From ae880ffbd282fe440213758bd9babf246dae1c9d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Jun 2026 10:42:21 +0000 Subject: [PATCH 01/54] Bump codecov/codecov-action from 6 to 7 Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 6 to 7. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v6...v7) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 38a237ef..aa7bf2d6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -130,7 +130,7 @@ jobs: - name: Upload coverage to Codecov if: matrix.python-version == '3.11' - uses: codecov/codecov-action@v6 + uses: codecov/codecov-action@v7 with: files: ./coverage.xml flags: unit From ae7fb263b3ee02d54245a179a2ee1ba5ac2f46ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Jun 2026 10:42:25 +0000 Subject: [PATCH 02/54] Bump actions/setup-node from 5 to 6 Bumps [actions/setup-node](https://github.com/actions/setup-node) from 5 to 6. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/setup-node dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/lint-pr-title.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint-pr-title.yml b/.github/workflows/lint-pr-title.yml index 2afd103a..4b7db899 100644 --- a/.github/workflows/lint-pr-title.yml +++ b/.github/workflows/lint-pr-title.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/checkout@v6 - name: Set up Node - uses: actions/setup-node@v5 + uses: actions/setup-node@v6 with: node-version: "20" From 082d8d90609a3232c6470f9fec03245746606ffc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Jun 2026 10:42:28 +0000 Subject: [PATCH 03/54] Bump actions/download-artifact from 5 to 8 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 5 to 8. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v5...v8) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-version: '8' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 38a237ef..9cde458e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -166,7 +166,7 @@ jobs: run: uv sync --dev - name: Download coverage artifact - uses: actions/download-artifact@v5 + uses: actions/download-artifact@v8 with: name: coverage-report From 0d89b800c412d6d0cbdf29eebf7e755a22517b6b Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Fri, 19 Jun 2026 11:11:43 +0200 Subject: [PATCH 04/54] Revert "Merge pull request #61 from databrickslabs/fix/Submit-for-Review-blocked-desp-DT" This reverts commit f721fdf37271bb5b39c2fd3c59d954f83d987860, reversing changes made to 4a4509af2d0571d3b1bee274432c98d96189f7a1. --- CONTRIBUTORS.md | 19 - ISSUE-52-FIX-REPORT.md | 143 + Makefile | 27 +- README.md | 2 +- .../v0.5.1/benoitcayladbx_2026-06-19.log | 172 - .../v0.6.0/benoitcayladbx_2026-06-12.log | 695 -- .../v0.6.0/benoitcayladbx_2026-06-16.log | 11 - .../v0.6.0/benoitcayladbx_2026-06-17.log | 29 - .../v0.6.0/benoitcayladbx_2026-06-18.log | 434 - .../v0.6.0/benoitcayladbx_2026-06-19.log | 141 - docs/architecture.md | 72 - ...026-06-18-ai-agent-clarifying-questions.md | 994 --- ...18-ai-agent-clarifying-questions-design.md | 170 - pyproject.toml | 51 +- releases/ReleaseNotes_V0.5.1.md | 162 - scripts/bootstrap-lakebase-perms.sh | 39 +- scripts/upgrade_lakebase_0.5_To_0.6.sql | 137 - ...grade_lakebase_0.6_drop_comment_anchor.sql | 67 - src/agents/agent_task_planner/__init__.py | 3 - src/agents/agent_task_planner/engine.py | 182 - src/agents/agent_task_planner/tools.py | 7 - src/agents/agent_task_router/__init__.py | 15 - src/agents/agent_task_router/engine.py | 192 - src/agents/agent_task_router/tools.py | 13 - src/agents/registry.py | 121 - src/api/routers/internal/__init__.py | 2 - src/api/routers/internal/comments.py | 212 - src/back/core/databricks/DatabricksAuth.py | 6 - src/back/core/databricks/SQLWarehouse.py | 155 +- .../objects/digitaltwin/_build_pipeline.py | 103 +- src/back/objects/mapping/Mapping.py | 118 +- src/back/objects/registry/CommentService.py | 593 -- src/back/objects/registry/RegistryService.py | 92 - src/back/objects/registry/ReviewService.py | 26 +- .../objects/registry/agent_task_runner.py | 718 -- src/back/objects/registry/store/base.py | 154 - .../registry/store/lakebase/schema.sql | 50 - .../objects/registry/store/lakebase/store.py | 453 - src/front/config/menu_config.json | 21 - .../domain/css/domain-collaboration.css | 113 - .../static/domain/js/domain-collaboration.js | 511 -- src/front/static/domain/js/domain-review.js | 20 +- src/front/static/global/css/review-modals.css | 259 - src/front/static/global/js/comments-panel.js | 824 -- src/front/static/home/js/home-tasks.js | 80 +- .../static/mapping/js/mapping-entity-modal.js | 2 - src/front/static/mapping/js/mapping-init.js | 21 - .../mapping/js/mapping-relationship-modal.js | 2 - src/front/static/mapping/js/mapping-shared.js | 41 - src/front/static/ontology/js/ontology-init.js | 66 - src/front/static/ontology/js/ontology-map.js | 19 - src/front/static/query/js/query-sigmagraph.js | 32 - src/front/static/query/js/query.js | 32 - .../static/registry/js/registry-my-tasks.js | 106 +- src/front/templates/base.html | 1 - src/front/templates/domain.html | 12 - .../partials/domain/_domain_discussions.html | 41 - .../partials/domain/_domain_mytasks.html | 22 - .../templates/partials/dtwin/_query_chat.html | 6 +- .../partials/dtwin/_query_cohorts.html | 4 - .../partials/dtwin/_query_dataquality.html | 4 - .../partials/dtwin/_query_graphql.html | 4 - .../partials/dtwin/_query_insights.html | 6 +- .../partials/dtwin/_query_reasoning.html | 8 +- .../partials/dtwin/_query_sigmagraph.html | 4 - .../partials/mapping/_mapping_autoassign.html | 6 +- .../partials/mapping/_mapping_design.html | 6 +- .../mapping/_mapping_diagnostics.html | 8 +- .../partials/mapping/_mapping_import.html | 6 +- .../mapping/_mapping_information.html | 8 +- .../partials/mapping/_mapping_manual.html | 6 +- .../partials/mapping/_mapping_r2rml.html | 6 +- .../partials/mapping/_mapping_sparksql.html | 6 +- .../ontology/_ontology_business_rules.html | 8 +- .../partials/ontology/_ontology_cohorts.html | 4 - .../ontology/_ontology_dataquality.html | 8 +- .../partials/ontology/_ontology_design.html | 6 +- .../partials/ontology/_ontology_entities.html | 6 +- .../partials/ontology/_ontology_import.html | 6 +- .../partials/ontology/_ontology_map.html | 4 - .../ontology/_ontology_relationships.html | 8 +- .../partials/ontology/_ontology_wizard.html | 8 +- .../partials/ontology/_pitfalls.html | 4 - .../digitaltwin/test_build_pipeline_units.py | 94 +- tests/units/agents/test_agent_task_planner.py | 67 - tests/units/agents/test_agent_task_router.py | 132 - tests/units/api/test_comment_endpoints.py | 194 - .../units/api/test_discussion_panel_assets.py | 187 - .../api/test_domain_current_user_endpoint.py | 93 - tests/units/api/test_ui_rendering.py | 16 +- tests/units/core/test_sql_warehouse.py | 90 +- tests/units/mapping/test_mapping_service.py | 39 - .../units/registry/test_agent_task_runner.py | 479 -- tests/units/registry/test_comment_service.py | 535 -- tests/units/registry/test_registry_store.py | 394 +- tests/units/registry/test_review_service.py | 124 - uv.lock | 7406 ++++++++--------- 97 files changed, 3986 insertions(+), 14819 deletions(-) delete mode 100644 CONTRIBUTORS.md create mode 100644 ISSUE-52-FIX-REPORT.md delete mode 100644 changelogs/v0.5.1/benoitcayladbx_2026-06-19.log delete mode 100644 changelogs/v0.6.0/benoitcayladbx_2026-06-12.log delete mode 100644 changelogs/v0.6.0/benoitcayladbx_2026-06-16.log delete mode 100644 changelogs/v0.6.0/benoitcayladbx_2026-06-17.log delete mode 100644 changelogs/v0.6.0/benoitcayladbx_2026-06-18.log delete mode 100644 changelogs/v0.6.0/benoitcayladbx_2026-06-19.log delete mode 100644 docs/superpowers/plans/2026-06-18-ai-agent-clarifying-questions.md delete mode 100644 docs/superpowers/specs/2026-06-18-ai-agent-clarifying-questions-design.md delete mode 100644 releases/ReleaseNotes_V0.5.1.md delete mode 100644 scripts/upgrade_lakebase_0.5_To_0.6.sql delete mode 100644 scripts/upgrade_lakebase_0.6_drop_comment_anchor.sql delete mode 100644 src/agents/agent_task_planner/__init__.py delete mode 100644 src/agents/agent_task_planner/engine.py delete mode 100644 src/agents/agent_task_planner/tools.py delete mode 100644 src/agents/agent_task_router/__init__.py delete mode 100644 src/agents/agent_task_router/engine.py delete mode 100644 src/agents/agent_task_router/tools.py delete mode 100644 src/agents/registry.py delete mode 100644 src/api/routers/internal/comments.py delete mode 100644 src/back/objects/registry/CommentService.py delete mode 100644 src/back/objects/registry/agent_task_runner.py delete mode 100644 src/front/static/domain/css/domain-collaboration.css delete mode 100644 src/front/static/domain/js/domain-collaboration.js delete mode 100644 src/front/static/global/js/comments-panel.js delete mode 100644 src/front/templates/partials/domain/_domain_discussions.html delete mode 100644 src/front/templates/partials/domain/_domain_mytasks.html delete mode 100644 tests/units/agents/test_agent_task_planner.py delete mode 100644 tests/units/agents/test_agent_task_router.py delete mode 100644 tests/units/api/test_comment_endpoints.py delete mode 100644 tests/units/api/test_discussion_panel_assets.py delete mode 100644 tests/units/api/test_domain_current_user_endpoint.py delete mode 100644 tests/units/registry/test_agent_task_runner.py delete mode 100644 tests/units/registry/test_comment_service.py diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md deleted file mode 100644 index a781c638..00000000 --- a/CONTRIBUTORS.md +++ /dev/null @@ -1,19 +0,0 @@ -# Contributors - -Thank you to everyone who has contributed to OntoBricks! - -## Core Team - -| Name | GitHub | Role | -|------|--------|------| -| Benoit Cayla | [@benoitcayladbx](https://github.com/benoitcayladbx) | Creator & Lead Maintainer | -| Dermot Smyth | [@dermotsmyth-db](https://github.com/dermotsmyth-db) | Contributor | -| hourdays | [@hourdays](https://github.com/hourdays) | Contributor | - -## How to Contribute - -See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on how to get involved. - ---- - -*This list is maintained manually. If you've contributed and are not listed, please open a PR.* diff --git a/ISSUE-52-FIX-REPORT.md b/ISSUE-52-FIX-REPORT.md new file mode 100644 index 00000000..58104062 --- /dev/null +++ b/ISSUE-52-FIX-REPORT.md @@ -0,0 +1,143 @@ +# Bug Fix Report — Issue #52 + +**Title:** Expanded instances in knowledge graph view are grouped under +identifier instead of entity type +**Issue:** [databrickslabs/ontobricks#52](https://github.com/databrickslabs/ontobricks/issues/52) +**Reported by:** @ulsmo · **Affected version:** 0.4.0 · **Fixed in:** 0.5.0 +**Date:** 2026-06-12 + +--- + +## 1. Summary + +When using the knowledge graph viewer's **right-click → "Expand neighbours"** +action, the newly added nodes showed up in the *View* pane as brand-new entity +types named after their **identifiers** (with freshly randomised colours) +instead of being folded into the entity type they actually belong to. This +made type-based filtering and the colour coding effectively unusable after any +expansion. + +The root cause was a **backend filter dropping `rdf:type` triples**, not a +front-end rendering bug. A one-line condition in the neighbour-expansion +endpoint is responsible. + +--- + +## 2. Reproduction + +1. Run a query to load a graph in the Digital Twin viewer. +2. Right-click any node → **Expand neighbours**. +3. Observe the *View* pane: the expanded nodes appear under new groups keyed by + their identifier rather than under their existing entity type, each with a + new random colour. + +--- + +## 3. Root Cause Analysis + +The expansion calls `GET /dtwin/neighbors` +(`src/api/routers/internal/dtwin.py`). The endpoint BFS-traverses from the seed +URI, collects the set of `visited` **instance** URIs, then fetches every triple +whose subject is in that set and returns the induced subgraph. + +To avoid rendering edges that point at nodes outside the returned subgraph +("ghost endpoints"), it discarded any triple whose object is a URI **not** in +`visited`: + +```python +is_uri_obj = o.startswith("http://") or o.startswith("https://") +if is_uri_obj and o not in visited: + continue # <-- also drops rdf:type triples +``` + +The problem: an `rdf:type` triple's object is the **class** URI +(e.g. `http://…/onto/Person`). A class is part of the ontology schema, never an +*instance*, so it is **never** in the `visited` instance set. As a result every +`rdf:type` triple for the freshly expanded nodes was silently filtered out. + +Downstream, the front-end `buildGraph()` (`query-d3graph.js`) assigns each +node's entity type from its `rdf:type` triple. With that triple missing it +falls back to `inferTypeFromUri()`, which derives a pseudo-type from the URI's +local part — i.e. the node's **identifier**. That pseudo-type becomes a new +group with its own colour, exactly matching the reported symptom. + +The originally-queried nodes were unaffected because the initial query result +*does* include their `rdf:type` triples. + +--- + +## 4. The Fix + +Preserve `rdf:type` triples through neighbour filtering even when the class URI +is not part of the visited subgraph. The inline loop was extracted into a small, +unit-testable helper. + +`src/api/routers/internal/dtwin.py`: + +```python +_RDF_TYPE_URI = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" + + +def _is_type_predicate(predicate: str) -> bool: + if not predicate: + return False + return ( + predicate == _RDF_TYPE_URI + or predicate.endswith("#type") + or predicate.endswith("/type") + ) + + +def _filter_neighbor_triples(rows, visited, limit): + triples, seen = [], set() + for r in rows: + s, p, o = r.get("subject", ""), r.get("predicate", ""), r.get("object", "") + key = (s, p, o) + if key in seen: + continue + is_uri_obj = o.startswith("http://") or o.startswith("https://") + if is_uri_obj and o not in visited and not _is_type_predicate(p): + continue # keep literals, in-subgraph URIs, and rdf:type + seen.add(key) + triples.append({"subject": s, "predicate": p, "object": o}) + if len(triples) >= limit: + break + return triples +``` + +The endpoint now simply calls `triples = _filter_neighbor_triples(rows, visited, limit)`. + +**Why this is safe:** keeping type triples does **not** introduce ghost class +nodes — `buildGraph()`'s pre-pass already detects type/class URIs and excludes +them from the entity set, using them only to assign types. The type-predicate +detection (`#type` / `/type` / full RDF URI) mirrors the logic the front-end +already uses, so backend and front-end stay consistent. + +--- + +## 5. Tests + +Added `TestNeighborTripleFilter` in `tests/units/api/test_routes.py` (6 cases): + +| Test | Asserts | +|------|---------| +| `test_keeps_rdf_type_triple_even_when_class_uri_not_visited` | The #52 regression — type triple survives | +| `test_keeps_short_type_predicate` | `#type` suffix predicates also survive | +| `test_drops_non_type_uri_object_outside_visited` | Ghost-endpoint guard still works | +| `test_keeps_uri_object_within_visited` | In-subgraph edges preserved | +| `test_keeps_literal_object` | Literal attributes preserved | +| `test_dedups_and_respects_limit` | De-dup + `limit` cap intact | + +**Result:** `python -m pytest tests/units` → **2328 passed, 11 skipped**. +(`tests/property/*` is skipped because the optional `hypothesis` package is not +installed in this environment — unrelated to this change.) + +--- + +## 6. Files Changed + +- `src/api/routers/internal/dtwin.py` — added `_RDF_TYPE_URI`, + `_is_type_predicate()`, `_filter_neighbor_triples()`; endpoint now delegates + filtering to the helper. +- `tests/units/api/test_routes.py` — added `TestNeighborTripleFilter`. +- `changelogs/v0.5.0/benoitcayladbx_2026-06-12.log` — changelog entry. diff --git a/Makefile b/Makefile index e2139918..e5d3d3f1 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ CONFIG := scripts/deploy.config.sh -.PHONY: help install test test-cov test-e2e run dev prod setup format lint clean \ +.PHONY: help install test test-cov run dev prod setup format lint clean \ deploy deploy-dry-run deploy-volume deploy-no-run \ bootstrap-perms bootstrap-lakebase \ bundle-validate bundle-summary deploy-check \ @@ -27,9 +27,8 @@ help: @echo " make setup - Complete setup (install + configure)" @echo "" @echo " Testing:" - @echo " make test - Run the PR gate (excludes e2e/property/eval/external)" - @echo " make test-cov - Run the PR gate with coverage" - @echo " make test-e2e - Run the Playwright e2e suite (isolated process)" + @echo " make test - Run tests" + @echo " make test-cov - Run tests with coverage" @echo "" @echo " Code Quality:" @echo " make format - Format code with black" @@ -65,25 +64,13 @@ run: @echo "Starting OntoBricks (FastAPI)..." . .venv/bin/activate && python run.py -# Mirror the CI "G1 unit+integration" gate (.github/workflows/ci.yml). -# The Playwright e2e suite uses the sync API, whose session-scoped event -# loop is incompatible with pytest-asyncio when run in the same process — -# so e2e runs in its own process via `make test-e2e` (and CI runs it as a -# separate nightly job). property/eval/external are likewise out-of-band. -PYTEST_GATE := --ignore=tests/e2e -m "not e2e and not property and not eval and not external" - test: - @echo "Running tests (PR gate; e2e excluded — use 'make test-e2e')..." - . .venv/bin/activate && pytest tests/ $(PYTEST_GATE) + @echo "Running tests..." + . .venv/bin/activate && pytest test-cov: - @echo "Running tests with coverage (PR gate)..." - . .venv/bin/activate && pytest tests/ $(PYTEST_GATE) \ - --cov=src --cov-report=html --cov-report=term - -test-e2e: - @echo "Running Playwright e2e suite (isolated process)..." - . .venv/bin/activate && pytest tests/e2e/ + @echo "Running tests with coverage..." + . .venv/bin/activate && pytest --cov=src --cov-report=html --cov-report=term format: @echo "Formatting code..." diff --git a/README.md b/README.md index 316c62b2..9b637a32 100644 --- a/README.md +++ b/README.md @@ -238,7 +238,7 @@ No command line required — ideal for ad-hoc transfers and cross-tenant sharing ### Registry Import / Export (CLI) -For automated promotion pipelines, use the +For automated promotion pipelines use the `scripts/registry_transfer.sh` command-line tool — export a curated subset of domains/versions from a source registry into a `.zip`, then preview and commit it into the target registry. See diff --git a/changelogs/v0.5.1/benoitcayladbx_2026-06-19.log b/changelogs/v0.5.1/benoitcayladbx_2026-06-19.log deleted file mode 100644 index ace4d50d..00000000 --- a/changelogs/v0.5.1/benoitcayladbx_2026-06-19.log +++ /dev/null @@ -1,172 +0,0 @@ -# 2026-06-19 — Interactive Digital Twin build now persists last_build (Submit-for-review unblock) + SQL pool / triple-count hardening - -## Fix: "Submit for review" blocked despite a built Digital Twin - -**Context:** On the Validation page a DRAFT version with a healthy, built -Digital Twin (green "Digital Twin built" tick, thousands of triples in the -view) could still be blocked from Submit-for-review with the banner -"This version has never been built. Run a Digital Twin build first." The two -indicators read different sources: the green tick reads live triplestore -state (`compute_dtwin_indicator`), while the Submit gate -(`ReviewService.review_detail`) and the lifecycle guard -(`version_lifecycle`) read the persisted `info.last_build` field from the -registry version record. - -Root cause: only the **scheduled** build path persisted `last_build` to the -registry (`scheduler._persist_domain_metadata` → `write_version`). The -**interactive** ("Build" button) and external **API** build paths stamped -`last_build` on the in-memory session only (`dtwin.py` → `domain.save()`), -never on the registry version record. So an interactive build left -`domain_versions.last_build` empty and Submit stayed blocked. - -Two secondary reliability issues surfaced during the investigation and are -hardened here: a stale pooled SQL connection crashing a long build, and the -triple-count silently coercing a failed count to a "healthy zero-triple -build". - -**Changes:** - -1. `src/back/objects/registry/store/base.py` — declared a new abstract - `update_last_build(folder, version, ts)` on `RegistryStore`. -2. `src/back/objects/registry/store/lakebase/store.py` — implemented - `update_last_build`: a targeted single-row `UPDATE` of the - `domain_versions.last_build` column (plus a `jsonb_set` mirror into the - `info` blob) keyed by registry/folder/version, so a build never rewrites - the full version document (no clobbering of concurrent session edits). - Invalidates the registry cache on success. -3. `src/back/objects/registry/RegistryService.py` — added - `update_last_build(...)` wrapper that calls the store and invalidates the - registry cache so the Validation page reflects the stamp immediately. -4. `src/back/objects/digitaltwin/_build_pipeline.py` — added best-effort - `_persist_last_build(ts)` and call it from the build success path - (`_complete_task`). It reuses the same folder/version/`RegistryService` - derivation as `_record_build_run`, also stamps `domain.last_build` on the - in-process session, and never fails a healthy build (try/except + log). - This makes interactive and API builds persist `last_build` the same way - the scheduler already did. -5. `src/back/core/databricks/SQLWarehouse.py` — pool hardening. Split - `_borrow` into `_checkout` (reports whether a connection was reused) / - `_checkin`, and added a `_run(fn)` helper that retries once on a fresh - connection when a **reused** pooled connection fails with a - connection-level error (added `_is_connection_error`, covering the - `'NoneType' object has no attribute 'request'` symptom seen when a - server-closed connection is reused after a warehouse auto-stop/idle drop). - Routed `test_connection`, `execute_query`, and `execute_statement` through - `_run`; the streaming `iter_rows` keeps the plain `_borrow` (a partially - consumed stream is unsafe to retry). -6. `src/back/objects/digitaltwin/_build_pipeline.py` — `_count_view_triples` - no longer swallows every exception to `0`. A successful `COUNT` of `0` is - still a genuinely empty view (non-fatal upstream), but a failed count - (view missing / transient error) now raises `InfrastructureError` so a - broken build fails loudly instead of being misreported as a healthy - zero-triple build (which would also have stamped `last_build`). - -**Tests added/updated:** - -7. `tests/units/registry/test_registry_store.py` — implemented - `update_last_build` on the in-memory contract store and added round-trip + - unknown-version tests. -8. `tests/back/core/digitaltwin/test_build_pipeline_units.py` — `_persist_last_build` - (stamps registry + session, snapshot-version precedence, non-fatal on - registry error) and `_count_view_triples` (count, empty-view 0, raises on - failure). -9. `tests/units/core/test_sql_warehouse.py` — `_is_connection_error` - classification and pool retry behaviour (retry once on a dead reused - connection; no retry on a fresh-connection failure or a non-connection - error). - -**Files modified:** -- `src/back/objects/registry/store/base.py` -- `src/back/objects/registry/store/lakebase/store.py` -- `src/back/objects/registry/RegistryService.py` -- `src/back/objects/digitaltwin/_build_pipeline.py` -- `src/back/core/databricks/SQLWarehouse.py` -- `tests/units/registry/test_registry_store.py` -- `tests/back/core/digitaltwin/test_build_pipeline_units.py` -- `tests/units/core/test_sql_warehouse.py` - -**Tests:** - -Targeted suites for the touched areas — all green: - -``` -python -m pytest tests/units/core/test_sql_warehouse.py \ - tests/back/core/digitaltwin/test_build_pipeline_units.py \ - tests/units/registry/test_registry_store.py \ - tests/units/registry/test_review_service.py \ - tests/units/registry/test_version_lifecycle.py -q -# 93 passed (sql + build pipeline + registry store) ; review/lifecycle green -``` - -Full suite (`python -m pytest`): 2801 passed, 17 skipped, 44 failed. The 44 -failures are pre-existing and unrelated to this change: the `tests/e2e/*` -ones are Playwright tests that time out against a live app server -(`localhost:18765`) that is not running here, and the `tests/mcp/*` / -`tests/units/api/*` ones pass both in isolation and when run together as a -group (full-suite import/ordering pollution). None of the failures are in the -registry-store, build-pipeline, or SQL-warehouse areas touched by this work. - ---- - -# 2026-06-19 — Dependabot security fixes (Closes #37, #42–#58 partial) - -## Security: dependency bumps for Dependabot advisories - -**Context:** GitHub Dependabot opened 22 alerts against the project's -`uv.lock`. The alerts span six packages: `aiohttp`, `cryptography`, -`python-multipart`, `pyjwt`, `starlette`, and `nltk`, plus a low-severity -`torch` advisory. Three packages (`starlette` 1.3.1, `nltk` 3.10.0, -`PyJWT` 2.13.0) were not yet available on the internal Databricks PyPI proxy -at the time of this fix and are tracked as PENDING proxy sync. - -**Changes:** - -1. `pyproject.toml` — bumped `python-multipart` to `>=0.0.30`: - closes quadratic-time DoS via semicolons (CVE-2026-53539), parameter - smuggling (CVE-2026-53538), negative Content-Length OOM (GHSA-h8vp-42mj-3c4x), - RFC 2231 param smuggling (GHSA-4w6j-v5jc-5fqr). Locked at 0.0.32. - -2. `pyproject.toml` — bumped `starlette` to `>=1.3.0` (BadHost fix); - target `>=1.3.1` is documented and will be applied once the proxy mirrors it - to additionally close form() limits DoS (CVE-2026-54283 / GHSA-82w8-qh3p-5jfq). - Locked at 1.3.0. - -3. `pyproject.toml` — bumped `mlflow` to `>=3.13.0` to unblock the - `cryptography` upgrade (mlflow ≤3.12.0 caps `cryptography<47`; 3.13.0 allows - `<49`). Locked at 3.13.0 (mlflow-skinny + mlflow-tracing follow). - -4. `pyproject.toml` `[tool.uv] constraint-dependencies` — bumped `aiohttp` - constraint to `>=3.14.1`: closes 8 aiohttp advisories (incomplete WS frame - payloads CVE-2026-54274, compressed body zip-bomb CVE-2026-54278, pipelined - queue CVE-2026-54275, C parser line-size CVE-2026-54276, DigestAuth - cross-origin CVE-2026-54277, payload disconnect CVE-2026-54279, TLS hostname - override CVE-2026-54280, host-only cookie CVE-2026-54281). Locked at 3.14.1. - -5. `pyproject.toml` `[tool.uv] constraint-dependencies` — added - `cryptography>=48.0.1`: closes vulnerable-OpenSSL-in-wheel advisory - (CVE-2026-34180 / GHSA-537c-gmf6-5ccf). Locked at 48.0.1. - -6. `pyproject.toml` `[tool.uv] constraint-dependencies` — added - `torch>=2.7.0`: documents CVE-2025-3000 fix; already satisfied by locked - version 2.11.0. - -7. `pyproject.toml` `[tool.uv] constraint-dependencies` — added pending - `pyjwt>=2.10.1` with TARGET comment `>=2.13.0` (five CVEs: algorithm - confusion GHSA-xgmm-8j9v-c9wx, allow-list bypass GHSA-jq35-7prp-9v3f, - DoS GHSA-r5fg-8rfm-jfxq, SSRF GHSA-vqx6-w8qr-234h, DoS GHSA-hpqf-4wfj-9qcc). - -8. `pyproject.toml` `[project.optional-dependencies].pitfalls` — added - pending comment TARGET `>=3.10.0` for nltk (CVE-2026-54293 / - GHSA-p4gq-832x-fm9v path traversal). - -**Files modified:** -- `pyproject.toml` -- `uv.lock` - -**Tests:** - -Full suite (unit + integration, excluding db/spark/external/e2e): 2563 passed. - -Alerts **closed** by this PR: #42, #46, #48–#55. -Alerts **pending proxy sync** (starlette 1.3.1 / nltk 3.10.0 / PyJWT 2.13.0): -#38–#41, #44–#45, #47, #56–#58. diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-12.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-12.log deleted file mode 100644 index 87809216..00000000 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-12.log +++ /dev/null @@ -1,695 +0,0 @@ -# v0.6.0 — 2026-06-12 — benoitcayladbx - -## Collaborative Comments & Tasks - -### Context -Implements the `releasereq/collaborative_comments_tasks_plan.md` roadmap -item: contextual threaded commenting anchored to a DRAFT/IN-REVIEW domain -(ontology classes/properties, mappings, graph nodes/edges, or the whole -domain) plus the ability to turn a comment into a personalised task -assigned to a teammate, surfaced in the cross-domain "My Tasks" worklist. -Follows the existing `domain_review_events` playbook (idempotent DDL, -lazy self-heal, SP grants, `(domain_id, version)` grain). - -### Changes -1. `src/back/objects/registry/store/base.py` — new `DomainComment` / - `DomainTask` TypedDicts and seven abstract `RegistryStore` methods - (`insert_comment`, `list_comments`, `resolve_comment`, `insert_task`, - `list_tasks`, `list_tasks_for_assignee`, `update_task_status`). -2. `src/back/objects/registry/store/lakebase/schema.sql` — canonical DDL - for `domain_comments` + `domain_tasks` (anchor/parent/resolved columns, - task status CHECK, FK to comments, indexes on - `(domain_id, version, anchor_type, anchor_ref)` and - `(lower(assignee), status)`). -3. `src/back/objects/registry/store/lakebase/store.py` — Lakebase impl of - the seven methods, a lazy `_ensure_collab_tables()` self-heal (same - pattern as `_ensure_review_events_table`), `_collab_tables_ready` guard, - row→dict mappers, and the two new tables added to `_KNOWN_TABLES`. -4. `scripts/bootstrap-lakebase-perms.sh` — Step 2b idempotent migration - for the two new tables (run as schema owner) so existing deployments - self-heal under `make bootstrap-lakebase`. -5. `src/back/objects/registry/RegistryService.py` — thin passthroughs to - the new store methods. -6. `src/back/objects/registry/CommentService.py` — NEW stateless service: - anchor validation, DRAFT/IN-REVIEW write gate (PUBLISHED is read-only), - per-action role rules (member reads/comments; author/editor/admin - resolves; assignee/creator/editor/admin updates tasks), and a - best-effort `commented` audit row on task create/complete to keep the - Validation timeline unified. -7. `src/api/routers/internal/comments.py` — NEW `/comments` router - (list/add/resolve comments, list/create/advance tasks); registered in - `src/api/routers/internal/__init__.py`. -8. `src/back/objects/registry/ReviewService.py` — `my_tasks` now also - returns `assigned_tasks` (open/in-progress tasks for the caller) via a - best-effort `_assigned_tasks` helper; backward compatible. -9. `src/front/static/global/js/comments-panel.js` — NEW reusable - right-side offcanvas (`window.OntoComments.openThread`) rendering the - anchored thread: replies, resolve/reopen, and create-task-from-comment - with an assignee picker sourced from the domain access roster. -10. `src/front/templates/base.html` + `.../css/review-modals.css` — load - and style the new panel globally. -11. `src/front/static/registry/js/registry-my-tasks.js` + - `.../home/js/home-tasks.js` — render an "Assigned to me" section with - inline status actions (Start / Done) alongside the review worklist. -12. `src/front/static/domain/js/domain-review.js` — "Discussion" button on - the Validation banner opens the domain-level thread. -13. `docs/architecture.md` — documented the three audit/collab tables in - the Lakebase registry schema table. - -### Modified / added files -- src/back/objects/registry/store/base.py -- src/back/objects/registry/store/lakebase/schema.sql -- src/back/objects/registry/store/lakebase/store.py -- scripts/bootstrap-lakebase-perms.sh -- src/back/objects/registry/RegistryService.py -- src/back/objects/registry/CommentService.py (new) -- src/api/routers/internal/comments.py (new) -- src/api/routers/internal/__init__.py -- src/back/objects/registry/ReviewService.py -- src/front/static/global/js/comments-panel.js (new) -- src/front/templates/base.html -- src/front/static/global/css/review-modals.css -- src/front/static/registry/js/registry-my-tasks.js -- src/front/static/home/js/home-tasks.js -- src/front/static/domain/js/domain-review.js -- docs/architecture.md -- tests/units/registry/test_registry_store.py (extended) -- tests/units/registry/test_comment_service.py (new) -- tests/units/api/test_comment_endpoints.py (new) - -### Decisions -- Comments/tasks are writable on DRAFT **and** IN-REVIEW (active - collaboration phases); PUBLISHED is read-only (reopen to continue). -- Fine-grained per-surface anchoring (ontology/mapping/graph selection) - is reachable through the documented `OntoComments.openThread(...)` seam; - the Validation page wires the domain-level anchor as the first adopter. - -### Tests -- `tests/units` (full unit tree): 2392 passed. -- New: `test_comment_service.py` (22), `test_comment_endpoints.py` (9). -- Extended `test_registry_store.py`: in-memory contract for comments/tasks - **plus** a `TestLakebaseCollab` class driving the real Lakebase SQL code - paths (row mappers, lazy `_ensure_collab_tables` short-circuit, - rowcount-based not-found handling) via the scripted cursor. -- Extended `test_review_service.py`: `my_tasks` now asserts the merged - `assigned_tasks` (open/in-progress filter, backend-error resilience, - empty-email skip). -- Full repo run shows 53 failures isolated to `tests/mcp/integration` - and the async API tests it pollutes when the entire ~2800-test suite - runs in one process — pre-existing event-loop ordering issue; every one - of those tests passes in isolation and per-directory. No regressions - from this change. - -## Per-surface discussion anchoring (ontology / mapping / graph) - -### Context -Follow-up to the Collaborative Comments & Tasks landing: wire the -fine-grained selection hooks so users can open a thread anchored to an -individual entity instead of only the whole domain. Completes the -`OntoComments.openThread(...)` seam noted as future work above. - -### Changes -1. `src/front/static/global/js/comments-panel.js` — added - `OntoComments.openForSelection(anchorType, anchorRef, anchorLabel)`: - resolves the loaded domain folder + version once (cached) via - `/domain/version-status`, gates on a registry-backed domain, then opens - the anchored thread. Editor surfaces no longer need to carry - folder/version themselves. -2. `src/front/static/query/js/query-sigmagraph.js` — "Discuss this entity" - / "Discuss this relationship" buttons appended to the node and edge - detail panels; new `SigmaGraph.discussNode` / `SigmaGraph.discussEdge` - public methods anchor to `graph_node` (subject URI) and `graph_edge` - (`source|predicate|target`). -3. `src/front/static/ontology/js/ontology-shared-panels.js` — reusable - `injectPanelDiscussButton(...)` adds a header Discuss button on the - entity/relationship edit + view panels, anchoring to `ontology_class` - / `ontology_property` by URI. -4. `src/front/static/mapping/js/mapping-shared.js` — reusable - `injectMappingDiscussButton(...)` adds a Discuss button to a mapping - modal header (anchor_type `mapping`, anchor ref = targeted class / - property URI); wired from `mapping-entity-modal.js` and - `mapping-relationship-modal.js`. - -### Modified files -- src/front/static/global/js/comments-panel.js -- src/front/static/query/js/query-sigmagraph.js -- src/front/static/ontology/js/ontology-shared-panels.js -- src/front/static/mapping/js/mapping-shared.js -- src/front/static/mapping/js/mapping-entity-modal.js -- src/front/static/mapping/js/mapping-relationship-modal.js - -### Decisions -- Anchoring auto-resolves domain context from the existing - `/domain/version-status` endpoint rather than threading it through every - surface — one cached fetch, consistent gating, matches `domain-review.js`. -- Anchor refs use the canonical URI (or `source|predicate|target` for - edges), matching the `anchor_type` set already enforced by - `CommentService` and the `domain_comments` CHECK constraint — no backend - change required. - -### Tests -- Frontend-only wiring; no Python surface changed. Backend anchor handling - already covered by `test_comment_service.py` / `test_comment_endpoints.py` - (all anchor types). Unit suite re-run: no regressions. - -### Fixup -- `ontology-shared-panels.js` — designer panel Discuss button now uses - `ms-auto me-1` so it groups top-right next to the close button instead of - landing mid-header (the header is `justify-content: space-between`). - -## Ontology designer diagram-level discussion + tag picker - -### Context -The Ontology Designer toolbar needed a discussion entry point for the -*whole* diagram (not a specific entity), with an optional way to re-tag the -thread to a specific class/relationship — requested next to the icon -generator button. - -### Changes -1. `src/front/templates/partials/ontology/_ontology_map.html` — added a - "Discussion" button (`#mapDiscuss`) to the designer toolbar, next to the - icon generator (`#mapAutoAssignIcons`). -2. `src/front/static/ontology/js/ontology-map.js` — `openOntologyDiscussion()` - opens the whole-diagram thread (anchor `domain` / ref `ontology`, kept - distinct from the Validation domain thread which uses ref `''`) and - passes a `taggable` list built from `OntologyState.config` - classes/properties. -3. `src/front/static/global/js/comments-panel.js` — the thread panel now - accepts an optional `taggable` list and renders a header `` - (Entities / Relationships optgroups) that adds removable chips. - - Tags are embedded in the comment body via a `[[onto-tags]]` JSON - marker (`encodeBody`/`parseBody`) — no schema change — and rendered as - badges under each comment. -3. `src/front/static/global/css/review-modals.css` — styles for the tag - chips (`.oc-tag-chip`, `.oc-bubble-tags`, `.oc-tagbar`). -4. `src/front/static/ontology/js/ontology-map.js` — designer Discussion - button still anchors to the whole diagram (domain/'ontology') and now - passes the class/relationship vocabulary as `taggable`. - -### Decisions -- Tags live inside the comment body behind a marker so the feature is fully - frontend and reversible; if first-class tagging is wanted later, promote - the marker payload into a `domain_comments.tags` column. -- Graph and mapping surfaces keep their own Discuss entry points (separate - pages, different context); only the ontology designer right-pane buttons - were removed per request. - -### Tests -- Frontend-only; no Python surface touched. Unit suite unaffected. - -### Fixup -- `ontology-map.js` — tag picker never appeared because the vocabulary was - read via `window.OntologyState`, but `OntologyState` is a `const` (lexical - global, not a `window` property), so the guard short-circuited to an empty - list. Now read via `typeof OntologyState !== 'undefined' && ...`. - -## Discuss button on all ontology sections - -### Context -The discussion entry point should be reachable from every ontology section, -not just the Model/Designer. - -### Changes -1. `src/front/static/ontology/js/ontology-init.js` — `injectOntologyDiscussButtons()` - adds a chat button to every `.section-header` in the ontology page on load, - wired to `openOntologyDiscussion()`. Skips the Import section (per request) - and the Model/Designer section (which already has a toolbar button). - Placement is layout-aware: appended into an existing right-hand actions - group when present, otherwise pushed to the far right with `ms-auto`. - -### Modified files -- src/front/static/ontology/js/ontology-init.js - -### Tests -- Frontend-only; no Python surface touched. - -## Task assignee picker lists domain permission holders - -### Context -"Create task" showed an empty "Assign to" list. The panel sourced names -from `/review/{folder}/{version}/team`, which intersects domain permission -entries with the Databricks App ACL and can come back empty. The picker -should simply list everyone who has a role on the domain. - -### Changes -1. `src/back/objects/registry/CommentService.py` — new `list_assignees(...)`: - reads the domain permission entries (`permission_service.list_domain_entries`) - and returns principals with an assignable role (viewer/editor/builder), - most-privileged first. Any member may read it; backend errors degrade to - an empty list rather than failing the panel. -2. `src/api/routers/internal/comments.py` — new - `GET /comments/{folder}/{version}/assignees` (per-domain) delegating to it. -3. `src/front/static/global/js/comments-panel.js` — `loadMembers()` now calls - the new assignees endpoint instead of the review team endpoint. - -### Modified / added files -- src/back/objects/registry/CommentService.py -- src/api/routers/internal/comments.py -- src/front/static/global/js/comments-panel.js -- tests/units/registry/test_comment_service.py (assignees cases) -- tests/units/api/test_comment_endpoints.py (assignees endpoint) - -### Decisions -- Used the domain permission entries (not the App-ACL-intersected Team view) - as the assignee source — that is literally "people with permissions on the - domain". The Validation Team display is left unchanged. - -### Tests -- `test_comment_service.py` + `test_comment_endpoints.py`: 35 passed - (incl. assignees sorting, member gate, backend-error resilience, endpoint - delegation). - -### Fixup -- `ontology-init.js` — the injected discuss button used `ms-auto`, which - pushed an existing trailing action (e.g. the Wizard's "Generate Ontology" - button) to the left. Now the title gets `me-auto` and the discuss button - slots just after it, so existing action buttons stay top-right. -- `ontology-init.js` — re-assert the discuss button on every section change - (idempotent, with short delayed passes). Some sections re-render their - header on `init()` after the one-time load pass, which dropped the button - on Groups, Business Views, Entities, Relationships, Data Quality, Cohorts - and Pitfalls. The button is now reliably present on all sections. -- `ontology-init.js` — unified the discuss-button placement: always insert - it right after the title (title gets `me-auto`), ahead of any existing - actions group, instead of appending inside that group. The Business Views - header's action bar is very crowded and was pushing the appended button - into overflow; it's now always visible. -- `_ontology_design.html` — added the discuss button statically to the - Business Views header (class `onto-discuss-btn`, so the JS injector skips - it). The OntoViz designer section was the one place runtime injection - wasn't surfacing the button reliably; the static button guarantees it. -- `_ontology_entities.html`, `_ontology_relationships.html` — added the - discuss button statically to the Classes and Relationships headers too - (same `onto-discuss-btn` opt-out from the JS injector). -- `_ontology_dataquality.html`, `_ontology_business_rules.html`, - `_ontology_cohorts.html`, `_pitfalls.html` — added the discuss button - statically to the Data Quality, Business Rules, Cohorts and Pitfalls - headers (same `onto-discuss-btn` opt-out). - -## Discuss capability on the Mapping pages - -### Context -Extend the contextual discussion (with the entity/relationship tag picker) -to the Mapping workspace, matching the ontology sections. - -### Changes -1. `src/front/static/mapping/js/mapping-shared.js` — `openMappingDiscussion()` - opens the thread anchored to the whole mapping layer (anchor_type - `mapping`, ref `mapping`) and passes the loaded ontology's - classes/relationships as the comment tag vocabulary. -2. Added the discuss button statically to every Mapping section header - except Import: `_mapping_information.html`, `_mapping_design.html`, - `_mapping_manual.html`, `_mapping_autoassign.html`, - `_mapping_diagnostics.html`, `_mapping_r2rml.html`, - `_mapping_sparksql.html` (each `onclick="openMappingDiscussion()"`). - -### Decisions -- Whole-mapping discussion uses anchor `mapping`/`mapping` (distinct from - the ontology designer's `domain`/`ontology` thread); per-mapping modal - Discuss buttons remain for entity/relationship-specific threads. -- `comments-panel.js` is already loaded globally via `base.html`, so the - mapping page reuses the same thread panel + tag picker with no extra - wiring. - -### Tests -- Frontend-only; no Python surface changed. Backend `mapping` anchor type - already validated/covered. - -## Discuss capability on the Digital Twin pages - -### Context -Extend the contextual discussion (with the entity/relationship tag picker) -to the Digital Twin workspace, matching the ontology and mapping sections. - -### Changes -1. `src/front/static/query/js/query.js` — `openTwinDiscussion()` opens the - thread anchored to the whole twin (anchor_type `domain`, ref - `digital-twin`). It lazily fetches `/ontology/load` once, caches the - result, and builds the comment tag vocabulary from the ontology's - classes/relationships. -2. Added the discuss button to every Digital Twin section header: - `_query_insights.html`, `_query_dataquality.html`, - `_query_reasoning.html`, `_query_cohorts.html`, - `_query_sigmagraph.html`, `_query_graphql.html`, `_query_chat.html` - (each `onclick="openTwinDiscussion()"`). - -### Decisions -- Whole-twin discussion uses anchor `domain`/`digital-twin` (distinct from - the ontology designer's `domain`/`ontology` and the mapping layer's - `mapping`/`mapping` threads); the SigmaGraph per-node/edge Discuss - buttons remain for graph-element-specific threads. -- Tag vocabulary is fetched lazily on first open (the query page has no - persistent clean ontology config global) and cached in `_twinTaggable`. -- `comments-panel.js` is already loaded globally via `base.html`, so the - Digital Twin page reuses the same thread panel + tag picker. - -### Tests -- Frontend-only; no Python surface changed. - -## Digital Twin discuss button — position fix - -### Context -The discuss button rendered to the left of the existing header actions; it -should sit to the right of them. Also confirmed the "openTwinDiscussion is -not defined" runtime error was a stale browser cache (`asset_version` is -`APP_VERSION.`, only bumped on server restart) — the function -is correctly defined globally in `query.js`. - -### Changes -1. Moved the discuss button to the rightmost position of every Digital Twin - section header action group: `_query_insights.html`, - `_query_dataquality.html`, `_query_reasoning.html`, `_query_cohorts.html`, - `_query_sigmagraph.html`, `_query_graphql.html`, `_query_chat.html`. - -### Tests -- Frontend-only; `node --check query.js` passes. - -## Ontology + Mapping discuss button — position fix - -### Context -Apply the same right-alignment to the Ontology and Mapping pages so the -discuss button consistently sits to the right of the other header actions. - -### Changes -1. Mapping partials — moved the discuss button to the rightmost slot: - `_mapping_information.html`, `_mapping_design.html`, `_mapping_manual.html`, - `_mapping_autoassign.html`, `_mapping_diagnostics.html`, - `_mapping_r2rml.html`, `_mapping_sparksql.html`. -2. Ontology partials — same reposition: `_ontology_design.html`, - `_ontology_entities.html`, `_ontology_relationships.html`, - `_ontology_dataquality.html`, `_ontology_business_rules.html`, - `_ontology_cohorts.html`, `_pitfalls.html`. -3. `src/front/static/ontology/js/ontology-init.js` — - `injectOntologyDiscussButtons()` now appends the button as the last - (rightmost) header element (after any existing actions group) instead of - slotting it right after the title. Covers JS-injected sections (Groups, - Wizard, etc.). -4. `_ontology_map.html` `#mapDiscuss` was already rightmost — unchanged. - -### Tests -- Frontend-only; `node --check ontology-init.js` passes; one - `onto-discuss-btn` per partial verified (no duplicates). - -## Mapping Import — add missing discuss button - -### Context -The Import R2RML mapping section was the only mapping page without a discuss -button. - -### Changes -1. `_mapping_import.html` — added the rightmost discuss button - (`openMappingDiscussion()`) to the section header. - -### Tests -- Frontend-only. - -## Ontology Import — add missing discuss button - -### Context -The Ontology Import section was previously excluded; user now wants it -covered too. - -### Changes -1. `_ontology_import.html` — added the rightmost discuss button - (`openOntologyDiscussion()`) statically. The `onto-discuss-btn` class - means the JS injector skips it (no duplicate), independent of its - existing `#import-section` exclusion. - -### Tests -- Frontend-only. - -## Ontology Generate (Wizard) — static rightmost discuss button - -### Context -The Generate Ontology section relied on the JS injector for its discuss -button; make it static and rightmost (after "Generate Ontology") for -reliability, matching the other sections. - -### Changes -1. `_ontology_wizard.html` — added a static discuss button after the - "Generate Ontology" action (title gets `me-auto`). The `onto-discuss-btn` - class makes the JS injector skip it (no duplicate). - -### Tests -- Frontend-only. - -## Discussion + tasks code — centralized (DRY) - -### Context -Ensure the discussion pane and its task code are a single shared module -across the whole app, with no per-surface duplication. - -### Audit findings -- The discussion pane (comments, replies, **task creation**, resolve, tags, - assignee picker) lives entirely in the global - `src/front/static/global/js/comments-panel.js`, loaded once via - `base.html` — already common to every page. Surfaces only call the - `window.OntoComments` API (`openThread` / `openForSelection`). -- `task-tracker.js` is a separate concept (async long-running jobs), not the - collaborative tasks of the discussion pane — left as-is. -- The "My Tasks" worklist (`registry-my-tasks.js`, `home-tasks.js`) is a - read-only display feature, already modular — left as-is. -- Only real duplication: the per-surface "build a comment tag vocabulary - from ontology classes/properties" logic was copy-pasted in three files. - -### Changes -1. `comments-panel.js` — added `OntoComments.taggableFromOntology(config)` - as the single shared builder for the `{type, ref, label}[]` tag - vocabulary; exposed on the global API. -2. `ontology-map.js` `openOntologyDiscussion()`, `mapping-shared.js` - `openMappingDiscussion()`, and `query.js` `openTwinDiscussion()` now call - `OntoComments.taggableFromOntology(...)` instead of each rebuilding the - list (removed ~45 duplicated lines). - -### Tests -- Frontend-only; `node --check` passes on all four files; no linter errors. - -## Domain → Collaboration page (My Tasks + Discussions timeline) - -### Context -A single place in the Domain area that concentrates every collaborative -signal: the user's tasks first, then all discussions as an activity timeline. - -### Changes -1. `src/front/config/menu_config.json` — new "Collaboration" group in the - Domain menu, placed before "Management", with two items: "My Tasks" - (`mytasks`) and "Discussions" (`discussions`). -2. `domain.html` — added `#mytasks-section` and `#discussions-section` - (partials below), plus the new CSS/JS includes. -3. `partials/domain/_domain_mytasks.html` — My Tasks section shell. -4. `partials/domain/_domain_discussions.html` — Discussions section shell - with a "Show resolved" switch + refresh. -5. `src/front/static/domain/js/domain-collaboration.js` — new module: - - My Tasks: reuses `GET /review/my-tasks` to render "Assigned to me" - tasks (Start/Done via `/comments/.../tasks/{id}/status`) and the - review worklist (Review → loads the domain and deep-links to - `?section=review`). - - Discussions: pulls every comment for the domain via - `GET /comments/{folder}/{version}` (no anchor filter), merges roots + - replies, sorts newest-first, groups by day, and renders an activity - timeline. Each entry shows author, anchor badge (Class/Property/ - Mapping/Node/Edge/Domain), body, and tag chips; clicking re-opens the - thread through the shared `OntoComments.openThread(...)`. - - Hooks the global `sidebarSectionChanged` event (no coupling to - `domain.js`). -6. `src/front/static/domain/css/domain-collaboration.css` — timeline styling. -7. `comments-panel.js` — exposed `OntoComments.parseBody` and - `OntoComments.anchorLabel(type)` so the timeline reuses the panel's body - parsing + anchor labels (no duplication). - -### Decisions -- No backend changes: the page composes existing endpoints - (`/review/my-tasks`, `/comments/{folder}/{version}`, - `/domain/version-status`, task status). -- Domain context (folder/version) resolved from `/domain/version-status`, - matching the panel's own resolution. - -### Tests -- Frontend-only; `node --check` passes; `menu_config.json` validates; no - linter errors. - -## Create task — "Assign to me" shortcut - -### Context -Make it one click to assign a new task to oneself from the discussion pane. - -### Changes -1. `comments-panel.js` — the "New task from this comment" form now has an - "Assign to me" link and marks the current user "(me)" in the assignee - dropdown. Current user is resolved once via `GET /domain/current-user` - (cached, prefetched on panel open). `assignToMe()` selects the user, - adding an option for them if they're not in the roster. - -### Decisions -- Shared in the global panel, so the shortcut appears on every surface - (ontology / mapping / twin / domain) automatically. -- Backend `create_task` only requires a non-empty assignee, so self-assign - needs no API change. - -### Tests -- Frontend-only; `node --check` passes; no linter errors. - -## Test suite — coverage for collab features + `make test` isolation fix - -### Context -Run the full suite and backfill tests for the new comments/tasks/ -collaboration work. Running the whole tree in one process surfaced a -pre-existing test-isolation bug: the Playwright **e2e** suite (sync API) -keeps a session-scoped event loop alive, so every `pytest-asyncio` test -that runs after it (MCP schema tests, comment/review/version-status -endpoint tests) failed with `RuntimeError: Cannot run the event loop -while another loop is running`. This only bites locally — CI runs the PR -gate with `--ignore=tests/e2e` and runs e2e as a separate nightly job; -bare `make test` (`pytest`) ran everything together and so went red. - -### Changes -1. `Makefile` — `make test` / `make test-cov` now mirror the CI G1 gate - (`--ignore=tests/e2e -m "not e2e and not property and not eval and not - external"`) so the Playwright suite no longer poisons the shared - asyncio loop. Added a dedicated `make test-e2e` target (runs the - Playwright suite by path, in its own process) plus help text. -2. `tests/units/api/test_domain_current_user_endpoint.py` — new unit tests - for `GET /domain/current-user` (the endpoint behind the discussion - pane's "Assign to me"): app-mode proxy headers (username preferred, - email fallback) and local/PAT mode (workspace client lookup, and the - no-client empty fallback). 5 tests. -3. `tests/units/api/test_ui_rendering.py` — extended `TestDomainPage` for - the new Domain → Collaboration area: sidebar links + section divs for - `mytasks` / `discussions`, and a `test_collaboration_section_assets_loaded` - asserting `domain-collaboration.js` and the timeline/my-tasks containers - render. - -### Modified files -- `Makefile` -- `tests/units/api/test_domain_current_user_endpoint.py` (new) -- `tests/units/api/test_ui_rendering.py` - -### Decisions -- The comments/tasks service (`tests/units/registry/test_comment_service.py`, - 25 tests) and router (`tests/units/api/test_comment_endpoints.py`, 10 - tests incl. `/assignees`) were already well covered, so new tests target - only the genuinely uncovered surfaces (current-user endpoint, the new - Domain collaboration UI). The timeline/"Assign to me" JS itself has no - Python-side harness (no JS test runner in this repo). -- `make test-e2e` selects e2e by path rather than `-m e2e` because the e2e - tests are not tagged with the `e2e` marker (selecting by marker collects - zero); this matches the usage documented in `tests/e2e/conftest.py`. - -### Tests -- PR gate (`make test`): **2627 passed, 17 skipped, 12 deselected** in - ~24s (previously 54 failures / 4m17s when e2e ran in-process). -- New/changed test files lint clean (`flake8 --max-line-length=100`). - -## Discussions timeline — multi-select tag filter - -### Context -The Domain → Collaboration → Discussions timeline already renders the -per-comment tags (entity/relationship chips). Let users narrow the -timeline to one or more of those tags. - -### Changes -1. `src/front/templates/partials/domain/_domain_discussions.html` — added a - "Tags" dropdown (Bootstrap, `data-bs-auto-close="outside"` so multiple - boxes can be ticked) with a live count badge, beside the existing - "Show resolved" switch. Hidden until the loaded comments actually carry - tags. -2. `src/front/static/domain/js/domain-collaboration.js` - - `selectedTags` set tracks the active filter keys. - - `buildTagFilter()` computes the distinct tag vocabulary from the loaded - comments (via the shared `OntoComments.parseBody`), renders the - checkbox menu, wires per-tag toggles and a "Clear" action, and - self-prunes selections whose tag no longer appears. Called after - comments load / on refresh. - - `renderDiscussions()` now filters by tag (OR semantics: keep comments - carrying any selected tag) and shows a dedicated "No discussions match - the selected tags" empty state when a filter hides everything. - - `parsedTags()` / `tagKey()` helpers; `updateTagCount()` drives the - badge. - -### Decisions -- OR semantics across selected tags (match any) — the common expectation - for a faceted filter; AND would make multi-select almost always empty. -- Tags keyed by their `ref` (falling back to `label`) so the same entity - tagged on different comments collapses to one filter row. -- Reuses the panel's `OntoComments.parseBody` rather than re-implementing - tag extraction — no duplication. - -### Tests -- `node --check` passes; `TestDomainPage` UI-render tests still green - (19 passed). Frontend-only; the asset version is fixed at server - startup, so restart the dev server to pick up the new JS. - -## Discussions — registry upgrade SQL (0.5 -> 0.6) - -### Context -The collaborative comments/tasks tables (`domain_comments`, `domain_tasks`) -are created lazily by the app (`_ensure_collab_tables`) and by -`make bootstrap-lakebase` (schema owner), but there was no standalone, -auditable `psql` migration like `upgrade_lakebase_0.4_To_0.5.sql`. Provide -one so an existing (pre-Discussions) Lakebase registry can be upgraded -out-of-band by a DBA. - -### Changes -1. `scripts/upgrade_lakebase_0.5_To_0.6.sql` — new idempotent one-shot - migration that adds `domain_comments` + `domain_tasks` (+ the three - indexes), mirroring the canonical - `src/back/objects/registry/store/lakebase/schema.sql`. Follows the same - psql conventions as the 0.4->0.5 script (`-v reg_schema=...`, default - `ontobricks_registry`, `\set ON_ERROR_STOP on`, single `BEGIN/COMMIT`). - - Also backfills the `anchor_type` and task `status` CHECK constraints on - registries whose tables were first created by the app's lazy self-heal - path (which omits those constraints), via guarded `pg_constraint` - lookups — so the schema ends up fully constrained either way. - - Non-destructive: no data touched, no columns dropped. - -### Modified files -- `scripts/upgrade_lakebase_0.5_To_0.6.sql` (new) - -### Decisions -- The explicit script carries the CHECK constraints (anchor_type, status) - that the runtime lazy path leaves off, making it the authoritative, - fully-constrained migration — and it self-heals already-lazily-created - tables by adding the missing constraints. -- Scoped to the Discussions feature (comments + tasks); the review/build - tables belong to the 0.4->0.5 era and already have their own provisioning. - -### Tests -- `psql` available locally; script mirrors the proven 0.4->0.5 structure - (2 CREATE TABLE + 3 CREATE INDEX + 2 guarded ADD CONSTRAINT). Idempotent; - safe to re-run. diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-16.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-16.log deleted file mode 100644 index f71cff5b..00000000 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-16.log +++ /dev/null @@ -1,11 +0,0 @@ -## Add CONTRIBUTORS.md - -**Context:** Added a contributors file to the repository root for GitHub visibility, listing all human contributors with their GitHub handles and roles. - -**Changes:** -1. `CONTRIBUTORS.md` (new) — created contributors file with a table listing Benoit Cayla and Dermot Smyth with links to their GitHub profiles, plus a pointer to CONTRIBUTING.md - -**Modified files:** -- `CONTRIBUTORS.md` (created) - -**Test result:** N/A — documentation-only change. diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-17.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-17.log deleted file mode 100644 index 40648c70..00000000 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-17.log +++ /dev/null @@ -1,29 +0,0 @@ -## Fix: last_build reset when switching domains (Issue reported by Chang Shi Lim) - -**Context:** After a manual UI build, `last_build` was only written to the server -session — not to the Lakebase registry store (`domain_versions.last_build`). When -the user switched to another domain and switched back, `load_domain_from_uc` reloaded -the domain from the registry, found `last_build` empty, and reset the "Last Built" -indicator. The Validation page still showed "Digital Twin built" because it checks -live Lakebase table existence, while the "Submit for Review" button checks -`last_build`, leaving users unable to submit for review after switching domains. -The only workaround was triggering a scheduled run (which already persisted -`last_build` to the store via `_persist_domain_metadata`). - -**Changes:** -1. `src/back/objects/registry/store/base.py` — added `stamp_last_build(folder, - version, ts)` with a safe default fallback (read+write) so any store - implementation works without requiring an override. -2. `src/back/objects/registry/store/lakebase/store.py` — overridden - `stamp_last_build` with a targeted single-column `UPDATE` on - `domain_versions.last_build` to avoid re-writing all JSONB blobs. -3. `src/back/objects/digitaltwin/_build_pipeline.py` — in `_record_build_run`, - for `status == "success"` call `svc._store.stamp_last_build(...)` so every - successful UI/API build durably persists `last_build` to the registry. - -**Modified files:** -- `src/back/objects/registry/store/base.py` -- `src/back/objects/registry/store/lakebase/store.py` -- `src/back/objects/digitaltwin/_build_pipeline.py` - -**Test result:** 2291 passed, 15 skipped (pre-existing psycopg skip unrelated to this change). diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-18.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-18.log deleted file mode 100644 index 5528f99a..00000000 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-18.log +++ /dev/null @@ -1,434 +0,0 @@ -## Feature: AI Agent as a task assignee (auto-routing) - -**Context:** Collaborative tasks (created from the comments panel) could only be -assigned to a human domain member. This feature adds a virtual "AI Agent" -assignee. When a task is assigned to it, an asynchronous router agent inspects -the task title/description, picks the best-suited specialized agent from a -static registry, runs it against the task's domain, and records the outcome back -on the task (status transitions + audit comments). Only agents that already have -background-task + domain-context wiring are dispatchable: OWL generator, business -rules generator, icon assigner, and the auto SQL mapper. Interactive chat agents -(dtwin chat, ontology assistant, cohort) are intentionally excluded. - -**Changes:** -1. `src/agents/registry.py` — new static `DISPATCHABLE_AGENTS` registry - (`AgentSpec` dataclass + `list_agents()` / `get_agent()`), mirroring the - repo's static agent-discovery convention. The descriptions double as routing - guidance for the router LLM. -2. `src/agents/agent_task_router/` — new single-shot router agent - (`engine.py`, `tools.py`, `__init__.py`). One `call_serving_endpoint` call, - JSON in / JSON out (`{"agent": ..., "reasoning": ...}`); validates the chosen - key against the registry and degrades gracefully on "none"/unknown/unparseable. -3. `src/back/objects/registry/agent_task_runner.py` — new orchestrator. - `start_agent_task()` launches a `TaskManager` background job (`task_router` - type); the worker routes, marks the `domain_tasks` row `in_progress`, - dispatches the chosen agent via the existing domain bridges - (`Ontology.generate_with_agent` / `generate_rules_with_agent` / - `assign_icons_with_agent`, `Mapping.auto_assign_with_agent`), then marks the - task `done` and writes audit comments. Defines the `AI_AGENT_PRINCIPAL` - sentinel (`agent://router`) and `is_ai_agent()`. -4. `src/back/objects/registry/CommentService.py` — `create_task()` triggers the - orchestrator for the AI-agent sentinel and returns `agent_task_id`; - `list_assignees()` now always lists the "AI Agent" first. -5. `src/front/static/global/js/comments-panel.js` — renders the AI Agent option - (robot emoji, "(auto)" suffix) in the assignee picker and, on creation of an - AI-agent task, shows an "AI Agent started" toast and refreshes the background - task tracker. - -**Modified files:** -- `src/agents/registry.py` (new) -- `src/agents/agent_task_router/__init__.py` (new) -- `src/agents/agent_task_router/engine.py` (new) -- `src/agents/agent_task_router/tools.py` (new) -- `src/back/objects/registry/agent_task_runner.py` (new) -- `src/back/objects/registry/CommentService.py` -- `src/front/static/global/js/comments-panel.js` -- `tests/units/agents/test_agent_task_router.py` (new) -- `tests/units/registry/test_agent_task_runner.py` (new) -- `tests/units/registry/test_comment_service.py` -- `docs/architecture.md` - -**Test result:** 2644 passed, 17 skipped, 12 deselected (full PR gate). - -## Fix: no UI entry point to assign a task to the AI Agent - -**Context:** After the feature above, task creation was still only reachable as a -per-comment action ("Create task" on a comment thread). There was no standalone -way to create a task, so assigning one to the AI Agent was effectively hidden — -users reported it was "not possible to assign a task to an AI agent in the UI". - -**Changes:** -1. `src/front/static/global/js/comments-panel.js` — added a "New task" button to - the discussion panel header that opens a standalone task form (title, - assignee picker incl. the AI Agent, optional due date) and posts to - `POST /comments/{folder}/{version}/tasks` with no `comment_id` (already - supported by the backend). Refactored the per-comment task form into shared - `taskFormHtml()` / `wireTaskForm()` / `hideTaskBox()` helpers, reused by both - the per-comment and standalone flows. On success the comment timeline reloads. - -**Modified files:** -- `src/front/static/global/js/comments-panel.js` - -**Test result:** Backend unchanged; full PR gate still 2644 passed, 17 skipped. - -## Fix: AI Agent outcome not visible + task not marked solved - -**Context:** After the AI Agent ran, its outcome was only written to the review -audit log (not the Discussion) and there was no obvious change, so it looked -like nothing happened. Requirement: post the agent's report into the domain -Discussion and mark the task solved when the agent finishes. - -**Changes:** -1. `src/back/objects/registry/agent_task_runner.py` — - - `_dispatch_agent` now returns `(summary, report, result)`; each agent - builds a human-readable markdown `report` (counts, sizes, where to review). - - Replaced the audit-only `_audit` with `_report`, which posts the report as - a real comment in the domain Discussion (threaded under the originating - comment via `_resolve_anchor`, else a domain-level note) AND records the - review-audit row. Used for the success report and for failure messages. - - On success the task is set to `done` (solved); the routing decision is now - folded into the final report instead of a separate audit row. -2. `tests/units/registry/test_agent_task_runner.py` — updated for the 3-tuple - dispatch return and to assert the report is posted as a Discussion comment. - -**Modified files:** -- `src/back/objects/registry/agent_task_runner.py` -- `tests/units/registry/test_agent_task_runner.py` - -**Test result:** 2644 passed, 17 skipped, 12 deselected (full PR gate). - -**Note / follow-up:** the remaining specialized agents produce *proposals* -(ontology draft, business rules, mappings, icons) that are not auto-applied — -the report points the user to the relevant page to review/apply. Also, -AI-Agent-assigned tasks are not yet surfaced in the "My Tasks" worklist -(assignee is the `agent://router` sentinel, not a user email); the status is -persisted correctly and the Discussion shows the outcome. My-Tasks visibility -remains an optional follow-up. - -## Fix: editing tasks routed to the generator (no applied outcome) - -**Context:** An AI Agent task like "evaluate whether the Person class is -necessary / restructure the hierarchy" was routed to the **Ontology Generator**, -which only produced a 13k-char Turtle *draft* and never applied it — so the user -saw a report but the ontology was unchanged. The task was really an *edit* of the -existing ontology, which the **Ontology Assistant** performs in place (and -persists). The generator's scope (whole-ontology from-scratch generation) didn't -match the request, and editing had no dispatch target at all. - -**Changes:** -1. `src/agents/registry.py` — - - Added a new `ontology_assistant` dispatchable agent ("Ontology Assistant") - whose description steers the router to edit/remove/rename/restructure - classes & properties on an existing ontology (changes applied directly). - - Tightened the `owl_generator` description to *whole-ontology, from-scratch* - generation only, explicitly deferring targeted edits to the assistant. -2. `src/back/objects/registry/agent_task_runner.py` — - - `_dispatch_agent` gained a `task_text` argument (task title + description) - and an `ontology_assistant` branch: it runs - `agent_ontology_assistant.run_agent` single-turn with the task as the user - message and, when `ontology_changed`, calls - `Ontology.apply_agent_ontology_changes(...)` which normalizes, prunes orphan - mappings, updates the session ontology and **saves** it — a real, applied - outcome. The Discussion report carries the assistant's reply + new - class/property counts. - - `_run` now passes `task_text` into `_dispatch_agent`. -3. `tests/units/registry/test_agent_task_runner.py` — added coverage for the - assistant branch applying + persisting changes, and for the no-change path. -4. `tests/units/agents/test_agent_task_router.py` — registry assertion now - expects `ontology_assistant`. - -**Modified files:** -- `src/agents/registry.py` -- `src/back/objects/registry/agent_task_runner.py` -- `tests/units/registry/test_agent_task_runner.py` -- `tests/units/agents/test_agent_task_router.py` - -**Test result:** targeted suites green — -`test_agent_task_runner.py` + `test_agent_task_router.py` + -`test_comment_service.py`: 44 passed. Full suite shows 59 pre-existing, -unrelated failures (API endpoint tests) caused by global test-ordering pollution -— each affected file passes in isolation, and the failures reproduce without -these changes. - -## Feature: AI Agent asks clarifying questions before running - -**Context:** AI-Agent tasks ran fire-and-forget — the router picked an agent and -it acted immediately, so a vague or mis-routed task (e.g. "evaluate whether the -Person class is necessary") produced an unwanted result. The AI Agent now -**always confirms scope first**: it posts a short plan + clarifying questions in -the task's Discussion thread, parks itself (`in_progress`), and resumes when the -assignee replies, iterating across multiple rounds until confident before -running the chosen agent. Designed with the brainstorming → writing-plans → -subagent-driven-development flow; spec and plan live under -`docs/superpowers/{specs,plans}/2026-06-18-ai-agent-clarifying-questions*`. -Zero schema change: parked state reuses `in_progress`, the route is re-derived -from the deterministic (temp 0) router each pass, and linkage uses the existing -`comment_id` (a kickoff comment is created for standalone tasks). - -**Changes:** -1. `src/agents/agent_task_planner/` (new: `engine.py`, `__init__.py`, `tools.py`) - — single-shot "ready vs. ask" gate mirroring the router. Returns - `PlanResult{ready, message}`; degrades safe (never `ready` on LLM/parse - failure), so the agent never runs without a human go-ahead. -2. `src/back/objects/registry/agent_task_runner.py` — reworked the background - worker into route → reconstruct thread Q&A (`_thread_history`) → plan → - branch (`_run_for_task`): not ready → post the question and park; ready → - fold the assignee's answers into the agent input (`_fold_answers`) and run. - Added `resume_agent_task` (relaunched on a reply), a `_launch_worker` shared - launcher, and an atomic, leak-free in-process concurrency guard - (`_ACTIVE_TASKS` + `_ACTIVE_LOCK` + `_claim_task`). -3. `src/back/objects/registry/CommentService.py` — `create_task` creates a - domain-level kickoff comment as the thread root for standalone AI-Agent tasks - (warns if it cannot); `add_comment` calls `_maybe_resume_agent`, which resumes - the matching active AI-Agent task when a teammate replies on its thread. -4. `docs/architecture.md` — documented the clarify-then-run loop and added - `agent_task_planner/` to the agents listing. - -**Modified files:** -- `src/agents/agent_task_planner/engine.py` (new) -- `src/agents/agent_task_planner/__init__.py` (new) -- `src/agents/agent_task_planner/tools.py` (new) -- `src/back/objects/registry/agent_task_runner.py` -- `src/back/objects/registry/CommentService.py` -- `tests/units/agents/test_agent_task_planner.py` (new) -- `tests/units/registry/test_agent_task_runner.py` -- `tests/units/registry/test_comment_service.py` -- `docs/architecture.md` - -**Test result:** new + touched suites green — -`test_agent_task_planner.py` (3), `test_agent_task_runner.py` (14), -`test_comment_service.py` (32), plus `tests/units/agents` and -`tests/units/registry` sweeps. The only failures in the registry sweep are 4 -pre-existing `TestLakebaseCollab` cases in `test_registry_store.py` that require -the optional `psycopg` backend (not installed); they reproduce without these -changes. - -## Fix: ontology design tasks no longer dead-end at routing - -**Context:** An AI-Agent task phrased as a design/modeling request (e.g. "create -an Agent Manager") was routed to "none" and hard-failed with "I could not route -this task…", because every dispatchable agent's guidance read as narrow -edit/generate/rules/icons/mapping work and the router treated an unfamiliar -entity name as off-topic. Ontology design is exactly what the Ontology Assistant -does, so these tasks should route there. - -**Changes:** -1. `src/agents/registry.py` — broadened the `ontology_assistant` routing - description to declare it the DEFAULT agent for ontology modeling/design: - create/add/model/design NEW classes/entities/relationships (with an explicit - "create an Agent Manager entity" example) in addition to edits/cleanup, and to - prefer it over the Generator unless the whole ontology is being (re)built. -2. `src/agents/agent_task_router/engine.py` — strengthened the router system - prompt: the ontology IS the domain model, so design/model/create/structure - tasks (and unfamiliar names, likely domain entities) route to the Ontology - Assistant; reserve "none" for work clearly unrelated to the ontology, its - mappings, rules, or icons. -3. `tests/units/agents/test_agent_task_router.py` — added guards that the - Assistant's description advertises design intent and the router prompt treats - the ontology as the domain model and reserves "none" for unrelated tasks. - -**Modified files:** -- `src/agents/registry.py` -- `src/agents/agent_task_router/engine.py` -- `tests/units/agents/test_agent_task_router.py` - -**Test result:** `test_agent_task_router.py` + `test_agent_task_runner.py` → -26 passed. - -## Feature: AI-Agent async status + answer UX in the Discussion pane - -**Context:** When an AI-Agent task ran, its progress was only visible in the -header task-tracker dropdown, and the Discussion offcanvas (the surface where -the task lives) never auto-refreshed — so the agent's clarifying question never -appeared live and there was no obvious way to answer it. The only path was the -generic "Reply" button on the thread root, which works (a reply resumes the -agent) but is undiscoverable. This adds inline progress + a clear answering -affordance, frontend-only, reusing existing endpoints. - -**Changes:** -1. `src/front/static/global/js/comments-panel.js` — added an AI-Agent live-status - layer: - - `loadAiTasks()` reads `/comments/{f}/{v}/tasks`, keying the version's - AI-Agent tasks (`assignee == agent://router`) by their thread-root - `comment_id` to drive per-thread state. - - `loadAgentRuns()` reads `/tasks/` for active `task_router` background runs; - `renderAgentStrip()` shows a top-of-panel progress strip (animated bar + - current step) mirroring the header tracker. - - Per-thread status chip (`agentChipHtml`): working… / waiting for your reply - / queued / done, plus a tinted left edge on AI threads. - - Prominent inline "Answer the AI Agent" box (`agentAnswerHtml`) on parked - (in_progress, not running) threads; sending posts a reply that resumes the - agent. Wired in `bindThreadActions`. - - Live polling (`startPanelPolling`/`panelPollTick`, 4s) while the panel is - open and any AI work is in flight; change-detected re-render via - `listSignature` and deferred while the user is mid-reply (`userIsComposing`) - so an open answer box is never clobbered. Stops when idle and on panel - close. - - `ensureAgentTracking()` kicks the strip + polling after opening a thread, - posting any comment/reply, or creating an AI-Agent task. -2. `src/front/static/global/css/review-modals.css` — styles for the progress - strip (spinning robot + striped bar), the AI thread accent edge, the status - chips (working/waiting/queued/done), and the answer box. - -**Modified files:** -- `src/front/static/global/js/comments-panel.js` -- `src/front/static/global/css/review-modals.css` - -**Test result:** Frontend-only (vanilla JS/CSS, no JS unit-test harness in repo); -no Python/backend code touched. Linter clean on both files. Verified the data -contracts against `CommentService.list_tasks` (DomainTask `assignee`/`status`/ -`comment_id`) and `Task.to_dict` (`task_type="task_router"`, `progress`, `steps`, -`current_step`). - -## Feature: AI-Agent design edits refresh the open pages live - -**Context:** When the Ontology Assistant agent edits and saves the ontology in -place, the open editor pages (ontology designer, mapping) kept showing stale -data until a manual reload. The agent's outcome was visible in the Discussion, -but the model itself wasn't refreshed. This wires a live refresh off the -existing AI-task completion signal — no backend change. - -**Changes:** -1. `src/front/static/global/js/comments-panel.js` — `announceAgentCompletions()` - detects when an AI-Agent task transitions to `done` (transition-guarded: - baselines on first load, fires only on a live change) and dispatches a global - `ontobricks:design-updated` CustomEvent. Snapshot state reset on `openThread`. -2. `src/front/static/ontology/js/ontology-init.js` — listens for - `ontobricks:design-updated`: re-pulls `loadOntologyFromSession()`, refreshes - the navbar status, and re-initialises the active section via - `_initSectionByName(SidebarNav.getActiveSection())` so the designer / map / - entity / relationship views reflect the agent's changes. Version-guarded, so - an unchanged ontology is a no-op for the canvas. -3. `src/front/static/mapping/js/mapping-init.js` — listens for the same event: - re-fetches `/ontology/get-loaded-ontology` into `MappingState.loadedOntology` - and calls `refreshMappingDesign()` + `updateMappingCompletionStatus()`. - -**Modified files:** -- `src/front/static/global/js/comments-panel.js` -- `src/front/static/ontology/js/ontology-init.js` -- `src/front/static/mapping/js/mapping-init.js` - -**Test result:** Frontend-only; `node --check` clean on all three files, linter -clean, no backend code touched. Reuses existing global refresh entry points -(`loadOntologyFromSession`, `_initSectionByName`, `refreshMappingDesign`). - -## Feature: render markdown in the Discussion panel - -**Context:** Comment bodies — especially the AI Agent's rich outcome reports — -are written in markdown but the Discussion offcanvas showed the raw source -(`**bold**`, `_italics_`, `- bullets`, headings). Rendered them as HTML. - -**Changes:** -1. `src/front/static/global/js/comments-panel.js` — added a `renderMarkdown()` - helper that uses the globally-loaded `marked` (same library/options as the - ontology chat assistant: `breaks:true, gfm:true`), with a plain-text + - `
` fallback. `bubble()` now renders the parsed body (tags already - stripped via `parseBody`) through it into a `.oc-text.oc-md` container - instead of escaping it verbatim. -2. `src/front/static/global/css/review-modals.css` — tight, bubble-friendly - styles for rendered markdown (`.oc-md`): paragraph/list/heading spacing, - inline code + code blocks, links, blockquotes, and tables, with - `white-space:normal` so block elements lay out correctly. - -**Modified files:** -- `src/front/static/global/js/comments-panel.js` -- `src/front/static/global/css/review-modals.css` - -**Test result:** Frontend-only; `node --check` + linter clean. `marked` is -already loaded for all pages via `base.html`. - -## Tests: Discussion-panel front-end contract tests - -**Context:** The Discussion-panel work above (AI-Agent async status + answering, -the `ontobricks:design-updated` refresh wiring, and markdown rendering) lives -entirely in static JS/CSS, and the repo has no JS unit-test harness. Added -Python contract tests that fetch the served assets through the app's `/static` -mount and assert the wiring is present — same philosophy as -`tests/units/api/test_ui_rendering.py` — so an accidental removal/rename of a -key hook is caught by CI. - -**Changes:** -1. `tests/units/api/test_discussion_panel_assets.py` (new) — 16 token-level - assertions across four classes: - - `TestDiscussionMarkdownRendering` — `renderMarkdown` via global `marked` - with a plain-text fallback, bubble renders into `.oc-md`, CSS present. - - `TestDiscussionAgentStatus` — `loadAiTasks`/`loadAgentRuns` (`task_router`), - `renderAgentStrip` + `oc-agent-strip`, the polling loop - (`panelPollTick`/`startPanelPolling`/`userIsComposing`), the per-thread - chip (`agentChipHtml`, "waiting for your reply"), and the strip/chip CSS. - - `TestAnswerTheAgent` — the "Answer the AI Agent" box, `data-agent-send` → - `ensureAgentTracking` wiring, and `.oc-agent-answer` CSS. - - `TestDesignUpdatedRefresh` — the panel dispatches - `ontobricks:design-updated` (`announceAgentCompletions`), and the ontology - page (`loadOntologyFromSession` + `_initSectionByName(...)`) and mapping - page (`/ontology/get-loaded-ontology` + `refreshMappingDesign`) listen for - it. - -**Modified files:** -- `tests/units/api/test_discussion_panel_assets.py` (new) - -**Test result:** `pytest tests/units/api/test_discussion_panel_assets.py` → -16 passed. - -## Feature: render markdown in the Domain → Discussions timeline - -**Context:** Markdown rendering was added to the Discussion offcanvas earlier, -but the Domain → Discussions timeline (a separate surface) still showed raw -markdown source for each comment. Rendered it there too for parity. - -**Changes:** -1. `src/front/static/domain/js/domain-collaboration.js` — added a - `renderMarkdown()` helper (same approach as the panel: global `marked` with a - plain-text/`
` fallback) and `timelineEntry()` now renders the parsed body - through it into a `.oc-tl-text.oc-md` container instead of escaping verbatim. -2. `src/front/static/global/css/review-modals.css` — broadened the markdown - white-space reset from `.oc-text.oc-md` to `.oc-md` so it also applies to the - timeline's `.oc-tl-text.oc-md` (which carried `white-space: pre-wrap`). The - Domain page already loads `review-modals.css`, so the shared `.oc-md` block - styles the timeline with no extra assets. -3. `tests/units/api/test_discussion_panel_assets.py` — added - `TestDiscussionTimelineMarkdown` (3 tests): the timeline defines the marked - renderer, `timelineEntry` renders `renderMarkdown(parsed.text)` into `.oc-md`, - and the unscoped `.oc-md` reset is present. - -**Modified files:** -- `src/front/static/domain/js/domain-collaboration.js` -- `src/front/static/global/css/review-modals.css` -- `tests/units/api/test_discussion_panel_assets.py` - -**Test result:** `pytest tests/units/api/test_discussion_panel_assets.py` → -19 passed. `node --check` + linter clean. - -## Change: Discussion panel is a single domain-wide thread (no anchors/tags) - -**Context:** Opening the discussion from the Ontology page showed a header badge -like "Domain · Whole ontology diagram" and separated threads by the selected -anchor (class/property/mapping/graph). Discussions are meant to be about the -Domain as a whole, so the per-anchor separation and the entity/relationship tag -picker were confusing. Unified everything to the Domain. - -**Changes:** -1. `src/front/static/global/js/comments-panel.js`: - - `openThread()` now always opens the Domain thread (`anchorType: 'domain'`, - `anchorRef: ''`) regardless of the caller's anchor hints, so every entry - point (ontology, mapping, graph, domain) shows the same discussion. - - `renderAnchorBadge()` dropped the "kind" badge that separated threads; the - header subtitle now just names the domain (`folder · vX`). - - Removed the entity/relationship tag picker from the compose and reply - boxes; new comments post the raw body (no embedded tag marker). - - Deleted the now-unused tag-input helpers (`tagWidgetHtml`, - `tagSelectOptions`, `setupTagbar`, `addTagChip`, `collectTags`, - `encodeBody`). Kept `TAG_MARK` + `parseBody` + `tagsHtml` so older comments - that embedded tags still display their chips (read-only). `openForSelection` - / `taggableFromOntology` remain as public API but their anchor/taggable - args are now ignored by the panel. -2. `tests/units/api/test_discussion_panel_assets.py` — added - `TestDiscussionDomainScope` (4 tests): opens at the domain anchor, no kind - badge, no tag picker in compose, and no tag encoding on post. - -**Modified files:** -- `src/front/static/global/js/comments-panel.js` -- `tests/units/api/test_discussion_panel_assets.py` - -**Test result:** `pytest tests/units/api/test_discussion_panel_assets.py` → -23 passed. `node --check` + linter clean. diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log deleted file mode 100644 index 1ab9889a..00000000 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log +++ /dev/null @@ -1,141 +0,0 @@ -## Change: Drop the comment `anchor_type` / `anchor_ref` columns - -**Context:** Discussions are now a single domain-wide thread per -`(domain_id, version)` (see the 2026-06-18 "single domain-wide thread" -change). The per-anchor columns on `domain_comments` — `anchor_type` -(class/property/mapping/graph node/edge/domain) and `anchor_ref` — were dead -weight: every row was effectively `('domain', '')` and nothing read them back. -Removed them end-to-end (schema, store, service, API, frontend) and added a -migration to drop them on existing registries. - -**Changes:** -1. `src/back/objects/registry/store/lakebase/schema.sql` — dropped the - `anchor_type` column (and its CHECK), the `anchor_ref` column, and the - `idx_domain_comments_anchor` index; replaced the index with - `idx_domain_comments_lookup (domain_id, version, created_at)` to keep the - domain-thread listing query fast. -2. `src/back/objects/registry/store/lakebase/store.py` — same column/index - changes in the lazy `_ensure_collab_tables()` self-heal DDL; dropped - `anchor_type` / `anchor_ref` from the row mapper, the `insert_comment` - INSERT/RETURNING, and the `list_comments` SELECT + filters. -3. `src/back/objects/registry/store/base.py` — removed the anchor fields from - the `DomainComment` TypedDict and from the `insert_comment` / - `list_comments` abstract signatures + docstrings. -4. `src/back/objects/registry/RegistryService.py` — dropped the anchor params - from the `insert_comment` / `list_comments` pass-through wrappers. -5. `src/back/objects/registry/CommentService.py` — removed the `ANCHOR_TYPES` - constant, the `_validate_anchor_type` / `_norm_anchor_type` validators, and - the anchor params from `add_comment` / `list_comments` and the AI-Agent - kickoff-comment insert. -6. `src/api/routers/internal/comments.py` — removed the `anchor_type` / - `anchor_ref` query params (GET) and body fields (POST). -7. `src/back/objects/registry/agent_task_runner.py` — replaced `_resolve_anchor` - (returned `(anchor_type, anchor_ref, parent_id)`) with - `_resolve_thread_parent` (returns just the parent comment id); the agent - report no longer passes anchors. -8. `src/front/static/global/js/comments-panel.js` — stopped sending - `anchor_type` / `anchor_ref` to the `/comments` API (GET query + POST body); - trimmed `ctx` to `{ folder, version }`; removed the `ANCHOR_LABELS` map and - the public `anchorLabel()` helper; `openForSelection` now ignores its legacy - anchor args. -9. `src/front/static/domain/js/domain-collaboration.js` — the Discussions - timeline no longer renders the anchor "kind" badge or `data-anchor-*` - attributes; `openThreadFor()` opens the domain thread with no anchor; removed - the now-unused `localName()` helper. -10. `scripts/upgrade_lakebase_0.6_drop_comment_anchor.sql` (new) — destructive, - idempotent migration: drops `idx_domain_comments_anchor`, drops the two - anchor columns (the CHECK drops with `anchor_type`), and creates - `idx_domain_comments_lookup`. Comment bodies/authors/threading/resolved - state are untouched. -11. `scripts/bootstrap-lakebase-perms.sh` — owner-provision DDL aligned to the - anchorless `domain_comments` shape + new lookup index. -12. `docs/architecture.md` — updated the `domain_comments` table row to describe - the domain-wide thread. -13. Tests — updated `tests/units/registry/test_registry_store.py`, - `tests/units/registry/test_comment_service.py`, - `tests/units/api/test_comment_endpoints.py`, and - `tests/units/api/test_discussion_panel_assets.py` to drop anchor params / - assertions (e.g. the per-anchor filter tests become whole-thread tests; the - panel test now asserts no anchor fields are sent). - -**Modified files:** -- `src/back/objects/registry/store/lakebase/schema.sql` -- `src/back/objects/registry/store/lakebase/store.py` -- `src/back/objects/registry/store/base.py` -- `src/back/objects/registry/RegistryService.py` -- `src/back/objects/registry/CommentService.py` -- `src/api/routers/internal/comments.py` -- `src/back/objects/registry/agent_task_runner.py` -- `src/front/static/global/js/comments-panel.js` -- `src/front/static/domain/js/domain-collaboration.js` -- `scripts/upgrade_lakebase_0.6_drop_comment_anchor.sql` (new) -- `scripts/bootstrap-lakebase-perms.sh` -- `docs/architecture.md` -- `tests/units/registry/test_registry_store.py` -- `tests/units/registry/test_comment_service.py` -- `tests/units/api/test_comment_endpoints.py` -- `tests/units/api/test_discussion_panel_assets.py` - -**Test result:** `pytest tests/units/registry/test_comment_service.py -tests/units/api/test_comment_endpoints.py -tests/units/registry/test_agent_task_runner.py -tests/units/api/test_discussion_panel_assets.py` → all passed. The -`TestLakebaseCollab` cases in `test_registry_store.py` require the optional -`psycopg` extra (not installed in this env) and are skipped/failing for that -reason only — unrelated to this change. - ---- - -## Change: Fix AI-Agent "unmap" misfire — guard removal + persist mappings - -**Context:** A task "unmap Customer" assigned to the AI Agent was routed to the -Auto SQL Mapper (`auto_assignment`), which then "unmapped Person and other -relationships, re-included already-excluded entities, and after a page reload no -changes were there". Root cause was two compounding defects in the -`agent_task_runner` dispatch: -1. The mapper is **additive-only** — it has no "remove/unmap" operation — yet a - removal request silently triggered a full-ontology re-map. The dispatch also - never passed the task text, so the user's intent was discarded. -2. The `auto_assignment` branch only **proposed** mappings (it called the bare - `auto_assign_with_agent` and returned them in the payload) and never applied - them, so nothing was persisted — a reload reverted everything. (Contrast - `ontology_assistant`, which calls `apply_agent_ontology_changes` to save.) - -Fix per the chosen "guard-and-persist" direction: (a) refuse removal/unmap -requests routed to the mapper and park the task for a rephrase; (b) when the -mapper does run, merge + persist its mappings to the registry, preserving any -existing `excluded` flag so a re-map never re-includes an excluded entity. - -**Changes:** -1. `src/back/objects/registry/agent_task_runner.py` — added `_MAPPING_REMOVAL_RE` - + `_is_unsupported_mapping_removal()`; `_run_for_task` now short-circuits - (before planning/dispatch) when the chosen agent is `auto_assignment` and the - task asks to unmap/remove/exclude a mapping, posting a helpful note and - parking the task (`in_progress`) so a rephrase can resume it. The - `auto_assignment` dispatch branch now calls `mapping_svc.apply_agent_mappings` - to persist, and reports "Applied SQL mappings" with the post-merge totals - instead of "Proposed … review and save them". -2. `src/back/objects/mapping/Mapping.py` — added `apply_agent_mappings()` - (session-less persist: merge into `domain.assignment` + `domain.save()`) and - extracted the upsert logic into reusable static helpers - `_merge_entity_mappings` / `_merge_relationship_mappings` (keyed by class - URI / `property`, preserving `excluded`); `save_mappings_to_session` now - reuses those helpers (dedupe). -3. Tests — `tests/units/registry/test_agent_task_runner.py`: added - `test_is_unsupported_mapping_removal_detects_removal_intent`, - `test_run_for_task_refuses_unmap_and_parks`, and - `test_dispatch_auto_assignment_persists_mappings`. - `tests/units/mapping/test_mapping_service.py`: added `TestApplyAgentMappings` - (add+persist, upsert-by-URI, excluded-flag preservation, None payloads). - -**Modified files:** -- `src/back/objects/registry/agent_task_runner.py` -- `src/back/objects/mapping/Mapping.py` -- `tests/units/registry/test_agent_task_runner.py` -- `tests/units/mapping/test_mapping_service.py` - -**Test result:** `pytest tests/units/registry/test_agent_task_runner.py -tests/units/mapping/test_mapping_service.py` → 63 passed. Full -`pytest tests/units` → 2408 passed, 15 skipped, 4 failed; the 4 failures are the -`TestLakebaseCollab` cases that need the optional `psycopg` extra (not installed -in this env) — unrelated to this change. diff --git a/docs/architecture.md b/docs/architecture.md index 4f64aefc..07cbaa33 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -446,13 +446,10 @@ src/ │ ├── llm_utils.py # Shared LLM call with retry (429/503 backoff) │ ├── serialization.py # Agent serialization utilities │ ├── tracing.py # MLflow tracing setup & decorators -│ ├── registry.py # Static registry of router-dispatchable agents │ ├── tools/ # Shared agent tools (ontology, mapping, metadata, SQL, etc.) │ ├── agent_owl_generator/ # OWL ontology generation agent │ ├── agent_auto_assignment/ # Entity/relationship → SQL mapping agent │ ├── agent_auto_icon_assign/ # Emoji icon mapping agent -│ ├── agent_task_router/ # Routes an AI-Agent task to the right agent -│ ├── agent_task_planner/ # Gates an AI-Agent task: ask clarifying questions vs. run │ └── agent_ontology_assistant/ # Conversational assistant + ResponsesAgent wrapper │ └── mcp-server/ # MCP Server (separate Databricks App) @@ -598,7 +595,6 @@ Long-running operations use the **TaskManager** pattern (`src/back/core/task_man | `triplestore_sync` | Digital Twin → Build | Generates and writes triples to Delta and the configured Graph DB engine (Lakebase) | | `quality_checks` | Digital Twin → Quality | Runs all quality checks sequentially with per-check progress | | `auto_assign` | Mapping → Auto-Map | Batch-maps entities and relationships via LLM; splits large jobs into chunks of `AUTO_ASSIGN_CHUNK_SIZE` with cooldown between chunks to avoid rate limits | -| `task_router` | Collaborative task assigned to the **AI Agent** | Routes the task, then confirms scope with the assignee (clarifying questions) before dispatching the chosen agent against the task's domain (see [AI Agent task assignment](#ai-agent-task-assignment)) | **How it works:** 1. Frontend sends a `POST` to start the task; backend creates a `TaskManager` task and spawns a `threading.Thread` @@ -607,71 +603,6 @@ Long-running operations use the **TaskManager** pattern (`src/back/core/task_man 4. On completion, the task result is returned to the frontend, which saves mappings and updates the UI 5. If the user navigates away and returns, the frontend resumes monitoring from `sessionStorage` -### AI Agent task assignment - -Collaborative tasks (created from the comments panel) can be assigned to a -virtual **AI Agent** instead of a human teammate. The AI Agent is a sentinel -principal (`agent://router`, defined in -`src/back/objects/registry/agent_task_runner.py`) that `CommentService.list_assignees` -always offers first in the assignee picker. - -When a task is created with this assignee, `CommentService.create_task` launches -a `task_router` background job. To keep the AI Agent from acting on a vague -request, it **always confirms scope before running** — the job runs a -clarify-then-run loop driven by the task's Discussion thread: - -1. **Route** — `agents/agent_task_router` (a single-shot LLM classifier) reads - the task title/description and the static registry of dispatchable agents - (`src/agents/registry.py`) and returns the best-matching agent key. The router - runs at temperature 0, so re-running it on each pass yields the same agent - (the route is effectively *locked*; no key is persisted). -2. **Plan** — the orchestrator marks the `domain_tasks` row `in_progress`, - reconstructs the clarification Q&A from the task's comment thread, and runs - `agents/agent_task_planner`. The planner returns `ready` only once the - assignee has replied with enough to proceed; on the first pass (no replies) - it always posts a short plan + clarifying question and the job parks, leaving - the task `in_progress`. -3. **Resume** — when the assignee replies on the thread, - `CommentService.add_comment` calls `resume_agent_task`, which relaunches the - same worker. It re-plans against the now-richer thread and either asks another - question (multi-round) or proceeds. -4. **Run** — once the planner is `ready`, the chosen agent runs against the - task's domain session (the **Ontology Assistant** edits and *saves* the - ontology in place; the others produce proposals via the existing domain - bridges). The task is marked `done` and the outcome is posted to the thread. - Failures leave the task with an explanatory comment. - -Linkage uses the thread root: every AI-Agent task has a `comment_id` (the -originating comment, or a **kickoff comment** created for standalone tasks). An -in-process guard (`_ACTIVE_TASKS` + a lock) prevents a reply from starting a -second concurrent run for the same task. - -**Discussion pane UI** (`comments-panel.js`): while the offcanvas is open it -polls `/comments/{f}/{v}/tasks` and `/tasks/` (every 4s, only while AI work is in -flight) so the agent's question and outcome appear live. An AI-Agent task thread -shows a status chip — *working…* / **waiting for your reply** / *queued* / -*done* — driven by the `domain_tasks` status plus any active `task_router` -background run. A top-of-panel progress strip mirrors the header task-tracker -(animated bar + current step) for the active run. When a task is parked, the -thread renders a prominent **"Answer the AI Agent"** box; sending it posts a -reply that triggers `resume_agent_task`. Re-renders are change-detected and -deferred while the user is typing so an open answer box is never lost. - -When the panel observes an AI-Agent task transition to `done`, it dispatches a -global `ontobricks:design-updated` event (transition-guarded so it never fires -on initial paint). Design-consuming pages subscribe and pull the agent's saved -changes live: the **ontology page** (`ontology-init.js`) re-runs -`loadOntologyFromSession()` and re-initialises the active section -(`_initSectionByName`), so the designer/map reflect the new model; the -**mapping page** (`mapping-init.js`) re-fetches the loaded ontology into -`MappingState` and redraws. This is the mechanism that keeps the *Ontology -Assistant*'s in-place edits visible without a manual reload. - -Dispatchable agents: `ontology_assistant` (in-place ontology edits, applied), -`owl_generator`, `business_rules_generator`, `icon_assign`, `auto_assignment`. -Interactive chat agents (dtwin chat, cohort) are excluded because they need a -live conversation rather than a one-shot task. - ### Scheduled Builds (BuildScheduler) The **BuildScheduler** (`src/back/objects/registry/scheduler.py`) provides per-domain scheduled triple store builds using APScheduler's `BackgroundScheduler`. Schedule definitions are persisted in `.global_config.json` on the UC Volume alongside other instance-level settings. @@ -777,9 +708,6 @@ relational tables: | `schedules` | Active scheduled-build configuration | | `schedule_runs` | Ring-buffered run history per domain | | `build_runs` | Append-only build-run trace (all paths) keyed by `(domain_id, version)` for analytics; active build = latest successful run | -| `domain_review_events` | Append-only review/validation audit log (submit / sign-off / publish / reopen / comment) keyed by `(domain_id, version)` | -| `domain_comments` | Domain-wide threaded discussion keyed by `(domain_id, version)`; `parent_id` links replies, `resolved` closes a thread | -| `domain_tasks` | Personalised work items assigned to a teammate (usually born from a comment); `status` walks `open → in_progress → done` (or `cancelled`), surfaced in the assignee's "My Tasks" worklist | Authentication is fully app-managed: the Databricks Apps runtime injects `PGHOST`/`PGPORT`/`PGDATABASE`/`PGUSER` and OntoBricks mints a diff --git a/docs/superpowers/plans/2026-06-18-ai-agent-clarifying-questions.md b/docs/superpowers/plans/2026-06-18-ai-agent-clarifying-questions.md deleted file mode 100644 index 61fa7319..00000000 --- a/docs/superpowers/plans/2026-06-18-ai-agent-clarifying-questions.md +++ /dev/null @@ -1,994 +0,0 @@ -# AI Agent Clarifying Questions Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Make an AI-Agent task post a plan + clarifying questions in its Discussion thread, park itself, and resume automatically when the assignee replies, iterating until confident before running the chosen specialized agent. - -**Architecture:** A new single-shot `agent_task_planner` LLM decides "ready vs ask". The `agent_task_runner` background worker does route -> reconstruct thread history -> plan -> branch (ask again, or dispatch the agent). A resume hook in `CommentService.add_comment` relaunches the worker when a human replies on a parked AI-Agent task thread. Zero schema change: the parked state reuses `in_progress`, linkage uses the existing `comment_id` (a kickoff comment is created for standalone tasks), and the deterministic router is re-run on each pass. - -**Tech Stack:** Python 3.11, FastAPI, the OntoBricks agent engine (`agents.engine_base.call_serving_endpoint`), `TaskManager` background jobs, pytest. - ---- - -## File structure - -| File | Responsibility | -|------|----------------| -| `src/agents/agent_task_planner/engine.py` (new) | Single-shot LLM: given task + chosen agent + Q&A history, return `PlanResult{ready, message}` | -| `src/agents/agent_task_planner/__init__.py` (new) | Re-export `run_agent`, `PlanResult` | -| `src/agents/agent_task_planner/tools.py` (new) | Empty tool tables (consistency with other agents) | -| `src/back/objects/registry/agent_task_runner.py` (modify) | Plan-or-run worker, thread-history reconstruction, `resume_agent_task`, concurrency guard, answer fold-in | -| `src/back/objects/registry/CommentService.py` (modify) | Kickoff comment for standalone AI tasks; resume hook in `add_comment` | -| `tests/units/agents/test_agent_task_planner.py` (new) | Planner ready/ask + degradation | -| `tests/units/registry/test_agent_task_runner.py` (modify) | Plan/park/resume/run + history reconstruction + guard | -| `tests/units/registry/test_comment_service.py` (modify) | Kickoff comment + resume-hook trigger conditions | - ---- - -### Task 1: `agent_task_planner` agent - -Mirrors `src/agents/agent_task_router/` (single-shot, JSON in/out). Decides whether the AI Agent has enough to act, or must ask the assignee more. - -**Files:** -- Create: `src/agents/agent_task_planner/engine.py` -- Create: `src/agents/agent_task_planner/__init__.py` -- Create: `src/agents/agent_task_planner/tools.py` -- Test: `tests/units/agents/test_agent_task_planner.py` - -- [ ] **Step 1: Write the failing test** - -```python -# tests/units/agents/test_agent_task_planner.py -"""Unit tests for the task-planner agent (ready vs. ask decision).""" -from __future__ import annotations - -from unittest.mock import patch - -from agents.agent_task_planner import PlanResult, run_agent -from agents.registry import get_agent - - -def _spec(): - return get_agent("ontology_assistant") - - -def _llm(content: str): - return {"choices": [{"message": {"content": content}}], "usage": {}} - - -def test_first_turn_asks_when_no_answers(): - with patch( - "agents.agent_task_planner.engine.call_serving_endpoint", - return_value=_llm('{"ready": false, "message": "Plan: remove Person? Confirm scope."}'), - ): - res = run_agent( - "h", "t", "ep", - task_title="Is Person needed?", - task_description="", - agent=_spec(), - history=[], - ) - assert isinstance(res, PlanResult) - assert res.success is True - assert res.ready is False - assert "Plan" in res.message - - -def test_ready_when_user_approved(): - history = [ - {"role": "assistant", "text": "Shall I remove Person?"}, - {"role": "user", "text": "yes go ahead"}, - ] - with patch( - "agents.agent_task_planner.engine.call_serving_endpoint", - return_value=_llm('{"ready": true, "message": "Running now."}'), - ): - res = run_agent( - "h", "t", "ep", - task_title="Is Person needed?", - task_description="", - agent=_spec(), - history=history, - ) - assert res.success is True - assert res.ready is True - - -def test_unparseable_response_degrades_to_ask(): - with patch( - "agents.agent_task_planner.engine.call_serving_endpoint", - return_value=_llm("not json at all"), - ): - res = run_agent( - "h", "t", "ep", - task_title="x", task_description="", agent=_spec(), history=[], - ) - # Degrade safe: never auto-run on a parse failure. - assert res.ready is False - assert res.error -``` - -- [ ] **Step 2: Run test to verify it fails** - -Run: `python -m pytest tests/units/agents/test_agent_task_planner.py -q` -Expected: FAIL with `ModuleNotFoundError: No module named 'agents.agent_task_planner'` - -- [ ] **Step 3: Write `tools.py`** - -```python -# src/agents/agent_task_planner/tools.py -"""The planner is single-shot and uses no tools (kept for package symmetry).""" -from __future__ import annotations - -from typing import Callable, Dict, List - -TOOL_DEFINITIONS: List[dict] = [] -TOOL_HANDLERS: Dict[str, Callable] = {} -``` - -- [ ] **Step 4: Write `engine.py`** - -```python -# src/agents/agent_task_planner/engine.py -""" -Task Planner agent engine. - -Single-shot gate that runs BEFORE a specialized agent does any work. Given the -task, the agent already chosen by the router, and the clarification Q&A so far -(reconstructed from the Discussion thread), the LLM decides whether it has -enough to act confidently (``ready=true``) or must ask the assignee more -(``ready=false`` + a short plan/question ``message``). JSON in / JSON out. -""" -from __future__ import annotations - -import json -import re -from dataclasses import dataclass, field -from typing import Callable, Dict, List, Optional - -from agents.engine_base import ( - AgentStep, - accumulate_usage, - call_serving_endpoint, - extract_message_content, -) -from agents.registry import AgentSpec -from agents.tracing import trace_agent -from back.core.logging import get_logger - -logger = get_logger(__name__) - -LLM_TIMEOUT = 60 -_TRACE_NAME = "task_planner" - - -@dataclass -class PlanResult: - """Outcome of a single planning turn.""" - - success: bool - ready: bool = False - message: str = "" - steps: List[AgentStep] = field(default_factory=list) - iterations: int = 0 - error: str = "" - usage: Dict[str, int] = field(default_factory=dict) - - -_SYSTEM_PROMPT = """\ -You are the Task Planner for OntoBricks. A teammate assigned a work item to the -"AI Agent", and a specialized agent has already been selected to carry it out. -Before that agent runs, you confirm scope with the teammate. - -You are given: the task, the selected agent's purpose, and the conversation so -far (your earlier questions and the teammate's replies, if any). - -RULES -- On the FIRST turn (no teammate replies yet) you are NOT ready: briefly state - what you will do and ask any clarifying question(s) needed to act safely. -- Mark ready=true ONLY once the teammate has replied with enough to proceed - (an approval or the missing detail). When unsure, ask one more focused - question rather than guessing. -- Keep messages short and concrete. No code fences. -- Reply with ONLY a JSON object: - {"ready": , "message": ""} -""" - - -def _build_user_prompt( - task_title: str, - task_description: str, - agent: AgentSpec, - history: List[dict], -) -> str: - lines = [ - f"SELECTED AGENT: {agent.label} — {agent.description}", - "", - f"TASK TITLE: {task_title}", - ] - if task_description: - lines.append(f"TASK DESCRIPTION: {task_description}") - lines.append("") - if history: - lines.append("CONVERSATION SO FAR:") - for turn in history: - who = "AI Agent" if turn.get("role") == "assistant" else "Teammate" - lines.append(f"- {who}: {turn.get('text', '')}") - else: - lines.append("CONVERSATION SO FAR: (none yet — this is the first turn)") - lines.append("") - lines.append('Respond with the JSON object: {"ready": ..., "message": "..."}') - return "\n".join(lines) - - -def _parse_plan(text: str) -> Optional[dict]: - """Extract the ``{"ready": ..., "message": ...}`` object from LLM text.""" - cleaned = (text or "").strip() - fence = re.search(r"```(?:json)?\s*([\s\S]*?)```", cleaned) - if fence: - cleaned = fence.group(1).strip() - for candidate in (cleaned, None): - if candidate is None: - brace = re.search(r"\{[\s\S]*\}", cleaned) - candidate = brace.group(0) if brace else None - if not candidate: - continue - try: - obj = json.loads(candidate) - if isinstance(obj, dict): - return obj - except json.JSONDecodeError: - continue - return None - - -@trace_agent(name="task_planner") -def run_agent( - host: str, - token: str, - endpoint_name: str, - *, - task_title: str, - task_description: str, - agent: AgentSpec, - history: List[dict], - on_step: Optional[Callable[[str], None]] = None, -) -> PlanResult: - """Decide whether to run the selected agent now or ask the teammate more. - - ``history`` is the ordered clarification Q&A: ``[{"role": "assistant"|"user", - "text": str}, ...]``. ``success`` is ``True`` when the LLM replied parseably; - ``ready`` gates the actual run. On any failure ``ready`` stays ``False`` so - the agent never runs without a confident go-ahead. - """ - result = PlanResult(success=False) - - if on_step: - on_step("Reviewing the task scope...") - - messages = [ - {"role": "system", "content": _SYSTEM_PROMPT}, - { - "role": "user", - "content": _build_user_prompt( - task_title, task_description, agent, history - ), - }, - ] - - result.iterations = 1 - try: - llm_response = call_serving_endpoint( - host, - token, - endpoint_name, - messages, - max_tokens=512, - temperature=0.0, - timeout=LLM_TIMEOUT, - trace_name=_TRACE_NAME, - ) - except Exception as exc: # noqa: BLE001 - result.error = f"Planner LLM request failed: {exc}" - logger.error("task_planner: %s", result.error) - return result - - accumulate_usage(result.usage, llm_response.get("usage", {})) - content = extract_message_content(llm_response) - result.steps.append(AgentStep(step_type="output", content=content[:500])) - - plan = _parse_plan(content) - if not plan: - result.error = "Planner returned an unparseable response" - result.message = ( - "I need a bit more detail before I proceed — could you clarify the " - "scope of this task?" - ) - logger.warning("task_planner: unparseable response: %s", content[:200]) - return result - - result.success = True - result.ready = bool(plan.get("ready", False)) - result.message = str(plan.get("message", "")).strip() - logger.info("task_planner: ready=%s", result.ready) - return result -``` - -- [ ] **Step 5: Write `__init__.py`** - -```python -# src/agents/agent_task_planner/__init__.py -from agents.agent_task_planner.engine import PlanResult, run_agent # noqa: F401 - -__all__ = ["run_agent", "PlanResult"] -``` - -- [ ] **Step 6: Run tests to verify they pass** - -Run: `python -m pytest tests/units/agents/test_agent_task_planner.py -q` -Expected: PASS (3 passed) - -- [ ] **Step 7: Commit** - -```bash -git add src/agents/agent_task_planner tests/units/agents/test_agent_task_planner.py -git commit -m "feat(agents): add task-planner agent (ready vs. ask gate)" -``` - ---- - -### Task 2: Plan-or-run worker + resume in `agent_task_runner` - -Rework the background worker so it routes, reconstructs the thread Q&A, calls the planner, and either parks (posts a question, stays `in_progress`) or runs the chosen agent. Add `resume_agent_task` (same worker, relaunched on a reply) and an in-process guard so a reply can't start a second concurrent run. - -**Files:** -- Modify: `src/back/objects/registry/agent_task_runner.py` -- Test: `tests/units/registry/test_agent_task_runner.py` - -- [ ] **Step 1: Write the failing tests** (append to the existing test module) - -```python -# tests/units/registry/test_agent_task_runner.py (additions) -def _svc_with_thread(thread): - """Service double whose list_comments returns *thread* (list of dicts).""" - svc, statuses, comments = _fake_svc() - svc.list_comments.return_value = thread - return svc, statuses, comments - - -def test_first_pass_parks_with_plan_and_stays_in_progress(monkeypatch): - svc, statuses, comments = _svc_with_thread( - [{"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "Is Person needed?", "created_at": "t0", - "anchor_type": "domain", "anchor_ref": ""}] - ) - router_res = SimpleNamespace(success=True, chosen_agent_key="ontology_assistant", - reasoning="edit", error="") - plan_res = SimpleNamespace(success=True, ready=False, - message="Plan: remove Person? Confirm.", error="") - monkeypatch.setattr("agents.agent_task_router.run_agent", lambda *a, **k: router_res) - monkeypatch.setattr("agents.agent_task_planner.run_agent", lambda *a, **k: plan_res) - dispatched = [] - monkeypatch.setattr(runner, "_dispatch_agent", - lambda *a, **k: dispatched.append(k) or ("s", "r", {})) - - runner._run_for_task( - svc=svc, domain=MagicMock(), host="h", token="t", llm_endpoint="ep", - warehouse_id="", folder="d", version="v", domain_task_id="T1", - title="Is Person needed?", description="", comment_id="root", - on_step=lambda m: None, tm=None, tm_task_id=None, - ) - - assert dispatched == [] # agent did NOT run - assert "in_progress" in statuses # parked - assert any("Plan: remove Person?" in c for c in comments) - - -def test_resume_runs_agent_when_planner_ready(monkeypatch): - svc, statuses, comments = _svc_with_thread([ - {"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "Is Person needed?", "created_at": "t0", - "anchor_type": "domain", "anchor_ref": ""}, - {"id": "q1", "parent_id": "root", "author": "AI Agent", - "body": "Remove Person?", "created_at": "t1", - "anchor_type": "domain", "anchor_ref": ""}, - {"id": "a1", "parent_id": "root", "author": "alice@x.io", - "body": "yes remove it", "created_at": "t2", - "anchor_type": "domain", "anchor_ref": ""}, - ]) - router_res = SimpleNamespace(success=True, chosen_agent_key="ontology_assistant", - reasoning="edit", error="") - plan_res = SimpleNamespace(success=True, ready=True, message="Running now.", error="") - monkeypatch.setattr("agents.agent_task_router.run_agent", lambda *a, **k: router_res) - monkeypatch.setattr("agents.agent_task_planner.run_agent", lambda *a, **k: plan_res) - captured = {} - monkeypatch.setattr( - runner, "_dispatch_agent", - lambda key, **k: captured.update(k) or ("updated", "Removed Person.", {}), - ) - - runner._run_for_task( - svc=svc, domain=MagicMock(), host="h", token="t", llm_endpoint="ep", - warehouse_id="", folder="d", version="v", domain_task_id="T1", - title="Is Person needed?", description="", comment_id="root", - on_step=lambda m: None, tm=None, tm_task_id=None, - ) - - assert statuses[-1] == "done" # solved - assert "yes remove it" in captured["task_text"] # answer folded in - assert any("Removed Person." in c for c in comments) - - -def test_thread_history_maps_authors_to_roles(): - svc, _, _ = _svc_with_thread([ - {"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "do X", "created_at": "t0"}, - {"id": "q1", "parent_id": "root", "author": "AI Agent", - "body": "clarify?", "created_at": "t1"}, - {"id": "a1", "parent_id": "root", "author": "alice@x.io", - "body": "answer", "created_at": "t2"}, - {"id": "other", "parent_id": "elsewhere", "author": "bob@x.io", - "body": "unrelated", "created_at": "t3"}, - ]) - hist = runner._thread_history(svc, "d", "v", "root") - assert [h["role"] for h in hist] == ["user", "assistant", "user"] - assert hist[1]["text"] == "clarify?" - assert all(h["text"] != "unrelated" for h in hist) # other thread excluded - - -def test_resume_skips_when_already_running(monkeypatch): - runner._ACTIVE_TASKS.add("T1") - try: - started = runner.resume_agent_task( - svc=MagicMock(), domain=MagicMock(), settings=MagicMock(), - folder="d", version="v", task={"id": "T1", "comment_id": "root", - "title": "x", "description": ""}, - ) - finally: - runner._ACTIVE_TASKS.discard("T1") - assert started is None -``` - -- [ ] **Step 2: Run tests to verify they fail** - -Run: `python -m pytest tests/units/registry/test_agent_task_runner.py -q` -Expected: FAIL with `AttributeError: module ... has no attribute '_run_for_task'` (and `_thread_history`, `resume_agent_task`, `_ACTIVE_TASKS`). - -- [ ] **Step 3: Add the module-level guard + imports** (top of `agent_task_runner.py`, after `AI_AGENT_LABEL`) - -```python -# In-process guard: domain_task ids with a background pass currently running. -# Prevents a reply from launching a second concurrent run for the same task. -# (Single-process app; reset on restart, which is fine — a stale entry only -# delays one resume.) -_ACTIVE_TASKS: set[str] = set() -``` - -- [ ] **Step 4: Replace the `_run` worker with route -> history -> plan -> branch** - -Replace the entire body of `_run(...)` (the `try/except` block) so it delegates to a shared `_run_for_task`, and add `_run_for_task`, `_thread_history`, and `_fold_answers`: - -```python -def _run( - task: Any, - *, - svc: Any, - domain: Any, - host: str, - token: str, - llm_endpoint: str, - warehouse_id: str, - folder: str, - version: str, - domain_task_id: str, - title: str, - description: str, - comment_id: str, -) -> None: - """TaskManager entry point: delegate to the shared plan-or-run worker.""" - from back.core.task_manager import get_task_manager - - tm = get_task_manager() - try: - _run_for_task( - svc=svc, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - folder=folder, version=version, domain_task_id=domain_task_id, - title=title, description=description, comment_id=comment_id, - on_step=lambda m: tm.update_progress(task.id, task.progress, m), - tm=tm, tm_task_id=task.id, - ) - finally: - _ACTIVE_TASKS.discard(domain_task_id) - - -def _run_for_task( - *, - svc: Any, - domain: Any, - host: str, - token: str, - llm_endpoint: str, - warehouse_id: str, - folder: str, - version: str, - domain_task_id: str, - title: str, - description: str, - comment_id: str, - on_step: Callable[[str], None], - tm: Any, - tm_task_id: Optional[str], -) -> None: - """Route, reconstruct the thread Q&A, plan, then ask-again or run the agent. - - ``tm``/``tm_task_id`` are the optional TaskManager handle for progress; the - worker is fully functional without them (used directly in tests). - """ - from agents.agent_task_planner import run_agent as run_planner - from agents.agent_task_router import run_agent as run_router - from agents.registry import get_agent, list_agents - - def _tm(method: str, *args: Any) -> None: - if tm is not None and tm_task_id is not None: - getattr(tm, method)(tm_task_id, *args) - - try: - _tm("start_task", "Selecting the right agent...") - - # 1) Route (deterministic — same choice on every pass => locked route). - router_result = run_router( - host, token, llm_endpoint, - task_title=title, task_description=description, - available_agents=list_agents(), on_step=on_step, - ) - if not router_result.success or not router_result.chosen_agent_key: - reason = router_result.error or "No suitable agent for this task" - _tm("fail_task", reason) - _report(svc, folder, version, domain_task_id, comment_id, - body=f"**AI Agent**\n\nI could not route this task: {reason}", - event="agent_failed") - return - spec = get_agent(router_result.chosen_agent_key) - if spec is None: - _tm("fail_task", "Router chose an unknown agent") - return - - # 2) Plan against the conversation reconstructed from the thread. - _set_status(svc, folder, domain_task_id, "in_progress") - history = _thread_history(svc, folder, version, comment_id) - plan = run_planner( - host, token, llm_endpoint, - task_title=title, task_description=description, - agent=spec, history=history, on_step=on_step, - ) - - # 3a) Not ready -> post the plan/question and park (stay in_progress). - if not plan.ready: - question = plan.message or ( - "Could you clarify the scope of this task before I proceed?" - ) - _report(svc, folder, version, domain_task_id, comment_id, - body=f"**AI Agent — {spec.label}**\n\n{question}", - event="agent_progress") - _tm("complete_task", {"agent": spec.key, "state": "waiting_input"}, - "Waiting for your reply") - return - - # 3b) Ready -> run the chosen agent with the answers folded in. - _tm("advance_step", f"Running {spec.label}...") - task_text = _fold_answers(title, description, history) - summary, report, result = _dispatch_agent( - spec.key, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - task_text=task_text, on_step=on_step, - ) - _tm("advance_step", "Recording the result...") - _set_status(svc, folder, domain_task_id, "done") - body = f"**AI Agent — {spec.label}**\n\n" - if router_result.reasoning: - body += f"_Why this agent:_ {router_result.reasoning}\n\n" - body += report - _report(svc, folder, version, domain_task_id, comment_id, - body=body, event="task_done") - _tm("complete_task", - {"agent": spec.key, "agent_label": spec.label, **result}, summary) - except Exception as exc: # noqa: BLE001 - logger.exception("agent_task_runner: task %s crashed", domain_task_id) - _tm("fail_task", f"AI Agent run failed: {exc}") - _report(svc, folder, version, domain_task_id, comment_id, - body=f"**AI Agent**\n\nThe run failed: {exc}", - event="agent_failed") - - -def _thread_history( - svc: Any, folder: str, version: str, root_comment_id: str -) -> list[dict]: - """Reconstruct the ordered clarification Q&A from the task's thread. - - The thread is the root comment (``root_comment_id``) plus its direct replies, - ordered by ``created_at``. The AI Agent's own comments map to ``assistant``; - everyone else maps to ``user``. - """ - if not root_comment_id: - return [] - try: - comments = list(svc.list_comments(folder, version)) - except Exception as exc: # noqa: BLE001 - logger.debug("agent_task_runner: thread read skipped: %s", exc) - return [] - rid = str(root_comment_id) - thread = [ - c for c in comments - if str(c.get("id")) == rid or str(c.get("parent_id") or "") == rid - ] - thread.sort(key=lambda c: str(c.get("created_at") or "")) - history: list[dict] = [] - for c in thread: - role = "assistant" if (c.get("author") or "") == AI_AGENT_LABEL else "user" - history.append({"role": role, "text": (c.get("body") or "").strip()}) - return history - - -def _fold_answers(title: str, description: str, history: list[dict]) -> str: - """Build the agent input from the task plus the teammate's answers.""" - parts = [title] - if description: - parts.append(description) - answers = [h["text"] for h in history if h["role"] == "user" and h["text"]] - # Drop the first 'user' turn — it is the task statement itself, already above. - extra = answers[1:] if answers else [] - if extra: - parts.append("Clarifications from the assignee:\n- " + "\n- ".join(extra)) - return "\n\n".join(parts) -``` - -- [ ] **Step 5: Update `start_agent_task` step labels** (the `steps=[...]` list in `run_background_task`) - -```python - steps=[ - {"name": "route", "description": "Selecting the right agent"}, - {"name": "plan", "description": "Confirming scope with you"}, - {"name": "run", "description": "Running the selected agent"}, - ], -``` - -Also, just before `tm.run_background_task(...)`, mark the task active so a racing reply won't double-launch: - -```python - _ACTIVE_TASKS.add(task_id) - tm = get_task_manager() - task = tm.run_background_task( -``` - -- [ ] **Step 6: Add `resume_agent_task`** (after `start_agent_task`) - -```python -def resume_agent_task( - *, - svc: Any, - domain: Any, - settings: Any, - folder: str, - version: str, - task: Dict[str, Any], -) -> Optional[str]: - """Relaunch the plan-or-run worker for a parked AI-Agent *task*. - - Called when a teammate replies on the task's thread. No-op (returns ``None``) - when a pass is already running for this task. Best-effort: setup failures are - logged and surfaced as a comment. - """ - task_id = str(task.get("id") or "") - if not task_id or task_id in _ACTIVE_TASKS: - return None - - from back.core.helpers import require_serving_llm, resolve_warehouse_id - from back.core.task_manager import get_task_manager - - comment_id = str(task.get("comment_id") or "") - title = str(task.get("title") or "") - description = str(task.get("description") or "") - try: - host, token, llm_endpoint = require_serving_llm(domain, settings) - except Exception as exc: # noqa: BLE001 - logger.warning("agent_task_runner: resume blocked: %s (task=%s)", exc, task_id) - return None - try: - warehouse_id = resolve_warehouse_id(domain, settings) - except Exception: # noqa: BLE001 - warehouse_id = "" - - _ACTIVE_TASKS.add(task_id) - tm = get_task_manager() - bg = tm.run_background_task( - f"AI Agent: {title}"[:80], - "task_router", - _run, - steps=[ - {"name": "route", "description": "Selecting the right agent"}, - {"name": "plan", "description": "Confirming scope with you"}, - {"name": "run", "description": "Running the selected agent"}, - ], - svc=svc, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - folder=folder, version=version, domain_task_id=task_id, - title=title, description=description, comment_id=comment_id, - ) - logger.info("agent_task_runner: resumed task %s (bg=%s)", task_id, bg.id) - return bg.id -``` - -- [ ] **Step 7: Run tests to verify they pass** - -Run: `python -m pytest tests/units/registry/test_agent_task_runner.py -q` -Expected: PASS (existing + 4 new tests). If `_fake_svc` lacks `list_comments`, ensure it returns `[]` by default (it already does per the current module). - -- [ ] **Step 8: Commit** - -```bash -git add src/back/objects/registry/agent_task_runner.py tests/units/registry/test_agent_task_runner.py -git commit -m "feat(registry): plan-then-run worker with thread-driven resume for AI-Agent tasks" -``` - ---- - -### Task 3: Kickoff comment + resume hook in `CommentService` - -Give every standalone AI-Agent task a thread root (a kickoff comment), and resume the worker when a human replies on a parked AI-Agent task thread. - -**Files:** -- Modify: `src/back/objects/registry/CommentService.py` -- Test: `tests/units/registry/test_comment_service.py` - -- [ ] **Step 1: Write the failing tests** (append to the existing module; reuse its `_call`/`_svc` helpers — see the existing tests for their shape) - -```python -# tests/units/registry/test_comment_service.py (additions) -from back.objects.registry.agent_task_runner import AI_AGENT_PRINCIPAL - - -def test_create_ai_task_without_comment_inserts_kickoff_comment(monkeypatch): - svc = _svc() # existing helper used by this module - svc.insert_comment.return_value = {"id": "kick1", "anchor_type": "domain", - "anchor_ref": ""} - svc.insert_task.return_value = {"id": "T1"} - started = {} - monkeypatch.setattr( - "back.objects.registry.CommentService.start_agent_task", - lambda **k: started.update(k) or "bg1", - ) - _call("create_task", svc, assignee=AI_AGENT_PRINCIPAL, title="Is Person needed?", - description="evaluate", due_date=None, comment_id=None) - - svc.insert_comment.assert_called_once() # kickoff created - _, kwargs = svc.insert_task.call_args - assert kwargs["comment_id"] == "kick1" # task linked to it - assert started["comment_id"] == "kick1" # agent anchored to it - - -def test_reply_on_active_ai_task_triggers_resume(monkeypatch): - svc = _svc() - svc.insert_comment.return_value = {"id": "r2", "parent_id": "root", - "anchor_type": "domain", "anchor_ref": ""} - svc.list_tasks.return_value = [ - {"id": "T1", "assignee": AI_AGENT_PRINCIPAL, "status": "in_progress", - "comment_id": "root", "title": "x", "description": ""}, - ] - resumed = {} - monkeypatch.setattr( - "back.objects.registry.CommentService.resume_agent_task", - lambda **k: resumed.update(k) or "bg2", - ) - _call("add_comment", svc, anchor_type="domain", anchor_ref="", - body="yes go ahead", parent_id="root") - - assert resumed.get("task", {}).get("id") == "T1" - - -def test_reply_on_done_ai_task_does_not_resume(monkeypatch): - svc = _svc() - svc.insert_comment.return_value = {"id": "r3", "parent_id": "root", - "anchor_type": "domain", "anchor_ref": ""} - svc.list_tasks.return_value = [ - {"id": "T1", "assignee": AI_AGENT_PRINCIPAL, "status": "done", - "comment_id": "root", "title": "x", "description": ""}, - ] - called = {"n": 0} - monkeypatch.setattr( - "back.objects.registry.CommentService.resume_agent_task", - lambda **k: called.__setitem__("n", called["n"] + 1), - ) - _call("add_comment", svc, anchor_type="domain", anchor_ref="", - body="thanks", parent_id="root") - - assert called["n"] == 0 -``` - -Note: if this test module does not already expose `_svc`/`_call` helpers in the shape used above, adapt these three tests to the module's existing harness (it already monkeypatches `start_agent_task` in `test_create_task_ai_agent_triggers_runner`; copy that pattern). - -- [ ] **Step 2: Run tests to verify they fail** - -Run: `python -m pytest tests/units/registry/test_comment_service.py -q` -Expected: FAIL — kickoff comment not inserted; `resume_agent_task` not imported/called. - -- [ ] **Step 3: Import `resume_agent_task`** (extend the existing import block) - -```python -from back.objects.registry.agent_task_runner import ( - AI_AGENT_PRINCIPAL, - is_ai_agent, - resume_agent_task, - start_agent_task, -) -``` - -- [ ] **Step 4: Create the kickoff comment in `create_task`** - -Replace the AI-agent block in `create_task` (currently `insert_task(...)` then the `is_ai_agent` `start_agent_task(...)`) so that, for a standalone AI-Agent task, a kickoff comment is created first and used as the task's `comment_id`: - -```python - # A standalone AI-Agent task needs a thread root so its clarifying - # questions and your replies live in one place. Create a kickoff - # comment (the task statement) and anchor the task to it. - effective_comment_id = comment_id or None - if is_ai_agent(assignee) and not effective_comment_id: - kickoff_body = title + ( - f"\n\n{(description or '').strip()}" if (description or "").strip() else "" - ) - kickoff = svc.insert_comment( - folder, version, - anchor_type="domain", anchor_ref="", - author=CommentService._email(request), - body=kickoff_body, parent_id=None, - ) - if kickoff: - effective_comment_id = str(kickoff.get("id") or "") or None - - created = svc.insert_task( - folder, - version, - assignee=assignee, - created_by=CommentService._email(request), - title=title, - description=(description or "").strip(), - due_date=(due_date or None), - comment_id=effective_comment_id, - ) - if not created: - raise InfrastructureError("Failed to create task") -``` - -Then update the audit + `start_agent_task` call below to use `effective_comment_id`: - -```python - agent_task_id = None - if is_ai_agent(assignee): - agent_task_id = start_agent_task( - svc=svc, - domain=get_domain(session_mgr), - settings=settings, - folder=folder, - version=version, - task_id=created.get("id", ""), - title=title, - description=(description or "").strip(), - comment_id=effective_comment_id or "", - ) -``` - -(Use `effective_comment_id` in the `_audit(... meta={"comment_id": ...})` call too, for consistency.) - -- [ ] **Step 5: Add the resume hook to `add_comment`** - -After the existing successful-insert block in `add_comment` (right before `return {"success": True, "comment": created}`), add: - -```python - CommentService._maybe_resume_agent( - svc, session_mgr, settings, folder, version, created, - author=CommentService._email(request), - ) - return {"success": True, "comment": created} -``` - -And add the helper (next to the other private helpers): - -```python - @staticmethod - def _maybe_resume_agent( - svc, - session_mgr: SessionManager, - settings, - folder: str, - version: str, - comment: Dict[str, Any], - *, - author: str, - ) -> None: - """Resume a parked AI-Agent task when a teammate replies on its thread. - - Best-effort: the AI Agent's own outcome comments are written through the - store (not this method), so only human replies reach here. Matches the - new comment's thread root against an active AI-Agent task's ``comment_id``. - """ - from back.objects.registry.agent_task_runner import AI_AGENT_LABEL - - try: - if (author or "") == AI_AGENT_LABEL: - return - root = str(comment.get("parent_id") or comment.get("id") or "") - if not root: - return - for task in svc.list_tasks(folder, version): - if not is_ai_agent(task.get("assignee") or ""): - continue - if (task.get("status") or "") != "in_progress": - continue - if str(task.get("comment_id") or "") != root: - continue - resume_agent_task( - svc=svc, - domain=get_domain(session_mgr), - settings=settings, - folder=folder, - version=version, - task=task, - ) - break - except Exception as exc: # noqa: BLE001 - logger.debug("CommentService: agent resume skipped: %s", exc) -``` - -- [ ] **Step 6: Run tests to verify they pass** - -Run: `python -m pytest tests/units/registry/test_comment_service.py -q` -Expected: PASS (existing + 3 new). - -- [ ] **Step 7: Commit** - -```bash -git add src/back/objects/registry/CommentService.py tests/units/registry/test_comment_service.py -git commit -m "feat(registry): kickoff comment + reply-driven resume for AI-Agent tasks" -``` - ---- - -### Task 4: Docs, changelog, full test run - -**Files:** -- Modify: `docs/architecture.md` -- Create/append: `changelogs/v0.6.0/benoitcayladbx_2026-06-18.log` - -- [ ] **Step 1: Update `docs/architecture.md`** - -In the "AI Agent task assignment" subsection, document the clarify-then-run loop: route -> planner (`agent_task_planner`) -> park (`in_progress`, plan/question posted) -> resume on reply (`CommentService.add_comment` -> `resume_agent_task`) -> run when ready. Add `agent_task_planner/` to the `src/agents/` listing. - -- [ ] **Step 2: Append a changelog section** (version from `pyproject.toml`) - -Title: "Feature: AI Agent asks clarifying questions before running". Include context, the numbered change list (planner agent, plan-or-run worker + resume, kickoff comment + reply hook), modified files, and the test result. - -- [ ] **Step 3: Run the targeted suites** - -Run: `python -m pytest tests/units/agents/test_agent_task_planner.py tests/units/agents/test_agent_task_router.py tests/units/registry/test_agent_task_runner.py tests/units/registry/test_comment_service.py -q` -Expected: PASS. - -- [ ] **Step 4: Run the full suite and record the result** - -Run: `python -m pytest -q` -Expected: no NEW failures vs. baseline. (The repo currently has ~59 pre-existing failures in `tests/units/api/*` caused by global test-ordering pollution — they pass in isolation and are unrelated to this change. Record the count and note it, do not try to fix it here.) - -- [ ] **Step 5: Commit** - -```bash -git add docs/architecture.md changelogs/v0.6.0/benoitcayladbx_2026-06-18.log -git commit -m "docs: document AI-Agent clarify-then-run loop + changelog" -``` - ---- - -## Self-review notes - -- **Spec coverage:** planner (Task 1), park/resume/multi-round/locked-route/answer-fold-in (Task 2), kickoff comment + reply hook + active-only/done-excluded triggers (Task 3), docs/changelog/tests (Task 4). Always-confirm is enforced because the first pass has no `user` answers in history, so the planner returns `ready=false`. -- **Type consistency:** `PlanResult{success, ready, message, ...}` (Task 1) is consumed in Task 2 as `plan.ready`/`plan.message`. `_thread_history` returns `[{"role", "text"}]`, consumed by the planner's `history` param and by `_fold_answers`. `resume_agent_task(svc, domain, settings, folder, version, task)` signature matches the `CommentService._maybe_resume_agent` call. -- **Guard:** `_ACTIVE_TASKS` is added in both `start_agent_task` and `resume_agent_task` and cleared in `_run`'s `finally`. -- **Known caveat:** `_thread_history` assumes one-level threads (replies parent to the root). The agent posts with `parent_id = comment_id` and the UI replies to the root, so this holds for the current comments panel. diff --git a/docs/superpowers/specs/2026-06-18-ai-agent-clarifying-questions-design.md b/docs/superpowers/specs/2026-06-18-ai-agent-clarifying-questions-design.md deleted file mode 100644 index a003a735..00000000 --- a/docs/superpowers/specs/2026-06-18-ai-agent-clarifying-questions-design.md +++ /dev/null @@ -1,170 +0,0 @@ -# AI Agent clarifying questions before running - -**Date:** 2026-06-18 -**Status:** Design — pending implementation plan -**Author:** benoitcayladbx - -## Problem - -A collaborative task assigned to the AI Agent fires immediately: the router -picks a specialized agent and runs it as a background job, then posts one report -comment. When the task is ambiguous the router can guess wrong (e.g. "evaluate -whether the `Person` class is necessary" was routed to the whole-ontology -Generator instead of the in-place Ontology Assistant). The user never gets a -chance to confirm scope or supply missing detail before work happens. - -## Goal - -Before running, the AI Agent posts a short plan plus any clarifying questions in -the task's Discussion thread, parks the task, and resumes automatically when the -user replies. It may ask follow-ups across several replies until it is confident, -then runs the chosen specialized agent and reports the outcome. - -## Decisions (locked) - -| Question | Decision | -|----------|----------| -| Loop model | **Park & resume** — post questions, park the task, resume on reply | -| Trigger | **Always confirm** — every AI-Agent task posts a plan + questions and waits for a go-ahead before running | -| Approval | **Any reply resumes** — the reply text is fed to the agent as answers/approval | -| Rounds | **Multi-round** — the agent may ask follow-ups until confident, then run | -| Routing | **Locked at start** — the router picks the agent once; clarification happens within that agent's scope | -| Architecture | **Thread is the source of truth** (Approach A) — the comment thread *is* the clarification conversation; no separate transcript storage | - -### Implementation refinements (zero schema change) - -To ship without a Postgres `CHECK`-constraint migration or base/file-store -changes, the locked decisions above are realized as follows: - -- **No new task status.** The parked ("waiting on you") state reuses the - existing `in_progress` status. A distinct, user-visible `waiting_input` status - is a follow-up (it requires altering the `domain_tasks.status` CHECK and the - store validation in three places). -- **Locked route without persistence.** The router runs at temperature 0 and is - deterministic, so on resume we simply re-run it on the same title/description — - the same agent is chosen every time. No `agent_key` column is added. -- **Linkage via the existing `comment_id`.** Every AI-Agent task is anchored to a - thread root comment: tasks born from a comment already have one; for standalone - tasks `create_task` first inserts a domain-level **kickoff comment** (the task - statement) and stores its id as the task's `comment_id`. A human reply whose - thread root equals a task's `comment_id` triggers resume. - -## Flow - -1. Task assigned to the AI Agent (`assignee == AI_AGENT_PRINCIPAL`) → - `start_agent_task` launches a background job (as today). -2. **Route once:** the existing `agent_task_router` picks the specialized agent - and records the choice. The choice is persisted on the task and not - re-evaluated on later turns. -3. **Plan / ask:** a new single-shot **planner** step receives the task - (title + description), the chosen agent's spec, and the conversation history - reconstructed from the thread. It returns `{ready: bool, message: str}`. - - First pass always returns `ready=false` with a plan + questions (the - "always confirm" rule), so the very first turn never runs the agent. - - Posts `message` as a comment under the task thread, keeps the task - `in_progress` (the parked state), and ends the job. -4. **Resume on reply:** when a human posts a comment under a parked AI-Agent task - thread, a resume hook in `CommentService.add_comment` launches a resume job - (`resume_agent_task`). Only human-authored API comments flow through - `add_comment`; the agent's own comments are written via the store directly, so - they never self-trigger. -5. **Re-plan:** the resume job re-runs the (deterministic) router, rebuilds the - Q&A history from the thread, and calls the planner again. - - `ready=false` → post the follow-up question, stay `in_progress`. - - `ready=true` → run the chosen specialized agent with the user's accumulated - answers folded into its input, post the outcome report, set status `done`. - -## Components - -### `src/agents/agent_task_planner/` (new) - -Single-shot LLM agent, mirroring `agent_task_router` (`engine.py`, `tools.py`, -`__init__.py`). - -- **Input:** task title/description, chosen `AgentSpec`, conversation history - (ordered list of `{role, text}` derived from the thread — AI Agent comments are - `assistant`, human replies are `user`). -- **Output:** `PlanResult { ready: bool, message: str, error: str }`. - - `ready=false`: `message` is the plan and/or the next question(s). - - `ready=true`: `message` is a brief "running now" confirmation; the runner then - dispatches the specialized agent. -- Degrades gracefully: on parse/LLM failure returns `error`; the runner posts an - error note and leaves the task `waiting_input` so a retry reply re-triggers. - -### `src/back/objects/registry/agent_task_runner.py` - -- Extract the post-route worker logic into one `_run` worker that does - route → history → plan → branch, used by both the initial and the resume job. -- `start_agent_task` (existing): launches the worker; the first pass always parks - with a plan + questions (history has no user answers yet). -- `resume_agent_task` (new): launches the same worker for a parked task. -- A module-level in-process guard (set of active `domain_task_id`s) prevents a - reply from starting a second concurrent run while one is in flight. -- `_thread_history(svc, folder, version, root_comment_id)`: reconstruct the - ordered Q&A from the thread rooted at the task's `comment_id` (the root comment - plus its replies, ordered by `created_at`). AI Agent author (`AI_AGENT_LABEL`) - → `assistant`; everyone else → `user`. -- The chosen agent is obtained by re-running the deterministic router each pass - (routing is locked; no persistence needed). -- Folding answers into agent input: the user's accumulated answers are appended - to the task text passed to `_dispatch_agent`. - - **Ontology Assistant:** `user_message` = task text + accumulated user answers. - - **Generator / rules / icons / mapper:** the confirmation gates the run; the - answers ride along in the task text where the bridge accepts free text. - -### `src/back/objects/registry/CommentService.py` - -- `create_task`: when `is_ai_agent(assignee)` and there is no originating - `comment_id`, first insert a domain-level **kickoff comment** (the task - statement) and pass its id as the task's `comment_id`, so every AI-Agent task - has a thread root. -- `add_comment`: after a successful insert, best-effort detect whether the new - (human) comment's thread root matches an active AI-Agent task and, if so, call - `resume_agent_task`. The AI Agent's own comments are written through the store - (`_report`), not `add_comment`, so they never trigger resume. Failures are - logged, not surfaced. - -## Data flow & linkage - -- Every AI-Agent task carries a `comment_id` thread root (originating comment, or - the kickoff comment for standalone tasks). -- Parked/active tasks = `assignee == AI_AGENT_PRINCIPAL` AND - `status == "in_progress"`. -- A new human comment whose thread root equals such a task's `comment_id` - triggers resume. -- The thread itself stores the full clarification transcript — no extra table. - -## Error handling - -- **Planner LLM failure:** post an error comment; leave the task `in_progress` - so the next human reply re-triggers planning. -- **Specialized agent failure:** unchanged from today — post a failure comment; - the task status reflects the failure. -- **Concurrent reply while running:** the in-process guard drops the second - resume so the agent never runs twice for one task at once. -- **No reply ever:** the task stays `in_progress` indefinitely (acceptable; - surfacing parked tasks distinctly in "My Tasks" is a separate follow-up). -- **Invariant:** the agent never runs without at least one human reply on the - thread (honors "always confirm"). - -## Testing - -- **Planner unit tests:** ready vs. ask decisions; graceful degradation on - unparseable/empty LLM output. -- **Runner tests:** first pass parks with a plan; resume that still needs info - asks again and stays `waiting_input`; resume that is ready runs the agent and - marks `done`; thread-history reconstruction maps authors to roles correctly. -- **CommentService tests:** standalone AI-Agent task creation inserts a kickoff - comment and links it; a human reply under an active AI-Agent task triggers - `resume_agent_task`; a reply under a `done`/non-agent task does not. - -## Out of scope / follow-ups - -- Re-routing on resume (locked route for v1). -- A distinct, user-visible `waiting_input` task status (needs a CHECK-constraint - migration + store validation changes); v1 reuses `in_progress`. -- Surfacing parked AI-Agent tasks in the "My Tasks" worklist (sentinel assignee - is not a user email). -- Auto-applying results for the non-conversational agents (generator, rules, - icons, mapper still produce proposals; only the Ontology Assistant applies). -- Dedicated UI affordances (Approve/Run buttons) — v1 infers from comment text. diff --git a/pyproject.toml b/pyproject.toml index 44c50f5e..27119321 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -5,22 +5,16 @@ description = "Ontology Management Tool for Databricks" requires-python = ">=3.10" dependencies = [ # fastapi>=0.129.0 added Starlette 1.0.0+ support (needed for the - # starlette>=1.3.0 BadHost fix below). + # starlette>=1.0.1 BadHost fix below). "fastapi>=0.129.0", "uvicorn[standard]>=0.27.0", "pydantic>=2.5.0", "pydantic-settings>=2.1.0", - # python-multipart>=0.0.30: quadratic-time querystring parsing with semicolon - # separators (CVE-2026-53539 / GHSA-5rvq-cxj2-64vf), parameter smuggling via - # semicolons (CVE-2026-53538), negative Content-Length memory allocation - # (GHSA-h8vp-42mj-3c4x), and RFC 2231 param smuggling (GHSA-4w6j-v5jc-5fqr). - "python-multipart>=0.0.30", - # starlette>=1.3.0: fixes BadHost (CVE-2026-48710 / GHSA-86qp-5c8j-p5mr). - # TARGET: >=1.3.1 once the proxy mirrors it — that release also fixes form() - # limits silently ignored for application/x-www-form-urlencoded DoS - # (CVE-2026-54283 / GHSA-82w8-qh3p-5jfq). + "python-multipart>=0.0.27", + # starlette>=1.0.1: BadHost (CVE-2026-48710 / GHSA-86qp-5c8j-p5mr) — missing + # Host-header validation poisons request.url.path, bypassing path-based auth. # Requires fastapi>=0.129 (Starlette 1.0 support added upstream Feb 2026). - "starlette>=1.3.0", + "starlette>=1.0.1", "itsdangerous>=2.1.0", "jinja2>=3.1.0", "aiofiles>=23.0.0", @@ -37,9 +31,7 @@ dependencies = [ # (CVE-2026-47707 / GHSA-fr49-mhgj-crfc) and circular-fragment DOS in # QueryDepthLimiter — both DOS via resource exhaustion. "strawberry-graphql[fastapi]>=0.315.7", - # mlflow>=3.13.0: earlier versions require cryptography<47 which conflicts - # with the cryptography>=48.0.1 security constraint below. - "mlflow>=3.13.0", + "mlflow>=3.11.1", "apscheduler>=3.10,<4", "owlrl>=7.0.0", "pyshacl>=0.26.0", @@ -60,10 +52,7 @@ lakebase = [ pitfalls = [ "sentence-transformers>=3.0.0", "scikit-learn>=1.3.0", - # nltk: TARGET >=3.10.0 once the proxy mirrors it — that release fixes - # URL-encoded path traversal in nltk.data.load() (CVE-2026-54293 / - # GHSA-p4gq-832x-fm9v). Proxy currently tops out at 3.9.4. - "nltk>=3.9.4", + "nltk>=3.8.0", "scipy>=1.11.0", ] @@ -121,31 +110,7 @@ constraint-dependencies = [ # aiohttp 3.14.0 fixes two issues (pulled in transitively by mlflow): # GHSA-jg22-mg44-37j8 (CVE-2026-34993) CookieJar.load() pickle deserialization RCE # GHSA-hg6j-4rv6-33pg (CVE-2026-47265) per-request cookies leaked on cross-origin redirect - # aiohttp 3.14.1 additionally fixes (all Moderate/Low): - # GHSA-xcgm-r5h9-7989 (CVE-2026-54274) incomplete WS frame payloads bypass memory limits - # GHSA-g3cq-j2xw-wf74 (CVE-2026-54278) compressed request bodies bypass client_max_size - # GHSA-jc7f-gxrc-qvfp (CVE-2026-54275) HTTP/1 pipelined requests queue without limit - # GHSA-4wfr-65wf-jgh8 (CVE-2026-54276) C HTTP parser bypasses max_line_size - # GHSA-hq6q-c2x6-hmch (CVE-2026-54277) DigestAuth applies credentials to cross-origin redirects - # GHSA-7m7x-8h22-2jmj (CVE-2026-54279) payload resources not closed after mid-body disconnect - # GHSA-mx4r-wm4h-xw27 (CVE-2026-54280) TLS server hostname override ignored on reused HTTPS conn - # GHSA-f94q-p6mj-vj6r (CVE-2026-54281) host-only cookies become domain cookies after persistence - "aiohttp>=3.14.1", - # cryptography>=48.0.1: vulnerable OpenSSL bundled in wheels prior to 48.0.1 - # (CVE-2026-34180 / GHSA-537c-gmf6-5ccf). OS-level patches do not help since - # OpenSSL is statically linked inside the wheel. - "cryptography>=48.0.1", - # pyjwt: TARGET >=2.13.0 once the proxy mirrors it (proxy tops out at - # 2.10.1). That release bundles five fixes: - # GHSA-xgmm-8j9v-c9wx (CVE-2026-48526) public-key JWK accepted as HMAC secret → HS256 forgery - # GHSA-jq35-7prp-9v3f (CVE-2026-48527) PyJWK algorithm allow-list bypass - # GHSA-r5fg-8rfm-jfxq (CVE-2026-48528) DoS via unbounded Base64URL decoding (b64=false JWS) - # GHSA-vqx6-w8qr-234h (CVE-2026-48529) PyJWKClient SSRF via file://, ftp://, data: schemes - # GHSA-hpqf-4wfj-9qcc (CVE-2026-48530) PyJWKClient unbounded JWKS endpoint requests (DoS) - "pyjwt>=2.10.1", - # torch>=2.7.0 fixes memory corruption in torch.jit.script (CVE-2025-3000 / - # GHSA-rrmf-rvhw-rf47). Already resolved at 2.11.0; constraint documents intent. - "torch>=2.7.0", + "aiohttp>=3.14.0", ] [tool.pytest.ini_options] diff --git a/releases/ReleaseNotes_V0.5.1.md b/releases/ReleaseNotes_V0.5.1.md deleted file mode 100644 index 83be13b6..00000000 --- a/releases/ReleaseNotes_V0.5.1.md +++ /dev/null @@ -1,162 +0,0 @@ -# OntoBricks — Release Notes V0.5.1 - -**Release window:** June, 2026 -**Type:** Patch release (bug fix + reliability hardening — no schema migration required) -**Test status:** touched-area suites green (SQL warehouse + build pipeline + registry store: 93 passing; review/lifecycle green). Full multi-tier run unchanged except pre-existing e2e/MCP ordering flakes that require a live app server. - ---- - -## Highlights - -- **Bug fix — "Submit for review" no longer blocked on a built Digital Twin.** Interactive ("Build" button) and external API builds now persist `last_build` to the registry version record, the same way scheduled builds already did. The Validation page's Submit gate and the lifecycle guard read that field, so a built DRAFT version can now be submitted for review. -- **Reliability — SQL warehouse pool survives a server-side session drop.** A stale pooled connection (warehouse auto-stop / idle disconnect) is now detected and retried once on a fresh connection instead of crashing a long build. -- **Reliability — Digital Twin builds fail loudly on a broken triple count** instead of silently reporting a "healthy" zero-triple build. - ---- - -## Bug Report — "Submit for Review" blocked despite a built Digital Twin - -### Symptom - -On the Domain → **Validation** page, a DRAFT version whose Digital Twin was -already built (the page's Consistency-checks panel shows a green -**"Digital Twin built"** tick, with thousands of triples in the view) was -still blocked from **Submit for review** with the banner: - -> "This version has never been built. Run a Digital Twin build first." - -The lifecycle stayed stuck at Draft and Submit was disabled. The two -indicators on the same page disagreed: - -| Indicator | Source it reads | Result | -| --- | --- | --- | -| "Digital Twin built" (green tick) | Live triplestore — graph triple count + view existence (`compute_dtwin_indicator`) | Built | -| "Never been built" banner / Submit gate | Registry version record field `info.last_build` | Empty -> blocked | - -### Root cause - -`read_version` sources `last_build` from the dedicated -`domain_versions.last_build` **column**, and the Submit gate -(`ReviewService.review_detail`: `can_submit = ... and bool(last_build)`) plus -the lifecycle guard (`version_lifecycle`, DRAFT -> IN-REVIEW) both depend on it. - -Only the **scheduled** build path persisted that field -(`scheduler._persist_domain_metadata` -> `write_version`). The **interactive** -and **API** build paths stamped `last_build` on the in-memory session only -(`dtwin.py` -> `domain.save()`), never on the registry version record. The -build's success path recorded a `build_runs` trace but did not update -`last_build`. So an interactive build left the column empty and Submit stayed -blocked, even though the live triplestore (read by the green tick) was healthy. - -Two secondary issues surfaced during the investigation and are hardened here: - -1. **Stale pooled SQL connection** — `SQLWarehouse` validated pooled - connections by age only, with no liveness check. A build spanning a - server-side session drop reused a dead connection, surfacing as - `'NoneType' object has no attribute 'request'` from `unified_http_client`. -2. **Triple count swallowed failures to `0`** — `_count_view_triples` returned - `0` on any error, so a missing view / transient failure was indistinguishable - from a genuinely empty view and could be reported as a "successful" - zero-triple build. - -### The fix - -1. New `RegistryStore.update_last_build(folder, version, ts)` — a targeted - single-row `UPDATE` of `domain_versions.last_build` (with a `jsonb_set` - mirror into the `info` blob), keyed by registry/folder/version. It does not - rewrite the full version document, so it never clobbers concurrent session - edits. Cache is invalidated on success. - (`store/base.py`, `store/lakebase/store.py`, `RegistryService.py`) -2. The build success path (`_BuildPipeline._complete_task`) now calls a - best-effort `_persist_last_build(ts)` that stamps both the registry version - record and the in-process session, reusing the same folder/version - derivation as the build-run trace. It never fails a healthy build. - (`digitaltwin/_build_pipeline.py`) -3. `SQLWarehouse` now splits connection checkout/checkin and adds a one-shot - retry: a **reused** pooled connection that fails with a connection-level - error (including the `NoneType ... request` symptom) is discarded and the - operation retried once on a fresh connection. The streaming `iter_rows` - path is intentionally not retried. - (`core/databricks/SQLWarehouse.py`) -4. `_count_view_triples` now raises `InfrastructureError` on a failed count - (view missing / transient error). A successful `COUNT` of `0` is still a - genuinely empty view (non-fatal upstream); only real failures surface as an - error so a broken build cannot be misreported as healthy. - (`digitaltwin/_build_pipeline.py`) - -Scheduled builds use a separate code path, so they are unaffected and there is -no double-stamping. - ---- - -## How to apply and redeploy - -This is a **code-only** patch. The `domain_versions.last_build` column already -exists in the 0.5.x schema, so **no Lakebase migration or bootstrap is -required**. - -1. **Pull the fix** onto the deployment host: - -```bash -git pull # or: git checkout v0.5.1 -``` - -2. **Redeploy the app + MCP server** via the Databricks Asset Bundle - orchestrator (syncs files, renders `app.yaml`, `databricks bundle deploy`, - bootstraps perms, restarts the app): - -```bash -make deploy -``` - - Optional dry run first (preflight + validate + resource checks, no changes): - -```bash -make deploy-dry-run -``` - -3. **Verify.** Run a Digital Twin build from the **Build** button on a DRAFT - version, then open Domain → **Validation**: the "never been built" banner - clears and **Submit for review** is enabled. Re-running the unit suites for - the touched areas stays green: - -```bash -python -m pytest tests/units/core/test_sql_warehouse.py \ - tests/back/core/digitaltwin/test_build_pipeline_units.py \ - tests/units/registry/test_registry_store.py -q -``` - -### Unblocking a version already affected (no rebuild) - -For a domain whose view is healthy but whose `last_build` was left empty by a -pre-0.5.1 interactive build, you have two options without redeploying: - -- **Re-run a build through the fixed path** (after redeploy): one more click of - **Build** stamps `last_build` correctly. -- **Trigger a scheduled "Run now"**: the scheduler path already stamps - `last_build` and invalidates the app cache. Create a schedule for the domain - version (any interval), click **Run now**, then optionally delete the - schedule. (Re-runs the full build.) -- **Surgical SQL stamp** (no rebuild) directly against the registry Postgres - schema — bypasses the app cache, so the Validation page may show stale state - until the cache TTL expires or the app restarts: - -```sql -UPDATE .domain_versions dv -SET last_build = now()::text -FROM .domains d -WHERE dv.domain_id = d.id - AND d.folder = '' - AND dv.version = ''; -``` - ---- - -## Upgrade Notes - -- **No migration.** Patch is application code only; the `last_build` column is - unchanged. A plain `make deploy` is sufficient. -- **Interactive builds now write the registry.** After upgrade, every Build - (UI or API) stamps `last_build`; previously only scheduled builds did. -- **Builds fail more honestly.** A build that cannot count its view's triples - now fails with a clear error instead of completing as a zero-triple "success". diff --git a/scripts/bootstrap-lakebase-perms.sh b/scripts/bootstrap-lakebase-perms.sh index d1e713e9..99b892dc 100755 --- a/scripts/bootstrap-lakebase-perms.sh +++ b/scripts/bootstrap-lakebase-perms.sh @@ -317,46 +317,9 @@ CREATE TABLE IF NOT EXISTS "${SCHEMA}".domain_review_events ( ); CREATE INDEX IF NOT EXISTS idx_review_events_domain_version ON "${SCHEMA}".domain_review_events(domain_id, version, created_at); - --- domain_comments (domain-wide threaded discussion added after initial release) -CREATE TABLE IF NOT EXISTS "${SCHEMA}".domain_comments ( - id uuid PRIMARY KEY DEFAULT gen_random_uuid(), - domain_id uuid NOT NULL - REFERENCES "${SCHEMA}".domains(id) ON DELETE CASCADE, - version text NOT NULL, - parent_id uuid REFERENCES "${SCHEMA}".domain_comments(id) ON DELETE CASCADE, - author text NOT NULL, - body text NOT NULL DEFAULT '', - resolved boolean NOT NULL DEFAULT false, - created_at timestamptz NOT NULL DEFAULT now() -); -CREATE INDEX IF NOT EXISTS idx_domain_comments_lookup - ON "${SCHEMA}".domain_comments(domain_id, version, created_at); - --- domain_tasks (collaborative tasks added after initial release) -CREATE TABLE IF NOT EXISTS "${SCHEMA}".domain_tasks ( - id uuid PRIMARY KEY DEFAULT gen_random_uuid(), - domain_id uuid NOT NULL - REFERENCES "${SCHEMA}".domains(id) ON DELETE CASCADE, - version text NOT NULL, - assignee text NOT NULL, - created_by text NOT NULL, - title text NOT NULL, - description text NOT NULL DEFAULT '', - status text NOT NULL DEFAULT 'open' - CHECK (status IN ('open', 'in_progress', 'done', 'cancelled')), - due_date date, - comment_id uuid REFERENCES "${SCHEMA}".domain_comments(id) ON DELETE SET NULL, - created_at timestamptz NOT NULL DEFAULT now(), - updated_at timestamptz NOT NULL DEFAULT now() -); -CREATE INDEX IF NOT EXISTS idx_domain_tasks_assignee - ON "${SCHEMA}".domain_tasks(lower(assignee), status); -CREATE INDEX IF NOT EXISTS idx_domain_tasks_domain - ON "${SCHEMA}".domain_tasks(domain_id, version); SQL then - echo " ✓ schema migrations applied (domain_versions.status, domains.review_quorum, build_runs, domain_review_events, domain_comments, domain_tasks)" + echo " ✓ schema migrations applied (domain_versions.status, domains.review_quorum, build_runs, domain_review_events)" else echo " ⚠ schema migration failed — continuing (SP grants below may partially succeed)" fi diff --git a/scripts/upgrade_lakebase_0.5_To_0.6.sql b/scripts/upgrade_lakebase_0.5_To_0.6.sql deleted file mode 100644 index afb7a0ac..00000000 --- a/scripts/upgrade_lakebase_0.5_To_0.6.sql +++ /dev/null @@ -1,137 +0,0 @@ --- ============================================================================ --- OntoBricks Lakebase registry upgrade: 0.5.x -> 0.6.x --- ---------------------------------------------------------------------------- --- Adds the collaborative *comments & tasks* (the "Discussions" feature): --- --- * new table domain_comments — contextual threaded discussion anchored --- to a domain version (ontology class/property, mapping, graph --- node/edge, or the whole domain). A non-empty ``parent_id`` --- makes the row a reply; ``resolved`` closes a thread without --- losing history. --- * new table domain_tasks — personalised work items, usually born --- from a comment (``comment_id``), surfaced in the assignee's --- "My Tasks" worklist. --- * indexes idx_domain_comments_anchor, idx_domain_tasks_assignee, --- idx_domain_tasks_domain. --- --- These tables carry the same CHECK constraints as the canonical --- ``src/back/objects/registry/store/lakebase/schema.sql`` (anchor_type and --- task status), so the registry stays fully constrained. --- --- The app self-heals these tables lazily on first comment/task write --- (``_ensure_collab_tables``), and ``make bootstrap-lakebase`` provisions them --- as the schema owner. Run this script when you prefer an explicit, auditable --- one-shot migration (e.g. a DBA applying it out-of-band). Nothing here is --- destructive — no existing data is touched, no columns are dropped. --- --- Idempotent: safe to run multiple times. --- ---------------------------------------------------------------------------- --- Usage (psql): --- # default schema (ontobricks_registry): --- psql "$PGURL" -f scripts/upgrade_lakebase_0.5_To_0.6.sql --- --- # custom registry schema (matches LAKEBASE_SCHEMA / REGISTRY_SCHEMA): --- psql "$PGURL" -v reg_schema=my_registry_schema \ --- -f scripts/upgrade_lakebase_0.5_To_0.6.sql --- ============================================================================ - -\set ON_ERROR_STOP on - --- Resolve the target schema (override with -v reg_schema=... ; default below). -\if :{?reg_schema} -\else - \set reg_schema ontobricks_registry -\endif - -SET search_path TO :"reg_schema"; - -\echo 'Upgrading OntoBricks registry schema:' :reg_schema - -BEGIN; - --- 1. Collaborative comments -------------------------------------------------- -CREATE TABLE IF NOT EXISTS domain_comments ( - id uuid PRIMARY KEY DEFAULT gen_random_uuid(), - domain_id uuid NOT NULL - REFERENCES domains(id) ON DELETE CASCADE, - version text NOT NULL, - anchor_type text NOT NULL DEFAULT 'domain' - CHECK (anchor_type IN ('ontology_class', 'ontology_property', - 'mapping', 'graph_node', 'graph_edge', - 'domain')), - anchor_ref text NOT NULL DEFAULT '', - parent_id uuid REFERENCES domain_comments(id) ON DELETE CASCADE, - author text NOT NULL, - body text NOT NULL DEFAULT '', - resolved boolean NOT NULL DEFAULT false, - created_at timestamptz NOT NULL DEFAULT now() -); - -CREATE INDEX IF NOT EXISTS idx_domain_comments_anchor - ON domain_comments(domain_id, version, anchor_type, anchor_ref); - --- 1b. Backfill the anchor_type CHECK on registries whose table was created by --- the app's lazy self-heal path (which omits the constraint). -DO $$ -BEGIN - IF NOT EXISTS ( - SELECT 1 - FROM pg_constraint - WHERE conname = 'domain_comments_anchor_type_check' - AND conrelid = 'domain_comments'::regclass - ) THEN - ALTER TABLE domain_comments - ADD CONSTRAINT domain_comments_anchor_type_check - CHECK (anchor_type IN ('ontology_class', 'ontology_property', - 'mapping', 'graph_node', 'graph_edge', - 'domain')); - END IF; -END$$; - --- 2. Collaborative tasks ----------------------------------------------------- -CREATE TABLE IF NOT EXISTS domain_tasks ( - id uuid PRIMARY KEY DEFAULT gen_random_uuid(), - domain_id uuid NOT NULL - REFERENCES domains(id) ON DELETE CASCADE, - version text NOT NULL, - assignee text NOT NULL, - created_by text NOT NULL, - title text NOT NULL, - description text NOT NULL DEFAULT '', - status text NOT NULL DEFAULT 'open' - CHECK (status IN ('open', 'in_progress', 'done', 'cancelled')), - due_date date, - comment_id uuid REFERENCES domain_comments(id) ON DELETE SET NULL, - created_at timestamptz NOT NULL DEFAULT now(), - updated_at timestamptz NOT NULL DEFAULT now() -); - -CREATE INDEX IF NOT EXISTS idx_domain_tasks_assignee - ON domain_tasks(lower(assignee), status); -CREATE INDEX IF NOT EXISTS idx_domain_tasks_domain - ON domain_tasks(domain_id, version); - --- 2b. Backfill the status CHECK on lazily-created tables (see 1b). ------------ -DO $$ -BEGIN - IF NOT EXISTS ( - SELECT 1 - FROM pg_constraint - WHERE conname = 'domain_tasks_status_check' - AND conrelid = 'domain_tasks'::regclass - ) THEN - ALTER TABLE domain_tasks - ADD CONSTRAINT domain_tasks_status_check - CHECK (status IN ('open', 'in_progress', 'done', 'cancelled')); - END IF; -END$$; - -COMMIT; - --- Summary ------------------------------------------------------------------- -\echo 'Done. Collaboration tables present:' -SELECT table_name -FROM information_schema.tables -WHERE table_schema = :'reg_schema' - AND table_name IN ('domain_comments', 'domain_tasks') -ORDER BY table_name; diff --git a/scripts/upgrade_lakebase_0.6_drop_comment_anchor.sql b/scripts/upgrade_lakebase_0.6_drop_comment_anchor.sql deleted file mode 100644 index 232d7402..00000000 --- a/scripts/upgrade_lakebase_0.6_drop_comment_anchor.sql +++ /dev/null @@ -1,67 +0,0 @@ --- ============================================================================ --- OntoBricks Lakebase registry upgrade: drop comment anchors (0.6.x) --- ---------------------------------------------------------------------------- --- Discussions are now domain-wide: every comment belongs to the single --- per-(domain, version) thread, so the per-anchor columns on --- ``domain_comments`` are dead weight. This migration removes them: --- --- * drop columns anchor_type, anchor_ref (the anchor_type CHECK --- constraint drops with its column) --- * drop index idx_domain_comments_anchor (referenced those columns) --- * create index idx_domain_comments_lookup (domain_id, version, created_at) --- to keep the domain-thread listing query fast --- --- DESTRUCTIVE: the anchor_type / anchor_ref values are discarded. No comment --- bodies, authors, threading (parent_id) or resolved state are touched. --- --- The app self-heals new installs without these columns --- (``_ensure_collab_tables``) and the canonical --- ``src/back/objects/registry/store/lakebase/schema.sql`` no longer declares --- them, so this script is only needed to clean up registries provisioned --- before the change. Run it as the schema owner. --- --- Idempotent: safe to run multiple times (IF EXISTS guards throughout). --- ---------------------------------------------------------------------------- --- Usage (psql): --- # default schema (ontobricks_registry): --- psql "$PGURL" -f scripts/upgrade_lakebase_0.6_drop_comment_anchor.sql --- --- # custom registry schema (matches LAKEBASE_SCHEMA / REGISTRY_SCHEMA): --- psql "$PGURL" -v reg_schema=my_registry_schema \ --- -f scripts/upgrade_lakebase_0.6_drop_comment_anchor.sql --- ============================================================================ - -\set ON_ERROR_STOP on - --- Resolve the target schema (override with -v reg_schema=... ; default below). -\if :{?reg_schema} -\else - \set reg_schema ontobricks_registry -\endif - -SET search_path TO :"reg_schema"; - -\echo 'Dropping comment anchors on OntoBricks registry schema:' :reg_schema - -BEGIN; - --- 1. Drop the anchor lookup index (replaced below). ------------------------ -DROP INDEX IF EXISTS idx_domain_comments_anchor; - --- 2. Drop the anchor columns (CHECK constraint drops with anchor_type). ----- -ALTER TABLE IF EXISTS domain_comments DROP COLUMN IF EXISTS anchor_type; -ALTER TABLE IF EXISTS domain_comments DROP COLUMN IF EXISTS anchor_ref; - --- 3. Domain-thread listing index. ------------------------------------------ -CREATE INDEX IF NOT EXISTS idx_domain_comments_lookup - ON domain_comments(domain_id, version, created_at); - -COMMIT; - --- Summary ------------------------------------------------------------------- -\echo 'Done. domain_comments columns:' -SELECT column_name -FROM information_schema.columns -WHERE table_schema = :'reg_schema' - AND table_name = 'domain_comments' -ORDER BY ordinal_position; diff --git a/src/agents/agent_task_planner/__init__.py b/src/agents/agent_task_planner/__init__.py deleted file mode 100644 index 0e2478de..00000000 --- a/src/agents/agent_task_planner/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from agents.agent_task_planner.engine import PlanResult, run_agent # noqa: F401 - -__all__ = ["run_agent", "PlanResult"] diff --git a/src/agents/agent_task_planner/engine.py b/src/agents/agent_task_planner/engine.py deleted file mode 100644 index cc8555f1..00000000 --- a/src/agents/agent_task_planner/engine.py +++ /dev/null @@ -1,182 +0,0 @@ -""" -Task Planner agent engine. - -Single-shot gate that runs BEFORE a specialized agent does any work. Given the -task, the agent already chosen by the router, and the clarification Q&A so far -(reconstructed from the Discussion thread), the LLM decides whether it has -enough to act confidently (``ready=true``) or must ask the assignee more -(``ready=false`` + a short plan/question ``message``). JSON in / JSON out. -""" -from __future__ import annotations - -import json -import re -from dataclasses import dataclass, field -from typing import Callable, Dict, List, Optional - -from agents.engine_base import ( - AgentStep, - accumulate_usage, - call_serving_endpoint, - extract_message_content, -) -from agents.registry import AgentSpec -from agents.tracing import trace_agent -from back.core.logging import get_logger - -logger = get_logger(__name__) - -LLM_TIMEOUT = 60 -_TRACE_NAME = "task_planner" - - -@dataclass -class PlanResult: - """Outcome of a single planning turn.""" - - success: bool - ready: bool = False - message: str = "" - steps: List[AgentStep] = field(default_factory=list) - iterations: int = 0 - error: str = "" - usage: Dict[str, int] = field(default_factory=dict) - - -_SYSTEM_PROMPT = """\ -You are the Task Planner for OntoBricks. A teammate assigned a work item to the -"AI Agent", and a specialized agent has already been selected to carry it out. -Before that agent runs, you confirm scope with the teammate. - -You are given: the task, the selected agent's purpose, and the conversation so -far (your earlier questions and the teammate's replies, if any). - -RULES -- On the FIRST turn (no teammate replies yet) you are NOT ready: briefly state - what you will do and ask any clarifying question(s) needed to act safely. -- Mark ready=true ONLY once the teammate has replied with enough to proceed - (an approval or the missing detail). When unsure, ask one more focused - question rather than guessing. -- Keep messages short and concrete. No code fences. -- Reply with ONLY a JSON object: - {"ready": , "message": ""} -""" - - -def _build_user_prompt( - task_title: str, - task_description: str, - agent: AgentSpec, - history: List[dict], -) -> str: - lines = [ - f"SELECTED AGENT: {agent.label} — {agent.description}", - "", - f"TASK TITLE: {task_title}", - ] - if task_description: - lines.append(f"TASK DESCRIPTION: {task_description}") - lines.append("") - if history: - lines.append("CONVERSATION SO FAR:") - for turn in history: - who = "AI Agent" if turn.get("role") == "assistant" else "Teammate" - lines.append(f"- {who}: {turn.get('text', '')}") - else: - lines.append("CONVERSATION SO FAR: (none yet — this is the first turn)") - lines.append("") - lines.append('Respond with the JSON object: {"ready": ..., "message": "..."}') - return "\n".join(lines) - - -def _parse_plan(text: str) -> Optional[dict]: - """Extract the ``{"ready": ..., "message": ...}`` object from LLM text.""" - cleaned = (text or "").strip() - fence = re.search(r"```(?:json)?\s*([\s\S]*?)```", cleaned) - if fence: - cleaned = fence.group(1).strip() - for candidate in (cleaned, None): - if candidate is None: - brace = re.search(r"\{[\s\S]*\}", cleaned) - candidate = brace.group(0) if brace else None - if not candidate: - continue - try: - obj = json.loads(candidate) - if isinstance(obj, dict): - return obj - except json.JSONDecodeError: - continue - return None - - -@trace_agent(name="task_planner") -def run_agent( - host: str, - token: str, - endpoint_name: str, - *, - task_title: str, - task_description: str, - agent: AgentSpec, - history: List[dict], - on_step: Optional[Callable[[str], None]] = None, -) -> PlanResult: - """Decide whether to run the selected agent now or ask the teammate more. - - ``history`` is the ordered clarification Q&A: ``[{"role": "assistant"|"user", - "text": str}, ...]``. ``success`` is ``True`` when the LLM replied parseably; - ``ready`` gates the actual run. On any failure ``ready`` stays ``False`` so - the agent never runs without a confident go-ahead. - """ - result = PlanResult(success=False) - - if on_step: - on_step("Reviewing the task scope...") - - messages = [ - {"role": "system", "content": _SYSTEM_PROMPT}, - { - "role": "user", - "content": _build_user_prompt( - task_title, task_description, agent, history - ), - }, - ] - - result.iterations = 1 - try: - llm_response = call_serving_endpoint( - host, - token, - endpoint_name, - messages, - max_tokens=512, - temperature=0.0, - timeout=LLM_TIMEOUT, - trace_name=_TRACE_NAME, - ) - except Exception as exc: # noqa: BLE001 - result.error = f"Planner LLM request failed: {exc}" - logger.error("task_planner: %s", result.error) - return result - - accumulate_usage(result.usage, llm_response.get("usage", {})) - content = extract_message_content(llm_response) - result.steps.append(AgentStep(step_type="output", content=content[:500])) - - plan = _parse_plan(content) - if not plan: - result.error = "Planner returned an unparseable response" - result.message = ( - "I need a bit more detail before I proceed — could you clarify the " - "scope of this task?" - ) - logger.warning("task_planner: unparseable response: %s", content[:200]) - return result - - result.success = True - result.ready = bool(plan.get("ready", False)) - result.message = str(plan.get("message", "")).strip() - logger.info("task_planner: ready=%s", result.ready) - return result diff --git a/src/agents/agent_task_planner/tools.py b/src/agents/agent_task_planner/tools.py deleted file mode 100644 index 2d08538a..00000000 --- a/src/agents/agent_task_planner/tools.py +++ /dev/null @@ -1,7 +0,0 @@ -"""The planner is single-shot and uses no tools (kept for package symmetry).""" -from __future__ import annotations - -from typing import Callable, Dict, List - -TOOL_DEFINITIONS: List[dict] = [] -TOOL_HANDLERS: Dict[str, Callable] = {} diff --git a/src/agents/agent_task_router/__init__.py b/src/agents/agent_task_router/__init__.py deleted file mode 100644 index 19ff7805..00000000 --- a/src/agents/agent_task_router/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -""" -Task Router Agent -- picks which specialized OntoBricks agent should carry -out a task assigned to the "AI Agent". - -Single-shot classifier (no tool loop). Driven by -:func:`back.objects.registry.agent_task_runner.start_agent_task`, which runs -the chosen agent against the task's domain in a background thread. - -Exports: - run_agent / AgentResult -""" - -from agents.agent_task_router.engine import AgentResult, run_agent # noqa: F401 - -__all__ = ["run_agent", "AgentResult"] diff --git a/src/agents/agent_task_router/engine.py b/src/agents/agent_task_router/engine.py deleted file mode 100644 index b6b5ccf6..00000000 --- a/src/agents/agent_task_router/engine.py +++ /dev/null @@ -1,192 +0,0 @@ -""" -Task Router Agent engine. - -A single-shot classifier: given a task's title + description and the list of -dispatchable agents (:mod:`agents.registry`), the LLM picks the one agent best -suited to carry the task out and explains why. No tool-calling loop -- one -serving-endpoint call, JSON in / JSON out. - -The orchestrator (:mod:`back.objects.registry.agent_task_runner`) consumes -:attr:`AgentResult.chosen_agent_key` to actually run the specialized agent. -""" - -from __future__ import annotations - -import json -import re -from dataclasses import dataclass, field -from typing import Callable, Dict, List, Optional - -from agents.engine_base import ( - AgentStep, - accumulate_usage, - call_serving_endpoint, - extract_message_content, -) -from agents.registry import AgentSpec -from agents.tracing import trace_agent -from back.core.logging import get_logger - -logger = get_logger(__name__) - -LLM_TIMEOUT = 60 -_TRACE_NAME = "task_router" - - -@dataclass -class AgentResult: - """Outcome of a routing decision.""" - - success: bool - chosen_agent_key: str = "" - reasoning: str = "" - steps: List[AgentStep] = field(default_factory=list) - iterations: int = 0 - error: str = "" - usage: Dict[str, int] = field(default_factory=dict) - - -_SYSTEM_PROMPT = """\ -You are the Task Router for OntoBricks. A teammate assigned a work item to the -"AI Agent". Your only job is to decide which ONE specialized agent should carry -out the task, based on the task title and description. - -You will be given the list of available agents, each with a key and a -description of what it does and when to pick it. - -RULES -- Choose exactly one agent whose purpose matches the task intent. -- The ontology IS the domain model. Tasks that ask to design, model, create, - add, structure, or restructure a domain concept / entity / class / - relationship are ontology DESIGN tasks -- route them to the Ontology Assistant - (the default for ontology design and editing), even when phrased as "build" or - "create" something. A name you don't recognize is most likely a domain entity - to model, not unrelated work. -- Only choose "none" for tasks clearly unrelated to the ontology / data model, - its mappings, business rules, or entity icons (e.g. infrastructure, app code, - or off-topic requests). -- Reply with ONLY a JSON object, no prose, no code fences: - {"agent": "", "reasoning": ""} -""" - - -def _build_user_prompt( - task_title: str, task_description: str, available_agents: List[AgentSpec] -) -> str: - lines = ["AVAILABLE AGENTS:"] - for spec in available_agents: - lines.append(f'- key="{spec.key}" ({spec.label}): {spec.description}') - lines.append("") - lines.append(f"TASK TITLE: {task_title}") - if task_description: - lines.append(f"TASK DESCRIPTION: {task_description}") - lines.append("") - lines.append('Respond with the JSON object: {"agent": "...", "reasoning": "..."}') - return "\n".join(lines) - - -def _parse_decision(text: str) -> Optional[dict]: - """Extract the ``{"agent": ..., "reasoning": ...}`` object from LLM text.""" - cleaned = (text or "").strip() - fence = re.search(r"```(?:json)?\s*([\s\S]*?)```", cleaned) - if fence: - cleaned = fence.group(1).strip() - try: - obj = json.loads(cleaned) - if isinstance(obj, dict): - return obj - except json.JSONDecodeError: - pass - brace = re.search(r"\{[\s\S]*\}", cleaned) - if brace: - try: - obj = json.loads(brace.group(0)) - if isinstance(obj, dict): - return obj - except json.JSONDecodeError: - return None - return None - - -@trace_agent(name="task_router") -def run_agent( - host: str, - token: str, - endpoint_name: str, - *, - task_title: str, - task_description: str, - available_agents: List[AgentSpec], - on_step: Optional[Callable[[str], None]] = None, -) -> AgentResult: - """Pick the agent that should carry out *task_title* / *task_description*. - - Returns an :class:`AgentResult`; ``success`` is ``True`` only when a valid, - known agent key was chosen. ``chosen_agent_key`` is empty when the router - decided no agent fits (``reasoning`` explains why). - """ - result = AgentResult(success=False) - valid_keys = {spec.key for spec in available_agents} - - if not available_agents: - result.error = "No dispatchable agents are registered" - return result - - if on_step: - on_step("Selecting the right agent for this task...") - - messages = [ - {"role": "system", "content": _SYSTEM_PROMPT}, - { - "role": "user", - "content": _build_user_prompt( - task_title, task_description, available_agents - ), - }, - ] - - result.iterations = 1 - try: - llm_response = call_serving_endpoint( - host, - token, - endpoint_name, - messages, - max_tokens=256, - temperature=0.0, - timeout=LLM_TIMEOUT, - trace_name=_TRACE_NAME, - ) - except Exception as exc: # noqa: BLE001 - result.error = f"Router LLM request failed: {exc}" - logger.error("task_router: %s", result.error) - return result - - accumulate_usage(result.usage, llm_response.get("usage", {})) - content = extract_message_content(llm_response) - result.steps.append(AgentStep(step_type="output", content=content[:500])) - - decision = _parse_decision(content) - if not decision: - result.error = "Router returned an unparseable response" - logger.warning("task_router: unparseable response: %s", content[:200]) - return result - - chosen = str(decision.get("agent", "")).strip() - reasoning = str(decision.get("reasoning", "")).strip() - result.reasoning = reasoning - - if chosen.lower() in ("", "none", "null"): - result.error = reasoning or "No suitable agent for this task" - logger.info("task_router: no agent chosen (%s)", result.error) - return result - - if chosen not in valid_keys: - result.error = f"Router chose an unknown agent: {chosen}" - logger.warning("task_router: %s", result.error) - return result - - result.success = True - result.chosen_agent_key = chosen - logger.info("task_router: chose '%s' — %s", chosen, reasoning) - return result diff --git a/src/agents/agent_task_router/tools.py b/src/agents/agent_task_router/tools.py deleted file mode 100644 index 98ffbf68..00000000 --- a/src/agents/agent_task_router/tools.py +++ /dev/null @@ -1,13 +0,0 @@ -""" -Tool definitions for the Task Router agent. - -The router is a single-shot classifier and intentionally exposes **no** tools: -it reads the task + the static agent registry and returns a routing decision in -one LLM call. These empty collections exist only for parity with the other -agent packages (every ``agent_*`` package ships a ``tools`` module). -""" - -from typing import Callable, Dict, List - -TOOL_DEFINITIONS: List[dict] = [] -TOOL_HANDLERS: Dict[str, Callable] = {} diff --git a/src/agents/registry.py b/src/agents/registry.py deleted file mode 100644 index 0b9f6e04..00000000 --- a/src/agents/registry.py +++ /dev/null @@ -1,121 +0,0 @@ -""" -Static registry of the agents that the task router may dispatch to. - -OntoBricks discovers agents statically (one package per agent under -``src/agents/agent_*``); there is no dynamic factory. This module mirrors that -convention: it lists the *dispatchable* agents -- the ones the -:mod:`agents.agent_task_router` can pick and the orchestrator -(:mod:`back.objects.registry.agent_task_runner`) knows how to run from a -domain session. - -Only agents that already have background-task + domain-context wiring are -listed here. Interactive chat agents (dtwin chat, ontology assistant, cohort) -are intentionally excluded -- they need a live conversation, not a task. -""" - -from __future__ import annotations - -from dataclasses import dataclass -from typing import List, Optional - - -@dataclass(frozen=True) -class AgentSpec: - """One dispatchable agent the router can choose. - - Attributes: - key: Stable identifier used by the router output and the orchestrator - dispatch table. - label: Human-readable name surfaced in task comments / UI. - description: What the agent does and *when to pick it* -- fed verbatim - to the router LLM, so phrase it as routing guidance. - task_type: The :class:`~back.core.task_manager.models.Task` ``task_type`` - the underlying agent runs under (kept for parity with the existing - background routes). - """ - - key: str - label: str - description: str - task_type: str - - -DISPATCHABLE_AGENTS: List[AgentSpec] = [ - AgentSpec( - key="ontology_assistant", - label="Ontology Assistant", - description=( - "Design and edit the domain ontology (the data model) in place and " - "save the changes. This is the default agent for any ontology " - "MODELING or DESIGN task: create, add, model, or design new " - "classes/entities/relationships (e.g. 'create an Agent Manager " - "entity'); rename, merge, split, or remove existing ones; evaluate " - "whether a class is necessary; adjust the class hierarchy or a " - "relationship's domain/range. Pick this whenever the task is about " - "shaping what concepts/entities exist in the ontology, including " - "targeted edits and incremental design (changes are applied " - "directly). Prefer this over the Generator unless the task asks to " - "(re)build the WHOLE ontology from scratch." - ), - task_type="ontology_assistant", - ), - AgentSpec( - key="owl_generator", - label="Ontology Generator", - description=( - "Generate the WHOLE OWL/Turtle ontology from scratch from the " - "imported Unity Catalog metadata and domain documents. Pick this " - "only to bootstrap a brand-new ontology or fully regenerate " - "everything -- NOT for editing or tweaking a few classes (use the " - "Ontology Assistant for targeted edits)." - ), - task_type="ontology_generation", - ), - AgentSpec( - key="business_rules_generator", - label="Business Rules Generator", - description=( - "Propose business rules (SWRL inferences, decision tables, SPARQL " - "queries, aggregate constraints) from the existing ontology " - "design. Pick this when the task asks to add, define, generate, or " - "suggest business rules, logic, inferences, constraints, or " - "validations." - ), - task_type="business_rules_generation", - ), - AgentSpec( - key="icon_assign", - label="Icon Assigner", - description=( - "Assign a representative emoji icon to each ontology entity. Pick " - "this when the task asks to set, assign, choose, or refresh icons " - "or emojis for entities / classes." - ), - task_type="auto_assign_icons", - ), - AgentSpec( - key="auto_assignment", - label="Auto SQL Mapper", - description=( - "Map ontology entities and relationships to validated SQL queries " - "over the warehouse tables. Pick this when the task asks to map, " - "assign, or connect entities / relationships to tables, columns, " - "or data, or to build the SQL mappings." - ), - task_type="auto_assign", - ), -] - - -def list_agents() -> List[AgentSpec]: - """Return the dispatchable agent specs (a copy, safe to mutate).""" - return list(DISPATCHABLE_AGENTS) - - -def get_agent(key: str) -> Optional[AgentSpec]: - """Return the :class:`AgentSpec` for *key*, or ``None`` when unknown.""" - key = (key or "").strip() - for spec in DISPATCHABLE_AGENTS: - if spec.key == key: - return spec - return None diff --git a/src/api/routers/internal/__init__.py b/src/api/routers/internal/__init__.py index 96e12c98..822f3570 100644 --- a/src/api/routers/internal/__init__.py +++ b/src/api/routers/internal/__init__.py @@ -11,7 +11,6 @@ from api.routers.internal.dtwin import router as dtwin_router from api.routers.internal.domain import router as domain_router from api.routers.internal.review import router as review_router -from api.routers.internal.comments import router as comments_router from api.routers.internal.tasks import router as tasks_router from api.routers.internal.help import router as help_router @@ -23,7 +22,6 @@ dtwin_router, domain_router, review_router, - comments_router, tasks_router, help_router, ] diff --git a/src/api/routers/internal/comments.py b/src/api/routers/internal/comments.py deleted file mode 100644 index 65a69467..00000000 --- a/src/api/routers/internal/comments.py +++ /dev/null @@ -1,212 +0,0 @@ -""" -Internal API -- collaborative comments & tasks endpoints. - -Backs the contextual thread panel (opened from the ontology, mapping and -graph surfaces, or the Validation workspace) and the assignee "My Tasks" -worklist. Comments are anchored to a canonical reference; a comment can be -turned into a task assigned to a teammate. - -Authorization is resolved against the *target* domain (which may differ -from the loaded session domain) via -:meth:`SettingsService.resolve_domain_role`. The DRAFT/IN-REVIEW write -gate and the per-action role rules are enforced in -:class:`CommentService`. -""" - -from fastapi import APIRouter, Request, Depends - -from shared.config.settings import get_settings, Settings -from back.core.logging import get_logger -from back.objects.session import SessionManager, get_session_manager -from back.objects.domain import SettingsService -from back.objects.registry.CommentService import CommentService - -logger = get_logger(__name__) - -router = APIRouter(prefix="/comments", tags=["Comments"]) - - -@router.get("/{folder}/{version}") -async def list_comments( - folder: str, - version: str, - request: Request, - session_mgr: SessionManager = Depends(get_session_manager), - settings: Settings = Depends(get_settings), -): - """All comments for the domain-wide ``(folder, version)`` thread.""" - user_role, domain_role = _roles(request, folder, settings) - return CommentService.list_comments( - request, - session_mgr, - settings, - folder, - version, - user_role=user_role, - user_domain_role=domain_role, - ) - - -@router.post("/{folder}/{version}") -async def add_comment( - folder: str, - version: str, - request: Request, - session_mgr: SessionManager = Depends(get_session_manager), - settings: Settings = Depends(get_settings), -): - """Add a comment (or a reply via ``parent_id``) to the domain discussion.""" - data = await _body(request) - user_role, domain_role = _roles(request, folder, settings) - return CommentService.add_comment( - request, - session_mgr, - settings, - folder, - version, - body=(data.get("body") or ""), - parent_id=(data.get("parent_id") or None), - user_role=user_role, - user_domain_role=domain_role, - ) - - -@router.post("/{folder}/{version}/{comment_id}/resolve") -async def resolve_comment( - folder: str, - version: str, - comment_id: str, - request: Request, - session_mgr: SessionManager = Depends(get_session_manager), - settings: Settings = Depends(get_settings), -): - """Resolve (or reopen) a comment thread.""" - data = await _body(request) - resolved = data.get("resolved", True) - user_role, domain_role = _roles(request, folder, settings) - return CommentService.resolve_comment( - request, - session_mgr, - settings, - folder, - version, - comment_id, - resolved=bool(resolved), - user_role=user_role, - user_domain_role=domain_role, - ) - - -@router.get("/{folder}/{version}/tasks") -async def list_tasks( - folder: str, - version: str, - request: Request, - session_mgr: SessionManager = Depends(get_session_manager), - settings: Settings = Depends(get_settings), -): - """All tasks for a version.""" - user_role, domain_role = _roles(request, folder, settings) - return CommentService.list_tasks( - request, - session_mgr, - settings, - folder, - version, - user_role=user_role, - user_domain_role=domain_role, - ) - - -@router.get("/{folder}/{version}/assignees") -async def list_assignees( - folder: str, - version: str, - request: Request, - session_mgr: SessionManager = Depends(get_session_manager), - settings: Settings = Depends(get_settings), -): - """People with a role on the domain — the task assignee picker.""" - del version # assignees are per-domain, not per-version - user_role, domain_role = _roles(request, folder, settings) - return CommentService.list_assignees( - request, - session_mgr, - settings, - folder, - user_role=user_role, - user_domain_role=domain_role, - ) - - -@router.post("/{folder}/{version}/tasks") -async def create_task( - folder: str, - version: str, - request: Request, - session_mgr: SessionManager = Depends(get_session_manager), - settings: Settings = Depends(get_settings), -): - """Create a task (optionally born from a comment).""" - data = await _body(request) - user_role, domain_role = _roles(request, folder, settings) - return CommentService.create_task( - request, - session_mgr, - settings, - folder, - version, - assignee=(data.get("assignee") or ""), - title=(data.get("title") or ""), - description=(data.get("description") or ""), - due_date=(data.get("due_date") or None), - comment_id=(data.get("comment_id") or None), - user_role=user_role, - user_domain_role=domain_role, - ) - - -@router.post("/{folder}/{version}/tasks/{task_id}/status") -async def update_task_status( - folder: str, - version: str, - task_id: str, - request: Request, - session_mgr: SessionManager = Depends(get_session_manager), - settings: Settings = Depends(get_settings), -): - """Advance a task's status.""" - data = await _body(request) - user_role, domain_role = _roles(request, folder, settings) - return CommentService.update_task_status( - request, - session_mgr, - settings, - folder, - version, - task_id, - status=(data.get("status") or ""), - user_role=user_role, - user_domain_role=domain_role, - ) - - -# --------------------------------------------------------------------- -# Helpers -# --------------------------------------------------------------------- - - -def _roles(request: Request, folder: str, settings: Settings): - """Resolve (app_role, domain_role) for *folder* against the target domain.""" - user_role = getattr(request.state, "user_role", "") or "" - domain_role = SettingsService.resolve_domain_role( - request, folder, settings, app_role=user_role - ) - return user_role, domain_role - - -async def _body(request: Request) -> dict: - try: - return await request.json() - except Exception: # noqa: BLE001 - return {} diff --git a/src/back/core/databricks/DatabricksAuth.py b/src/back/core/databricks/DatabricksAuth.py index ecb50fe8..2f3e35df 100644 --- a/src/back/core/databricks/DatabricksAuth.py +++ b/src/back/core/databricks/DatabricksAuth.py @@ -35,7 +35,6 @@ class DatabricksAuth: # Class-level cache: { (host, warehouse_id): (capable, reason, ts) } _cloud_fetch_cache: Dict[Tuple[str, str], Tuple[bool, str, float]] = {} - _resolving_cloud_fetch: bool = False @staticmethod def is_databricks_app() -> bool: @@ -58,9 +57,6 @@ def normalize_host(host: str) -> str: @staticmethod def _resolve_global_cloud_fetch_default(host: str, token: str) -> bool: """Best-effort load of global CloudFetch setting (default: enabled).""" - if DatabricksAuth._resolving_cloud_fetch: - return True - DatabricksAuth._resolving_cloud_fetch = True try: from shared.config.settings import get_settings from back.objects.registry import RegistryCfg @@ -79,8 +75,6 @@ def _resolve_global_cloud_fetch_default(host: str, token: str) -> bool: exc, ) return True - finally: - DatabricksAuth._resolving_cloud_fetch = False @staticmethod def get_workspace_host() -> str: diff --git a/src/back/core/databricks/SQLWarehouse.py b/src/back/core/databricks/SQLWarehouse.py index 07f5ba73..6ff53c2f 100644 --- a/src/back/core/databricks/SQLWarehouse.py +++ b/src/back/core/databricks/SQLWarehouse.py @@ -23,39 +23,6 @@ _POOL_MAX_SIZE = 8 _POOL_MAX_IDLE_SECS = 300 -try: # databricks-sql-connector connection-level exception types - from databricks.sql import exc as _dbsql_exc - - _CONN_ERROR_TYPES: Tuple[type, ...] = ( - _dbsql_exc.OperationalError, - _dbsql_exc.InterfaceError, - _dbsql_exc.RequestError, - _dbsql_exc.SessionAlreadyClosedError, - _dbsql_exc.CursorAlreadyClosedError, - _dbsql_exc.NonRecoverableNetworkError, - ) -except Exception: # noqa: BLE001 - older/newer connector layouts - _CONN_ERROR_TYPES = () - - -def _is_connection_error(exc: BaseException) -> bool: - """True when *exc* looks like a dead/stale connection worth one retry. - - Covers the connector's connection-level exception types plus the - specific ``'NoneType' object has no attribute 'request'`` AttributeError - seen when a pooled connection whose HTTP transport was already closed - (server-side session drop / warehouse auto-stop) is reused. - """ - if _CONN_ERROR_TYPES and isinstance(exc, _CONN_ERROR_TYPES): - return True - msg = str(exc).lower() - if isinstance(exc, AttributeError) and "request" in msg: - return True - return any( - token in msg - for token in ("connection", "session", "closed", "broken pipe", "transport") - ) - class _PooledConnection: """Wrapper that tracks creation time around a raw DB-API connection.""" @@ -98,12 +65,14 @@ def _new_connection(self): params = self._auth.get_sql_connection_params() return sql.connect(**params) - def _checkout(self) -> Tuple[_PooledConnection, bool]: - """Get a pooled connection (``reused=True``) or a fresh one. + @contextmanager + def _borrow(self): + """Borrow a connection from the pool; return it when done. Stale connections (older than ``_POOL_MAX_IDLE_SECS``) are discarded - and a fresh one is created. Reuse is reported so callers can decide - whether a failure is worth retrying on a fresh connection. + and a fresh one is created. If the borrowed connection turns out to + be broken the caller should **not** return it (the ``except`` branch + takes care of that). """ conn: Optional[_PooledConnection] = None try: @@ -115,70 +84,18 @@ def _checkout(self) -> Tuple[_PooledConnection, bool]: conn = None if conn is None: - return _PooledConnection(self._new_connection()), False - return conn, True - - def _checkin(self, conn: _PooledConnection) -> None: - """Return *conn* to the pool, or close it if the pool is full.""" - try: - self._pool.put_nowait(conn) - except queue.Full: - self._close_quietly(conn) - - @contextmanager - def _borrow(self): - """Borrow a connection from the pool; return it when done. + conn = _PooledConnection(self._new_connection()) - Stale connections (older than ``_POOL_MAX_IDLE_SECS``) are discarded - and a fresh one is created. If the borrowed connection turns out to - be broken the caller should **not** return it (the ``except`` branch - takes care of that). - """ - conn, _reused = self._checkout() try: yield conn.conn except Exception: self._close_quietly(conn) raise else: - self._checkin(conn) - - def _run(self, fn): - """Run ``fn(conn)`` on a pooled connection with one retry. - - A long-running build can span a server-side session drop (warehouse - auto-stop/scale, idle disconnect); the stale pooled connection then - surfaces as a connection error (e.g. the ``unified_http_client`` None - ``request`` AttributeError). When that happens on a *reused* - connection we discard it and retry once on a fresh connection so the - build doesn't crash on a recoverable transport teardown. - - ``fn`` must fully consume its work before returning (no lazy - generators) so a retry re-runs the whole operation cleanly. - """ - conn, reused = self._checkout() - try: - result = fn(conn.conn) - except Exception as exc: - self._close_quietly(conn) - if reused and _is_connection_error(exc): - logger.warning( - "Stale pooled connection (%s); retrying once on a fresh " - "connection", - exc, - ) - fresh = _PooledConnection(self._new_connection()) - try: - result = fn(fresh.conn) - except Exception: - self._close_quietly(fresh) - raise - self._checkin(fresh) - return result - raise - else: - self._checkin(conn) - return result + try: + self._pool.put_nowait(conn) + except queue.Full: + self._close_quietly(conn) @staticmethod def _close_quietly(pc: _PooledConnection) -> None: @@ -202,12 +119,10 @@ def test_connection(self) -> Tuple[bool, str]: return False, "Missing configuration: DATABRICKS_HOST or DATABRICKS_TOKEN" try: - def _probe(conn): + with self._borrow() as conn: with conn.cursor() as cur: cur.execute("SELECT 1") cur.fetchone() - - self._run(_probe) auth_mode = ( "OAuth (Databricks App)" if self._auth.is_app_mode @@ -220,15 +135,12 @@ def _probe(conn): def execute_query(self, query: str) -> List[Dict[str, Any]]: """Execute *query* and return rows as a list of dicts.""" self._require_warehouse() - - def _fetch(conn): - with conn.cursor() as cur: - cur.execute(query) - columns = [desc[0] for desc in cur.description] - return [dict(zip(columns, row)) for row in cur.fetchall()] - try: - return self._run(_fetch) + with self._borrow() as conn: + with conn.cursor() as cur: + cur.execute(query) + columns = [desc[0] for desc in cur.description] + return [dict(zip(columns, row)) for row in cur.fetchall()] except Exception as exc: logger.exception("Error executing query: %s", exc) raise @@ -268,25 +180,22 @@ def iter_rows( def execute_statement(self, statement: str) -> bool: """Execute a DDL/DML *statement* without returning results.""" self._require_warehouse() - - def _exec(conn): - with conn.cursor() as cur: - cur.execute(statement) - # UC DDL must be committed before control-plane APIs (e.g. synced - # database tables) can resolve catalog.schema in the metastore. - commit = getattr(conn, "commit", None) - if callable(commit): - try: - commit() - except Exception as commit_exc: # noqa: BLE001 - logger.debug( - "Ignoring commit() after DDL (autocommit driver): %s", - commit_exc, - ) - return True - try: - return self._run(_exec) + with self._borrow() as conn: + with conn.cursor() as cur: + cur.execute(statement) + # UC DDL must be committed before control-plane APIs (e.g. synced + # database tables) can resolve catalog.schema in the metastore. + commit = getattr(conn, "commit", None) + if callable(commit): + try: + commit() + except Exception as commit_exc: # noqa: BLE001 + logger.debug( + "Ignoring commit() after DDL (autocommit driver): %s", + commit_exc, + ) + return True except Exception as exc: logger.exception("Error executing statement: %s", exc) raise diff --git a/src/back/objects/digitaltwin/_build_pipeline.py b/src/back/objects/digitaltwin/_build_pipeline.py index 289f230b..3cd09763 100644 --- a/src/back/objects/digitaltwin/_build_pipeline.py +++ b/src/back/objects/digitaltwin/_build_pipeline.py @@ -22,11 +22,7 @@ from datetime import datetime, timezone from typing import Any, Dict, Optional -from back.core.errors import ( - InfrastructureError, - OntoBricksError, - OperationCancelledError, -) +from back.core.errors import OntoBricksError, OperationCancelledError def _raise_if_cancelled(cancel_check) -> None: @@ -298,14 +294,7 @@ def _lakebase_managed_synced(self) -> bool: return self._is_lakebase_synced def _count_view_triples(self) -> int: - """Return the number of triples in the VIEW (server-side COUNT). - - A successful COUNT of ``0`` is a genuinely empty view (kept as a - non-fatal "no triples" outcome upstream). A *failed* count (view - missing, transient/connection error) is raised rather than coerced - to ``0`` — otherwise a broken build would be misreported as a - healthy zero-triple build and would silently stamp ``last_build``. - """ + """Return the number of triples in the VIEW (server-side COUNT).""" logger.debug( "[DT-BUILD %s] counting triples in VIEW %s", self.task_id, self.view_table ) @@ -322,15 +311,13 @@ def _count_view_triples(self) -> int: ) return count except Exception as exc: # noqa: BLE001 - logger.error( + logger.warning( "[DT-BUILD %s] could not count triples in VIEW %s: %s", self.task_id, self.view_table, exc, ) - raise InfrastructureError( - f"Failed to count triples in view {self.view_table}: {exc}" - ) from exc + return 0 # ------------------------------------------------------------------ # Orchestrator @@ -1262,24 +1249,6 @@ def _record_build_run( } svc = RegistryService.from_context(self.domain, self.settings) svc.record_build_run(folder, entry) - if status == "success" and version: - build_ts = getattr(self.domain, "last_build", "") or entry.get( - "finished_at", "" - ) - if build_ts: - ok, msg = svc._store.stamp_last_build(folder, str(version), build_ts) - if ok: - logger.info( - "[DT-BUILD %s] stamped last_build=%s in registry", - self.task_id, - build_ts, - ) - else: - logger.warning( - "[DT-BUILD %s] stamp_last_build failed (non-fatal): %s", - self.task_id, - msg, - ) except Exception as exc: # noqa: BLE001 logger.warning( "[DT-BUILD %s] could not record build-run trace " @@ -1288,69 +1257,6 @@ def _record_build_run( exc, ) - def _persist_last_build(self, ts: str) -> None: - """Stamp ``last_build`` on the registry version record (best-effort). - - The interactive/API build only updated the in-memory session; - the Submit gate and lifecycle guard read ``info.last_build`` from - the registry. Without this, a healthy build leaves the version - looking "never built" and Submit stays blocked. Mirrors the - scheduler's stamp but as a surgical single-column update so it - never rewrites the full version document. - """ - try: - from back.objects.registry.RegistryService import RegistryService - from back.objects.session import sanitize_domain_folder - - folder = getattr(self.domain, "uc_domain_folder", "") or ( - sanitize_domain_folder(self.domain_name) - ) - version = ( - getattr(self.domain_snap, "current_version", None) - or getattr(self.domain, "current_version", None) - or "" - ) - if not folder or not version: - logger.warning( - "[DT-BUILD %s] cannot stamp last_build " - "(folder=%r version=%r)", - self.task_id, - folder, - version, - ) - return - # Keep the in-process session consistent with the registry. - try: - self.domain.last_build = ts - except Exception: # noqa: BLE001 - pass - svc = RegistryService.from_context(self.domain, self.settings) - ok, msg = svc.update_last_build(folder, str(version), ts) - if ok: - logger.info( - "[DT-BUILD %s] stamped last_build=%s in registry " - "(%s/%s)", - self.task_id, - ts, - folder, - version, - ) - else: - logger.error( - "[DT-BUILD %s] update_last_build failed (%s/%s): %s", - self.task_id, - folder, - version, - msg, - ) - except Exception as exc: # noqa: BLE001 - logger.warning( - "[DT-BUILD %s] could not stamp last_build " - "(non-fatal): %s", - self.task_id, - exc, - ) - def _complete_task(self) -> None: duration = time.time() - self.start_time logger.info( @@ -1378,7 +1284,6 @@ def _complete_task(self) -> None: msg = f"Full rebuild: {self.triple_count} triples in {duration:.1f}s" self.tm.complete_task(self.task_id, result=result_data, message=msg) self._record_build_run("success", message=msg) - self._persist_last_build(datetime.now(timezone.utc).isoformat()) def _fail_unexpected(self, exc: Exception) -> None: duration = time.time() - self.start_time diff --git a/src/back/objects/mapping/Mapping.py b/src/back/objects/mapping/Mapping.py index 8a196640..13ed00fe 100644 --- a/src/back/objects/mapping/Mapping.py +++ b/src/back/objects/mapping/Mapping.py @@ -909,81 +909,6 @@ def build_per_item_results( return results - @staticmethod - def _merge_entity_mappings( - existing: List[Dict[str, Any]], incoming: List[Dict[str, Any]] - ) -> List[Dict[str, Any]]: - """Upsert *incoming* entity mappings into *existing* (keyed by class URI). - - Preserves an existing ``excluded`` flag when the incoming mapping does - not set one, so a re-map never silently re-includes an entity the user - excluded. - """ - merged = list(existing) - for new_m in incoming: - uri = new_m.get("ontology_class") or new_m.get("class_uri", "") - idx = next( - ( - i - for i, m in enumerate(merged) - if (m.get("ontology_class") or m.get("class_uri")) == uri - ), - None, - ) - if idx is not None: - if merged[idx].get("excluded") and "excluded" not in new_m: - new_m["excluded"] = True - merged[idx] = new_m - else: - merged.append(new_m) - return merged - - @staticmethod - def _merge_relationship_mappings( - existing: List[Dict[str, Any]], incoming: List[Dict[str, Any]] - ) -> List[Dict[str, Any]]: - """Upsert *incoming* relationship mappings into *existing* (keyed by - ``property``), preserving an existing ``excluded`` flag. - """ - merged = list(existing) - for new_m in incoming: - uri = new_m.get("property", "") - idx = next( - (i for i, m in enumerate(merged) if m.get("property") == uri), - None, - ) - if idx is not None: - if merged[idx].get("excluded") and "excluded" not in new_m: - new_m["excluded"] = True - merged[idx] = new_m - else: - merged.append(new_m) - return merged - - def apply_agent_mappings( - self, - entity_mappings: Optional[List[Dict[str, Any]]], - relationship_mappings: Optional[List[Dict[str, Any]]], - ) -> Dict[str, int]: - """Merge agent-proposed mappings into the domain and persist to the registry. - - The session-less counterpart of :meth:`save_mappings_to_session`: it - upserts into ``domain.assignment`` (preserving ``excluded`` flags) and - calls ``domain.save()``. Used by the background AI-Agent task runner, - which has a domain but no HTTP session. Returns the post-merge totals. - """ - domain = self._domain - merged_e = Mapping._merge_entity_mappings( - domain.get_entity_mappings(), entity_mappings or [] - ) - merged_r = Mapping._merge_relationship_mappings( - domain.get_relationship_mappings(), relationship_mappings or [] - ) - domain.assignment["entities"] = merged_e - domain.assignment["relationships"] = merged_r - domain.save() - return {"entities": len(merged_e), "relationships": len(merged_r)} - @staticmethod def save_mappings_to_session( session_id: Optional[str], @@ -1016,17 +941,48 @@ def save_mappings_to_session( if entity_mappings is not None: if existing_entity_mappings is not None: - assignment["entities"] = Mapping._merge_entity_mappings( - existing_entity_mappings, entity_mappings - ) + merged = list(existing_entity_mappings) + for new_m in entity_mappings: + uri = new_m.get("ontology_class") or new_m.get("class_uri", "") + idx = next( + ( + i + for i, m in enumerate(merged) + if (m.get("ontology_class") or m.get("class_uri")) + == uri + ), + None, + ) + if idx is not None: + if merged[idx].get("excluded") and "excluded" not in new_m: + new_m["excluded"] = True + merged[idx] = new_m + else: + merged.append(new_m) + assignment["entities"] = merged else: assignment["entities"] = entity_mappings if relationship_mappings is not None: if existing_relationship_mappings is not None: - assignment["relationships"] = Mapping._merge_relationship_mappings( - existing_relationship_mappings, relationship_mappings - ) + merged = list(existing_relationship_mappings) + for new_m in relationship_mappings: + uri = new_m.get("property", "") + idx = next( + ( + i + for i, m in enumerate(merged) + if m.get("property") == uri + ), + None, + ) + if idx is not None: + if merged[idx].get("excluded") and "excluded" not in new_m: + new_m["excluded"] = True + merged[idx] = new_m + else: + merged.append(new_m) + assignment["relationships"] = merged else: assignment["relationships"] = relationship_mappings diff --git a/src/back/objects/registry/CommentService.py b/src/back/objects/registry/CommentService.py deleted file mode 100644 index 3a2f598f..00000000 --- a/src/back/objects/registry/CommentService.py +++ /dev/null @@ -1,593 +0,0 @@ -"""Collaborative comments & tasks workflow. - -Adds contextual, threaded discussion on top of a domain version and lets -a comment become a personalised task assigned to a teammate. Comments are -*anchored* to a canonical reference so the same thread component opens -from any surface: - -* ``ontology_class`` / ``ontology_property`` — the class/property URI -* ``mapping`` — the mapping ontology URI -* ``graph_node`` / ``graph_edge`` — the node subject URI / - ``source|predicate|target`` -* ``domain`` — the whole (domain, version) - -Lifecycle coupling (mirrors the edit lock): comments and tasks are -*written* only while a version is DRAFT or IN-REVIEW — PUBLISHED versions -are read-only here too. Reads are open to any domain member. - -Authorization reuses the per-domain role resolved by the router (the same -``_roles()`` pattern as :mod:`api.routers.internal.review`): - -* **Read** (list comments / tasks) — any member (viewer or above). -* **Comment / create task** — any member (a reviewer can delegate work). -* **Resolve a comment** — its author, an editor (or above), or an admin. -* **Update a task** — its assignee, its creator, an editor (or above), - or an admin. - -Every task create / completion also appends a ``commented`` row to the -``domain_review_events`` audit log (with ``meta`` linking the task and -comment) so the Validation timeline stays unified. -""" - -from __future__ import annotations - -from typing import Any, Dict, List, Optional, Tuple - -from back.core.errors import ( - AuthorizationError, - ConflictError, - InfrastructureError, - NotFoundError, - OntoBricksError, - ValidationError, -) -from back.core.logging import get_logger -from back.objects.registry.agent_task_runner import ( - AI_AGENT_PRINCIPAL, - is_ai_agent, - resume_agent_task, - start_agent_task, -) -from back.objects.registry.RegistryService import RegistryCfg, RegistryService -from back.objects.registry.PermissionService import ( - ASSIGNABLE_ROLES, - ROLE_ADMIN, - ROLE_EDITOR, - ROLE_VIEWER, - permission_service, - role_level, -) -from back.objects.registry.version_lifecycle import ( - STATUS_DRAFT, - STATUS_IN_REVIEW, -) -from back.objects.session import SessionManager, get_domain - -logger = get_logger(__name__) - -# Task status values (mirror the schema CHECK constraint). -TASK_STATUSES = frozenset({"open", "in_progress", "done", "cancelled"}) - -# Versions whose discussion is still open for writing. PUBLISHED is -# read-only, matching the ontology edit lock. -_WRITABLE_STATUSES = frozenset({STATUS_DRAFT, STATUS_IN_REVIEW}) - -_MAX_BODY = 8000 -_MAX_TITLE = 300 - - -class CommentService: - """Stateless orchestrator for collaborative comments + tasks.""" - - # ------------------------------------------------------------------ - # Comments - # ------------------------------------------------------------------ - - @staticmethod - def list_comments( - request, - session_mgr: SessionManager, - settings, - folder: str, - version: str, - *, - user_role: str, - user_domain_role: str, - ) -> Dict[str, Any]: - """All comments for the domain-wide ``(folder, version)`` thread.""" - try: - svc, _ = CommentService._load(session_mgr, settings, folder, version) - CommentService._require_member(user_role, user_domain_role) - comments = svc.list_comments(folder, version) - return {"success": True, "comments": comments} - except OntoBricksError: - raise - except Exception as exc: # noqa: BLE001 - logger.exception("CommentService.list_comments failed") - raise InfrastructureError( - "Failed to load comments", detail=str(exc) - ) from exc - - @staticmethod - def add_comment( - request, - session_mgr: SessionManager, - settings, - folder: str, - version: str, - *, - body: str, - parent_id: Optional[str], - user_role: str, - user_domain_role: str, - ) -> Dict[str, Any]: - """Add a comment (or a reply) to the domain discussion.""" - body = (body or "").strip() - if not body: - raise ValidationError("comment body is required") - if len(body) > _MAX_BODY: - raise ValidationError( - f"comment is too long (max {_MAX_BODY} characters)" - ) - - svc, status = CommentService._load(session_mgr, settings, folder, version) - CommentService._require_member(user_role, user_domain_role) - CommentService._require_writable(status) - - created = svc.insert_comment( - folder, - version, - author=CommentService._email(request), - body=body, - parent_id=(parent_id or None), - ) - if not created: - raise InfrastructureError("Failed to save comment") - CommentService._maybe_resume_agent( - svc, session_mgr, settings, folder, version, created, - author=CommentService._email(request), - ) - return {"success": True, "comment": created} - - @staticmethod - def resolve_comment( - request, - session_mgr: SessionManager, - settings, - folder: str, - version: str, - comment_id: str, - *, - resolved: bool, - user_role: str, - user_domain_role: str, - ) -> Dict[str, Any]: - """Mark a comment thread resolved (or reopen it).""" - if not comment_id: - raise ValidationError("comment_id is required") - svc, status = CommentService._load(session_mgr, settings, folder, version) - CommentService._require_member(user_role, user_domain_role) - CommentService._require_writable(status) - - # Author may always resolve their own thread; otherwise editor+. - email = CommentService._email(request) - is_author = CommentService._is_comment_author( - svc, folder, version, comment_id, email - ) - if not is_author and not CommentService._is_editor( - user_role, user_domain_role - ): - raise AuthorizationError( - "Only the comment author, an editor or an admin can " - "resolve a comment" - ) - - ok, msg = svc.resolve_comment(folder, comment_id, resolved=resolved) - if not ok: - raise NotFoundError(msg or "Comment not found") - return {"success": True, "resolved": resolved} - - # ------------------------------------------------------------------ - # Tasks - # ------------------------------------------------------------------ - - @staticmethod - def list_tasks( - request, - session_mgr: SessionManager, - settings, - folder: str, - version: str, - *, - user_role: str, - user_domain_role: str, - ) -> Dict[str, Any]: - """All tasks for ``(folder, version)``.""" - try: - svc, _ = CommentService._load(session_mgr, settings, folder, version) - CommentService._require_member(user_role, user_domain_role) - return {"success": True, "tasks": svc.list_tasks(folder, version)} - except OntoBricksError: - raise - except Exception as exc: # noqa: BLE001 - logger.exception("CommentService.list_tasks failed") - raise InfrastructureError( - "Failed to load tasks", detail=str(exc) - ) from exc - - @staticmethod - def list_assignees( - request, - session_mgr: SessionManager, - settings, - folder: str, - *, - user_role: str, - user_domain_role: str, - ) -> Dict[str, Any]: - """People with an assignable role on *folder* (task assignee picker). - - Sourced directly from the domain permission entries — i.e. everyone - granted a role on the domain (viewer/editor/builder) — so it lists - who can actually be assigned work, independent of the Databricks App - ACL intersection used by the Validation "Team" view. Any member may - read it. Returns most-privileged first. - """ - del request # identity not needed; same list for any member - CommentService._require_member(user_role, user_domain_role) - if not folder: - raise ValidationError("domain is required") - try: - from back.core.helpers import get_databricks_host_and_token - - domain = get_domain(session_mgr) - host, token = get_databricks_host_and_token(domain, settings) - registry_cfg = RegistryCfg.from_domain(domain, settings).as_dict() - entries = permission_service.list_domain_entries( - host, token, registry_cfg, folder - ) - except OntoBricksError: - raise - except Exception as exc: # noqa: BLE001 - logger.warning("CommentService.list_assignees failed: %s", exc) - return {"success": True, "domain": folder, "members": []} - - members: List[Dict[str, Any]] = [] - for entry in entries: - principal = entry.get("principal") or "" - role = entry.get("role") or "" - if principal and role in ASSIGNABLE_ROLES: - members.append( - { - "principal": principal, - "principal_type": entry.get("principal_type") or "user", - "display_name": entry.get("display_name") or principal, - "role": role, - } - ) - members.sort( - key=lambda m: (-role_level(m["role"]), m["display_name"].lower()) - ) - # The AI Agent is always assignable: picking it routes the task to the - # right specialized agent and runs it asynchronously. Listed first. - members.insert( - 0, - { - "principal": AI_AGENT_PRINCIPAL, - "principal_type": "agent", - "display_name": "AI Agent", - "role": "agent", - }, - ) - return {"success": True, "domain": folder, "members": members} - - @staticmethod - def create_task( - request, - session_mgr: SessionManager, - settings, - folder: str, - version: str, - *, - assignee: str, - title: str, - description: str, - due_date: Optional[str], - comment_id: Optional[str], - user_role: str, - user_domain_role: str, - ) -> Dict[str, Any]: - """Create a task (optionally born from a comment).""" - assignee = (assignee or "").strip() - title = (title or "").strip() - if not assignee: - raise ValidationError("assignee is required") - if not title: - raise ValidationError("title is required") - if len(title) > _MAX_TITLE: - raise ValidationError( - f"title is too long (max {_MAX_TITLE} characters)" - ) - - svc, status = CommentService._load(session_mgr, settings, folder, version) - CommentService._require_member(user_role, user_domain_role) - CommentService._require_writable(status) - - # A standalone AI-Agent task needs a thread root so its clarifying - # questions and your replies live in one place. Create a kickoff - # comment (the task statement) and anchor the task to it. - effective_comment_id = comment_id or None - if is_ai_agent(assignee) and not effective_comment_id: - kickoff_body = title + ( - f"\n\n{(description or '').strip()}" if (description or "").strip() else "" - ) - kickoff = svc.insert_comment( - folder, version, - author=CommentService._email(request), - body=kickoff_body, parent_id=None, - ) - if kickoff: - effective_comment_id = str(kickoff.get("id") or "") or None - else: - logger.warning( - "create_task: kickoff comment could not be created for " - "AI-Agent task in %s/%s; the task will have no thread root " - "and cannot be resumed", folder, version, - ) - - created = svc.insert_task( - folder, - version, - assignee=assignee, - created_by=CommentService._email(request), - title=title, - description=(description or "").strip(), - due_date=(due_date or None), - comment_id=effective_comment_id, - ) - if not created: - raise InfrastructureError("Failed to create task") - - CommentService._audit( - svc, - folder, - version, - CommentService._email(request), - comment=f"Task assigned to {assignee}: {title}", - meta={ - "task_id": created.get("id", ""), - "comment_id": effective_comment_id or "", - "event": "task_created", - }, - ) - - # When assigned to the AI Agent, kick off the async router that picks - # and runs the right specialized agent against this domain. - agent_task_id = None - if is_ai_agent(assignee): - agent_task_id = start_agent_task( - svc=svc, - domain=get_domain(session_mgr), - settings=settings, - folder=folder, - version=version, - task_id=created.get("id", ""), - title=title, - description=(description or "").strip(), - comment_id=effective_comment_id or "", - ) - - result = {"success": True, "task": created} - if agent_task_id: - result["agent_task_id"] = agent_task_id - return result - - @staticmethod - def update_task_status( - request, - session_mgr: SessionManager, - settings, - folder: str, - version: str, - task_id: str, - *, - status: str, - user_role: str, - user_domain_role: str, - ) -> Dict[str, Any]: - """Advance a task's status (open/in_progress/done/cancelled).""" - if not task_id: - raise ValidationError("task_id is required") - status = (status or "").strip().lower() - if status not in TASK_STATUSES: - raise ValidationError( - "status must be one of: " + ", ".join(sorted(TASK_STATUSES)) - ) - - svc, lifecycle = CommentService._load( - session_mgr, settings, folder, version - ) - CommentService._require_member(user_role, user_domain_role) - CommentService._require_writable(lifecycle) - - email = CommentService._email(request) - task = CommentService._find_task(svc, folder, version, task_id) - if task is None: - raise NotFoundError("Task not found") - is_owner = email.lower() in { - (task.get("assignee") or "").lower(), - (task.get("created_by") or "").lower(), - } - if not is_owner and not CommentService._is_editor( - user_role, user_domain_role - ): - raise AuthorizationError( - "Only the assignee, the creator, an editor or an admin " - "can update this task" - ) - - ok, msg = svc.update_task_status(folder, task_id, status) - if not ok: - raise NotFoundError(msg or "Task not found") - - if status == "done": - CommentService._audit( - svc, - folder, - version, - email, - comment=f"Task completed: {task.get('title', '')}", - meta={ - "task_id": task_id, - "comment_id": task.get("comment_id", ""), - "event": "task_done", - }, - ) - return {"success": True, "status": status} - - # ------------------------------------------------------------------ - # Internals - # ------------------------------------------------------------------ - - @staticmethod - def _load( - session_mgr: SessionManager, settings, folder: str, version: str - ) -> Tuple[RegistryService, str]: - """Resolve the registry service + the version lifecycle status.""" - if not folder or not version: - raise ValidationError("domain and version are required") - domain = get_domain(session_mgr) - svc = RegistryService.from_context(domain, settings) - if not svc.cfg.is_configured: - raise ValidationError("Registry not configured") - if version not in svc.list_versions_sorted(folder): - raise NotFoundError(f'Version {version} not found in "{folder}"') - ok, data, msg = svc.read_version(folder, version) - if not ok: - raise InfrastructureError( - "Failed to read registry version", detail=msg - ) - info = data.get("info", {}) or {} - return svc, (info.get("status") or STATUS_DRAFT).upper() - - @staticmethod - def _audit( - svc: RegistryService, - folder: str, - version: str, - actor: str, - *, - comment: str, - meta: Dict[str, Any], - ) -> None: - """Append a best-effort ``commented`` row to the review audit log.""" - try: - svc.record_review_event( - folder, version, actor, "commented", comment=comment, meta=meta - ) - except Exception as exc: # noqa: BLE001 - logger.debug("collab audit append skipped: %s", exc) - - @staticmethod - def _maybe_resume_agent( - svc, - session_mgr: SessionManager, - settings, - folder: str, - version: str, - comment: Dict[str, Any], - *, - author: str, - ) -> None: - """Resume a parked AI-Agent task when a teammate replies on its thread. - - Best-effort: the AI Agent's own outcome comments are written through the - store (not this method), so only human replies reach here. Matches the - new comment's thread root against an active AI-Agent task's ``comment_id``. - """ - from back.objects.registry.agent_task_runner import AI_AGENT_LABEL - - try: - if (author or "") == AI_AGENT_LABEL: - return - root = str(comment.get("parent_id") or comment.get("id") or "") - if not root: - return - for task in svc.list_tasks(folder, version): - if not is_ai_agent(task.get("assignee") or ""): - continue - if (task.get("status") or "") != "in_progress": - continue - if str(task.get("comment_id") or "") != root: - continue - resume_agent_task( - svc=svc, - domain=get_domain(session_mgr), - settings=settings, - folder=folder, - version=version, - task=task, - ) - break - except Exception as exc: # noqa: BLE001 - logger.debug("CommentService: agent resume skipped: %s", exc) - - @staticmethod - def _is_comment_author( - svc: RegistryService, - folder: str, - version: str, - comment_id: str, - email: str, - ) -> bool: - try: - for c in svc.list_comments(folder, version): - if str(c.get("id")) == str(comment_id): - return (c.get("author") or "").lower() == email.lower() - except Exception: # noqa: BLE001 - return False - return False - - @staticmethod - def _find_task( - svc: RegistryService, folder: str, version: str, task_id: str - ) -> Optional[Dict[str, Any]]: - try: - for t in svc.list_tasks(folder, version): - if str(t.get("id")) == str(task_id): - return t - except Exception: # noqa: BLE001 - return None - return None - - @staticmethod - def _require_member(user_role: str, user_domain_role: str) -> None: - is_member = user_role == ROLE_ADMIN or role_level( - user_domain_role - ) >= role_level(ROLE_VIEWER) - if not is_member: - raise AuthorizationError( - "You need a role on this domain to view or discuss it" - ) - - @staticmethod - def _require_writable(status: str) -> None: - if (status or "").upper() not in _WRITABLE_STATUSES: - raise ConflictError( - "Comments and tasks are read-only once a version is " - "published; reopen it to DRAFT to continue the discussion" - ) - - @staticmethod - def _is_editor(user_role: str, user_domain_role: str) -> bool: - return user_role == ROLE_ADMIN or role_level( - user_domain_role - ) >= role_level(ROLE_EDITOR) - - @staticmethod - def _email(request) -> str: - return ( - getattr(request.state, "user_email", "") - or request.headers.get("x-forwarded-email", "") - or "" - ) diff --git a/src/back/objects/registry/RegistryService.py b/src/back/objects/registry/RegistryService.py index cc46e402..05fe780e 100644 --- a/src/back/objects/registry/RegistryService.py +++ b/src/back/objects/registry/RegistryService.py @@ -865,20 +865,6 @@ def set_version_status( invalidate_registry_cache(self.cache_key) return ok, msg - def update_last_build( - self, folder: str, version: str, ts: str - ) -> Tuple[bool, str]: - """Stamp ``last_build`` for a single (domain, version). - - Targeted single-column update used by every build path so the - Submit gate / lifecycle guard see a built version. Invalidates the - registry cache so the Validation page reflects it immediately. - """ - ok, msg = self._store.update_last_build(folder, version, ts) - if ok: - invalidate_registry_cache(self.cache_key) - return ok, msg - # -- review / validation audit log ------------------------------- def record_review_event( @@ -915,84 +901,6 @@ def list_all_review_events(self) -> list: """All review events across the registry (oldest-first).""" return self._store.list_all_review_events() - # -- collaborative comments + tasks ------------------------------ - - def insert_comment( - self, - folder: str, - version: str, - *, - author: str, - body: str, - parent_id: Optional[str] = None, - ) -> Optional[dict]: - """Append a discussion comment; return the created row or None.""" - return self._store.insert_comment( - folder, - version, - author=author, - body=body, - parent_id=parent_id, - ) - - def list_comments( - self, - folder: str, - version: Optional[str] = None, - *, - include_resolved: bool = True, - ) -> list: - """Oldest-first comments for *folder* (optionally scoped to version).""" - return self._store.list_comments( - folder, - version, - include_resolved=include_resolved, - ) - - def resolve_comment( - self, folder: str, comment_id: str, *, resolved: bool = True - ) -> Tuple[bool, str]: - """Flip a comment's ``resolved`` flag.""" - return self._store.resolve_comment(folder, comment_id, resolved=resolved) - - def insert_task( - self, - folder: str, - version: str, - *, - assignee: str, - created_by: str, - title: str, - description: str = "", - due_date: Optional[str] = None, - comment_id: Optional[str] = None, - ) -> Optional[dict]: - """Create a task; return the created row or None.""" - return self._store.insert_task( - folder, - version, - assignee=assignee, - created_by=created_by, - title=title, - description=description, - due_date=due_date, - comment_id=comment_id, - ) - - def list_tasks(self, folder: str, version: Optional[str] = None) -> list: - """Newest-first tasks for *folder* (optionally one *version*).""" - return self._store.list_tasks(folder, version) - - def list_tasks_for_assignee(self, assignee: str) -> list: - """All tasks across the registry assigned to *assignee*.""" - return self._store.list_tasks_for_assignee(assignee) - - def update_task_status( - self, folder: str, task_id: str, status: str - ) -> Tuple[bool, str]: - """Set a task's ``status``.""" - return self._store.update_task_status(folder, task_id, status) - # -- document operations ------------------------------------------- def copy_version_documents( diff --git a/src/back/objects/registry/ReviewService.py b/src/back/objects/registry/ReviewService.py index 1bd12c2b..07de822b 100644 --- a/src/back/objects/registry/ReviewService.py +++ b/src/back/objects/registry/ReviewService.py @@ -152,11 +152,7 @@ def my_tasks( # Newest activity first; versions never reviewed (no activity) # sort to the bottom. tasks.sort(key=lambda t: t["last_activity"] or "", reverse=True) - return { - "success": True, - "tasks": tasks, - "assigned_tasks": ReviewService._assigned_tasks(svc, email), - } + return {"success": True, "tasks": tasks} except OntoBricksError: raise except Exception as exc: # noqa: BLE001 @@ -652,26 +648,6 @@ def _is_admin(user_role: str, user_domain_role: str) -> bool: """ return user_role == ROLE_ADMIN or user_domain_role == ROLE_ADMIN - @staticmethod - def _assigned_tasks(svc, email: str) -> List[Dict[str, Any]]: - """Open / in-progress collaborative tasks assigned to *email*. - - Best-effort: the worklist must still render review actions even if - the tasks backend is mid-migration or unavailable. - """ - if not email: - return [] - try: - rows = svc.list_tasks_for_assignee(email) - return [ - r - for r in rows - if (r.get("status") or "").lower() in ("open", "in_progress") - ] - except Exception as exc: # noqa: BLE001 - logger.debug("_assigned_tasks(%s) failed: %s", email, exc) - return [] - @staticmethod def _group_events( events: List[Dict[str, Any]], diff --git a/src/back/objects/registry/agent_task_runner.py b/src/back/objects/registry/agent_task_runner.py deleted file mode 100644 index f6c142f0..00000000 --- a/src/back/objects/registry/agent_task_runner.py +++ /dev/null @@ -1,718 +0,0 @@ -""" -AI-Agent task runner -- the bridge between a task assigned to the "AI Agent" -and the specialized OntoBricks agents. - -When a collaborative task is created with the AI-agent sentinel assignee -(:data:`AI_AGENT_PRINCIPAL`), :func:`start_agent_task` spins up a background -:class:`~back.core.task_manager.TaskManager` job that runs a *plan-or-run* loop: - -1. route -- :mod:`agents.agent_task_router` picks the best agent (deterministic, - so the choice is stable on every pass), -2. reconstruct the clarification Q&A from the task's Discussion thread, -3. plan -- :mod:`agents.agent_task_planner` decides whether the scope is clear, -4. on the FIRST pass (no human reply yet beyond the task statement) -- or when - the planner is not ready -- post a short plan/question and *park* the task - (status stays ``in_progress``). The first-pass park is code-enforced, not - left to the planner's prompt. - -A teammate's reply on the thread relaunches the same worker via -:func:`resume_agent_task`; an in-process guard prevents double concurrent runs. -Once the planner is ready (and a human has replied), the chosen agent runs with -the answers folded in, the outcome is posted to the Discussion, and the task is -marked ``done``. -""" - -from __future__ import annotations - -import re -import threading -from typing import Any, Callable, Dict, Optional, Tuple - -from back.core.logging import get_logger - -logger = get_logger(__name__) - -# Removal/unmapping intent. The Auto SQL Mapper (the only mapping agent) can -# only *add* mappings -- it has no "remove/unmap" operation -- so a task that -# asks to unmap/remove/exclude a mapping must be refused rather than silently -# triggering a full additive re-map. Scoped to the mapper at the call site. -_MAPPING_REMOVAL_RE = re.compile( - r"\b(un-?map|un-?assign|un-?link|detach)\b" - r"|\b(remove|delete|drop|clear|exclude|strip|reset)\b[^.\n]{0,40}" - r"\b(mapping|map|assignment|assign|sql|quer(?:y|ies)|table|column)s?\b" - r"|\b(mapping|map|assignment|sql)s?\b[^.\n]{0,40}" - r"\b(remove|delete|drop|clear|exclude|strip|reset)\b", - re.IGNORECASE, -) - - -def _is_unsupported_mapping_removal(text: str) -> bool: - """True when *text* asks to remove/unmap a mapping (unsupported by agents).""" - return bool(_MAPPING_REMOVAL_RE.search(text or "")) - -# Virtual assignee that means "let the AI figure out and run the right agent". -# Not a real Databricks principal -- it never appears in domain permissions. -AI_AGENT_PRINCIPAL = "agent://router" -AI_AGENT_LABEL = "AI Agent" - -# In-process guard: domain_task ids with a background pass currently running. -# Prevents a reply from launching a second concurrent run for the same task. -# (Single-process app; reset on restart, which is fine — a stale entry only -# delays one resume.) -_ACTIVE_TASKS: set[str] = set() -_ACTIVE_LOCK = threading.Lock() - - -def _claim_task(task_id: str) -> bool: - """Atomically mark *task_id* active. Returns False if already running.""" - if not task_id: - return False - with _ACTIVE_LOCK: - if task_id in _ACTIVE_TASKS: - return False - _ACTIVE_TASKS.add(task_id) - return True - - -def _launch_worker( - *, - svc: Any, - domain: Any, - host: str, - token: str, - llm_endpoint: str, - warehouse_id: str, - folder: str, - version: str, - task_id: str, - title: str, - description: str, - comment_id: str, -) -> Optional[str]: - """Claim the task and launch the background plan-or-run worker. - - Returns the background task id, or ``None`` when the task is already running. - On launch failure the claim is released and the exception propagates to the - caller (``start_agent_task`` / ``resume_agent_task``) to handle. - """ - from back.core.task_manager import get_task_manager - - if not _claim_task(task_id): - return None - try: - tm = get_task_manager() - bg = tm.run_background_task( - f"AI Agent: {title}"[:80], - "task_router", - _run, - steps=[ - {"name": "route", "description": "Selecting the right agent"}, - {"name": "plan", "description": "Confirming scope with you"}, - {"name": "run", "description": "Running the selected agent"}, - ], - svc=svc, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - folder=folder, version=version, domain_task_id=task_id, - title=title, description=description, comment_id=comment_id, - ) - return bg.id - except Exception: - _ACTIVE_TASKS.discard(task_id) - raise - - -def is_ai_agent(assignee: str) -> bool: - """Return ``True`` when *assignee* is the AI-agent sentinel.""" - return (assignee or "").strip().lower() == AI_AGENT_PRINCIPAL - - -def start_agent_task( - *, - svc: Any, - domain: Any, - settings: Any, - folder: str, - version: str, - task_id: str, - title: str, - description: str = "", - comment_id: str = "", -) -> Optional[str]: - """Launch the background router+dispatch job for an AI-agent task. - - Best-effort: any setup failure is logged and recorded as a comment, and the - function returns ``None`` so the (already created) task still succeeds. - - Returns the background :class:`~back.core.task_manager.models.Task` id, or - ``None`` when the job could not be started. - """ - from back.core.helpers import require_serving_llm, resolve_warehouse_id - - try: - host, token, llm_endpoint = require_serving_llm(domain, settings) - except Exception as exc: # noqa: BLE001 - msg = f"AI Agent could not start: {exc}" - logger.warning("agent_task_runner: %s (task=%s)", msg, task_id) - _report( - svc, folder, version, task_id, comment_id, - body=f"**AI Agent**\n\n{msg}", event="agent_failed", - ) - return None - - try: - warehouse_id = resolve_warehouse_id(domain, settings) - except Exception: # noqa: BLE001 - warehouse_id = "" - - bg_id = _launch_worker( - svc=svc, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - folder=folder, version=version, task_id=task_id, - title=title, description=description, comment_id=comment_id, - ) - if bg_id is None: - return None - logger.info( - "agent_task_runner: started background task %s for domain_task %s", - bg_id, - task_id, - ) - return bg_id - - -def resume_agent_task( - *, - svc: Any, - domain: Any, - settings: Any, - folder: str, - version: str, - task: Dict[str, Any], -) -> Optional[str]: - """Relaunch the plan-or-run worker for a parked AI-Agent *task*. - - Called when a teammate replies on the task's thread. No-op (returns ``None``) - when a pass is already running for this task. Best-effort: setup failures are - logged and surfaced as a comment. - """ - task_id = str(task.get("id") or "") - if not task_id: - return None - - from back.core.helpers import require_serving_llm, resolve_warehouse_id - - comment_id = str(task.get("comment_id") or "") - title = str(task.get("title") or "") - description = str(task.get("description") or "") - try: - host, token, llm_endpoint = require_serving_llm(domain, settings) - except Exception as exc: # noqa: BLE001 - logger.warning("agent_task_runner: resume blocked: %s (task=%s)", exc, task_id) - return None - try: - warehouse_id = resolve_warehouse_id(domain, settings) - except Exception: # noqa: BLE001 - warehouse_id = "" - - bg_id = _launch_worker( - svc=svc, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - folder=folder, version=version, task_id=task_id, - title=title, description=description, comment_id=comment_id, - ) - if bg_id is None: - return None - logger.info("agent_task_runner: resumed task %s (bg=%s)", task_id, bg_id) - return bg_id - - -# --------------------------------------------------------------------------- -# Background worker -# --------------------------------------------------------------------------- - - -def _run( - task: Any, - *, - svc: Any, - domain: Any, - host: str, - token: str, - llm_endpoint: str, - warehouse_id: str, - folder: str, - version: str, - domain_task_id: str, - title: str, - description: str, - comment_id: str, -) -> None: - """TaskManager entry point: delegate to the shared plan-or-run worker.""" - from back.core.task_manager import get_task_manager - - tm = get_task_manager() - try: - _run_for_task( - svc=svc, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - folder=folder, version=version, domain_task_id=domain_task_id, - title=title, description=description, comment_id=comment_id, - on_step=lambda m: tm.update_progress(task.id, task.progress, m), - tm=tm, tm_task_id=task.id, - ) - finally: - _ACTIVE_TASKS.discard(domain_task_id) - - -def _run_for_task( - *, - svc: Any, - domain: Any, - host: str, - token: str, - llm_endpoint: str, - warehouse_id: str, - folder: str, - version: str, - domain_task_id: str, - title: str, - description: str, - comment_id: str, - on_step: Callable[[str], None], - tm: Any, - tm_task_id: Optional[str], -) -> None: - """Route, reconstruct the thread Q&A, plan, then ask-again or run the agent. - - ``tm``/``tm_task_id`` are the optional TaskManager handle for progress; the - worker is fully functional without them (used directly in tests). - """ - from agents.agent_task_planner import run_agent as run_planner - from agents.agent_task_router import run_agent as run_router - from agents.registry import get_agent, list_agents - - def _tm(method: str, *args: Any) -> None: - if tm is not None and tm_task_id is not None: - getattr(tm, method)(tm_task_id, *args) - - try: - _tm("start_task", "Selecting the right agent...") - - # 1) Route (deterministic — same choice on every pass => locked route). - router_result = run_router( - host, token, llm_endpoint, - task_title=title, task_description=description, - available_agents=list_agents(), on_step=on_step, - ) - if not router_result.success or not router_result.chosen_agent_key: - reason = router_result.error or "No suitable agent for this task" - _tm("fail_task", reason) - _report(svc, folder, version, domain_task_id, comment_id, - body=f"**AI Agent**\n\nI could not route this task: {reason}", - event="agent_failed") - return - spec = get_agent(router_result.chosen_agent_key) - if spec is None: - _tm("fail_task", "Router chose an unknown agent") - return - - # 1b) Refuse unsupported removal: the Auto SQL Mapper only *adds* - # mappings, so an "unmap / remove mapping / exclude" request would - # otherwise trigger a full additive re-map. Park (stay in_progress) with - # a helpful note so a rephrase can resume the same task. - if spec.key == "auto_assignment" and _is_unsupported_mapping_removal( - f"{title}\n{description}" - ): - _set_status(svc, folder, domain_task_id, "in_progress") - _report( - svc, folder, version, domain_task_id, comment_id, - body=( - f"**AI Agent — {spec.label}**\n\n" - "I can't **remove or unmap** mappings automatically — the Auto " - "SQL Mapper only *adds* SQL mappings, and no agent supports " - "removal yet. To clear a mapping, open the **Mapping** page and " - "remove it there. If you meant to *map* a specific entity, reply " - "with a rephrased request and I'll continue." - ), - event="agent_progress", - ) - _tm("complete_task", {"agent": spec.key, "state": "waiting_input"}, - "Cannot unmap — waiting for a rephrase") - return - - # 2) Plan against the conversation reconstructed from the thread. - _set_status(svc, folder, domain_task_id, "in_progress") - history = _thread_history(svc, folder, version, comment_id) - plan = run_planner( - host, token, llm_endpoint, - task_title=title, task_description=description, - agent=spec, history=history, on_step=on_step, - ) - - # Always confirm scope before doing any work: the very first pass (no - # human reply yet beyond the task statement) must park and ask, no matter - # what the planner returns. This makes the guarantee code-enforced rather - # than relying on the planner's prompt. - human_turns = sum(1 for h in history if h.get("role") == "user") - first_pass = human_turns <= 1 - ready = plan.ready and not first_pass - - # 3a) Not ready -> post the plan/question and park (stay in_progress). - if not ready: - question = plan.message or ( - "Could you clarify the scope of this task before I proceed?" - ) - _report(svc, folder, version, domain_task_id, comment_id, - body=f"**AI Agent — {spec.label}**\n\n{question}", - event="agent_progress") - _tm("complete_task", {"agent": spec.key, "state": "waiting_input"}, - "Waiting for your reply") - return - - # 3b) Ready -> run the chosen agent with the answers folded in. - _tm("advance_step", f"Running {spec.label}...") - task_text = _fold_answers(title, description, history) - summary, report, result = _dispatch_agent( - spec.key, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - task_text=task_text, on_step=on_step, - ) - _tm("advance_step", "Recording the result...") - _set_status(svc, folder, domain_task_id, "done") - body = f"**AI Agent — {spec.label}**\n\n" - if router_result.reasoning: - body += f"_Why this agent:_ {router_result.reasoning}\n\n" - body += report - _report(svc, folder, version, domain_task_id, comment_id, - body=body, event="task_done") - _tm("complete_task", - {"agent": spec.key, "agent_label": spec.label, **result}, summary) - except Exception as exc: # noqa: BLE001 - logger.exception("agent_task_runner: task %s crashed", domain_task_id) - _tm("fail_task", f"AI Agent run failed: {exc}") - _report(svc, folder, version, domain_task_id, comment_id, - body=f"**AI Agent**\n\nThe run failed: {exc}", - event="agent_failed") - - -def _thread_history( - svc: Any, folder: str, version: str, root_comment_id: str -) -> list[dict]: - """Reconstruct the ordered clarification Q&A from the task's thread. - - The thread is the root comment (``root_comment_id``) plus its direct replies, - ordered by ``created_at``. The AI Agent's own comments map to ``assistant``; - everyone else maps to ``user``. - """ - if not root_comment_id: - return [] - try: - comments = list(svc.list_comments(folder, version)) - except Exception as exc: # noqa: BLE001 - logger.debug("agent_task_runner: thread read skipped: %s", exc) - return [] - rid = str(root_comment_id) - thread = [ - c for c in comments - if str(c.get("id")) == rid or str(c.get("parent_id") or "") == rid - ] - thread.sort(key=lambda c: str(c.get("created_at") or "")) - history: list[dict] = [] - for c in thread: - role = "assistant" if (c.get("author") or "") == AI_AGENT_LABEL else "user" - history.append({"role": role, "text": (c.get("body") or "").strip()}) - return history - - -def _fold_answers(title: str, description: str, history: list[dict]) -> str: - """Build the agent input from the task plus the teammate's answers.""" - parts = [title] - if description: - parts.append(description) - answers = [h["text"] for h in history if h["role"] == "user" and h["text"]] - # Drop the first 'user' turn — it is the task statement itself, already above. - extra = answers[1:] if answers else [] - if extra: - parts.append("Clarifications from the assignee:\n- " + "\n- ".join(extra)) - return "\n\n".join(parts) - - -# --------------------------------------------------------------------------- -# Per-agent dispatch -# --------------------------------------------------------------------------- - - -def _dispatch_agent( - key: str, - *, - domain: Any, - host: str, - token: str, - llm_endpoint: str, - warehouse_id: str, - task_text: str = "", - on_step: Callable[[str], None], -) -> Tuple[str, str, Dict[str, Any]]: - """Run the specialized agent identified by *key* against the domain session. - - Returns ``(summary, report, result_payload)`` where ``summary`` is a short - one-liner (TaskManager message) and ``report`` is the markdown posted to the - domain Discussion. Raises on agent failure so the worker records it. - """ - from agents.serialization import serialize_agent_steps - from back.objects.ontology import Ontology - - if key == "ontology_assistant": - from shared.config.constants import DEFAULT_BASE_URI - - ont = Ontology(domain) - classes = list(domain.get_classes()) - properties = list(domain.get_properties()) - base_uri = domain.ontology.get("base_uri") or DEFAULT_BASE_URI - from agents.agent_ontology_assistant import run_agent as run_assistant - - res = run_assistant( - host=host, - token=token, - endpoint_name=llm_endpoint, - classes=classes, - properties=properties, - base_uri=base_uri, - user_message=task_text, - on_step=on_step, - ) - if not res.success: - raise RuntimeError(res.error or "Ontology assistant failed") - if res.ontology_changed: - # Apply + persist the edits directly to the domain ontology. - cfg = ont.apply_agent_ontology_changes( - res.classes, res.properties, prune_orphan_mappings=True - ) - summary = ( - f"updated the ontology " - f"({len(cfg['classes'])} classes, {len(cfg['properties'])} properties)" - ) - report = ( - (res.reply.strip() + "\n\n" if res.reply else "") - + f"Applied the changes to the ontology — it now has " - f"**{len(cfg['classes'])} class(es)** and " - f"**{len(cfg['properties'])} property(ies)**." - ) - else: - summary = "reviewed the ontology (no change needed)" - report = res.reply.strip() or "No ontology changes were necessary." - return summary, report, { - "ontology_changed": res.ontology_changed, - "reply": res.reply, - "agent_steps": serialize_agent_steps(res.steps), - "agent_iterations": res.iterations, - "agent_usage": res.usage, - } - - if key == "owl_generator": - res = Ontology(domain).generate_with_agent( - host=host, - token=token, - endpoint_name=llm_endpoint, - metadata=domain.catalog_metadata, - warehouse_id=warehouse_id, - on_step=on_step, - ) - if not res.success: - raise RuntimeError(res.error or "Ontology generation produced no output") - summary = ( - f"generated ontology draft ({len(res.owl_content)} chars, " - f"{res.iterations} iteration(s))" - ) - report = ( - f"Generated an ontology draft in {res.iterations} iteration(s) " - f"({len(res.owl_content):,} characters of Turtle). " - "Open the **Ontology** page to review and apply it." - ) - return summary, report, { - "owl_content": res.owl_content, - "agent_steps": serialize_agent_steps(res.steps), - "agent_iterations": res.iterations, - "agent_usage": res.usage, - } - - if key == "business_rules_generator": - res = Ontology(domain).generate_rules_with_agent( - host=host, - token=token, - endpoint_name=llm_endpoint, - warehouse_id=warehouse_id, - on_step=on_step, - ) - if not res.success: - raise RuntimeError(res.error or "Business-rules generation failed") - summary = f"proposed {res.total_rules()} business rule(s)" - report = ( - f"Proposed {res.total_rules()} business rule(s): " - f"{len(res.swrl_rules)} SWRL, " - f"{len(res.decision_tables)} decision table(s), " - f"{len(res.sparql_rules)} SPARQL, " - f"{len(res.aggregate_rules)} aggregate. " - "Open **Ontology -> Business Rules** to review and accept them." - ) - return summary, report, { - "swrl_rules": res.swrl_rules, - "decision_tables": res.decision_tables, - "sparql_rules": res.sparql_rules, - "aggregate_rules": res.aggregate_rules, - "agent_steps": serialize_agent_steps(res.steps), - "agent_iterations": res.iterations, - "agent_usage": res.usage, - } - - if key == "icon_assign": - entity_names = [ - c.get("name", "") for c in domain.get_classes() if c.get("name") - ] - if not entity_names: - raise RuntimeError("No ontology entities to assign icons to") - res = Ontology(domain).assign_icons_with_agent( - host=host, - token=token, - endpoint_name=llm_endpoint, - entity_names=entity_names, - on_step=on_step, - ) - if not res.success: - raise RuntimeError(res.error or "Icon assignment failed") - summary = f"assigned icons to {len(res.icons)} entity(ies)" - preview = " ".join( - f"{name} {emoji}" for name, emoji in list(res.icons.items())[:10] - ) - report = ( - f"Proposed icons for {len(res.icons)} entity(ies)" - + (f": {preview}" if preview else "") - + ". Open the **Ontology** page to review them." - ) - return summary, report, { - "icons": res.icons, - "agent_steps": serialize_agent_steps(res.steps), - "agent_iterations": res.iterations, - "agent_usage": res.usage, - } - - if key == "auto_assignment": - from back.core.databricks import DatabricksClient - from back.objects.mapping import Mapping - - mapping_svc = Mapping(domain) - schema_context = mapping_svc.resolve_auto_assign_schema_context({}) - ontology_ctx = Ontology(domain).agent_ontology_context() - if not ontology_ctx.get("entities"): - raise RuntimeError("No ontology entities to map") - if not warehouse_id: - raise RuntimeError("No SQL warehouse configured for auto-mapping") - client = DatabricksClient( - host=host, token=token, warehouse_id=warehouse_id - ) - res = mapping_svc.auto_assign_with_agent( - host=host, - token=token, - endpoint_name=llm_endpoint, - client=client, - metadata=schema_context, - ontology=ontology_ctx, - on_step=lambda m, pct=0: on_step(m), - ) - if not res.success and res.error: - raise RuntimeError(res.error) - # Persist directly (session-less): merge into the domain assignment and - # save to the registry, so the mappings survive a page reload. Existing - # ``excluded`` flags are preserved by the merge. - counts = mapping_svc.apply_agent_mappings( - res.entity_mappings, res.relationship_mappings - ) - summary = ( - f"mapped {len(res.entity_mappings)} entity and " - f"{len(res.relationship_mappings)} relationship(s)" - ) - report = ( - f"Applied SQL mappings — the domain now has " - f"**{counts['entities']} entity** and " - f"**{counts['relationships']} relationship** mapping(s). " - "Open the **Mapping** page to review them." - ) - return summary, report, { - "entity_mappings": res.entity_mappings, - "relationship_mappings": res.relationship_mappings, - "agent_steps": serialize_agent_steps(res.steps), - "agent_iterations": res.iterations, - "agent_usage": res.usage, - } - - raise RuntimeError(f"No dispatch wiring for agent '{key}'") - - -# --------------------------------------------------------------------------- -# Persistence helpers (run outside a request -> no human authorization) -# --------------------------------------------------------------------------- - - -def _set_status(svc: Any, folder: str, task_id: str, status: str) -> None: - """Update the domain_tasks row status, swallowing storage errors.""" - try: - svc.update_task_status(folder, task_id, status) - except Exception as exc: # noqa: BLE001 - logger.debug("agent_task_runner: status update skipped: %s", exc) - - -def _report( - svc: Any, - folder: str, - version: str, - task_id: str, - comment_id: str, - *, - body: str, - event: str = "agent_progress", -) -> None: - """Surface the AI Agent's outcome. - - Posts *body* as a real comment in the domain Discussion (threaded under the - originating comment when there is one, otherwise a domain-level note) so the - team sees the report, and appends a matching review-audit row for the - Validation timeline. Both are best-effort. - """ - try: - parent_id = _resolve_thread_parent(svc, folder, version, comment_id) - svc.insert_comment( - folder, - version, - author=AI_AGENT_LABEL, - body=body, - parent_id=parent_id, - ) - except Exception as exc: # noqa: BLE001 - logger.debug("agent_task_runner: discussion comment skipped: %s", exc) - try: - svc.record_review_event( - folder, - version, - AI_AGENT_LABEL, - "commented", - comment=body, - meta={"task_id": task_id, "comment_id": comment_id or "", "event": event}, - ) - except Exception as exc: # noqa: BLE001 - logger.debug("agent_task_runner: audit append skipped: %s", exc) - - -def _resolve_thread_parent( - svc: Any, folder: str, version: str, comment_id: str -) -> Optional[str]: - """Reply under the originating comment when it still exists, otherwise - post a top-level note (``None``). - """ - if comment_id: - try: - for c in svc.list_comments(folder, version): - if str(c.get("id")) == str(comment_id): - return comment_id - except Exception: # noqa: BLE001 - pass - return None diff --git a/src/back/objects/registry/store/base.py b/src/back/objects/registry/store/base.py index 23a9120b..04ca9f8e 100644 --- a/src/back/objects/registry/store/base.py +++ b/src/back/objects/registry/store/base.py @@ -112,47 +112,6 @@ class ReviewEvent(TypedDict, total=False): created_at: str # ISO timestamp -class DomainComment(TypedDict, total=False): - """One threaded comment on a DRAFT domain's discussion. - - Discussions are domain-wide: every comment belongs to the single - per-(domain, version) thread. A non-empty ``parent_id`` makes the row a - reply in a thread. Rows are append-only and ordered by ``created_at``; - ``resolved`` flips a thread closed without deleting the history. - """ - - id: str # row id (UUID string; "" for stores without one) - folder: str # domain folder (populated by reads) - version: str - parent_id: str # thread parent comment id ("" for a root comment) - author: str # acting user email - body: str - resolved: bool - created_at: str # ISO timestamp - - -class DomainTask(TypedDict, total=False): - """A personalised work item assigned to a teammate on a DRAFT domain. - - Usually born from a comment (``comment_id``) turned into actionable - work, surfaced in the assignee's "My Tasks" worklist. ``status`` - walks ``open -> in_progress -> done`` (or ``cancelled``). - """ - - id: str # row id (UUID string; "" for stores without one) - folder: str # domain folder (populated by reads) - version: str - assignee: str # email the work is assigned to - created_by: str # email that created the task - title: str - description: str - status: str # open|in_progress|done|cancelled - due_date: str # ISO date ("" when unset) - comment_id: str # originating comment id ("" when standalone) - created_at: str # ISO timestamp - updated_at: str # ISO timestamp - - class RegistryStore(ABC): """Single seam in front of all registry-shaped JSON storage.""" @@ -247,15 +206,6 @@ def update_version_status( a single (domain, version) without rewriting the full document. """ - @abstractmethod - def update_last_build( - self, folder: str, version: str, ts: str - ) -> Tuple[bool, str]: - """Stamp the ``last_build`` timestamp of a single (domain, version) - without rewriting the full document. Used by every build path so - the Submit gate / lifecycle guard see a built version. - """ - # ------------------------------------------------------------------ # Domain-level permissions # ------------------------------------------------------------------ @@ -311,25 +261,6 @@ def record_build_run(self, folder: str, entry: BuildRunEntry) -> None: NOT raise (log + swallow on failure). """ - def stamp_last_build( - self, folder: str, version: str, ts: str - ) -> Tuple[bool, str]: - """Lightweight update: write *ts* into ``domain_versions.last_build`` - for ``(folder, version)`` without touching any other column. - - Default implementation falls back to a full ``read_version`` + - ``write_version`` round-trip so that stores which do not override - this method still work correctly (at higher cost). - - Returns ``(ok, message)``. - """ - ok, data, msg = self.read_version(folder, version) - if not ok: - return False, f"stamp_last_build read failed: {msg}" - info = data.setdefault("info", {}) - info["last_build"] = ts - return self.write_version(folder, version, data) - @abstractmethod def load_build_runs( self, @@ -417,91 +348,6 @@ def list_all_review_events(self) -> List[ReviewEvent]: worklist. Empty list on any error. """ - # ------------------------------------------------------------------ - # Collaborative comments + tasks - # - # Contextual threaded comments anchored to a DRAFT domain (ontology - # class/property, mapping, graph node/edge, or the whole domain) and - # the personalised tasks they can spawn. Both are keyed by - # ``(folder, version)``. Writes return the created row (or ``None`` - # on failure) so a comment can be turned into a task in one round - # trip; reads return oldest-first. All methods are best-effort and - # must NOT raise (log + swallow) — a UI surface should degrade - # gracefully when the backend is mid-migration. - # ------------------------------------------------------------------ - - @abstractmethod - def insert_comment( - self, - folder: str, - version: str, - *, - author: str, - body: str, - parent_id: Optional[str] = None, - ) -> Optional[DomainComment]: - """Append a comment for ``(folder, version)``; return the created - row (with its id + timestamp) or ``None`` on failure. - """ - - @abstractmethod - def list_comments( - self, - folder: str, - version: Optional[str] = None, - *, - include_resolved: bool = True, - ) -> List[DomainComment]: - """Oldest-first comments for *folder*, optionally scoped to a - version. Empty list on any error. - """ - - @abstractmethod - def resolve_comment( - self, folder: str, comment_id: str, *, resolved: bool = True - ) -> Tuple[bool, str]: - """Flip a comment's ``resolved`` flag. ``(False, msg)`` when the - comment does not exist or on error. - """ - - @abstractmethod - def insert_task( - self, - folder: str, - version: str, - *, - assignee: str, - created_by: str, - title: str, - description: str = "", - due_date: Optional[str] = None, - comment_id: Optional[str] = None, - ) -> Optional[DomainTask]: - """Create a task for ``(folder, version)``; return the created row - or ``None`` on failure. - """ - - @abstractmethod - def list_tasks( - self, folder: str, version: Optional[str] = None - ) -> List[DomainTask]: - """Newest-first tasks for *folder* (optionally one *version*).""" - - @abstractmethod - def list_tasks_for_assignee(self, assignee: str) -> List[DomainTask]: - """All tasks across the registry assigned to *assignee* (case- - insensitive), each enriched with its ``folder``. Newest-first. - Backs the assignee's "My Tasks" worklist. - """ - - @abstractmethod - def update_task_status( - self, folder: str, task_id: str, status: str - ) -> Tuple[bool, str]: - """Set a task's ``status``. ``(False, msg)`` when the task does - not exist or on error. - """ - # ------------------------------------------------------------------ # Cohort schedules + history # diff --git a/src/back/objects/registry/store/lakebase/schema.sql b/src/back/objects/registry/store/lakebase/schema.sql index b1ccd134..05d32f08 100644 --- a/src/back/objects/registry/store/lakebase/schema.sql +++ b/src/back/objects/registry/store/lakebase/schema.sql @@ -209,53 +209,3 @@ CREATE TABLE IF NOT EXISTS domain_review_events ( CREATE INDEX IF NOT EXISTS idx_review_events_domain_version ON domain_review_events(domain_id, version, created_at); - --- ---------------------------------------------------------------- --- Collaborative comments — domain-wide threaded discussion. Every --- comment belongs to the single per-(domain, version) thread. A --- non-empty ``parent_id`` makes the row a reply within a thread. --- Append-only; ``resolved`` closes a thread without losing history. --- Grain: (domain_id, version). --- ---------------------------------------------------------------- -CREATE TABLE IF NOT EXISTS domain_comments ( - id uuid PRIMARY KEY DEFAULT gen_random_uuid(), - domain_id uuid NOT NULL - REFERENCES domains(id) ON DELETE CASCADE, - version text NOT NULL, - parent_id uuid REFERENCES domain_comments(id) ON DELETE CASCADE, - author text NOT NULL, - body text NOT NULL DEFAULT '', - resolved boolean NOT NULL DEFAULT false, - created_at timestamptz NOT NULL DEFAULT now() -); - -CREATE INDEX IF NOT EXISTS idx_domain_comments_lookup - ON domain_comments(domain_id, version, created_at); - --- ---------------------------------------------------------------- --- Collaborative tasks — a personalised work item assigned to a --- teammate, usually born from a comment (``comment_id``). Surfaced in --- the assignee's "My Tasks" worklist. ``status`` walks --- open -> in_progress -> done (or cancelled). Grain: (domain_id, version). --- ---------------------------------------------------------------- -CREATE TABLE IF NOT EXISTS domain_tasks ( - id uuid PRIMARY KEY DEFAULT gen_random_uuid(), - domain_id uuid NOT NULL - REFERENCES domains(id) ON DELETE CASCADE, - version text NOT NULL, - assignee text NOT NULL, - created_by text NOT NULL, - title text NOT NULL, - description text NOT NULL DEFAULT '', - status text NOT NULL DEFAULT 'open' - CHECK (status IN ('open', 'in_progress', 'done', 'cancelled')), - due_date date, - comment_id uuid REFERENCES domain_comments(id) ON DELETE SET NULL, - created_at timestamptz NOT NULL DEFAULT now(), - updated_at timestamptz NOT NULL DEFAULT now() -); - -CREATE INDEX IF NOT EXISTS idx_domain_tasks_assignee - ON domain_tasks(lower(assignee), status); -CREATE INDEX IF NOT EXISTS idx_domain_tasks_domain - ON domain_tasks(domain_id, version); diff --git a/src/back/objects/registry/store/lakebase/store.py b/src/back/objects/registry/store/lakebase/store.py index b226a4b0..65236c35 100644 --- a/src/back/objects/registry/store/lakebase/store.py +++ b/src/back/objects/registry/store/lakebase/store.py @@ -62,9 +62,7 @@ from ..base import ( BuildRunEntry, - DomainComment, DomainSummary, - DomainTask, RegistryStore, ReviewEvent, ScheduleHistoryEntry, @@ -106,8 +104,6 @@ "schedule_runs", "build_runs", "domain_review_events", - "domain_comments", - "domain_tasks", } ) @@ -519,11 +515,6 @@ def __init__( # used to self-heal deployments created before the review/validation # audit log existed (same pattern as ``_build_runs_ready``). self._review_events_ready = False - # Guards the lazy ``CREATE TABLE IF NOT EXISTS domain_comments / - # domain_tasks`` used to self-heal deployments created before the - # collaborative comments + tasks feature existed (same pattern as - # ``_review_events_ready``). - self._collab_tables_ready = False # ------------------------------------------------------------------ # Identity @@ -1034,43 +1025,6 @@ def update_version_status( ) return False, str(exc) - def update_last_build( - self, folder: str, version: str, ts: str - ) -> Tuple[bool, str]: - """Stamp the ``last_build`` timestamp of a single (domain, version). - - Targeted single-row UPDATE so a build never rewrites the full - version document (avoids clobbering concurrent session edits). - Also mirrors ``last_build`` into the version ``info`` blob so - cached reads stay consistent. - """ - try: - with self._connect() as conn, conn.cursor() as cur: - cur.execute( - f""" - UPDATE {self._q(self._schema)}.domain_versions v - SET last_build = %s, - info = jsonb_set(v.info, '{{last_build}}', to_jsonb(%s::text)), - updated_at = now() - FROM {self._q(self._schema)}.domains d - WHERE v.domain_id = d.id - AND d.registry_id = %s AND d.folder = %s - AND v.version = %s - """, - (ts, ts, self._registry(), folder, version), - ) - if cur.rowcount == 0: - return False, ( - f"Version {version} not found for domain {folder}" - ) - invalidate_registry_cache(self.cache_key) - return True, "" - except Exception as exc: # noqa: BLE001 - logger.exception( - "update_last_build failed for %s/%s", folder, version - ) - return False, str(exc) - # ------------------------------------------------------------------ # Permissions # ------------------------------------------------------------------ @@ -1547,32 +1501,6 @@ def _build_run_row_to_entry(r: Dict[str, Any]) -> BuildRunEntry: "stats": dict(r["stats"] or {}), } - def stamp_last_build( - self, folder: str, version: str, ts: str - ) -> Tuple[bool, str]: - """Targeted UPDATE for ``domain_versions.last_build``. - - Avoids a full read + re-write of the JSONB blobs: only the scalar - ``last_build`` column is touched. Returns ``(ok, message)``. - """ - try: - with self._connect() as conn, conn.cursor() as cur: - cur.execute( - f""" - UPDATE {self._q(self._schema)}.domain_versions v - SET last_build = %s - FROM {self._q(self._schema)}.domains d - WHERE d.id = v.domain_id - AND d.registry_id = %s - AND d.folder = %s - AND v.version = %s - """, - (ts, self._registry(), folder, version), - ) - return True, "" - except Exception as exc: # noqa: BLE001 - return False, str(exc) - def load_build_runs( self, folder: str, @@ -1928,387 +1856,6 @@ def list_all_review_events(self) -> List[ReviewEvent]: logger.debug("list_all_review_events failed: %s", exc) return [] - # ------------------------------------------------------------------ - # Collaborative comments + tasks - # ------------------------------------------------------------------ - - def _ensure_collab_tables(self) -> bool: - """Lazily create ``domain_comments`` + ``domain_tasks`` (+ indexes). - - Self-heals deployments created before the collaborative comments - and tasks feature existed — same ownership-safe pattern as - :meth:`_ensure_review_events_table`. Best-effort: on failure it - logs and returns ``False`` so callers no-op rather than breaking. - """ - if self._collab_tables_ready: - return True - try: - sch = self._q(self._schema) - with self._connect() as conn, conn.cursor() as cur: - cur.execute( - "SELECT 1 FROM information_schema.tables " - "WHERE table_schema = %s " - "AND table_name = 'domain_comments'", - (self._schema,), - ) - if cur.fetchone(): - self._collab_tables_ready = True - return True - cur.execute( - f""" - CREATE TABLE IF NOT EXISTS {sch}.domain_comments ( - id uuid PRIMARY KEY DEFAULT gen_random_uuid(), - domain_id uuid NOT NULL - REFERENCES {sch}.domains(id) - ON DELETE CASCADE, - version text NOT NULL, - parent_id uuid - REFERENCES {sch}.domain_comments(id) - ON DELETE CASCADE, - author text NOT NULL, - body text NOT NULL DEFAULT '', - resolved boolean NOT NULL DEFAULT false, - created_at timestamptz NOT NULL DEFAULT now() - ) - """ - ) - cur.execute( - f""" - CREATE INDEX IF NOT EXISTS idx_domain_comments_lookup - ON {sch}.domain_comments (domain_id, version, created_at) - """ - ) - cur.execute( - f""" - CREATE TABLE IF NOT EXISTS {sch}.domain_tasks ( - id uuid PRIMARY KEY DEFAULT gen_random_uuid(), - domain_id uuid NOT NULL - REFERENCES {sch}.domains(id) - ON DELETE CASCADE, - version text NOT NULL, - assignee text NOT NULL, - created_by text NOT NULL, - title text NOT NULL, - description text NOT NULL DEFAULT '', - status text NOT NULL DEFAULT 'open', - due_date date, - comment_id uuid - REFERENCES {sch}.domain_comments(id) - ON DELETE SET NULL, - created_at timestamptz NOT NULL DEFAULT now(), - updated_at timestamptz NOT NULL DEFAULT now() - ) - """ - ) - cur.execute( - f""" - CREATE INDEX IF NOT EXISTS idx_domain_tasks_assignee - ON {sch}.domain_tasks (lower(assignee), status) - """ - ) - cur.execute( - f""" - CREATE INDEX IF NOT EXISTS idx_domain_tasks_domain - ON {sch}.domain_tasks (domain_id, version) - """ - ) - self._collab_tables_ready = True - return True - except Exception as exc: # noqa: BLE001 - logger.error( - "could not create domain_comments/domain_tasks tables — " - "run `make bootstrap-lakebase` as the schema owner to " - "apply the migration: %s", - exc, - ) - return False - - @staticmethod - def _comment_row_to_dict( - r: Dict[str, Any], folder: str = "" - ) -> DomainComment: - return { - "id": str(r.get("id") or ""), - "folder": r.get("folder", folder) or folder, - "version": r["version"], - "parent_id": str(r["parent_id"]) if r.get("parent_id") else "", - "author": r["author"] or "", - "body": r["body"] or "", - "resolved": bool(r["resolved"]), - "created_at": ( - r["created_at"].isoformat() if r.get("created_at") else "" - ), - } - - def insert_comment( - self, - folder: str, - version: str, - *, - author: str, - body: str, - parent_id: Optional[str] = None, - ) -> Optional[DomainComment]: - if not self._ensure_collab_tables(): - return None - try: - psycopg, dict_row = _require_psycopg() - sch = self._q(self._schema) - with self._connect() as conn, conn.cursor(row_factory=dict_row) as cur: - cur.execute( - f""" - INSERT INTO {sch}.domain_comments - (domain_id, version, parent_id, author, body) - SELECT d.id, %s, %s, %s, %s - FROM {sch}.domains d - WHERE d.registry_id = %s AND d.folder = %s - RETURNING id, version, parent_id, author, body, - resolved, created_at - """, - ( - version, - parent_id or None, - author or "", - body or "", - self._registry(), - folder, - ), - ) - row = cur.fetchone() - if not row: - return None - return self._comment_row_to_dict(row, folder) - except Exception as exc: # noqa: BLE001 - logger.warning( - "insert_comment(%s/%s) failed: %s", folder, version, exc - ) - return None - - def list_comments( - self, - folder: str, - version: Optional[str] = None, - *, - include_resolved: bool = True, - ) -> List[DomainComment]: - if not self._ensure_collab_tables(): - return [] - try: - psycopg, dict_row = _require_psycopg() - sch = self._q(self._schema) - clauses = ["d.registry_id = %s", "d.folder = %s"] - params: List[Any] = [self._registry(), folder] - if version: - clauses.append("c.version = %s") - params.append(version) - if not include_resolved: - clauses.append("c.resolved = false") - where = " AND ".join(clauses) - with self._connect() as conn, conn.cursor(row_factory=dict_row) as cur: - cur.execute( - f""" - SELECT c.id, d.folder, c.version, c.parent_id, - c.author, c.body, c.resolved, c.created_at - FROM {sch}.domain_comments c - JOIN {sch}.domains d ON d.id = c.domain_id - WHERE {where} - ORDER BY c.created_at ASC, c.id ASC - """, - tuple(params), - ) - rows = cur.fetchall() - return [self._comment_row_to_dict(r) for r in rows] - except Exception as exc: # noqa: BLE001 - logger.debug("list_comments(%s) failed: %s", folder, exc) - return [] - - def resolve_comment( - self, folder: str, comment_id: str, *, resolved: bool = True - ) -> Tuple[bool, str]: - if not self._ensure_collab_tables(): - return False, "comments backend unavailable" - try: - sch = self._q(self._schema) - with self._connect() as conn, conn.cursor() as cur: - cur.execute( - f""" - UPDATE {sch}.domain_comments c - SET resolved = %s - FROM {sch}.domains d - WHERE c.domain_id = d.id - AND d.registry_id = %s AND d.folder = %s - AND c.id = %s - """, - (resolved, self._registry(), folder, comment_id), - ) - if cur.rowcount == 0: - return False, "Comment not found" - return True, "" - except Exception as exc: # noqa: BLE001 - logger.warning( - "resolve_comment(%s/%s) failed: %s", folder, comment_id, exc - ) - return False, str(exc) - - @staticmethod - def _task_row_to_dict(r: Dict[str, Any], folder: str = "") -> DomainTask: - return { - "id": str(r.get("id") or ""), - "folder": r.get("folder", folder) or folder, - "version": r["version"], - "assignee": r["assignee"] or "", - "created_by": r["created_by"] or "", - "title": r["title"] or "", - "description": r["description"] or "", - "status": r["status"] or "open", - "due_date": r["due_date"].isoformat() if r.get("due_date") else "", - "comment_id": str(r["comment_id"]) if r.get("comment_id") else "", - "created_at": ( - r["created_at"].isoformat() if r.get("created_at") else "" - ), - "updated_at": ( - r["updated_at"].isoformat() if r.get("updated_at") else "" - ), - } - - def insert_task( - self, - folder: str, - version: str, - *, - assignee: str, - created_by: str, - title: str, - description: str = "", - due_date: Optional[str] = None, - comment_id: Optional[str] = None, - ) -> Optional[DomainTask]: - if not self._ensure_collab_tables(): - return None - try: - psycopg, dict_row = _require_psycopg() - sch = self._q(self._schema) - with self._connect() as conn, conn.cursor(row_factory=dict_row) as cur: - cur.execute( - f""" - INSERT INTO {sch}.domain_tasks - (domain_id, version, assignee, created_by, title, - description, due_date, comment_id) - SELECT d.id, %s, %s, %s, %s, %s, %s, %s - FROM {sch}.domains d - WHERE d.registry_id = %s AND d.folder = %s - RETURNING id, version, assignee, created_by, title, - description, status, due_date, comment_id, - created_at, updated_at - """, - ( - version, - assignee or "", - created_by or "", - title or "", - description or "", - due_date or None, - comment_id or None, - self._registry(), - folder, - ), - ) - row = cur.fetchone() - if not row: - return None - return self._task_row_to_dict(row, folder) - except Exception as exc: # noqa: BLE001 - logger.warning( - "insert_task(%s/%s) failed: %s", folder, version, exc - ) - return None - - def list_tasks( - self, folder: str, version: Optional[str] = None - ) -> List[DomainTask]: - if not self._ensure_collab_tables(): - return [] - try: - psycopg, dict_row = _require_psycopg() - sch = self._q(self._schema) - clauses = ["d.registry_id = %s", "d.folder = %s"] - params: List[Any] = [self._registry(), folder] - if version: - clauses.append("t.version = %s") - params.append(version) - where = " AND ".join(clauses) - with self._connect() as conn, conn.cursor(row_factory=dict_row) as cur: - cur.execute( - f""" - SELECT t.id, d.folder, t.version, t.assignee, t.created_by, - t.title, t.description, t.status, t.due_date, - t.comment_id, t.created_at, t.updated_at - FROM {sch}.domain_tasks t - JOIN {sch}.domains d ON d.id = t.domain_id - WHERE {where} - ORDER BY t.created_at DESC, t.id DESC - """, - tuple(params), - ) - rows = cur.fetchall() - return [self._task_row_to_dict(r) for r in rows] - except Exception as exc: # noqa: BLE001 - logger.debug("list_tasks(%s) failed: %s", folder, exc) - return [] - - def list_tasks_for_assignee(self, assignee: str) -> List[DomainTask]: - if not self._ensure_collab_tables(): - return [] - try: - psycopg, dict_row = _require_psycopg() - sch = self._q(self._schema) - with self._connect() as conn, conn.cursor(row_factory=dict_row) as cur: - cur.execute( - f""" - SELECT t.id, d.folder, t.version, t.assignee, t.created_by, - t.title, t.description, t.status, t.due_date, - t.comment_id, t.created_at, t.updated_at - FROM {sch}.domain_tasks t - JOIN {sch}.domains d ON d.id = t.domain_id - WHERE d.registry_id = %s AND lower(t.assignee) = lower(%s) - ORDER BY t.created_at DESC, t.id DESC - """, - (self._registry(), assignee or ""), - ) - rows = cur.fetchall() - return [self._task_row_to_dict(r) for r in rows] - except Exception as exc: # noqa: BLE001 - logger.debug("list_tasks_for_assignee(%s) failed: %s", assignee, exc) - return [] - - def update_task_status( - self, folder: str, task_id: str, status: str - ) -> Tuple[bool, str]: - if not self._ensure_collab_tables(): - return False, "tasks backend unavailable" - try: - sch = self._q(self._schema) - with self._connect() as conn, conn.cursor() as cur: - cur.execute( - f""" - UPDATE {sch}.domain_tasks t - SET status = %s, updated_at = now() - FROM {sch}.domains d - WHERE t.domain_id = d.id - AND d.registry_id = %s AND d.folder = %s - AND t.id = %s - """, - (status, self._registry(), folder, task_id), - ) - if cur.rowcount == 0: - return False, "Task not found" - return True, "" - except Exception as exc: # noqa: BLE001 - logger.warning( - "update_task_status(%s/%s) failed: %s", folder, task_id, exc - ) - return False, str(exc) - # ------------------------------------------------------------------ # Global config # ------------------------------------------------------------------ diff --git a/src/front/config/menu_config.json b/src/front/config/menu_config.json index 8e602b5d..cdda90b7 100644 --- a/src/front/config/menu_config.json +++ b/src/front/config/menu_config.json @@ -194,27 +194,6 @@ } ] }, - { - "id": "domain-collaboration", - "title": "Collaboration", - "icon": "bi-chat-left-text", - "items": [ - { - "id": "mytasks", - "label": "My Tasks", - "icon": "bi-inbox", - "default": false, - "requires": "domain_saved" - }, - { - "id": "discussions", - "label": "Discussions", - "icon": "bi-chat-left-text", - "default": false, - "requires": "domain_saved" - } - ] - }, { "id": "domain-management", "title": "Management", diff --git a/src/front/static/domain/css/domain-collaboration.css b/src/front/static/domain/css/domain-collaboration.css deleted file mode 100644 index 3b2f2da1..00000000 --- a/src/front/static/domain/css/domain-collaboration.css +++ /dev/null @@ -1,113 +0,0 @@ -/* Domain → Collaboration: discussions activity timeline */ - -.oc-timeline { - position: relative; - padding-left: 0.5rem; -} - -.oc-timeline-day { - font-size: 0.72rem; - font-weight: 600; - text-transform: uppercase; - letter-spacing: 0.03em; - color: #6c757d; - margin: 1rem 0 0.5rem; - padding-left: 2.75rem; -} - -.oc-timeline-day:first-child { - margin-top: 0; -} - -.oc-tl-item { - position: relative; - display: flex; - gap: 0.75rem; - padding: 0.6rem 0.75rem 0.6rem 0; - cursor: pointer; - border-radius: 0.5rem; - transition: background-color 0.12s ease; -} - -.oc-tl-item:hover { - background-color: #f6f8fa; -} - -/* Vertical connector line through the avatars. */ -.oc-tl-marker { - position: relative; - flex: 0 0 2.25rem; - display: flex; - justify-content: center; -} - -.oc-tl-marker::before { - content: ""; - position: absolute; - top: -0.6rem; - bottom: -0.6rem; - left: 50%; - width: 2px; - background: #e9ecef; - transform: translateX(-50%); - z-index: 0; -} - -.oc-tl-item:first-of-type .oc-tl-marker::before { - top: 0.9rem; -} - -.oc-tl-marker .oc-avatar { - position: relative; - z-index: 1; - width: 2rem; - height: 2rem; - border-radius: 50%; - background: #0d6efd; - color: #fff; - font-size: 0.72rem; - font-weight: 600; - display: flex; - align-items: center; - justify-content: center; - border: 2px solid #fff; - box-shadow: 0 0 0 1px #e9ecef; -} - -.oc-tl-body { - flex: 1 1 auto; - min-width: 0; -} - -.oc-tl-head { - display: flex; - align-items: center; - flex-wrap: wrap; - gap: 0.15rem; - font-size: 0.85rem; -} - -.oc-tl-head .oc-author { - font-weight: 600; - color: #212529; -} - -.oc-tl-head .oc-time { - font-size: 0.72rem; - color: #adb5bd; - white-space: nowrap; -} - -.oc-anchor-badge { - background: #eef2ff; - color: #4338ca; - font-weight: 500; -} - -.oc-tl-text { - font-size: 0.9rem; - color: #343a40; - margin-top: 0.15rem; - white-space: pre-wrap; - word-break: break-word; -} diff --git a/src/front/static/domain/js/domain-collaboration.js b/src/front/static/domain/js/domain-collaboration.js deleted file mode 100644 index 910e802a..00000000 --- a/src/front/static/domain/js/domain-collaboration.js +++ /dev/null @@ -1,511 +0,0 @@ -/** - * Domain → Collaboration - * - * Two sections that concentrate every collaborative signal for the loaded - * domain in one place: - * - * • My Tasks — tasks assigned to the current user plus the review - * worklist (data: GET /review/my-tasks). - * • Discussions — a single activity timeline merging every comment thread - * across the domain's surfaces (ontology, mappings, graph, - * domain), newest first (data: GET /comments/{folder}/{ver}). - * - * The thread panel itself is the shared global component (comments-panel.js): - * clicking a timeline entry re-opens it via OntoComments.openThread(). - */ -(function () { - 'use strict'; - - let tasksLoaded = false; - let discussionsLoaded = false; - let domainCtx = null; // { folder, version, hasRegistry } - let allComments = []; // cached raw comments for re-render - const selectedTags = new Set(); // active tag-filter keys (multi-select) - - document.addEventListener('DOMContentLoaded', init); - - function init() { - document.addEventListener('sidebarSectionChanged', (e) => { - const section = e.detail && e.detail.section; - if (section === 'mytasks' && !tasksLoaded) loadTasks(); - if (section === 'discussions' && !discussionsLoaded) loadDiscussions(); - }); - - const initial = new URLSearchParams(window.location.search).get('section'); - if (initial === 'mytasks') loadTasks(); - if (initial === 'discussions') loadDiscussions(); - - on('btnRefreshDomainTasks', 'click', () => { tasksLoaded = false; loadTasks(); }); - on('btnRefreshDomainDiscussions', 'click', () => { - discussionsLoaded = false; - loadDiscussions(); - }); - on('domainDiscShowResolved', 'change', renderDiscussions); - } - - // ---- shared helpers ----------------------------------------------------- - - function on(id, evt, fn) { - const elx = document.getElementById(id); - if (elx) elx.addEventListener(evt, fn); - } - - function esc(text) { - if (typeof window.escapeHtml === 'function') return window.escapeHtml(text); - if (text == null) return ''; - const d = document.createElement('div'); - d.textContent = String(text); - return d.innerHTML; - } - - function escAttr(text) { - return esc(text).replace(/"/g, '"'); - } - - // Render a comment body's markdown to HTML (same approach as the Discussion - // panel): use the global `marked` (loaded in base.html), with an escaped - // text +
fallback when it isn't available. - function renderMarkdown(text) { - const src = text || ''; - if (typeof window.marked !== 'undefined' && window.marked.parse) { - try { - window.marked.setOptions({ breaks: true, gfm: true }); - return window.marked.parse(src); - } catch (e) { /* fall through to plain text */ } - } - return esc(src).replace(/\n/g, '
'); - } - - function note(msg, kind) { - if (typeof window.showNotification === 'function') { - window.showNotification(msg, kind || 'info'); - } - } - - async function resolveDomainCtx() { - if (domainCtx) return domainCtx; - try { - const r = await fetch('/domain/version-status', { credentials: 'same-origin' }); - const vs = await r.json(); - domainCtx = { - folder: vs.domain_folder || '', - version: vs.version || '', - hasRegistry: !!vs.has_registry, - }; - } catch (e) { - domainCtx = { folder: '', version: '', hasRegistry: false }; - } - return domainCtx; - } - - function relativeTime(iso) { - if (!iso) return 'never'; - const d = new Date(iso); - if (isNaN(d.getTime())) return ''; - const diff = (Date.now() - d.getTime()) / 1000; - if (diff < 60) return 'just now'; - if (diff < 3600) return Math.floor(diff / 60) + 'm ago'; - if (diff < 86400) return Math.floor(diff / 3600) + 'h ago'; - return d.toLocaleDateString(); - } - - function dayKey(iso) { - const d = new Date(iso); - if (isNaN(d.getTime())) return 'Unknown date'; - const today = new Date(); - const yest = new Date(); - yest.setDate(today.getDate() - 1); - if (d.toDateString() === today.toDateString()) return 'Today'; - if (d.toDateString() === yest.toDateString()) return 'Yesterday'; - return d.toLocaleDateString(undefined, { - weekday: 'short', year: 'numeric', month: 'short', day: 'numeric', - }); - } - - function parsedTags(cm) { - const parsed = (window.OntoComments && OntoComments.parseBody) - ? OntoComments.parseBody(cm.body) - : { tags: [] }; - return parsed.tags || []; - } - - function tagKey(t) { - return String(t.ref || t.label || ''); - } - - // ======================================================================== - // MY TASKS - // ======================================================================== - - async function loadTasks() { - const c = document.getElementById('domainMyTasksContainer'); - if (!c) return; - c.innerHTML = spinner('Loading your tasks...'); - try { - const resp = await fetch('/review/my-tasks', { credentials: 'same-origin' }); - const data = await resp.json(); - if (!resp.ok || !data.success) { - c.innerHTML = errBox(data.message || 'Failed to load tasks'); - return; - } - renderTasks(data.tasks || [], data.assigned_tasks || []); - tasksLoaded = true; - } catch (err) { - c.innerHTML = errBox('Network error: ' + String(err)); - } - } - - function renderTasks(reviewTasks, assigned) { - const c = document.getElementById('domainMyTasksContainer'); - if (!c) return; - - if (!reviewTasks.length && !assigned.length) { - c.innerHTML = - '
' + - '' + - "You're all caught up — no pending tasks.
"; - return; - } - c.innerHTML = assignedHtml(assigned) + reviewHtml(reviewTasks); - c.querySelectorAll('button[data-task-status]').forEach((b) => { - b.addEventListener('click', () => onTaskStatus(b)); - }); - c.querySelectorAll('button[data-open-review]').forEach((b) => { - b.addEventListener('click', () => openReview(b.dataset.domain, b.dataset.version)); - }); - } - - function assignedHtml(tasks) { - if (!tasks.length) return ''; - const rows = tasks.map((t) => - '' + - '' + esc(t.title) + '' + - '' + esc(t.folder) + ' v' + esc(t.version) + '' + - '' + esc(t.created_by) + '' + - '' + taskStatusBadge(t.status) + '' + - '' + (t.due_date ? esc(t.due_date) : '') + '' + - '' + taskActions(t) + '' + - '' - ).join(''); - return '
' + - 'Assigned to me
' + - '
' + - '' + - '' + - '' + rows + '
TaskDomainFromStatusDueAction
'; - } - - function reviewHtml(tasks) { - if (!tasks.length) return ''; - const rows = tasks.map((t) => - '' + - '' + esc(t.domain) + '' + - 'v' + esc(t.version) + '' + - '' + statusBadge(t.status) + '' + - '' + esc(t.approvals) + ' / ' + esc(t.required) + '' + - '' + esc(relativeTime(t.last_activity)) + '' + - '' + - '' + - '' - ).join(''); - return '
' + - 'Review worklist
' + - '
' + - '' + - '' + - '' + rows + '
DomainVersionStatusApprovalsLast activityYour action
'; - } - - function taskActions(t) { - const start = t.status === 'open' - ? '' - : ''; - const done = (t.status !== 'done' && t.status !== 'cancelled') - ? '' - : ''; - return start + ' ' + done; - } - - async function onTaskStatus(btn) { - const { folder, version, taskId } = btn.dataset; - const status = btn.dataset.taskStatus; - try { - const resp = await fetch( - '/comments/' + encodeURIComponent(folder) + '/' + - encodeURIComponent(version) + '/tasks/' + - encodeURIComponent(taskId) + '/status', - { - method: 'POST', - credentials: 'same-origin', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ status: status }), - } - ); - const data = await resp.json(); - if (!resp.ok || !data.success) { - note(data.message || 'Failed to update task', 'error'); - return; - } - note('Task marked ' + status.replace('_', ' ') + '.', 'success'); - tasksLoaded = false; - loadTasks(); - } catch (err) { - note('Error: ' + err.message, 'error'); - } - } - - async function openReview(domain, version) { - try { - note('Opening ' + domain + ' v' + version + '…', 'info', 4000); - const resp = await fetch('/domain/load-from-uc', { - method: 'POST', - credentials: 'same-origin', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ domain: domain, version: version }), - }); - const data = await resp.json(); - if (!data.success) { - note('Error: ' + (data.message || 'Failed to load domain'), 'error'); - return; - } - window.location.href = '/domain/?section=review'; - } catch (err) { - note('Error loading domain: ' + err.message, 'error'); - } - } - - function taskStatusBadge(status) { - const map = { - open: 'bg-secondary-subtle text-dark border', - in_progress: 'bg-info-subtle text-dark border-info', - done: 'bg-success-subtle text-dark border-success', - cancelled: 'bg-light text-muted border', - }; - const cls = map[status] || map.open; - return '' + esc((status || 'open').replace('_', ' ')) + ''; - } - - function statusBadge(status) { - const map = { - 'DRAFT': 'bg-warning-subtle text-dark border-warning', - 'IN-REVIEW': 'bg-info-subtle text-dark border-info', - 'PUBLISHED': 'bg-success-subtle text-dark border-success', - }; - const cls = map[status] || map['DRAFT']; - const label = status === 'IN-REVIEW' ? 'In Review' - : ((status || 'DRAFT').charAt(0) + (status || 'DRAFT').slice(1).toLowerCase()); - return '' + esc(label) + ''; - } - - // ======================================================================== - // DISCUSSIONS TIMELINE - // ======================================================================== - - async function loadDiscussions() { - const c = document.getElementById('domainDiscussionsContainer'); - if (!c) return; - c.innerHTML = spinner('Loading discussions...'); - const dc = await resolveDomainCtx(); - if (!dc.folder || !dc.hasRegistry) { - c.innerHTML = - '
' + - 'Save this domain to the registry to start collaborating.
'; - return; - } - try { - const url = '/comments/' + encodeURIComponent(dc.folder) + '/' + - encodeURIComponent(dc.version); - const resp = await fetch(url, { credentials: 'same-origin' }); - const data = await resp.json(); - if (!resp.ok || !data.success) { - c.innerHTML = errBox(data.message || 'Failed to load discussions'); - return; - } - allComments = data.comments || []; - discussionsLoaded = true; - buildTagFilter(); - renderDiscussions(); - } catch (err) { - c.innerHTML = errBox('Network error: ' + String(err)); - } - } - - function renderDiscussions() { - const c = document.getElementById('domainDiscussionsContainer'); - if (!c) return; - const showResolved = !!(document.getElementById('domainDiscShowResolved') || {}).checked; - - let items = allComments.slice(); - if (!showResolved) items = items.filter((x) => !x.resolved); - // Tag filter (multi-select, OR semantics: keep comments carrying any - // of the selected tags). - if (selectedTags.size) { - items = items.filter((x) => - parsedTags(x).some((t) => selectedTags.has(tagKey(t)))); - } - // Newest first. - items.sort((a, b) => new Date(b.created_at) - new Date(a.created_at)); - - if (!items.length) { - c.innerHTML = selectedTags.size - ? '
' + - '' + - 'No discussions match the selected tags.
' - : '
' + - '' + - 'No discussions yet. Open any ontology, mapping or twin page and ' + - 'click to start one.
'; - return; - } - - let html = '
'; - let lastDay = null; - items.forEach((cm) => { - const day = dayKey(cm.created_at); - if (day !== lastDay) { - html += '
' + esc(day) + '
'; - lastDay = day; - } - html += timelineEntry(cm); - }); - html += '
'; - c.innerHTML = html; - - c.querySelectorAll('[data-open-thread]').forEach((row) => { - row.addEventListener('click', () => { openThreadFor(); }); - }); - } - - function buildTagFilter() { - const wrap = document.getElementById('domainDiscTagFilterWrap'); - const menu = document.getElementById('domainDiscTagMenu'); - if (!wrap || !menu) return; - - // Distinct tags across every comment, keyed by ref, with a label. - const byKey = new Map(); - allComments.forEach((cm) => { - parsedTags(cm).forEach((t) => { - const k = tagKey(t); - if (k && !byKey.has(k)) byKey.set(k, t.label || t.ref || k); - }); - }); - - // Forget selections whose tag no longer appears in the data. - Array.from(selectedTags).forEach((k) => { - if (!byKey.has(k)) selectedTags.delete(k); - }); - - if (!byKey.size) { - wrap.style.display = 'none'; - menu.innerHTML = ''; - updateTagCount(); - return; - } - wrap.style.display = ''; - - const entries = Array.from(byKey.entries()) - .sort((a, b) => String(a[1]).localeCompare(String(b[1]))); - let html = - '
  • ' + - 'Filter by tag' + - '
  • '; - entries.forEach((e) => { - const k = e[0]; - const checked = selectedTags.has(k) ? ' checked' : ''; - html += - '
  • '; - }); - menu.innerHTML = html; - - menu.querySelectorAll('input[type=checkbox]').forEach((cb) => { - cb.addEventListener('change', () => { - if (cb.checked) selectedTags.add(cb.value); - else selectedTags.delete(cb.value); - updateTagCount(); - renderDiscussions(); - }); - }); - const clr = document.getElementById('domainDiscTagClear'); - if (clr) { - clr.addEventListener('click', () => { - selectedTags.clear(); - menu.querySelectorAll('input[type=checkbox]') - .forEach((cb) => { cb.checked = false; }); - updateTagCount(); - renderDiscussions(); - }); - } - updateTagCount(); - } - - function updateTagCount() { - const badge = document.getElementById('domainDiscTagCount'); - if (!badge) return; - if (selectedTags.size) { - badge.textContent = String(selectedTags.size); - badge.classList.remove('d-none'); - } else { - badge.classList.add('d-none'); - } - } - - function timelineEntry(cm) { - const parsed = (window.OntoComments && OntoComments.parseBody) - ? OntoComments.parseBody(cm.body) - : { text: cm.body || '', tags: [] }; - const author = cm.author || 'unknown'; - const initials = author.replace(/@.*/, '').slice(0, 2).toUpperCase(); - const isReply = !!cm.parent_id; - - const tagsHtml = (parsed.tags || []).map((t) => - '' + - esc(t.label || t.ref) + '').join(''); - - return '
    ' + - '
    ' + esc(initials) + '
    ' + - '
    ' + - '
    ' + - '' + esc(author) + '' + - (isReply ? 'reply' : '') + - (cm.resolved ? 'Resolved' : '') + - '' + esc(relativeTime(cm.created_at)) + '' + - '
    ' + - '
    ' + renderMarkdown(parsed.text) + '
    ' + - (tagsHtml ? '
    ' + tagsHtml + '
    ' : '') + - '
    '; - } - - function openThreadFor() { - if (!window.OntoComments || !domainCtx) return; - OntoComments.openThread({ - folder: domainCtx.folder, - version: domainCtx.version, - }); - } - - // ---- tiny html helpers -------------------------------------------------- - - function spinner(label) { - return '
    ' + - ' ' + esc(label) + '
    '; - } - - function errBox(msg) { - return '
    ' + esc(msg) + '
    '; - } -})(); diff --git a/src/front/static/domain/js/domain-review.js b/src/front/static/domain/js/domain-review.js index e1137acc..18034f51 100644 --- a/src/front/static/domain/js/domain-review.js +++ b/src/front/static/domain/js/domain-review.js @@ -89,13 +89,10 @@ function statusBanner(d) { const buttons = actionButtons(d); const notes = actionNotes(d); - const discussBtn = - ''; - const right = - '
    ' + - buttons.join('') + discussBtn + '
    '; + const right = buttons.length + ? '
    ' + + buttons.join('') + '
    ' + : ''; const notesHtml = notes.length ? '
    ' + notes.join('') + '
    ' @@ -472,15 +469,6 @@ document.querySelectorAll('[data-review-action]').forEach((b) => { b.addEventListener('click', () => onAction(b.dataset.reviewAction)); }); - document.querySelector('[data-review-discuss]')?.addEventListener( - 'click', () => { - if (!window.OntoComments) return; - OntoComments.openThread({ - folder: state.folder, - version: state.version, - }); - } - ); } async function onAction(action) { diff --git a/src/front/static/global/css/review-modals.css b/src/front/static/global/css/review-modals.css index cff22fb2..e2fbf49c 100644 --- a/src/front/static/global/css/review-modals.css +++ b/src/front/static/global/css/review-modals.css @@ -82,262 +82,3 @@ font-size: 0.72rem; color: var(--db-text-muted, #666); } - -/* ── Anchored comments offcanvas (OntoComments) ─────────────── */ -/* The app navbar is z-index:1050 (main.css); Bootstrap's offcanvas is - only 1045, so without this lift the navbar would paint over the - panel's header. Keep the backdrop just below the panel. */ -.oc-comments { - z-index: 1060; -} - -.offcanvas-backdrop.oc-comments-backdrop { - z-index: 1055; -} - -.oc-comments-list { - overflow-y: auto; -} - -.oc-thread { - padding: 0.6rem 0.6rem 0.4rem; - border: 1px solid var(--db-border, #e3e6ea); - border-radius: 0.5rem; - margin-bottom: 0.75rem; - background: var(--db-surface, #fff); -} - -.oc-thread.oc-resolved { - opacity: 0.7; - background: var(--db-surface-muted, #f7f9fb); -} - -.oc-bubble { - display: flex; - gap: 0.5rem; - margin-bottom: 0.4rem; -} - -.oc-bubble-reply { - margin-left: 1.6rem; -} - -.oc-avatar { - flex: 0 0 auto; - width: 28px; - height: 28px; - border-radius: 50%; - background: var(--db-accent-subtle, #e7f0fe); - color: var(--db-accent, #1b6ec2); - font-size: 0.7rem; - font-weight: 600; - display: flex; - align-items: center; - justify-content: center; -} - -.oc-bubble-body { - flex: 1 1 auto; - min-width: 0; -} - -.oc-bubble-head { - display: flex; - align-items: center; - gap: 0.5rem; - flex-wrap: wrap; -} - -.oc-author { - font-size: 0.78rem; - font-weight: 600; -} - -.oc-time { - font-size: 0.7rem; - color: var(--db-text-muted, #888); -} - -.oc-text { - font-size: 0.85rem; - white-space: pre-wrap; - word-break: break-word; -} - -/* Rendered markdown bodies (agent reports + comments). Tight, bubble-friendly - spacing so block elements don't blow the thread/timeline layout out. Used by - the Discussion panel (.oc-text.oc-md) and the Domain → Discussions timeline - (.oc-tl-text.oc-md). */ -.oc-md { - white-space: normal; -} - -.oc-md > :first-child { margin-top: 0; } -.oc-md > :last-child { margin-bottom: 0; } -.oc-md p { margin: 0 0 0.4rem; } -.oc-md ul, -.oc-md ol { margin: 0 0 0.4rem; padding-left: 1.2rem; } -.oc-md li { margin-bottom: 0.15rem; } - -.oc-md h1, -.oc-md h2, -.oc-md h3, -.oc-md h4, -.oc-md h5, -.oc-md h6 { - font-size: 0.9rem; - font-weight: 600; - margin: 0.5rem 0 0.3rem; -} - -.oc-md code { - background: var(--db-surface-muted, #f1f3f5); - padding: 0.05rem 0.3rem; - border-radius: 0.25rem; - font-size: 0.8rem; -} - -.oc-md pre { - background: var(--db-surface-muted, #f6f8fa); - padding: 0.5rem; - border-radius: 0.375rem; - overflow-x: auto; - margin: 0 0 0.4rem; -} - -.oc-md pre code { background: none; padding: 0; } -.oc-md a { color: var(--db-accent, #1b6ec2); } - -.oc-md blockquote { - margin: 0 0 0.4rem; - padding-left: 0.6rem; - border-left: 3px solid var(--db-border, #e3e6ea); - color: var(--db-text-muted, #6c757d); -} - -.oc-md table { - font-size: 0.8rem; - border-collapse: collapse; - margin: 0 0 0.4rem; -} - -.oc-md th, -.oc-md td { - border: 1px solid var(--db-border, #e3e6ea); - padding: 0.2rem 0.4rem; -} - -/* Entity / relationship tags on a comment + in the compose picker */ -.oc-tag-chip { - font-weight: 500; - font-size: 0.72rem; - background: var(--db-surface-alt, #eef2ff); - color: var(--db-text, #334155); - border-color: #c7d2fe !important; -} - -.oc-bubble-tags .oc-tag-chip { - margin-top: 0.15rem; -} - -.oc-tagbar .oc-tag-chips:empty { - display: none; -} - -.oc-tag-chip .btn-close { - font-size: 0.5rem; - padding: 0; - margin-left: 0.25rem; -} - -.oc-replies:empty { - display: none; -} - -.oc-thread-tools { - margin-top: 0.25rem; - margin-left: 1.6rem; - font-size: 0.78rem; -} - -.oc-reply-box, -.oc-task-box { - margin-top: 0.5rem; - margin-left: 1.6rem; -} - -.oc-task-form { - background: var(--db-surface-muted, #f7f9fb); -} - -/* ---- AI-Agent live status --------------------------------------------- */ - -/* Top-of-panel progress strip for an active AI-Agent background run. */ -.oc-agent-strip { - background: var(--db-accent-subtle, #e7f0fe); - color: var(--db-text, #334155); -} - -.oc-agent-strip .oc-agent-spin { - color: var(--db-accent, #1b6ec2); - animation: oc-agent-spin 1.4s linear infinite; - display: inline-flex; -} - -@keyframes oc-agent-spin { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } -} - -/* AI-Agent task threads get a tinted left edge so they stand out. */ -.oc-thread-agent { - border-left: 3px solid var(--db-accent, #1b6ec2); -} - -/* Per-thread status chip. */ -.oc-agent-chip { - display: inline-flex; - align-items: center; - font-size: 0.72rem; - font-weight: 600; - padding: 0.1rem 0.5rem; - border-radius: 999px; - border: 1px solid transparent; -} - -.oc-agent-chip.oc-agent-working { - background: var(--db-accent-subtle, #e7f0fe); - color: var(--db-accent, #1b6ec2); - border-color: #b6d4fe; -} - -.oc-agent-chip.oc-agent-waiting { - background: #fff3cd; - color: #8a6d00; - border-color: #ffe69c; -} - -.oc-agent-chip.oc-agent-queued { - background: var(--db-surface-muted, #f1f3f5); - color: var(--db-text-muted, #6c757d); - border-color: #e3e6ea; -} - -.oc-agent-chip.oc-agent-done { - background: #d1e7dd; - color: #0f5132; - border-color: #badbcc; -} - -/* Prominent answer box on a parked AI-Agent thread. */ -.oc-agent-answer { - margin: 0.4rem 0 0.2rem 1.6rem; - padding: 0.5rem; - border: 1px solid #ffe69c; - border-radius: 0.5rem; - background: #fffbef; -} - -.oc-agent-answer .fw-semibold { - color: #8a6d00; -} diff --git a/src/front/static/global/js/comments-panel.js b/src/front/static/global/js/comments-panel.js deleted file mode 100644 index 829904c4..00000000 --- a/src/front/static/global/js/comments-panel.js +++ /dev/null @@ -1,824 +0,0 @@ -/** - * Collaborative comments & tasks — domain discussion panel (global) - * - * A reusable right-side offcanvas that opens the single domain-wide, - * threaded discussion for ``(folder, version)``. Any surface can open it - * through the global API: - * - * OntoComments.openThread({ folder, version }); - * - * Backed by the /comments API (see CommentService). A comment can be - * turned into a task assigned to a teammate; the assignee picker is loaded - * from the domain access roster (/review///team). - * - * Depends on Bootstrap 5 (Offcanvas) and the global escapeHtml in - * utils.js (falls back to a local implementation when absent). - */ -(function () { - 'use strict'; - - // Sentinel assignee that routes the task to the AI Agent (see - // back/objects/registry/agent_task_runner.AI_AGENT_PRINCIPAL). - const AI_AGENT_PRINCIPAL = 'agent://router'; - - let el = null; - let offcanvas = null; - let ctx = null; // { folder, version } - let membersCache = {}; // key folder/version -> [members] - let currentUser = null; // current user's email/principal (for "Assign to me") - let currentUserPromise = null; - let aiTasksByComment = {}; // root comment_id -> AI-Agent DomainTask (this version) - let agentRuns = []; // active task_router background runs (from /tasks/) - let panelPollTimer = null; // live-refresh timer while the panel is open - let lastListSig = ''; // signature of the last rendered comment set - let aiStatusSnapshot = {}; // comment_id -> last-seen AI task status (transition guard) - let aiSnapshotReady = false;// becomes true after the first AI-task load (baseline) - - function esc(text) { - if (typeof window.escapeHtml === 'function') return window.escapeHtml(text); - if (text == null) return ''; - const div = document.createElement('div'); - div.textContent = String(text); - return div.innerHTML; - } - - function escAttr(text) { - return esc(text).replace(/"/g, '"'); - } - - // Render a comment body's markdown to HTML. Uses `marked` (loaded globally - // in base.html, same as the ontology chat assistant); falls back to escaped - // text with
    when it isn't available. - function renderMarkdown(text) { - const src = text || ''; - if (typeof window.marked !== 'undefined' && window.marked.parse) { - try { - window.marked.setOptions({ breaks: true, gfm: true }); - return window.marked.parse(src); - } catch (e) { /* fall through to plain text */ } - } - return esc(src).replace(/\n/g, '
    '); - } - - function notify(msg, kind) { - if (typeof window.showNotification === 'function') { - window.showNotification(msg, kind || 'info'); - } - } - - function build() { - if (el) return; - el = document.createElement('div'); - el.className = 'offcanvas offcanvas-end oc-comments'; - el.tabIndex = -1; - el.setAttribute('aria-labelledby', 'ocCommentsTitle'); - el.style.width = '460px'; - el.innerHTML = - '
    ' + - '
    ' + - '
    ' + - 'Discussion
    ' + - '
    ' + - '
    ' + - '' + - '' + - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '' + - '
    ' + - '' + - '
    ' + - '
    '; - document.body.appendChild(el); - - const compose = el.querySelector('[data-oc-compose]'); - el.querySelector('[data-oc-send]').addEventListener('click', () => { - const ta = compose.querySelector('[data-oc-input]'); - postComment((ta.value || '').trim(), null, ta, compose); - }); - el.querySelector('[data-oc-new-task]').addEventListener('click', openNewTask); - el.addEventListener('hidden.bs.offcanvas', stopPanelPolling); - } - - // Header subtitle: discussions are domain-wide, so just name the domain - // (no per-anchor "kind" badge that would separate threads by selection). - function renderAnchorBadge() { - const label = ctx.folder - ? esc(ctx.folder) + ' · v' + esc(ctx.version) - : ''; - el.querySelector('[data-oc-anchor]').innerHTML = label; - } - - // ---- Tags (legacy) ------------------------------------------------------ - // The entity/relationship tag picker has been removed — discussions are - // domain-wide and untagged. We keep the marker + parser/renderer so older - // comments that embedded tags still display their chips (read-only). - const TAG_MARK = '\n\n[[onto-tags]]'; - - function parseBody(body) { - const raw = body || ''; - const idx = raw.indexOf(TAG_MARK); - if (idx === -1) return { text: raw, tags: [] }; - let tags = []; - try { tags = JSON.parse(raw.slice(idx + TAG_MARK.length)) || []; } - catch (e) { tags = []; } - return { text: raw.slice(0, idx), tags: tags }; - } - - function tagsHtml(tags) { - if (!tags || !tags.length) return ''; - return '
    ' + tags.map((t) => - '' + - esc(t.label || t.ref) + '').join('') + '
    '; - } - - async function openThread(opts) { - opts = opts || {}; - if (!opts.folder || !opts.version) { - notify('Cannot open discussion: missing domain/version', 'error'); - return; - } - build(); - // Reset AI-Agent live-status state for the new context. - stopPanelPolling(); - agentRuns = []; - aiTasksByComment = {}; - aiStatusSnapshot = {}; - aiSnapshotReady = false; - lastListSig = ''; - renderAgentStrip(); - // Discussions are domain-wide: every entry point opens the single - // Domain thread (no per-anchor separation, no entity/relationship tags). - // The caller's anchor hints (type/ref/label/taggable) are ignored. - ctx = { - folder: opts.folder, - version: opts.version, - }; - renderAnchorBadge(); - - if (window.bootstrap) { - offcanvas = bootstrap.Offcanvas.getOrCreateInstance(el); - offcanvas.show(); - // Lift the shared backdrop above the navbar (z-index:1050) so - // the whole screen dims behind the panel (see review-modals.css). - setTimeout(() => { - document.querySelectorAll('.offcanvas-backdrop.show') - .forEach((b) => b.classList.add('oc-comments-backdrop')); - }, 0); - } - await reload(); - loadMembers(); - loadCurrentUser(); - ensureAgentTracking(); - } - - async function reload() { - const list = el.querySelector('[data-oc-list]'); - list.innerHTML = - '
    ' + - ' Loading...
    '; - const url = '/comments/' + encodeURIComponent(ctx.folder) + '/' + - encodeURIComponent(ctx.version); - try { - const resp = await fetch(url, { credentials: 'same-origin' }); - const data = await resp.json(); - if (!resp.ok || !data.success) { - list.innerHTML = '
    ' + - esc(data.message || 'Failed to load comments') + '
    '; - return; - } - await loadAiTasks(); - const comments = data.comments || []; - renderList(list, comments); - lastListSig = listSignature(comments); - } catch (err) { - list.innerHTML = '
    Network error: ' + - esc(String(err)) + '
    '; - } - } - - // Resolve the signed-in user once (for the "Assign to me" shortcut). - function loadCurrentUser() { - if (currentUserPromise) return currentUserPromise; - currentUserPromise = fetch('/domain/current-user', { credentials: 'same-origin' }) - .then((r) => r.json()) - .then((d) => { - currentUser = (d && d.success && d.email) ? d.email : null; - return currentUser; - }) - .catch(() => { currentUser = null; return null; }); - return currentUserPromise; - } - - async function loadMembers() { - const key = ctx.folder + '/' + ctx.version; - if (membersCache[key]) return; - try { - const resp = await fetch( - '/comments/' + encodeURIComponent(ctx.folder) + '/' + - encodeURIComponent(ctx.version) + '/assignees', - { credentials: 'same-origin' } - ); - const data = await resp.json(); - membersCache[key] = (resp.ok && data.success && data.members) - ? data.members : []; - } catch (err) { - membersCache[key] = []; - } - } - - // ---- AI-Agent live status ---------------------------------------------- - // An AI-Agent task runs asynchronously: a short "working" phase - // (route -> plan -> run) then it parks in_progress, waiting for the - // author's reply. We surface both states — a progress strip at the top of - // the panel and a per-thread chip — and poll while the panel is open so - // the agent's questions and outcomes appear without a manual refresh. - - // Load this version's AI-Agent tasks, keyed by their thread-root comment. - async function loadAiTasks() { - aiTasksByComment = {}; - try { - const resp = await fetch( - '/comments/' + encodeURIComponent(ctx.folder) + '/' + - encodeURIComponent(ctx.version) + '/tasks', - { credentials: 'same-origin' } - ); - const data = await resp.json(); - if (!resp.ok || !data.success) return; - (data.tasks || []).forEach((t) => { - if ((t.assignee || '').toLowerCase() !== AI_AGENT_PRINCIPAL) return; - const cid = t.comment_id || ''; - if (cid) aiTasksByComment[cid] = t; - }); - announceAgentCompletions(); - } catch (err) { /* best-effort: chips just won't show */ } - } - - // Fire a global "design updated" event when an AI-Agent task transitions to - // done, so design-consuming pages (ontology designer, mapping, …) can pull - // the agent's saved changes and re-render. The first load only records a - // baseline — we never refresh on initial paint, only on a live transition. - function announceAgentCompletions() { - const statuses = {}; - Object.keys(aiTasksByComment).forEach((k) => { - statuses[k] = aiTasksByComment[k].status; - }); - if (!aiSnapshotReady) { - aiStatusSnapshot = statuses; - aiSnapshotReady = true; - return; - } - const completed = Object.keys(statuses).filter((k) => { - const prev = aiStatusSnapshot[k]; - return statuses[k] === 'done' && prev && prev !== 'done'; - }); - aiStatusSnapshot = statuses; - if (completed.length) { - window.dispatchEvent(new CustomEvent('ontobricks:design-updated', { - detail: { source: 'agent', commentIds: completed }, - })); - } - } - - // Active AI-Agent background runs (the router/plan/run worker). - async function loadAgentRuns() { - agentRuns = []; - try { - const resp = await fetch('/tasks/', { credentials: 'same-origin' }); - const data = await resp.json(); - if (!data || !data.success) return; - agentRuns = (data.tasks || []).filter((t) => - t.task_type === 'task_router' && - (t.status === 'pending' || t.status === 'running')); - } catch (err) { /* best-effort: strip just stays hidden */ } - } - - function isAgentWorking() { return agentRuns.length > 0; } - - // Any in-flight AI-Agent work on this version (running OR parked/queued)? - function hasLiveAgentWork() { - if (isAgentWorking()) return true; - return Object.keys(aiTasksByComment).some((k) => { - const s = aiTasksByComment[k].status; - return s === 'in_progress' || s === 'open'; - }); - } - - // Render the top progress strip from the active background run(s). - function renderAgentStrip() { - const strip = el && el.querySelector('[data-oc-agent-strip]'); - if (!strip) return; - if (!agentRuns.length) { - strip.classList.add('d-none'); - strip.innerHTML = ''; - return; - } - const run = agentRuns[0]; - const pct = Math.max(3, Math.min(100, Number(run.progress) || 0)); - let step = run.message || ''; - if (run.steps && run.steps.length && run.current_step < run.steps.length) { - step = run.steps[run.current_step].description || step; - } - const extra = agentRuns.length > 1 - ? ' (+' + (agentRuns.length - 1) + ' more)' - : ''; - strip.classList.remove('d-none'); - strip.innerHTML = - '
    ' + - '' + - '' + esc(run.name || 'AI Agent') + '' + - extra + - '
    ' + - '
    ' + - '
    ' + - (step ? '
    ' + esc(step) + '
    ' : ''); - } - - // Refresh the AI strip and (re)start polling whenever there is live work. - async function ensureAgentTracking() { - await loadAgentRuns(); - renderAgentStrip(); - if (hasLiveAgentWork() && !panelPollTimer) startPanelPolling(); - } - - function startPanelPolling() { - stopPanelPolling(); - panelPollTimer = setInterval(panelPollTick, 4000); - } - - function stopPanelPolling() { - if (panelPollTimer) { clearInterval(panelPollTimer); panelPollTimer = null; } - } - - async function panelPollTick() { - if (!el || !ctx) { stopPanelPolling(); return; } - await loadAgentRuns(); - await loadAiTasks(); - renderAgentStrip(); - // Re-render the thread list only when the comment set changed, and - // never while the user is mid-reply (don't clobber an open answer box). - if (!userIsComposing()) { - const list = el.querySelector('[data-oc-list]'); - try { - const url = '/comments/' + encodeURIComponent(ctx.folder) + '/' + - encodeURIComponent(ctx.version); - const resp = await fetch(url, { credentials: 'same-origin' }); - const data = await resp.json(); - if (resp.ok && data.success) { - const comments = data.comments || []; - const sig = listSignature(comments); - if (sig !== lastListSig) { - renderList(list, comments); - lastListSig = sig; - } - } - } catch (err) { /* keep the last render on a transient error */ } - } - // Once everything is idle, stop polling to avoid needless traffic. - if (!hasLiveAgentWork()) stopPanelPolling(); - } - - // True while the user is actively typing a reply/answer somewhere in the - // panel — used to defer disruptive list re-renders during polling. - function userIsComposing() { - if (!el) return false; - const active = document.activeElement; - if (active && el.contains(active) && active.tagName === 'TEXTAREA') return true; - return Array.from(el.querySelectorAll('textarea')) - .some((t) => (t.value || '').trim().length > 0); - } - - // Cheap change-detector for the rendered comment set + AI task statuses, - // so polling only re-renders when something actually changed. - function listSignature(comments) { - const base = comments.map((c) => c.id + ':' + (c.created_at || '')).join('|'); - const ai = Object.keys(aiTasksByComment).sort() - .map((k) => k + '=' + aiTasksByComment[k].status).join('|'); - return comments.length + '#' + base + '#' + (isAgentWorking() ? 'W' : '') + '#' + ai; - } - - // Status chip shown atop an AI-Agent task thread. - function agentChipHtml(t) { - let cls = 'oc-agent-chip'; - let icon = 'bi-robot'; - let label = 'AI Agent'; - if (t.status === 'done') { - cls += ' oc-agent-done'; icon = 'bi-check-circle-fill'; label = 'AI Agent · done'; - } else if (t.status === 'cancelled') { - cls += ' oc-agent-done'; icon = 'bi-slash-circle'; label = 'AI Agent · cancelled'; - } else if (t.status === 'in_progress' && isAgentWorking()) { - cls += ' oc-agent-working'; icon = 'bi-robot'; label = 'AI Agent · working…'; - } else if (t.status === 'in_progress') { - cls += ' oc-agent-waiting'; icon = 'bi-hourglass-split'; - label = 'AI Agent · waiting for your reply'; - } else if (t.status === 'open') { - cls += ' oc-agent-queued'; icon = 'bi-clock'; label = 'AI Agent · queued'; - } - return '
    ' + - esc(label) + '
    '; - } - - // Prominent, always-visible answer box on a parked AI-Agent thread. A reply - // here resumes the agent (see CommentService._maybe_resume_agent). - function agentAnswerHtml(rootId, t) { - if (!(t.status === 'in_progress' && !isAgentWorking())) return ''; - return '
    ' + - '
    ' + - 'Answer the AI Agent
    ' + - '' + - '
    ' + - '' + - '
    '; - } - - function renderList(list, comments) { - if (!comments.length) { - list.innerHTML = - '
    ' + - '' + - 'No comments yet. Start the discussion.
    '; - return; - } - // Build a parent -> replies map; root comments keep document order. - const roots = []; - const replies = {}; - comments.forEach((c) => { - if (c.parent_id) { - (replies[c.parent_id] = replies[c.parent_id] || []).push(c); - } else { - roots.push(c); - } - }); - list.innerHTML = roots.map((r) => threadHtml(r, replies[r.id] || [])).join(''); - bindThreadActions(list); - list.scrollTop = list.scrollHeight; - } - - function threadHtml(root, replies) { - const replyHtml = replies.map((r) => bubble(r, true)).join(''); - const resolvedCls = root.resolved ? ' oc-resolved' : ''; - const aiTask = aiTasksByComment[root.id]; - const aiCls = aiTask ? ' oc-thread-agent' : ''; - return '
    ' + - (aiTask ? agentChipHtml(aiTask) : '') + - bubble(root, false) + - '
    ' + replyHtml + '
    ' + - (aiTask ? agentAnswerHtml(root.id, aiTask) : '') + - '
    ' + - '' + - '' + - '' + - '
    ' + - '' + - '' + - '
    '; - } - - function bubble(c, isReply) { - const actor = c.author || 'unknown'; - const initials = actor.replace(/@.*/, '').slice(0, 2).toUpperCase(); - const parsed = parseBody(c.body); - return '
    ' + - '
    ' + esc(initials) + '
    ' + - '
    ' + - '
    ' + - '' + esc(actor) + '' + - '' + formatTime(c.created_at) + '' + - (c.resolved && !isReply ? 'Resolved' : '') + - '
    ' + - '
    ' + renderMarkdown(parsed.text) + '
    ' + - tagsHtml(parsed.tags) + - '
    '; - } - - function bindThreadActions(list) { - list.querySelectorAll('button[data-reply]').forEach((btn) => { - btn.addEventListener('click', () => toggleReply(btn.dataset.reply)); - }); - list.querySelectorAll('button[data-resolve]').forEach((btn) => { - btn.addEventListener('click', () => { - resolveThread(btn.dataset.resolve, btn.dataset.resolved !== '1'); - }); - }); - list.querySelectorAll('button[data-task]').forEach((btn) => { - btn.addEventListener('click', () => toggleTask(btn.dataset.task)); - }); - // Answering a parked AI-Agent thread: a reply here resumes the agent. - list.querySelectorAll('button[data-agent-send]').forEach((btn) => { - btn.addEventListener('click', () => { - const box = btn.closest('[data-agent-answer]'); - const ta = box ? box.querySelector('textarea') : null; - const text = ta ? (ta.value || '').trim() : ''; - postComment(text, btn.dataset.agentSend, ta, box) - .then(() => ensureAgentTracking()); - }); - }); - } - - function toggleReply(rootId) { - const box = el.querySelector('[data-reply-box="' + cssEsc(rootId) + '"]'); - if (!box) return; - if (box.style.display !== 'none') { box.style.display = 'none'; return; } - box.style.display = ''; - box.innerHTML = - '' + - '
    ' + - '
    '; - const ta = box.querySelector('textarea'); - box.querySelector('button').addEventListener('click', () => { - postComment((ta.value || '').trim(), rootId, ta, box); - }); - ta.focus(); - } - - // Build the inner markup of a task-creation form. Shared by the - // per-comment task box and the standalone "New task" box in the header. - function taskFormHtml(heading, withCancel) { - const members = membersCache[ctx.folder + '/' + ctx.version] || []; - const opts = members.map((m) => { - const label = m.principal_type === 'agent' - ? '\uD83E\uDD16 ' + esc(m.display_name || 'AI Agent') + ' (auto)' - : esc(m.display_name || m.principal) + - (m.principal === currentUser ? ' (me)' : '') + - ' (' + esc(m.role) + ')'; - return ''; - }).join(''); - const cancel = withCancel - ? '' - : ''; - return '
    ' + - '
    ' + - esc(heading) + '
    ' + - '' + - '
    ' + - '' + - '' + - '
    ' + - '' + - '' + - '
    ' + cancel + - '' + - '
    '; - } - - function wireTaskForm(box, commentId) { - box.querySelector('[data-tk-me]').addEventListener('click', () => { - assignToMe(box); - }); - box.querySelector('[data-tk-create]').addEventListener('click', () => { - createTask(commentId, box); - }); - const cancel = box.querySelector('[data-tk-cancel]'); - if (cancel) cancel.addEventListener('click', () => hideTaskBox(box)); - const sel = box.querySelector('[data-tk-assignee]'); - if (sel) sel.addEventListener('change', () => syncDueVisibility(box)); - syncDueVisibility(box); - } - - // The AI Agent runs the task immediately, so a due date is meaningless — - // hide (and clear) it whenever the AI Agent is the selected assignee. - function syncDueVisibility(box) { - const sel = box.querySelector('[data-tk-assignee]'); - const due = box.querySelector('[data-tk-due]'); - if (!sel || !due) return; - const isAgent = sel.value === AI_AGENT_PRINCIPAL; - due.classList.toggle('d-none', isAgent); - if (isAgent) due.value = ''; - } - - function hideTaskBox(box) { - box.innerHTML = ''; - box.style.display = 'none'; - box.classList.add('d-none'); - } - - function toggleTask(rootId) { - const box = el.querySelector('[data-task-box="' + cssEsc(rootId) + '"]'); - if (!box) return; - if (box.style.display !== 'none') { box.style.display = 'none'; return; } - box.classList.remove('d-none'); - box.style.display = ''; - box.innerHTML = taskFormHtml('New task from this comment', false); - wireTaskForm(box, rootId); - } - - // Standalone task creation (not tied to a comment), opened from the - // panel header. Lets the user assign a task to a teammate or the AI Agent. - async function openNewTask() { - const box = el.querySelector('[data-oc-newtask]'); - if (!box) return; - if (!box.classList.contains('d-none')) { hideTaskBox(box); return; } - await loadMembers(); - box.classList.remove('d-none'); - box.style.display = ''; - box.innerHTML = taskFormHtml('New task', true); - wireTaskForm(box, null); - } - - // Select the current user in the assignee picker, adding an option for - // them when they are not already in the roster. - async function assignToMe(box) { - const me = await loadCurrentUser(); - if (!me) { notify('Could not determine the current user', 'warning'); return; } - const sel = box.querySelector('[data-tk-assignee]'); - if (!sel) return; - const exists = Array.from(sel.options).some((o) => o.value === me); - if (!exists) { - const opt = document.createElement('option'); - opt.value = me; - opt.textContent = me + ' (me)'; - sel.appendChild(opt); - } - sel.value = me; - syncDueVisibility(box); - } - - async function postComment(body, parentId, ta, scope) { - if (!body) { notify('Write something first', 'warning'); return; } - try { - const resp = await fetch( - '/comments/' + encodeURIComponent(ctx.folder) + '/' + - encodeURIComponent(ctx.version), - { - method: 'POST', - credentials: 'same-origin', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - body: body, - parent_id: parentId || null, - }), - } - ); - const data = await resp.json(); - if (!resp.ok || !data.success) { - notify(data.message || 'Failed to post comment', 'error'); - return; - } - if (ta) ta.value = ''; - await reload(); - ensureAgentTracking(); - } catch (err) { - notify('Error: ' + err.message, 'error'); - } - } - - async function resolveThread(rootId, resolved) { - try { - const resp = await fetch( - '/comments/' + encodeURIComponent(ctx.folder) + '/' + - encodeURIComponent(ctx.version) + '/' + - encodeURIComponent(rootId) + '/resolve', - { - method: 'POST', - credentials: 'same-origin', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ resolved: resolved }), - } - ); - const data = await resp.json(); - if (!resp.ok || !data.success) { - notify(data.message || 'Failed to update comment', 'error'); - return; - } - await reload(); - } catch (err) { - notify('Error: ' + err.message, 'error'); - } - } - - async function createTask(commentId, box) { - const title = (box.querySelector('[data-tk-title]').value || '').trim(); - const assignee = box.querySelector('[data-tk-assignee]').value || ''; - const due = box.querySelector('[data-tk-due]').value || ''; - if (!title) { notify('Task title is required', 'warning'); return; } - if (!assignee) { notify('Pick an assignee', 'warning'); return; } - try { - const resp = await fetch( - '/comments/' + encodeURIComponent(ctx.folder) + '/' + - encodeURIComponent(ctx.version) + '/tasks', - { - method: 'POST', - credentials: 'same-origin', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - assignee: assignee, - title: title, - due_date: due || null, - comment_id: commentId, - }), - } - ); - const data = await resp.json(); - if (!resp.ok || !data.success) { - notify(data.message || 'Failed to create task', 'error'); - return; - } - if (data.agent_task_id) { - notify('AI Agent started — routing your task to the right agent', 'success'); - if (typeof window.refreshTasks === 'function') { window.refreshTasks(); } - } else { - notify('Task assigned to ' + assignee, 'success'); - } - hideTaskBox(box); - await reload(); - if (data.agent_task_id) ensureAgentTracking(); - } catch (err) { - notify('Error: ' + err.message, 'error'); - } - } - - function formatTime(iso) { - if (!iso) return ''; - const d = new Date(iso); - if (isNaN(d.getTime())) return ''; - return esc(d.toLocaleString()); - } - - function cssEsc(s) { - if (window.CSS && CSS.escape) return CSS.escape(s); - return String(s).replace(/"/g, '\\"'); - } - - // Resolve the loaded domain folder + version once, then cache. Used by - // the editor surfaces (ontology / mapping / graph) which always operate - // on the loaded session domain, so they don't carry folder/version. - let _ctxPromise = null; - function resolveDomainContext() { - if (_ctxPromise) return _ctxPromise; - _ctxPromise = fetch('/domain/version-status', { credentials: 'same-origin' }) - .then((r) => r.json()) - .then((vs) => ({ - folder: vs.domain_folder || '', - version: vs.version || '', - hasRegistry: !!vs.has_registry, - })) - .catch(() => ({ folder: '', version: '', hasRegistry: false })); - return _ctxPromise; - } - - /** - * Build the comment tag vocabulary ({type, ref, label}[]) from an - * ontology config ({ classes, properties }). Shared by every surface - * (ontology designer, mapping, digital twin) so the entity/relationship - * tag picker is built identically everywhere. - */ - function taggableFromOntology(config) { - const cfg = config || {}; - const out = []; - (cfg.classes || []).forEach((c) => out.push({ - type: 'ontology_class', - ref: c.uri || c.name, - label: (c.emoji || '🔷') + ' ' + (c.name || c.uri), - })); - (cfg.properties || []).forEach((p) => out.push({ - type: 'ontology_property', - ref: p.uri || p.name, - label: '🔗 ' + (p.name || p.uri), - })); - return out; - } - - /** - * Open the domain discussion from any editor surface (ontology / mapping - * / graph), auto-resolving the loaded domain + version. Legacy anchor - * arguments are accepted for backward compatibility but ignored — - * discussions are domain-wide. - */ - async function openForSelection() { - const dc = await resolveDomainContext(); - if (!dc.folder || !dc.hasRegistry) { - notify('Save this domain to the registry to start a discussion.', - 'warning'); - return; - } - openThread({ folder: dc.folder, version: dc.version }); - } - - window.OntoComments = { - openThread: openThread, - openForSelection: openForSelection, - taggableFromOntology: taggableFromOntology, - // Split a stored comment body into { text, tags } (strips the - // internal tag marker). Shared with the Domain → Discussions timeline. - parseBody: parseBody, - }; -})(); diff --git a/src/front/static/home/js/home-tasks.js b/src/front/static/home/js/home-tasks.js index 75ac3f6a..4e0a8591 100644 --- a/src/front/static/home/js/home-tasks.js +++ b/src/front/static/home/js/home-tasks.js @@ -22,14 +22,12 @@ credentials: 'same-origin', }); const data = await resp.json(); - const ok = resp.ok && data.success; - const tasks = (ok && data.tasks) ? data.tasks : []; - const assigned = (ok && data.assigned_tasks) ? data.assigned_tasks : []; - if (!tasks.length && !assigned.length) { + const tasks = (resp.ok && data.success && data.tasks) ? data.tasks : []; + if (!tasks.length) { section.style.display = 'none'; return; } - render(container, tasks, assigned); + render(container, tasks); section.style.display = ''; } catch (err) { // Home page must stay usable even if the review API is down. @@ -38,8 +36,7 @@ } } - function render(container, tasks, assigned) { - assigned = assigned || []; + function render(container, tasks) { const rows = tasks.map((t) => { const actions = validateButton(t); return '' + @@ -52,16 +49,13 @@ ''; }).join(''); - const reviewBlock = tasks.length - ? '
    ' + - '' + - '' + - '' + - '' + - '' + rows + '
    DomainVersionStatusApprovalsReview
    ' - : ''; - - container.innerHTML = reviewBlock + assignedBlock(assigned); + container.innerHTML = + '
    ' + + '' + + '' + + '' + + '' + + '' + rows + '
    DomainVersionStatusApprovalsReview
    '; container.querySelectorAll('button[data-validate]').forEach((btn) => { btn.addEventListener('click', () => { @@ -73,58 +67,6 @@ ReviewModals.showComments(btn.dataset.domain, btn.dataset.version); }); }); - container.querySelectorAll('button[data-task-done]').forEach((btn) => { - btn.addEventListener('click', () => completeTask(btn)); - }); - } - - function assignedBlock(assigned) { - if (!assigned.length) return ''; - const rows = assigned.map((t) => - '' + - '' + escapeHtml(t.title) + '' + - '' + escapeHtml(t.folder) + ' v' + escapeHtml(t.version) + '' + - '' + escapeHtml((t.status || 'open').replace('_', ' ')) + '' + - '' + - '' - ).join(''); - return '
    ' + - 'Assigned to me
    ' + - '
    ' + - '' + - '' + - '' + - '' + rows + '
    TaskDomainStatusAction
    '; - } - - async function completeTask(btn) { - const { folder, version, taskId } = btn.dataset; - try { - const resp = await fetch( - '/comments/' + encodeURIComponent(folder) + '/' + - encodeURIComponent(version) + '/tasks/' + - encodeURIComponent(taskId) + '/status', - { - method: 'POST', - credentials: 'same-origin', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ status: 'done' }), - } - ); - const data = await resp.json(); - if (!resp.ok || !data.success) { - showNotification(data.message || 'Failed to update task', 'error'); - return; - } - showNotification('Task completed.', 'success'); - loadTasks(); - } catch (err) { - showNotification('Error: ' + err.message, 'error'); - } } function commentsButton(task) { diff --git a/src/front/static/mapping/js/mapping-entity-modal.js b/src/front/static/mapping/js/mapping-entity-modal.js index 62b13720..50177499 100644 --- a/src/front/static/mapping/js/mapping-entity-modal.js +++ b/src/front/static/mapping/js/mapping-entity-modal.js @@ -274,8 +274,6 @@ function openEntityMappingModal(classUri, className) { setTimeout(() => switchToEntityTab('wizard-tab'), 100); } - injectMappingDiscussButton('addEntityMappingModal', classUri, className); - const modal = new bootstrap.Modal(document.getElementById('addEntityMappingModal')); modal.show(); } diff --git a/src/front/static/mapping/js/mapping-init.js b/src/front/static/mapping/js/mapping-init.js index 0ac562fc..29492bd4 100644 --- a/src/front/static/mapping/js/mapping-init.js +++ b/src/front/static/mapping/js/mapping-init.js @@ -13,27 +13,6 @@ document.body.classList.add('full-width-layout'); // Configure sidebar navigation with callbacks window.SIDEBAR_NAV_MANUAL_INIT = true; -// When an AI Agent finishes a task that edited & saved the ontology, the -// Discussion panel fires `ontobricks:design-updated`. The mapping page derives -// its entity/relationship rows from the ontology, so re-pull the loaded -// ontology into MappingState and redraw the design. -window.addEventListener('ontobricks:design-updated', async function () { - try { - const resp = await fetch('/ontology/get-loaded-ontology', - { credentials: 'same-origin' }); - const result = await resp.json(); - if (result.success && result.ontology && typeof MappingState !== 'undefined') { - MappingState.loadedOntology = result.ontology; - } - if (typeof refreshMappingDesign === 'function') refreshMappingDesign(); - if (typeof updateMappingCompletionStatus === 'function') { - updateMappingCompletionStatus(); - } - } catch (e) { - console.error('[Mapping] design-updated refresh failed', e); - } -}); - // Main initialization function async function initializeMappingPage() { console.log('Mapping Page: Starting initialization...'); diff --git a/src/front/static/mapping/js/mapping-relationship-modal.js b/src/front/static/mapping/js/mapping-relationship-modal.js index 0f2c8fce..ca4f0bea 100644 --- a/src/front/static/mapping/js/mapping-relationship-modal.js +++ b/src/front/static/mapping/js/mapping-relationship-modal.js @@ -395,8 +395,6 @@ function openRelationshipMappingModal(propertyUri, propertyName) { setTimeout(() => switchToRelTab('rel-wizard-tab'), 100); } - injectMappingDiscussButton('addRelationshipMappingModal', propertyUri, propertyName); - const modal = new bootstrap.Modal(document.getElementById('addRelationshipMappingModal')); modal.show(); } diff --git a/src/front/static/mapping/js/mapping-shared.js b/src/front/static/mapping/js/mapping-shared.js index 93bec7c1..d4b6a3e2 100644 --- a/src/front/static/mapping/js/mapping-shared.js +++ b/src/front/static/mapping/js/mapping-shared.js @@ -22,47 +22,6 @@ document.addEventListener('click', () => { document.querySelectorAll('.mapping-dropdown.show').forEach(d => d.classList.remove('show')); }); -/** - * Open the mappings discussion. Anchors to the whole mapping layer - * (mapping/'mapping'); each comment can optionally be tagged with one or - * more ontology classes/relationships via the compose-box tag picker. - */ -function openMappingDiscussion() { - if (!window.OntoComments) return; - const ont = (typeof MappingState !== 'undefined' && MappingState.loadedOntology) - ? MappingState.loadedOntology : {}; - window.OntoComments.openForSelection( - 'mapping', 'mapping', 'Mappings', - window.OntoComments.taggableFromOntology(ont) - ); -} - -/** - * Inject (or refresh) a contextual "Discuss" button into a mapping modal - * header so collaborators can open the domain discussion. ``selectionRef`` - * (the targeted ontology class / property URI) only gates whether the button - * is shown — discussions are domain-wide, so it is not used as an anchor. - */ -function injectMappingDiscussButton(modalId, selectionRef) { - if (!window.OntoComments) return; - const modal = document.getElementById(modalId); - if (!modal || !selectionRef) return; - const header = modal.querySelector('.modal-header'); - if (!header) return; - let btn = header.querySelector('.mapping-discuss-btn'); - if (!btn) { - btn = document.createElement('button'); - btn.type = 'button'; - btn.className = 'btn btn-outline-primary btn-sm mapping-discuss-btn ms-auto me-2'; - btn.title = 'Discuss'; - btn.innerHTML = ''; - const closeBtn = header.querySelector('.btn-close, [data-bs-dismiss="modal"]'); - if (closeBtn) header.insertBefore(btn, closeBtn); - else header.appendChild(btn); - } - btn.onclick = () => window.OntoComments.openForSelection(); -} - // ========================================================================== // SQL WIZARD BASE CLASS (Metadata-based) // Creates a reusable wizard using domain metadata tables diff --git a/src/front/static/ontology/js/ontology-init.js b/src/front/static/ontology/js/ontology-init.js index 7718ec3f..98a39873 100644 --- a/src/front/static/ontology/js/ontology-init.js +++ b/src/front/static/ontology/js/ontology-init.js @@ -79,17 +79,10 @@ document.addEventListener('DOMContentLoaded', function() { }, onSectionChange: function(section) { _initSectionByName(section); - // Re-assert the discuss button: some sections (re)render their - // header on init, which can drop the injected button. The helper - // is idempotent, so repeated passes never duplicate it. - injectOntologyDiscussButtons(); - setTimeout(injectOntologyDiscussButtons, 250); - setTimeout(injectOntologyDiscussButtons, 700); } }); initializeDefaultSection(); - injectOntologyDiscussButtons(); if (initialSection) { const link = document.querySelector(`[data-section="${initialSection}"]`); @@ -115,65 +108,6 @@ document.addEventListener('DOMContentLoaded', function() { } }); -// When an AI Agent finishes a task that edited & saved the ontology, the -// Discussion panel fires `ontobricks:design-updated`. Pull the agent's changes -// into session state and re-render whichever ontology section is active so the -// designer (and every other section) reflects the new model without a manual -// reload. Idempotent and version-guarded (initOntologyDesigner skips reload -// when the fingerprint is unchanged). -window.addEventListener('ontobricks:design-updated', async function () { - try { - if (typeof loadOntologyFromSession === 'function') { - await loadOntologyFromSession(); - } - if (typeof window.refreshOntologyStatus === 'function') { - window.refreshOntologyStatus(); - } - if (typeof SidebarNav !== 'undefined' && - typeof SidebarNav.getActiveSection === 'function') { - _initSectionByName(SidebarNav.getActiveSection()); - } - if (typeof showNotification === 'function') { - showNotification("Ontology refreshed with the AI Agent's changes", 'info', 3000); - } - } catch (e) { - console.error('[Ontology] design-updated refresh failed', e); - } -}); - -/** - * Add a "Discuss" button to every ontology section header (except Import) - * so the ontology discussion can be opened from anywhere. The Model/Designer - * section already carries its own toolbar button, so it is skipped. - */ -function injectOntologyDiscussButtons() { - const headers = document.querySelectorAll('.sidebar-content .section-header'); - headers.forEach(function (header) { - if (header.closest('#import-section')) return; - if (header.querySelector('.onto-discuss-btn') || - header.querySelector('#mapDiscuss')) return; - - const btn = document.createElement('button'); - btn.type = 'button'; - btn.className = 'btn btn-sm btn-outline-primary onto-discuss-btn'; - btn.title = 'Open the ontology discussion'; - btn.innerHTML = ''; - btn.addEventListener('click', function () { - if (typeof openOntologyDiscussion === 'function') openOntologyDiscussion(); - }); - - // Consistent placement across every section: push the title left - // with me-auto and append the discuss button as the last (rightmost) - // element, after any existing actions group. - const first = header.firstElementChild; - if (first) { - first.classList.add('me-auto'); - btn.classList.add('ms-2'); - } - header.appendChild(btn); - }); -} - /** * Initialize the default active section after ensuring data is loaded. */ diff --git a/src/front/static/ontology/js/ontology-map.js b/src/front/static/ontology/js/ontology-map.js index e0f2125f..657152f1 100644 --- a/src/front/static/ontology/js/ontology-map.js +++ b/src/front/static/ontology/js/ontology-map.js @@ -790,11 +790,6 @@ async function initOntologyMap() { const autoIconsBtn = document.getElementById('mapAutoAssignIcons'); if (autoIconsBtn) autoIconsBtn.onclick = () => autoAssignEntityIcons(); - // Discussion button — opens the whole-ontology thread with a picker to - // optionally re-tag the comment to a specific entity/relationship. - const discussBtn = document.getElementById('mapDiscuss'); - if (discussBtn) discussBtn.onclick = () => openOntologyDiscussion(); - // Reset layout button - clears saved positions and re-runs simulation document.getElementById('mapResetLayout')?.addEventListener('click', async () => { // Clear fixed positions @@ -1506,20 +1501,6 @@ const ICONS_TASK_KEY = 'ontobricks_icons_task'; // Module-level guard so the monitor loop is started at most once per task. let _iconsCurrentTaskId = null; -/** - * Open the ontology designer discussion. Anchors to the whole ontology - * diagram (domain/'ontology'); each comment can optionally be tagged with - * one or more classes/relationships via the compose-box tag picker. - */ -function openOntologyDiscussion() { - if (!window.OntoComments) return; - const cfg = (typeof OntologyState !== 'undefined' && OntologyState.config) || {}; - OntoComments.openForSelection( - 'domain', 'ontology', 'Whole ontology diagram', - OntoComments.taggableFromOntology(cfg) - ); -} - /** * Restore button state (used after completion, failure, or resume). */ diff --git a/src/front/static/query/js/query-sigmagraph.js b/src/front/static/query/js/query-sigmagraph.js index c94814e1..6a9bc0d5 100644 --- a/src/front/static/query/js/query-sigmagraph.js +++ b/src/front/static/query/js/query-sigmagraph.js @@ -1446,12 +1446,6 @@ var SigmaGraph = (function () { html += _sec('bi bi-arrow-left-circle', 'Incoming (' + incomingRels.length + ')', inBody, false); } - var _dNid = esc(nodeId).replace(/'/g, "\\'"); - var _dNlbl = esc(displayLabel).replace(/'/g, "\\'"); - html += '
    ' + - '
    '; - el.innerHTML = html; } @@ -1525,14 +1519,6 @@ var SigmaGraph = (function () { '' + targetIcon + ' ' + esc(targetLabel) + '' + ''; - var _dSrc = esc(source).replace(/'/g, "\\'"); - var _dPred = esc(predicateUri).replace(/'/g, "\\'"); - var _dTgt = esc(target).replace(/'/g, "\\'"); - var _dPlbl = esc(predicateLabel).replace(/'/g, "\\'"); - html += '
    ' + - '
    '; - el.innerHTML = html; } @@ -2365,24 +2351,6 @@ var SigmaGraph = (function () { } }, - // Open the contextual discussion thread anchored to a graph node - // (subject URI) or edge (source|predicate|target). Auto-resolves - // the loaded domain + version via OntoComments. - discussNode: function (nodeId, label) { - if (window.OntoComments) { - window.OntoComments.openForSelection('graph_node', nodeId, label || nodeId); - } - }, - - discussEdge: function (source, predicate, target, label) { - if (window.OntoComments) { - window.OntoComments.openForSelection( - 'graph_edge', source + '|' + predicate + '|' + target, - label || predicate - ); - } - }, - focusEntityByUri: async function (uri) { if (!uri) return false; diff --git a/src/front/static/query/js/query.js b/src/front/static/query/js/query.js index fc370ce3..d6bbc54b 100644 --- a/src/front/static/query/js/query.js +++ b/src/front/static/query/js/query.js @@ -60,38 +60,6 @@ let taxonomyIcons = {}; // Track all relationship types for filtering let allRelationshipTypes = new Set(); -// ===================================================== -// DISCUSSION -// ===================================================== - -// Cache the ontology-derived tag vocabulary for the Digital Twin discussion. -let _twinTaggable = null; - -/** - * Open the Digital Twin discussion. Anchors to the whole twin - * (domain/'digital-twin'); each comment can optionally be tagged with one or - * more ontology classes/relationships via the compose-box tag picker. The tag - * vocabulary is lazily fetched from the loaded ontology and cached. - */ -async function openTwinDiscussion() { - if (!window.OntoComments) return; - if (_twinTaggable === null) { - _twinTaggable = []; - try { - const resp = await fetch('/ontology/load', { credentials: 'same-origin' }); - const data = await resp.json(); - const cfg = (data && data.success && data.config) ? data.config : {}; - _twinTaggable = window.OntoComments.taggableFromOntology(cfg); - } catch (e) { - console.log('Twin discussion: could not load ontology tags:', e.message); - } - } - window.OntoComments.openForSelection( - 'domain', 'digital-twin', 'Digital Twin', _twinTaggable - ); -} -window.openTwinDiscussion = openTwinDiscussion; - // ===================================================== // INITIALIZATION // ===================================================== diff --git a/src/front/static/registry/js/registry-my-tasks.js b/src/front/static/registry/js/registry-my-tasks.js index 1a993740..04ff01df 100644 --- a/src/front/static/registry/js/registry-my-tasks.js +++ b/src/front/static/registry/js/registry-my-tasks.js @@ -53,7 +53,7 @@ ''; return; } - render(data.tasks || [], data.assigned_tasks || []); + render(data.tasks || []); loaded = true; } catch (err) { console.error('loadTasks error:', err); @@ -64,12 +64,11 @@ } } - function render(tasks, assignedTasks) { + function render(tasks) { const container = document.getElementById('myTasksContainer'); if (!container) return; - assignedTasks = assignedTasks || []; - if (!tasks.length && !assignedTasks.length) { + if (!tasks.length) { container.innerHTML = '
    ' + '' + @@ -78,15 +77,6 @@ return; } - container.innerHTML = assignedTasksHtml(assignedTasks) + - reviewTasksHtml(tasks); - - bindReviewActions(container); - bindAssignedActions(container); - } - - function reviewTasksHtml(tasks) { - if (!tasks.length) return ''; const rows = tasks.map((t) => { const approvals = '' + t.approvals + ' / ' + t.required + ''; @@ -103,67 +93,15 @@ ''; }).join(''); - return '
    ' + - 'Review worklist
    ' + - '
    ' + + container.innerHTML = + '
    ' + '' + '' + '' + '' + '' + '' + rows + '
    DomainVersionStatusApprovalsLast activityYour action
    '; - } - - function assignedTasksHtml(tasks) { - if (!tasks.length) return ''; - const rows = tasks.map((t) => { - return '' + - '' + escapeHtml(t.title) + '' + - '' + escapeHtml(t.folder) + ' v' + escapeHtml(t.version) + '' + - '' + escapeHtml(t.created_by) + '' + - '' + taskStatusBadge(t.status) + '' + - '' + (t.due_date ? escapeHtml(t.due_date) : '') + '' + - '' + taskActions(t) + '' + - ''; - }).join(''); - - return '
    ' + - 'Assigned to me
    ' + - '
    ' + - '' + - '' + - '' + - '' + - '' + rows + '
    TaskDomainFromStatusDueAction
    '; - } - - function taskActions(t) { - const start = t.status === 'open' - ? '' - : ''; - const done = ''; - return start + ' ' + done; - } - function taskStatusBadge(status) { - const map = { - open: 'bg-secondary-subtle text-dark border', - in_progress: 'bg-info-subtle text-dark border-info', - done: 'bg-success-subtle text-dark border-success', - cancelled: 'bg-light text-muted border', - }; - const cls = map[status] || map.open; - const label = (status || 'open').replace('_', ' '); - return '' + escapeHtml(label) + ''; - } - - function bindReviewActions(container) { container.querySelectorAll('button[data-action]').forEach((btn) => { btn.addEventListener('click', onAction); }); @@ -174,40 +112,6 @@ }); } - function bindAssignedActions(container) { - container.querySelectorAll('button[data-task-status]').forEach((btn) => { - btn.addEventListener('click', () => onTaskStatus(btn)); - }); - } - - async function onTaskStatus(btn) { - const { folder, version, taskId } = btn.dataset; - const status = btn.dataset.taskStatus; - try { - const resp = await fetch( - '/comments/' + encodeURIComponent(folder) + '/' + - encodeURIComponent(version) + '/tasks/' + - encodeURIComponent(taskId) + '/status', - { - method: 'POST', - credentials: 'same-origin', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ status: status }), - } - ); - const data = await resp.json(); - if (!resp.ok || !data.success) { - showNotification(data.message || 'Failed to update task', 'error'); - return; - } - showNotification('Task marked ' + status.replace('_', ' ') + '.', 'success'); - loaded = false; - loadTasks(); - } catch (err) { - showNotification('Error: ' + err.message, 'error'); - } - } - function commentsButton(task) { return ' - -
    -
    - - -
    - -
    - - -
    -
    - - Loading discussions... -
    -
    - diff --git a/src/front/templates/partials/domain/_domain_mytasks.html b/src/front/templates/partials/domain/_domain_mytasks.html deleted file mode 100644 index cde16a8f..00000000 --- a/src/front/templates/partials/domain/_domain_mytasks.html +++ /dev/null @@ -1,22 +0,0 @@ -
    -
    -
    -

    My Tasks

    -

    - Tasks assigned to you and domain versions waiting on your - review — act on them inline. -

    -
    - -
    - -
    -
    - - Loading your tasks... -
    -
    -
    diff --git a/src/front/templates/partials/dtwin/_query_chat.html b/src/front/templates/partials/dtwin/_query_chat.html index 116be4a3..9593912c 100644 --- a/src/front/templates/partials/dtwin/_query_chat.html +++ b/src/front/templates/partials/dtwin/_query_chat.html @@ -14,14 +14,10 @@

    Graph Chat

    -
    +
    -
    diff --git a/src/front/templates/partials/dtwin/_query_cohorts.html b/src/front/templates/partials/dtwin/_query_cohorts.html index b21f0347..244864b5 100644 --- a/src/front/templates/partials/dtwin/_query_cohorts.html +++ b/src/front/templates/partials/dtwin/_query_cohorts.html @@ -37,10 +37,6 @@

    Cohort Discovery

    onclick="CohortModule.openMaterializeModal()" disabled> Materialise - diff --git a/src/front/templates/partials/dtwin/_query_dataquality.html b/src/front/templates/partials/dtwin/_query_dataquality.html index 23a2c287..1a890e39 100644 --- a/src/front/templates/partials/dtwin/_query_dataquality.html +++ b/src/front/templates/partials/dtwin/_query_dataquality.html @@ -26,10 +26,6 @@

    Data Quality

    -
    diff --git a/src/front/templates/partials/dtwin/_query_graphql.html b/src/front/templates/partials/dtwin/_query_graphql.html index 3af4c586..e6f8e3da 100644 --- a/src/front/templates/partials/dtwin/_query_graphql.html +++ b/src/front/templates/partials/dtwin/_query_graphql.html @@ -24,10 +24,6 @@

    GraphQL Playground New tab -

    diff --git a/src/front/templates/partials/dtwin/_query_insights.html b/src/front/templates/partials/dtwin/_query_insights.html index d84ff0d2..4a747427 100644 --- a/src/front/templates/partials/dtwin/_query_insights.html +++ b/src/front/templates/partials/dtwin/_query_insights.html @@ -8,15 +8,11 @@

    Digital Twin Insights

    Content overview of the triple store: entity types and relationships

    -
    +
    -
    diff --git a/src/front/templates/partials/dtwin/_query_reasoning.html b/src/front/templates/partials/dtwin/_query_reasoning.html index 378066d4..e92d6f0d 100644 --- a/src/front/templates/partials/dtwin/_query_reasoning.html +++ b/src/front/templates/partials/dtwin/_query_reasoning.html @@ -1,7 +1,7 @@
    -
    +

    Inference

    OWL 2 RL inference, SWRL rules, graph reasoning, and business rules
    Domain: {{ domain_name }} v{{ current_version }} Draft @@ -10,13 +10,9 @@

    Inference

    - -
    diff --git a/src/front/templates/partials/dtwin/_query_sigmagraph.html b/src/front/templates/partials/dtwin/_query_sigmagraph.html index bbe7c476..53457141 100644 --- a/src/front/templates/partials/dtwin/_query_sigmagraph.html +++ b/src/front/templates/partials/dtwin/_query_sigmagraph.html @@ -58,10 +58,6 @@

    Knowledge Graph

    -
    diff --git a/src/front/templates/partials/mapping/_mapping_autoassign.html b/src/front/templates/partials/mapping/_mapping_autoassign.html index 89552a5d..4eac28c5 100644 --- a/src/front/templates/partials/mapping/_mapping_autoassign.html +++ b/src/front/templates/partials/mapping/_mapping_autoassign.html @@ -1,7 +1,7 @@
    -
    +

    Batch Auto-Map

    Automatically generate SQL queries and assign columns using AI

    @@ -16,10 +16,6 @@

    Batch Auto-Map

    Cancel
    -
    diff --git a/src/front/templates/partials/mapping/_mapping_design.html b/src/front/templates/partials/mapping/_mapping_design.html index a632be5b..63bb257d 100644 --- a/src/front/templates/partials/mapping/_mapping_design.html +++ b/src/front/templates/partials/mapping/_mapping_design.html @@ -3,7 +3,7 @@
    -
    +

    Visual Mapping Designer

    Click on an entity or relationship to configure its data mapping.

    @@ -42,10 +42,6 @@

    Visual Mapping Designer -

    diff --git a/src/front/templates/partials/mapping/_mapping_diagnostics.html b/src/front/templates/partials/mapping/_mapping_diagnostics.html index f56f8d44..e8bb216c 100644 --- a/src/front/templates/partials/mapping/_mapping_diagnostics.html +++ b/src/front/templates/partials/mapping/_mapping_diagnostics.html @@ -3,17 +3,13 @@
    -
    +

    Mapping Diagnostics

    Validate entity and relationship mappings before building the Digital Twin

    - -
    diff --git a/src/front/templates/partials/mapping/_mapping_import.html b/src/front/templates/partials/mapping/_mapping_import.html index 2df6cd93..89f6bd6a 100644 --- a/src/front/templates/partials/mapping/_mapping_import.html +++ b/src/front/templates/partials/mapping/_mapping_import.html @@ -2,14 +2,10 @@
    -
    +

    Import R2RML

    Import an existing R2RML mapping file to populate entity and relationship mappings.

    -
    diff --git a/src/front/templates/partials/mapping/_mapping_information.html b/src/front/templates/partials/mapping/_mapping_information.html index 72b7eb53..736a9e0f 100644 --- a/src/front/templates/partials/mapping/_mapping_information.html +++ b/src/front/templates/partials/mapping/_mapping_information.html @@ -32,17 +32,13 @@
    -
    +

    Mapping Summary

    Overview of mappings between ontology and data sources

    - -
    diff --git a/src/front/templates/partials/mapping/_mapping_manual.html b/src/front/templates/partials/mapping/_mapping_manual.html index 266c2518..7fdb635c 100644 --- a/src/front/templates/partials/mapping/_mapping_manual.html +++ b/src/front/templates/partials/mapping/_mapping_manual.html @@ -2,7 +2,7 @@
    -
    +

    Manual Mapping

    Manually configure SQL queries and column mappings for each entity and relationship

    @@ -18,10 +18,6 @@

    Manual Mapping

    -
    diff --git a/src/front/templates/partials/mapping/_mapping_r2rml.html b/src/front/templates/partials/mapping/_mapping_r2rml.html index c4d16923..528c689f 100644 --- a/src/front/templates/partials/mapping/_mapping_r2rml.html +++ b/src/front/templates/partials/mapping/_mapping_r2rml.html @@ -30,7 +30,7 @@
    -
    +

    R2RML Content (Turtle Format)

    Generated R2RML mapping from current mappings

    @@ -44,10 +44,6 @@

    R2RML Content (Turtle Form -

    diff --git a/src/front/templates/partials/mapping/_mapping_sparksql.html b/src/front/templates/partials/mapping/_mapping_sparksql.html index c64414f2..f2d9ec0c 100644 --- a/src/front/templates/partials/mapping/_mapping_sparksql.html +++ b/src/front/templates/partials/mapping/_mapping_sparksql.html @@ -29,7 +29,7 @@
    -
    +

    Generated Spark SQL

    View the Spark SQL generated from your SPARQL queries

    @@ -40,10 +40,6 @@

    Generated Spark SQL -

    diff --git a/src/front/templates/partials/ontology/_ontology_business_rules.html b/src/front/templates/partials/ontology/_ontology_business_rules.html index c56a844d..0c02e107 100644 --- a/src/front/templates/partials/ontology/_ontology_business_rules.html +++ b/src/front/templates/partials/ontology/_ontology_business_rules.html @@ -2,11 +2,11 @@
    -
    +

    Business Rules

    Define inference and business rules across multiple rule paradigms

    -
    +
    -
    diff --git a/src/front/templates/partials/ontology/_ontology_cohorts.html b/src/front/templates/partials/ontology/_ontology_cohorts.html index eff15096..b3817223 100644 --- a/src/front/templates/partials/ontology/_ontology_cohorts.html +++ b/src/front/templates/partials/ontology/_ontology_cohorts.html @@ -26,10 +26,6 @@

    Cohorts

    onclick="CohortModule.save()"> Save rule -
    diff --git a/src/front/templates/partials/ontology/_ontology_dataquality.html b/src/front/templates/partials/ontology/_ontology_dataquality.html index 025bcbe9..3c47f8cd 100644 --- a/src/front/templates/partials/ontology/_ontology_dataquality.html +++ b/src/front/templates/partials/ontology/_ontology_dataquality.html @@ -2,11 +2,11 @@
    -
    +

    Data Quality

    Define SHACL-based data quality rules across six dimensions

    -
    +
    @@ -22,10 +22,6 @@

    Data Quality

    SHACL
    -
    diff --git a/src/front/templates/partials/ontology/_ontology_design.html b/src/front/templates/partials/ontology/_ontology_design.html index 7673bb35..70e29b0d 100644 --- a/src/front/templates/partials/ontology/_ontology_design.html +++ b/src/front/templates/partials/ontology/_ontology_design.html @@ -1,7 +1,7 @@
    -
    +

    Visual Ontology Designer - Business Views

    View your ontology visually. Click "Edit" to modify entities and relationships.

    @@ -46,10 +46,6 @@

    Visual Ontology Designer - Create Group

    -
    diff --git a/src/front/templates/partials/ontology/_ontology_entities.html b/src/front/templates/partials/ontology/_ontology_entities.html index 56f1115a..c7ae1e5b 100644 --- a/src/front/templates/partials/ontology/_ontology_entities.html +++ b/src/front/templates/partials/ontology/_ontology_entities.html @@ -1,7 +1,7 @@
    -
    +

    Classes (Hierarchy)

    View the class inheritance hierarchy and manage entities

    @@ -17,10 +17,6 @@

    Classes (Hierarchy)

    -
    diff --git a/src/front/templates/partials/ontology/_ontology_import.html b/src/front/templates/partials/ontology/_ontology_import.html index 69666223..9af5e543 100644 --- a/src/front/templates/partials/ontology/_ontology_import.html +++ b/src/front/templates/partials/ontology/_ontology_import.html @@ -2,14 +2,10 @@
    -
    +

    Import

    Import ontologies from local files or load industry-standard ontologies.

    -
    diff --git a/src/front/templates/partials/ontology/_ontology_map.html b/src/front/templates/partials/ontology/_ontology_map.html index 4eba18a4..2fa8e76d 100644 --- a/src/front/templates/partials/ontology/_ontology_map.html +++ b/src/front/templates/partials/ontology/_ontology_map.html @@ -23,10 +23,6 @@

    Ontology Designer

    -
    -
    diff --git a/src/front/templates/partials/ontology/_ontology_relationships.html b/src/front/templates/partials/ontology/_ontology_relationships.html index acf73a4a..7d2bba7e 100644 --- a/src/front/templates/partials/ontology/_ontology_relationships.html +++ b/src/front/templates/partials/ontology/_ontology_relationships.html @@ -1,17 +1,13 @@
    -
    +

    Relationships (Properties)

    Define how entities relate to each other

    - -
    diff --git a/src/front/templates/partials/ontology/_ontology_wizard.html b/src/front/templates/partials/ontology/_ontology_wizard.html index 3db3cc60..eb642433 100644 --- a/src/front/templates/partials/ontology/_ontology_wizard.html +++ b/src/front/templates/partials/ontology/_ontology_wizard.html @@ -2,17 +2,13 @@
    -
    +

    Generate Ontology

    Auto-generate an ontology from your data sources using AI

    - -
    diff --git a/src/front/templates/partials/ontology/_pitfalls.html b/src/front/templates/partials/ontology/_pitfalls.html index dd25d85e..13b3cbbf 100644 --- a/src/front/templates/partials/ontology/_pitfalls.html +++ b/src/front/templates/partials/ontology/_pitfalls.html @@ -23,10 +23,6 @@

    Pitfalls

    -
    diff --git a/tests/back/core/digitaltwin/test_build_pipeline_units.py b/tests/back/core/digitaltwin/test_build_pipeline_units.py index 8aeed9a7..d0e9faec 100644 --- a/tests/back/core/digitaltwin/test_build_pipeline_units.py +++ b/tests/back/core/digitaltwin/test_build_pipeline_units.py @@ -20,13 +20,11 @@ import time from types import SimpleNamespace from typing import Any -from unittest.mock import MagicMock, patch +from unittest.mock import MagicMock import pytest -from back.core.errors import InfrastructureError from back.objects.digitaltwin._build_pipeline import _BuildPipeline -from back.objects.registry.RegistryService import RegistryService def _make_pipeline(**overrides: Any) -> _BuildPipeline: @@ -177,93 +175,3 @@ def test_same_phase_overwrites(self) -> None: pipe._log_phase("apply", now - 0.1) second = pipe.phase_times["apply"] assert second < first # The retry was faster than the first attempt. - - -# --- _persist_last_build ------------------------------------------------- - - -_TS = "2026-06-19T09:00:00+00:00" - - -@pytest.mark.unit -class TestPersistLastBuild: - """The interactive/API build must stamp ``last_build`` on the registry - version record (the scheduler does this already); otherwise the Submit - gate reads an empty ``info.last_build`` and stays blocked.""" - - def _pipeline(self, **overrides: Any) -> _BuildPipeline: - domain = SimpleNamespace( - info={"name": "sales"}, - uc_domain_folder="sales", - current_version="1", - last_build="", - ) - return _make_pipeline( - domain=domain, - domain_snap=SimpleNamespace(current_version="1"), - **overrides, - ) - - def test_stamps_registry_and_session(self) -> None: - svc = MagicMock() - svc.update_last_build.return_value = (True, "") - pipe = self._pipeline() - with patch.object(RegistryService, "from_context", return_value=svc): - pipe._persist_last_build(_TS) - svc.update_last_build.assert_called_once_with("sales", "1", _TS) - assert pipe.domain.last_build == _TS - - def test_uses_snapshot_version_when_present(self) -> None: - svc = MagicMock() - svc.update_last_build.return_value = (True, "") - pipe = _make_pipeline( - domain=SimpleNamespace( - info={"name": "sales"}, - uc_domain_folder="sales", - current_version="3", - last_build="", - ), - domain_snap=SimpleNamespace(current_version="2"), - ) - with patch.object(RegistryService, "from_context", return_value=svc): - pipe._persist_last_build(_TS) - # Snapshot wins over the live session version. - svc.update_last_build.assert_called_once_with("sales", "2", _TS) - - def test_is_non_fatal_when_registry_raises(self) -> None: - pipe = self._pipeline() - with patch.object( - RegistryService, "from_context", side_effect=RuntimeError("registry down") - ): - # Must not propagate — a healthy build is never failed by a - # best-effort stamp. - pipe._persist_last_build(_TS) - - -# --- _count_view_triples ------------------------------------------------- - - -@pytest.mark.unit -class TestCountViewTriples: - def test_returns_count_on_success(self) -> None: - pipe = _make_pipeline() - pipe.source_client = MagicMock() - pipe.source_client.execute_query.return_value = [{"cnt": 5}] - assert pipe._count_view_triples() == 5 - - def test_zero_for_genuinely_empty_view(self) -> None: - pipe = _make_pipeline() - pipe.source_client = MagicMock() - pipe.source_client.execute_query.return_value = [{"cnt": 0}] - assert pipe._count_view_triples() == 0 - - def test_raises_on_count_failure(self) -> None: - """A failed count (view missing / transient error) must surface as - an error, not be coerced to a healthy zero-triple build.""" - pipe = _make_pipeline() - pipe.source_client = MagicMock() - pipe.source_client.execute_query.side_effect = RuntimeError( - "[TABLE_OR_VIEW_NOT_FOUND] cannot be found" - ) - with pytest.raises(InfrastructureError): - pipe._count_view_triples() diff --git a/tests/units/agents/test_agent_task_planner.py b/tests/units/agents/test_agent_task_planner.py deleted file mode 100644 index ce9621c0..00000000 --- a/tests/units/agents/test_agent_task_planner.py +++ /dev/null @@ -1,67 +0,0 @@ -"""Unit tests for the task-planner agent (ready vs. ask decision).""" -from __future__ import annotations - -from unittest.mock import patch - -from agents.agent_task_planner import PlanResult, run_agent -from agents.registry import get_agent - - -def _spec(): - return get_agent("ontology_assistant") - - -def _llm(content: str): - return {"choices": [{"message": {"content": content}}], "usage": {}} - - -def test_first_turn_asks_when_no_answers(): - with patch( - "agents.agent_task_planner.engine.call_serving_endpoint", - return_value=_llm('{"ready": false, "message": "Plan: remove Person? Confirm scope."}'), - ): - res = run_agent( - "h", "t", "ep", - task_title="Is Person needed?", - task_description="", - agent=_spec(), - history=[], - ) - assert isinstance(res, PlanResult) - assert res.success is True - assert res.ready is False - assert "Plan" in res.message - - -def test_ready_when_user_approved(): - history = [ - {"role": "assistant", "text": "Shall I remove Person?"}, - {"role": "user", "text": "yes go ahead"}, - ] - with patch( - "agents.agent_task_planner.engine.call_serving_endpoint", - return_value=_llm('{"ready": true, "message": "Running now."}'), - ): - res = run_agent( - "h", "t", "ep", - task_title="Is Person needed?", - task_description="", - agent=_spec(), - history=history, - ) - assert res.success is True - assert res.ready is True - - -def test_unparseable_response_degrades_to_ask(): - with patch( - "agents.agent_task_planner.engine.call_serving_endpoint", - return_value=_llm("not json at all"), - ): - res = run_agent( - "h", "t", "ep", - task_title="x", task_description="", agent=_spec(), history=[], - ) - # Degrade safe: never auto-run on a parse failure. - assert res.ready is False - assert res.error diff --git a/tests/units/agents/test_agent_task_router.py b/tests/units/agents/test_agent_task_router.py deleted file mode 100644 index 4f164d38..00000000 --- a/tests/units/agents/test_agent_task_router.py +++ /dev/null @@ -1,132 +0,0 @@ -"""Tests for the Task Router agent + the dispatchable-agent registry. - -The router is a single-shot classifier; we patch ``call_serving_endpoint`` -to return a scripted JSON decision and assert the parsed routing outcome. -""" - -from __future__ import annotations - -from unittest.mock import patch - -import pytest - -from agents import registry -from agents.agent_task_router import engine as router_engine - - -def _llm(content: str) -> dict: - return { - "choices": [{"message": {"content": content}}], - "usage": {"prompt_tokens": 10, "completion_tokens": 5}, - } - - -def _run(content: str): - with patch.object(router_engine, "call_serving_endpoint", return_value=_llm(content)): - return router_engine.run_agent( - "https://host", - "tok", - "ep", - task_title="Generate the ontology from the metadata", - task_description="", - available_agents=registry.list_agents(), - ) - - -# ---------------------------------------------------------------------- -# Registry -# ---------------------------------------------------------------------- - - -def test_registry_lists_agents_with_unique_keys(): - agents = registry.list_agents() - assert agents, "registry must not be empty" - keys = [a.key for a in agents] - assert len(keys) == len(set(keys)), "agent keys must be unique" - assert {"owl_generator", "business_rules_generator", "icon_assign", - "auto_assignment", "ontology_assistant"} <= set(keys) - - -def test_get_agent_known_and_unknown(): - assert registry.get_agent("owl_generator").label == "Ontology Generator" - assert registry.get_agent("does_not_exist") is None - assert registry.get_agent("") is None - - -def test_ontology_assistant_is_the_design_default(): - # Ontology design/modeling tasks ("create/model an entity") must route to the - # Ontology Assistant, so its routing guidance has to advertise design intent. - desc = registry.get_agent("ontology_assistant").description.lower() - assert "design" in desc - assert any(verb in desc for verb in ("create", "model", "add")) - assert "new" in desc - - -def test_router_prompt_treats_ontology_as_domain_model(): - # The router must not bail to "none" on ontology design tasks; the system - # prompt has to steer design/modeling toward an agent and reserve "none" for - # clearly unrelated work. - prompt = router_engine._SYSTEM_PROMPT.lower() - assert "domain model" in prompt - assert "design" in prompt - assert "none" in prompt - - -# ---------------------------------------------------------------------- -# Router decisions -# ---------------------------------------------------------------------- - - -def test_router_picks_valid_agent(): - res = _run('{"agent": "owl_generator", "reasoning": "asks to generate ontology"}') - assert res.success is True - assert res.chosen_agent_key == "owl_generator" - assert res.reasoning - assert res.usage["prompt_tokens"] == 10 - - -def test_router_handles_code_fenced_json(): - res = _run('```json\n{"agent": "icon_assign", "reasoning": "icons"}\n```') - assert res.success is True - assert res.chosen_agent_key == "icon_assign" - - -def test_router_none_decision_is_unsuccessful(): - res = _run('{"agent": "none", "reasoning": "nothing fits"}') - assert res.success is False - assert res.chosen_agent_key == "" - assert "nothing fits" in res.error - - -def test_router_rejects_unknown_agent_key(): - res = _run('{"agent": "make_coffee", "reasoning": "?"}') - assert res.success is False - assert "unknown agent" in res.error.lower() - - -def test_router_unparseable_response(): - res = _run("I think you should run the owl generator.") - assert res.success is False - assert "unparseable" in res.error.lower() - - -def test_router_llm_failure_is_captured(): - with patch.object( - router_engine, "call_serving_endpoint", side_effect=RuntimeError("boom") - ): - res = router_engine.run_agent( - "h", "t", "ep", - task_title="x", - task_description="", - available_agents=registry.list_agents(), - ) - assert res.success is False - assert "boom" in res.error - - -def test_router_no_agents_registered(): - res = router_engine.run_agent( - "h", "t", "ep", task_title="x", task_description="", available_agents=[] - ) - assert res.success is False - assert "No dispatchable agents" in res.error diff --git a/tests/units/api/test_comment_endpoints.py b/tests/units/api/test_comment_endpoints.py deleted file mode 100644 index 130723ea..00000000 --- a/tests/units/api/test_comment_endpoints.py +++ /dev/null @@ -1,194 +0,0 @@ -"""Tests for the internal /comments router request plumbing. - -The handlers resolve the caller's role against the *target* domain and -delegate to ``CommentService`` (covered in -``tests/units/registry/test_comment_service.py``). These tests assert the -request wiring only: role resolution, body parsing, and argument -forwarding. -""" - -import importlib -from types import SimpleNamespace - -from unittest.mock import AsyncMock, MagicMock, patch - -_comments = importlib.import_module("api.routers.internal.comments") - - -def _request(body=None, *, user_role="admin"): - req = MagicMock() - req.json = AsyncMock(return_value=body if body is not None else {}) - req.state = SimpleNamespace(user_role=user_role) - return req - - -async def test_list_comments_forwards_roles(): - with ( - patch.object( - _comments.SettingsService, "resolve_domain_role", - return_value="viewer", - ), - patch.object( - _comments.CommentService, "list_comments", - return_value={"success": True, "comments": []}, - ) as lc, - ): - result = await _comments.list_comments( - "acme", "2", - _request(user_role="app_user"), - session_mgr=MagicMock(), settings=MagicMock(), - ) - assert result["success"] is True - assert "anchor_type" not in lc.call_args.kwargs - assert "anchor_ref" not in lc.call_args.kwargs - assert lc.call_args.kwargs["user_role"] == "app_user" - assert lc.call_args.kwargs["user_domain_role"] == "viewer" - - -async def test_add_comment_forwards_body_fields(): - body = { - "body": "fix this", "parent_id": "42", - } - with ( - patch.object( - _comments.SettingsService, "resolve_domain_role", - return_value="editor", - ), - patch.object( - _comments.CommentService, "add_comment", - return_value={"success": True, "comment": {}}, - ) as ac, - ): - await _comments.add_comment( - "acme", "2", _request(body, user_role="app_user"), - session_mgr=MagicMock(), settings=MagicMock(), - ) - assert "anchor_type" not in ac.call_args.kwargs - assert "anchor_ref" not in ac.call_args.kwargs - assert ac.call_args.kwargs["body"] == "fix this" - assert ac.call_args.kwargs["parent_id"] == "42" - assert ac.call_args.kwargs["user_domain_role"] == "editor" - - -async def test_resolve_comment_forwards_flag(): - with ( - patch.object( - _comments.SettingsService, "resolve_domain_role", - return_value="editor", - ), - patch.object( - _comments.CommentService, "resolve_comment", - return_value={"success": True, "resolved": False}, - ) as rc, - ): - await _comments.resolve_comment( - "acme", "2", "cid-1", - _request({"resolved": False}, user_role="app_user"), - session_mgr=MagicMock(), settings=MagicMock(), - ) - assert rc.call_args.args[5] == "cid-1" - assert rc.call_args.kwargs["resolved"] is False - - -async def test_resolve_comment_defaults_resolved_true(): - with ( - patch.object( - _comments.SettingsService, "resolve_domain_role", - return_value="editor", - ), - patch.object( - _comments.CommentService, "resolve_comment", - return_value={"success": True, "resolved": True}, - ) as rc, - ): - await _comments.resolve_comment( - "acme", "2", "cid-1", _request({}), - session_mgr=MagicMock(), settings=MagicMock(), - ) - assert rc.call_args.kwargs["resolved"] is True - - -async def test_list_tasks_delegates(): - with ( - patch.object( - _comments.SettingsService, "resolve_domain_role", - return_value="viewer", - ), - patch.object( - _comments.CommentService, "list_tasks", - return_value={"success": True, "tasks": []}, - ) as lt, - ): - result = await _comments.list_tasks( - "acme", "2", _request(user_role="app_user"), - session_mgr=MagicMock(), settings=MagicMock(), - ) - assert result["success"] is True - lt.assert_called_once() - - -async def test_list_assignees_delegates_per_domain(): - with ( - patch.object( - _comments.SettingsService, "resolve_domain_role", - return_value="viewer", - ), - patch.object( - _comments.CommentService, "list_assignees", - return_value={"success": True, "members": []}, - ) as la, - ): - result = await _comments.list_assignees( - "acme", "2", _request(user_role="app_user"), - session_mgr=MagicMock(), settings=MagicMock(), - ) - assert result["success"] is True - assert la.call_args.kwargs["user_role"] == "app_user" - assert la.call_args.kwargs["user_domain_role"] == "viewer" - - -async def test_create_task_forwards_fields(): - body = { - "assignee": "bob@acme.com", "title": "Fix it", - "description": "details", "due_date": "2026-07-01", - "comment_id": "9", - } - with ( - patch.object( - _comments.SettingsService, "resolve_domain_role", - return_value="editor", - ), - patch.object( - _comments.CommentService, "create_task", - return_value={"success": True, "task": {}}, - ) as ct, - ): - await _comments.create_task( - "acme", "2", _request(body, user_role="app_user"), - session_mgr=MagicMock(), settings=MagicMock(), - ) - assert ct.call_args.kwargs["assignee"] == "bob@acme.com" - assert ct.call_args.kwargs["title"] == "Fix it" - assert ct.call_args.kwargs["due_date"] == "2026-07-01" - assert ct.call_args.kwargs["comment_id"] == "9" - - -async def test_update_task_status_forwards_fields(): - with ( - patch.object( - _comments.SettingsService, "resolve_domain_role", - return_value="viewer", - ), - patch.object( - _comments.CommentService, "update_task_status", - return_value={"success": True, "status": "done"}, - ) as ut, - ): - result = await _comments.update_task_status( - "acme", "2", "task-1", - _request({"status": "done"}, user_role="app_user"), - session_mgr=MagicMock(), settings=MagicMock(), - ) - assert result["status"] == "done" - assert ut.call_args.args[5] == "task-1" - assert ut.call_args.kwargs["status"] == "done" diff --git a/tests/units/api/test_discussion_panel_assets.py b/tests/units/api/test_discussion_panel_assets.py deleted file mode 100644 index ca73e019..00000000 --- a/tests/units/api/test_discussion_panel_assets.py +++ /dev/null @@ -1,187 +0,0 @@ -""" -Contract tests for the Discussion panel front-end assets. - -The Discussion-panel behaviour added for AI-Agent tasks lives entirely in -static JS/CSS (the repo has no JS unit-test harness). These tests fetch the -served assets through the app's ``/static`` mount and assert the wiring is -present, so an accidental removal/rename of a key hook is caught by CI. - -They are deliberately token-level (not behavioural) — they guard that the -contract between the panel and the rest of the app stays intact: - -* comment bodies are rendered as markdown (via the global ``marked``); -* AI-Agent task status + progress are surfaced in the pane and answerable; -* finishing an AI-Agent task broadcasts ``ontobricks:design-updated`` and the - ontology / mapping pages listen for it to refresh their design. -""" - -from __future__ import annotations - -import pytest - -PANEL_JS = "/static/global/js/comments-panel.js" -ONTOLOGY_INIT_JS = "/static/ontology/js/ontology-init.js" -MAPPING_INIT_JS = "/static/mapping/js/mapping-init.js" -COLLAB_JS = "/static/domain/js/domain-collaboration.js" -REVIEW_CSS = "/static/global/css/review-modals.css" - -# Event name shared between the panel (dispatch) and the pages (listeners). -DESIGN_UPDATED_EVENT = "ontobricks:design-updated" - - -def _static(client, path: str) -> str: - """Fetch a served static asset, asserting it is reachable.""" - resp = client.get(path) - assert resp.status_code == 200, f"GET {path} returned {resp.status_code}" - return resp.text - - -@pytest.fixture -def panel_js(client) -> str: - return _static(client, PANEL_JS) - - -class TestDiscussionMarkdownRendering: - """Comment bodies render markdown (not raw source) via the global marked.""" - - def test_panel_defines_markdown_renderer(self, panel_js): - assert "function renderMarkdown" in panel_js - - def test_renderer_uses_global_marked(self, panel_js): - assert "window.marked" in panel_js - assert "marked.parse" in panel_js - - def test_renderer_has_plaintext_fallback(self, panel_js): - # When marked is unavailable it must still escape + line-break, never - # inject raw text as HTML. - assert "replace(/\\n/g, '
    ')" in panel_js - - def test_bubble_renders_body_as_markdown(self, panel_js): - # The comment bubble pipes the parsed body through the renderer into a - # markdown-styled container rather than escaping it verbatim. - assert "oc-md" in panel_js - assert "renderMarkdown(parsed.text)" in panel_js - - def test_markdown_styles_present(self, client): - css = _static(client, REVIEW_CSS) - assert ".oc-md" in css - - -class TestDiscussionAgentStatus: - """AI-Agent runs surface progress + status inside the pane.""" - - def test_loads_ai_tasks_and_runs(self, panel_js): - assert "function loadAiTasks" in panel_js - assert "function loadAgentRuns" in panel_js - # AI-Agent background runs are the router/plan/run worker. - assert "'task_router'" in panel_js - - def test_progress_strip_rendered(self, panel_js): - assert "function renderAgentStrip" in panel_js - assert "oc-agent-strip" in panel_js - - def test_live_polling_loop(self, panel_js): - assert "function panelPollTick" in panel_js - assert "function startPanelPolling" in panel_js - # Polling must not clobber a half-written reply. - assert "function userIsComposing" in panel_js - - def test_per_thread_status_chip(self, panel_js): - assert "function agentChipHtml" in panel_js - assert "waiting for your reply" in panel_js - - def test_strip_and_chip_styles_present(self, client): - css = _static(client, REVIEW_CSS) - for token in (".oc-agent-strip", "oc-agent-working", "oc-agent-waiting"): - assert token in css, f"missing CSS token {token!r}" - - -class TestAnswerTheAgent: - """A parked AI-Agent thread is answerable from the pane.""" - - def test_answer_box_present(self, panel_js): - assert "function agentAnswerHtml" in panel_js - assert "Answer the AI Agent" in panel_js - - def test_answer_send_wired_to_reply(self, panel_js): - # The send button posts a reply (parent = thread root) which resumes the - # agent server-side, then re-checks tracking. - assert "data-agent-send" in panel_js - assert "ensureAgentTracking" in panel_js - - def test_answer_box_styles_present(self, client): - css = _static(client, REVIEW_CSS) - assert ".oc-agent-answer" in css - - -class TestDesignUpdatedRefresh: - """Finishing an AI-Agent design task refreshes the open pages.""" - - def test_panel_dispatches_event_on_completion(self, panel_js): - assert "function announceAgentCompletions" in panel_js - assert DESIGN_UPDATED_EVENT in panel_js - - def test_ontology_page_listens_and_refreshes(self, client): - js = _static(client, ONTOLOGY_INIT_JS) - assert DESIGN_UPDATED_EVENT in js - # Pulls the agent's saved changes and re-renders the active section. - assert "loadOntologyFromSession" in js - assert "_initSectionByName(SidebarNav.getActiveSection())" in js - - def test_mapping_page_listens_and_refreshes(self, client): - js = _static(client, MAPPING_INIT_JS) - assert DESIGN_UPDATED_EVENT in js - # Re-pulls the loaded ontology and redraws the mapping design. - assert "/ontology/get-loaded-ontology" in js - assert "refreshMappingDesign" in js - - -class TestDiscussionDomainScope: - """The panel is a single domain-wide thread with no tagging UI.""" - - def test_no_anchor_in_requests(self, panel_js): - # Comments are domain-wide: the panel must not send the (removed) - # anchor_type / anchor_ref to the /comments API. - assert "anchor_type" not in panel_js - assert "anchor_ref" not in panel_js - assert "anchorType" not in panel_js - assert "anchorRef" not in panel_js - - def test_no_kind_badge_separator(self, panel_js): - # The header no longer renders the "Class/Domain/Mapping" kind badge - # that separated discussions by selection. - assert "bg-secondary-subtle text-dark border me-1" not in panel_js - - def test_tag_picker_removed_from_compose(self, panel_js): - # No entity/relationship tag widget when writing a comment/reply. - assert "tagWidgetHtml" not in panel_js - assert "data-oc-tag-select" not in panel_js - assert "data-oc-tagbar" not in panel_js - - def test_no_tag_encoding_on_post(self, panel_js): - # New comments post the raw body — tags are no longer embedded. - assert "encodeBody" not in panel_js - assert "collectTags" not in panel_js - - -class TestDiscussionTimelineMarkdown: - """Domain → Discussions timeline renders comment bodies as markdown.""" - - def test_timeline_defines_markdown_renderer(self, client): - js = _static(client, COLLAB_JS) - assert "function renderMarkdown" in js - assert "window.marked" in js - assert "marked.parse" in js - - def test_timeline_entry_renders_markdown(self, client): - js = _static(client, COLLAB_JS) - # Timeline entry pipes the parsed body through the renderer into a - # markdown-styled container rather than escaping it verbatim. - assert "renderMarkdown(parsed.text)" in js - assert "oc-md" in js - - def test_timeline_markdown_styles_apply(self, client): - # The Domain page loads review-modals.css, and the `.oc-md` reset is - # unscoped so it applies to the timeline's `.oc-tl-text.oc-md`. - css = _static(client, REVIEW_CSS) - assert ".oc-md {" in css diff --git a/tests/units/api/test_domain_current_user_endpoint.py b/tests/units/api/test_domain_current_user_endpoint.py deleted file mode 100644 index 60960e94..00000000 --- a/tests/units/api/test_domain_current_user_endpoint.py +++ /dev/null @@ -1,93 +0,0 @@ -"""Tests for the ``GET /domain/current-user`` endpoint. - -This endpoint backs the discussion pane's "Assign to me" shortcut: the -browser asks the server who it is so the task assignee can be prefilled. -Two identity sources exist — the Databricks Apps proxy headers (app mode) -and the SCIM ``/Me`` lookup via the workspace client (local / PAT mode). -These tests assert the branch selection and the response shape only; -collaborators are mocked. -""" - -import importlib -from types import SimpleNamespace - -from unittest.mock import MagicMock, patch - -_domain = importlib.import_module("api.routers.internal.domain") - - -def _request(headers=None): - req = MagicMock() - req.headers = headers if headers is not None else {} - return req - - -async def test_current_user_uses_app_proxy_headers(): - with ( - patch.object(_domain, "is_databricks_app", return_value=True), - patch.object(_domain, "get_databricks_client") as gdc, - ): - result = await _domain.get_current_user( - _request({"x-forwarded-preferred-username": "alice@acme.com"}), - session_mgr=MagicMock(), settings=MagicMock(), - ) - assert result == {"success": True, "email": "alice@acme.com"} - # App mode must not fall through to the workspace client. - gdc.assert_not_called() - - -async def test_current_user_app_mode_prefers_username_over_email(): - headers = { - "x-forwarded-preferred-username": "alice", - "x-forwarded-email": "alice@acme.com", - } - with ( - patch.object(_domain, "is_databricks_app", return_value=True), - patch.object(_domain, "get_databricks_client"), - ): - result = await _domain.get_current_user( - _request(headers), - session_mgr=MagicMock(), settings=MagicMock(), - ) - assert result["email"] == "alice" - - -async def test_current_user_app_mode_falls_back_to_email_header(): - with ( - patch.object(_domain, "is_databricks_app", return_value=True), - patch.object(_domain, "get_databricks_client"), - ): - result = await _domain.get_current_user( - _request({"x-forwarded-email": "bob@acme.com"}), - session_mgr=MagicMock(), settings=MagicMock(), - ) - assert result["email"] == "bob@acme.com" - - -async def test_current_user_local_mode_uses_workspace_client(): - client = SimpleNamespace( - get_current_user_email=lambda: "carol@acme.com" - ) - with ( - patch.object(_domain, "is_databricks_app", return_value=False), - patch.object(_domain, "get_domain", return_value=MagicMock()), - patch.object(_domain, "get_databricks_client", return_value=client), - ): - result = await _domain.get_current_user( - _request(), - session_mgr=MagicMock(), settings=MagicMock(), - ) - assert result == {"success": True, "email": "carol@acme.com"} - - -async def test_current_user_local_mode_without_client_returns_empty(): - with ( - patch.object(_domain, "is_databricks_app", return_value=False), - patch.object(_domain, "get_domain", return_value=MagicMock()), - patch.object(_domain, "get_databricks_client", return_value=None), - ): - result = await _domain.get_current_user( - _request(), - session_mgr=MagicMock(), settings=MagicMock(), - ) - assert result == {"success": True, "email": ""} diff --git a/tests/units/api/test_ui_rendering.py b/tests/units/api/test_ui_rendering.py index c490c5a9..af69e784 100644 --- a/tests/units/api/test_ui_rendering.py +++ b/tests/units/api/test_ui_rendering.py @@ -386,8 +386,7 @@ def test_sidebar_present(self, client): @pytest.mark.parametrize( "section", - ["information", "metadata", "documents", "validation", "owl-content", - "r2rml", "mytasks", "discussions"], + ["information", "metadata", "documents", "validation", "owl-content", "r2rml"], ) def test_sidebar_has_section_link(self, client, section): html = _html(client, "/domain") @@ -398,8 +397,7 @@ def test_sidebar_has_section_link(self, client, section): @pytest.mark.parametrize( "section_id", ["information-section", "metadata-section", "validation-section", - "runs-section", "audit-section", "mytasks-section", - "discussions-section"], + "runs-section", "audit-section"], ) def test_section_div_exists(self, client, section_id): html = _html(client, "/domain") @@ -411,16 +409,6 @@ def test_audit_section_link_and_script(self, client): assert any(t == "a" and a.get("data-section") == "audit" for t, a in tags) assert any("domain-audit.js" in src for src in _script_srcs(html)) - def test_collaboration_section_assets_loaded(self, client): - """The new Domain → Collaboration timeline ships its own JS module - and a container the script populates.""" - html = _html(client, "/domain") - assert any( - "domain-collaboration.js" in src for src in _script_srcs(html) - ) - assert _find(_tags(html), id_="domainDiscussionsContainer") is not None - assert _find(_tags(html), id_="domainMyTasksContainer") is not None - # ===================================================== # DIGITAL TWIN PAGE diff --git a/tests/units/core/test_sql_warehouse.py b/tests/units/core/test_sql_warehouse.py index 598b52fe..e9b66e5c 100644 --- a/tests/units/core/test_sql_warehouse.py +++ b/tests/units/core/test_sql_warehouse.py @@ -7,7 +7,7 @@ _databricks_auth_mod = importlib.import_module("back.core.databricks.DatabricksAuth") from back.core.databricks.DatabricksAuth import DatabricksAuth -from back.core.databricks.SQLWarehouse import SQLWarehouse, _is_connection_error +from back.core.databricks.SQLWarehouse import SQLWarehouse from back.core.errors import ValidationError @@ -327,94 +327,6 @@ def test_returns_false_and_message_on_failure(self, mock_connect, monkeypatch): assert "ctas failed" in msg -class TestIsConnectionError: - def test_nonetype_request_attribute_error_is_connection(self): - # The exact signature seen when a pooled connection whose HTTP - # transport was already closed is reused. - exc = AttributeError("'NoneType' object has no attribute 'request'") - assert _is_connection_error(exc) is True - - def test_connection_keyword_message_is_connection(self): - assert _is_connection_error(RuntimeError("connection reset by peer")) is True - - def test_session_closed_message_is_connection(self): - assert _is_connection_error(RuntimeError("session already closed")) is True - - def test_unrelated_error_is_not_connection(self): - assert _is_connection_error(ValueError("invalid literal for int()")) is False - - -class TestPoolRetry: - """A long build can span a server-side session drop; a stale pooled - connection then surfaces as a connection error. ``_run`` discards it and - retries once on a fresh connection so the build doesn't crash.""" - - def _auth(self): - return DatabricksAuth( - host="https://h.databricks.com", - token="tok", - warehouse_id="wh-1", - ) - - @patch("databricks.sql.connect") - def test_execute_query_retries_on_dead_pooled_connection( - self, mock_connect, monkeypatch - ): - monkeypatch.delenv("DATABRICKS_APP_PORT", raising=False) - conn1, cur1 = _make_connect_mock( - description=[("cnt",)], fetchall_rows=[(5,)] - ) - conn2, _ = _make_connect_mock( - description=[("cnt",)], fetchall_rows=[(9,)] - ) - mock_connect.side_effect = [conn1, conn2] - - sw = SQLWarehouse(self._auth()) - # Prime the pool with conn1. - assert sw.execute_query("SELECT count(*) AS cnt FROM v") == [{"cnt": 5}] - # conn1 is now pooled; make it dead on its next use. - cur1.execute.side_effect = AttributeError( - "'NoneType' object has no attribute 'request'" - ) - rows = sw.execute_query("SELECT count(*) AS cnt FROM v") - assert rows == [{"cnt": 9}] - assert mock_connect.call_count == 2 - - @patch("databricks.sql.connect") - def test_no_retry_when_fresh_connection_fails(self, mock_connect, monkeypatch): - monkeypatch.delenv("DATABRICKS_APP_PORT", raising=False) - conn1, cur1 = _make_connect_mock( - description=[("cnt",)], fetchall_rows=[(5,)] - ) - cur1.execute.side_effect = AttributeError( - "'NoneType' object has no attribute 'request'" - ) - mock_connect.side_effect = [conn1] - - sw = SQLWarehouse(self._auth()) - with pytest.raises(AttributeError): - sw.execute_query("SELECT 1") - # Fresh connection failures are real; no retry. - assert mock_connect.call_count == 1 - - @patch("databricks.sql.connect") - def test_no_retry_on_non_connection_error(self, mock_connect, monkeypatch): - monkeypatch.delenv("DATABRICKS_APP_PORT", raising=False) - conn1, cur1 = _make_connect_mock( - description=[("cnt",)], fetchall_rows=[(5,)] - ) - mock_connect.side_effect = [conn1] - - sw = SQLWarehouse(self._auth()) - # Prime the pool with conn1. - assert sw.execute_query("SELECT count(*) AS cnt FROM v") == [{"cnt": 5}] - # A genuine SQL error on the reused connection is not retried. - cur1.execute.side_effect = ValueError("bad SQL syntax near token") - with pytest.raises(ValueError): - sw.execute_query("SELECT bad") - assert mock_connect.call_count == 1 - - class TestGetWarehouses: @patch("requests.get") def test_returns_list_via_rest_when_not_app_mode(self, mock_get, monkeypatch): diff --git a/tests/units/mapping/test_mapping_service.py b/tests/units/mapping/test_mapping_service.py index 06ede72e..a15feffe 100644 --- a/tests/units/mapping/test_mapping_service.py +++ b/tests/units/mapping/test_mapping_service.py @@ -154,45 +154,6 @@ def test_reset(self): assert domain.assignment["entities"] == [] -class TestApplyAgentMappings: - def test_adds_and_persists(self): - domain = _mock_domain() - counts = Mapping(domain).apply_agent_mappings( - [{"ontology_class": "http://t/A", "id_column": "id"}], - [{"property": "http://t/p"}], - ) - assert counts == {"entities": 1, "relationships": 1} - assert domain.assignment["entities"][0]["id_column"] == "id" - domain.save.assert_called_once() - - def test_upserts_by_uri(self): - domain = _mock_domain( - entities=[{"ontology_class": "http://t/A", "id_column": "old"}] - ) - Mapping(domain).apply_agent_mappings( - [{"ontology_class": "http://t/A", "id_column": "new"}], [] - ) - assert len(domain.assignment["entities"]) == 1 - assert domain.assignment["entities"][0]["id_column"] == "new" - - def test_preserves_existing_excluded_flag(self): - # An entity the user excluded must stay excluded after a re-map even if - # the agent proposes a fresh mapping for it. - domain = _mock_domain( - entities=[{"ontology_class": "http://t/A", "excluded": True}] - ) - Mapping(domain).apply_agent_mappings( - [{"ontology_class": "http://t/A", "id_column": "id"}], [] - ) - assert domain.assignment["entities"][0]["excluded"] is True - - def test_handles_none_payloads(self): - domain = _mock_domain(entities=[{"ontology_class": "http://t/A"}]) - counts = Mapping(domain).apply_agent_mappings(None, None) - assert counts == {"entities": 1, "relationships": 0} - domain.save.assert_called_once() - - class TestExtractFqnFromSql: def test_simple_from(self): triples = Mapping._extract_fqn_from_sql( diff --git a/tests/units/registry/test_agent_task_runner.py b/tests/units/registry/test_agent_task_runner.py deleted file mode 100644 index 3b75f954..00000000 --- a/tests/units/registry/test_agent_task_runner.py +++ /dev/null @@ -1,479 +0,0 @@ -"""Tests for the AI-agent task runner (router + dispatch orchestration). - -We never call a real agent: the router and the per-agent dispatch are patched, -and the in-memory ``TaskManager`` singleton tracks the background job. We assert -the orchestration side effects -- task status transitions on the ``domain_tasks`` -row, the audit comments, and the TaskManager terminal state. -""" - -from __future__ import annotations - -from types import SimpleNamespace -from unittest.mock import MagicMock, patch - -import pytest - -from back.core.task_manager import get_task_manager -from back.objects.registry import agent_task_runner as runner - - -def _fake_svc(): - """A registry-service double recording status updates + posted comments.""" - statuses = [] - comments = [] - svc = MagicMock() - svc.update_task_status.side_effect = lambda folder, tid, status: ( - statuses.append(status) or (True, "") - ) - svc.list_comments.return_value = [] - svc.insert_comment.side_effect = lambda *a, **k: ( - comments.append(k.get("body", "")) or {"id": "x"} - ) - svc.record_review_event.side_effect = lambda *a, **k: (True, "") - return svc, statuses, comments - - -def _svc_with_thread(thread): - """Service double whose list_comments returns *thread* (list of dicts).""" - svc, statuses, comments = _fake_svc() - svc.list_comments.return_value = thread - return svc, statuses, comments - - -def _router_ok(key="owl_generator"): - return SimpleNamespace( - success=True, chosen_agent_key=key, reasoning="fits", error="" - ) - - -def _router_fail(): - return SimpleNamespace( - success=False, chosen_agent_key="", reasoning="", error="no fit" - ) - - -def _plan_ready(): - return SimpleNamespace(success=True, ready=True, message="Running now.", error="") - - -# ---------------------------------------------------------------------- -# Sentinel helper -# ---------------------------------------------------------------------- - - -def test_is_ai_agent(): - assert runner.is_ai_agent("agent://router") is True - assert runner.is_ai_agent("AGENT://ROUTER") is True - assert runner.is_ai_agent("bob@acme.com") is False - assert runner.is_ai_agent("") is False - - -# ---------------------------------------------------------------------- -# start_agent_task setup guard -# ---------------------------------------------------------------------- - - -def test_start_agent_task_returns_none_when_llm_unconfigured(): - svc, _, _ = _fake_svc() - with patch( - "back.core.helpers.require_serving_llm", - side_effect=RuntimeError("Databricks LLM not configured"), - ): - bg = runner.start_agent_task( - svc=svc, domain=MagicMock(), settings=MagicMock(), - folder="acme", version="1", task_id="t1", - title="do something", description="", - ) - assert bg is None - # The failure is surfaced as an audit row on the task. - assert svc.record_review_event.called - - -# ---------------------------------------------------------------------- -# Background worker -# ---------------------------------------------------------------------- - - -def test_run_happy_path_routes_dispatches_and_completes(): - # Thread with a human reply beyond the root (2 user turns) so the - # code-enforced first-pass park does NOT apply and the ready path runs. - svc, statuses, comments = _svc_with_thread([ - {"id": "c1", "parent_id": "", "author": "alice@x.io", - "body": "Generate ontology", "created_at": "t0"}, - {"id": "r1", "parent_id": "c1", "author": "alice@x.io", - "body": "go ahead", "created_at": "t1"}, - ]) - tm = get_task_manager() - task = tm.create_task("AI Agent: x", "task_router", steps=[ - {"name": "route", "description": "r"}, - {"name": "run", "description": "u"}, - {"name": "finalize", "description": "f"}, - ]) - - with patch("agents.agent_task_router.run_agent", return_value=_router_ok()), \ - patch("agents.agent_task_planner.run_agent", return_value=_plan_ready()), \ - patch.object( - runner, "_dispatch_agent", - return_value=( - "generated ontology (10 chars)", - "Generated an ontology draft. Open the Ontology page.", - {"owl_content": "x"}, - ), - ): - runner._run( - task, svc=svc, domain=MagicMock(), host="h", token="t", - llm_endpoint="ep", warehouse_id="wh", folder="acme", version="1", - domain_task_id="t1", title="Generate ontology", description="", - comment_id="c1", - ) - - final = tm.get_task(task.id) - assert final.status.value == "completed" - assert final.result["agent"] == "owl_generator" - # Task moved open -> in_progress -> done. - assert statuses == ["in_progress", "done"] - # The agent report is posted to the Discussion as a comment. - assert any("Ontology Generator" in body for body in comments) - assert any("Generated an ontology draft" in body for body in comments) - - -def test_run_router_failure_leaves_task_open(): - svc, statuses, comments = _fake_svc() - tm = get_task_manager() - task = tm.create_task("AI Agent: x", "task_router") - - with patch("agents.agent_task_router.run_agent", return_value=_router_fail()): - runner._run( - task, svc=svc, domain=MagicMock(), host="h", token="t", - llm_endpoint="ep", warehouse_id="", folder="acme", version="1", - domain_task_id="t1", title="ambiguous", description="", - comment_id="", - ) - - final = tm.get_task(task.id) - assert final.status.value == "failed" - # Status never advanced past open. - assert statuses == [] - assert any("could not route" in body.lower() for body in comments) - - -def test_run_dispatch_exception_is_recorded_as_failure(): - # A replied-to thread (2 user turns) so the ready path reaches dispatch. - svc, statuses, comments = _svc_with_thread([ - {"id": "c1", "parent_id": "", "author": "alice@x.io", - "body": "Generate ontology", "created_at": "t0"}, - {"id": "r1", "parent_id": "c1", "author": "alice@x.io", - "body": "go ahead", "created_at": "t1"}, - ]) - tm = get_task_manager() - task = tm.create_task("AI Agent: x", "task_router") - - with patch("agents.agent_task_router.run_agent", return_value=_router_ok()), \ - patch("agents.agent_task_planner.run_agent", return_value=_plan_ready()), \ - patch.object(runner, "_dispatch_agent", side_effect=RuntimeError("agent boom")): - runner._run( - task, svc=svc, domain=MagicMock(), host="h", token="t", - llm_endpoint="ep", warehouse_id="", folder="acme", version="1", - domain_task_id="t1", title="Generate ontology", description="", - comment_id="c1", - ) - - final = tm.get_task(task.id) - assert final.status.value == "failed" - # It was picked up (in_progress) but never marked done. - assert statuses == ["in_progress"] - assert any("run failed" in body.lower() for body in comments) - - -def test_dispatch_unknown_agent_raises(): - with pytest.raises(RuntimeError): - runner._dispatch_agent( - "no_such_agent", domain=MagicMock(), host="h", token="t", - llm_endpoint="ep", warehouse_id="", on_step=lambda m: None, - ) - - -def test_dispatch_auto_assignment_persists_mappings(): - # The mapper must APPLY+PERSIST its proposals (not merely propose), so the - # mappings survive a page reload. - res = SimpleNamespace( - success=True, error="", - entity_mappings=[{"ontology_class": "C"}], - relationship_mappings=[], - steps=[], iterations=1, usage={}, - ) - fake_mapping = MagicMock() - fake_mapping.resolve_auto_assign_schema_context.return_value = {"tables": [1]} - fake_mapping.auto_assign_with_agent.return_value = res - fake_mapping.apply_agent_mappings.return_value = {"entities": 1, "relationships": 0} - fake_ont = MagicMock() - fake_ont.agent_ontology_context.return_value = {"entities": [{"uri": "C"}]} - - with patch("back.objects.mapping.Mapping", return_value=fake_mapping), \ - patch("back.objects.ontology.Ontology", return_value=fake_ont), \ - patch("back.core.databricks.DatabricksClient", return_value=MagicMock()): - summary, report, payload = runner._dispatch_agent( - "auto_assignment", domain=MagicMock(), host="h", token="t", - llm_endpoint="ep", warehouse_id="wh", task_text="map it", - on_step=lambda m: None, - ) - - fake_mapping.apply_agent_mappings.assert_called_once_with( - res.entity_mappings, res.relationship_mappings - ) - assert "Applied SQL mappings" in report - assert payload["entity_mappings"] == res.entity_mappings - - -def test_dispatch_ontology_assistant_applies_and_saves_changes(): - res = SimpleNamespace( - success=True, ontology_changed=True, reply="Removed the Person class.", - classes=[{"uri": "a"}], properties=[], steps=[], iterations=2, usage={}, - ) - fake_ont = MagicMock() - fake_ont.apply_agent_ontology_changes.return_value = { - "classes": [{"uri": "a"}], "properties": [], - } - domain = MagicMock() - domain.get_classes.return_value = [{"name": "Person"}] - domain.get_properties.return_value = [] - domain.ontology = {"base_uri": "http://x#"} - - with patch("agents.agent_ontology_assistant.run_agent", return_value=res), \ - patch("back.objects.ontology.Ontology", return_value=fake_ont): - summary, report, payload = runner._dispatch_agent( - "ontology_assistant", domain=domain, host="h", token="t", - llm_endpoint="ep", warehouse_id="", task_text="Is Person needed?", - on_step=lambda m: None, - ) - - # The edits are applied + persisted (apply_agent_ontology_changes calls save()). - fake_ont.apply_agent_ontology_changes.assert_called_once() - assert "updated the ontology" in summary - assert payload["ontology_changed"] is True - assert "Removed the Person class." in report - - -def test_dispatch_ontology_assistant_no_change(): - res = SimpleNamespace( - success=True, ontology_changed=False, reply="Person is still needed.", - classes=[], properties=[], steps=[], iterations=1, usage={}, - ) - fake_ont = MagicMock() - domain = MagicMock() - domain.get_classes.return_value = [{"name": "Person"}] - domain.get_properties.return_value = [] - domain.ontology = {"base_uri": "http://x#"} - - with patch("agents.agent_ontology_assistant.run_agent", return_value=res), \ - patch("back.objects.ontology.Ontology", return_value=fake_ont): - summary, report, payload = runner._dispatch_agent( - "ontology_assistant", domain=domain, host="h", token="t", - llm_endpoint="ep", warehouse_id="", task_text="Is Person needed?", - on_step=lambda m: None, - ) - - fake_ont.apply_agent_ontology_changes.assert_not_called() - assert payload["ontology_changed"] is False - assert "Person is still needed." in report - - -# ---------------------------------------------------------------------- -# Plan-then-run worker (_run_for_task) + thread-driven resume -# ---------------------------------------------------------------------- - - -def test_first_pass_parks_with_plan_and_stays_in_progress(monkeypatch): - svc, statuses, comments = _svc_with_thread( - [{"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "Is Person needed?", "created_at": "t0", - "anchor_type": "domain", "anchor_ref": ""}] - ) - router_res = SimpleNamespace(success=True, chosen_agent_key="ontology_assistant", - reasoning="edit", error="") - plan_res = SimpleNamespace(success=True, ready=False, - message="Plan: remove Person? Confirm.", error="") - monkeypatch.setattr("agents.agent_task_router.run_agent", lambda *a, **k: router_res) - monkeypatch.setattr("agents.agent_task_planner.run_agent", lambda *a, **k: plan_res) - dispatched = [] - monkeypatch.setattr(runner, "_dispatch_agent", - lambda *a, **k: dispatched.append(k) or ("s", "r", {})) - - runner._run_for_task( - svc=svc, domain=MagicMock(), host="h", token="t", llm_endpoint="ep", - warehouse_id="", folder="d", version="v", domain_task_id="T1", - title="Is Person needed?", description="", comment_id="root", - on_step=lambda m: None, tm=None, tm_task_id=None, - ) - - assert dispatched == [] # agent did NOT run - assert "in_progress" in statuses # parked - assert any("Plan: remove Person?" in c for c in comments) - - -def test_first_pass_parks_even_when_planner_ready(monkeypatch): - # Only the root comment (one human turn) -> first pass. Even though the - # planner says ready, the code-level guard must override and park. - svc, statuses, comments = _svc_with_thread( - [{"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "Remove Person", "created_at": "t0", - "anchor_type": "domain", "anchor_ref": ""}] - ) - router_res = SimpleNamespace(success=True, chosen_agent_key="ontology_assistant", - reasoning="edit", error="") - plan_res = SimpleNamespace(success=True, ready=True, message="Plan: confirm?", - error="") - monkeypatch.setattr("agents.agent_task_router.run_agent", lambda *a, **k: router_res) - monkeypatch.setattr("agents.agent_task_planner.run_agent", lambda *a, **k: plan_res) - dispatched = [] - monkeypatch.setattr(runner, "_dispatch_agent", - lambda *a, **k: dispatched.append(k) or ("s", "r", {})) - - runner._run_for_task( - svc=svc, domain=MagicMock(), host="h", token="t", llm_endpoint="ep", - warehouse_id="", folder="d", version="v", domain_task_id="T1", - title="Remove Person", description="", comment_id="root", - on_step=lambda m: None, tm=None, tm_task_id=None, - ) - - assert dispatched == [] # guard overrode planner readiness - assert statuses[-1] == "in_progress" # parked, never marked done - assert "done" not in statuses - - -def test_resume_runs_agent_when_planner_ready(monkeypatch): - svc, statuses, comments = _svc_with_thread([ - {"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "Is Person needed?", "created_at": "t0", - "anchor_type": "domain", "anchor_ref": ""}, - {"id": "q1", "parent_id": "root", "author": "AI Agent", - "body": "Remove Person?", "created_at": "t1", - "anchor_type": "domain", "anchor_ref": ""}, - {"id": "a1", "parent_id": "root", "author": "alice@x.io", - "body": "yes remove it", "created_at": "t2", - "anchor_type": "domain", "anchor_ref": ""}, - ]) - router_res = SimpleNamespace(success=True, chosen_agent_key="ontology_assistant", - reasoning="edit", error="") - plan_res = SimpleNamespace(success=True, ready=True, message="Running now.", error="") - monkeypatch.setattr("agents.agent_task_router.run_agent", lambda *a, **k: router_res) - monkeypatch.setattr("agents.agent_task_planner.run_agent", lambda *a, **k: plan_res) - captured = {} - monkeypatch.setattr( - runner, "_dispatch_agent", - lambda key, **k: captured.update(k) or ("updated", "Removed Person.", {}), - ) - - runner._run_for_task( - svc=svc, domain=MagicMock(), host="h", token="t", llm_endpoint="ep", - warehouse_id="", folder="d", version="v", domain_task_id="T1", - title="Is Person needed?", description="", comment_id="root", - on_step=lambda m: None, tm=None, tm_task_id=None, - ) - - assert statuses[-1] == "done" # solved - assert "yes remove it" in captured["task_text"] # answer folded in - assert any("Removed Person." in c for c in comments) - - -def test_is_unsupported_mapping_removal_detects_removal_intent(): - f = runner._is_unsupported_mapping_removal - assert f("Unmap Customer") is True - assert f("please remove the mapping for Order") is True - assert f("clear the SQL mapping") is True - assert f("unassign Person") is True - # Additive / unrelated requests must NOT trip the guard. - assert f("Map Customer to the orders table") is False - assert f("create an Agent Manager entity") is False - assert f("") is False - - -def test_run_for_task_refuses_unmap_and_parks(monkeypatch): - # "Unmap Customer" routed to the Auto SQL Mapper must be refused (the mapper - # only adds), parked for a rephrase -- never planned, never dispatched. - svc, statuses, comments = _svc_with_thread( - [{"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "Unmap Customer", "created_at": "t0"}] - ) - router_res = SimpleNamespace(success=True, chosen_agent_key="auto_assignment", - reasoning="map", error="") - plan_called = [] - monkeypatch.setattr("agents.agent_task_router.run_agent", lambda *a, **k: router_res) - monkeypatch.setattr( - "agents.agent_task_planner.run_agent", - lambda *a, **k: plan_called.append(1) or SimpleNamespace( - success=True, ready=True, message="", error=""), - ) - dispatched = [] - monkeypatch.setattr(runner, "_dispatch_agent", - lambda *a, **k: dispatched.append(k) or ("s", "r", {})) - - runner._run_for_task( - svc=svc, domain=MagicMock(), host="h", token="t", llm_endpoint="ep", - warehouse_id="wh", folder="d", version="v", domain_task_id="T1", - title="Unmap Customer", description="", comment_id="root", - on_step=lambda m: None, tm=None, tm_task_id=None, - ) - - assert dispatched == [] # mapper never ran - assert plan_called == [] # guard short-circuits before planning - assert statuses[-1] == "in_progress" # parked for a rephrase - assert "done" not in statuses - assert any("unmap" in c.lower() for c in comments) - - -def test_thread_history_maps_authors_to_roles(): - svc, _, _ = _svc_with_thread([ - {"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "do X", "created_at": "t0"}, - {"id": "q1", "parent_id": "root", "author": "AI Agent", - "body": "clarify?", "created_at": "t1"}, - {"id": "a1", "parent_id": "root", "author": "alice@x.io", - "body": "answer", "created_at": "t2"}, - {"id": "other", "parent_id": "elsewhere", "author": "bob@x.io", - "body": "unrelated", "created_at": "t3"}, - ]) - hist = runner._thread_history(svc, "d", "v", "root") - assert [h["role"] for h in hist] == ["user", "assistant", "user"] - assert hist[1]["text"] == "clarify?" - assert all(h["text"] != "unrelated" for h in hist) # other thread excluded - - -def test_resume_skips_when_already_running(monkeypatch): - runner._ACTIVE_TASKS.add("T1") - try: - started = runner.resume_agent_task( - svc=MagicMock(), domain=MagicMock(), settings=MagicMock(), - folder="d", version="v", task={"id": "T1", "comment_id": "root", - "title": "x", "description": ""}, - ) - finally: - runner._ACTIVE_TASKS.discard("T1") - assert started is None - - -def test_claim_task_is_idempotent_per_id(): - assert "T9" not in runner._ACTIVE_TASKS - try: - assert runner._claim_task("T9") is True # first claim wins - assert runner._claim_task("T9") is False # already active - assert runner._claim_task("") is False # empty id never claims - finally: - runner._ACTIVE_TASKS.discard("T9") - - -def test_launch_failure_releases_the_claim(monkeypatch): - tm = MagicMock() - tm.run_background_task.side_effect = RuntimeError("thread boom") - monkeypatch.setattr( - "back.core.task_manager.get_task_manager", lambda: tm - ) - assert "T7" not in runner._ACTIVE_TASKS - with pytest.raises(RuntimeError): - runner._launch_worker( - svc=MagicMock(), domain=MagicMock(), host="h", token="t", - llm_endpoint="ep", warehouse_id="", folder="d", version="v", - task_id="T7", title="x", description="", comment_id="root", - ) - # The claim must NOT leak when the launch raises. - assert "T7" not in runner._ACTIVE_TASKS diff --git a/tests/units/registry/test_comment_service.py b/tests/units/registry/test_comment_service.py deleted file mode 100644 index ae282471..00000000 --- a/tests/units/registry/test_comment_service.py +++ /dev/null @@ -1,535 +0,0 @@ -"""Tests for the collaborative comments & tasks workflow (CommentService). - -Covers the orchestration layer: the DRAFT/IN-REVIEW -write gate, per-action role rules, and the audit-log side effects when a -task is created or completed. Collaborators (registry service, session) -are mocked; the focus is the workflow rules and side effects. -""" - -import importlib - -import pytest -from unittest.mock import MagicMock, patch - -from back.core.errors import ( - AuthorizationError, - ConflictError, - NotFoundError, - ValidationError, -) -from back.objects.registry.PermissionService import ( - ROLE_ADMIN, - ROLE_BUILDER, - ROLE_EDITOR, - ROLE_VIEWER, - ROLE_NONE, -) -from back.objects.registry.CommentService import CommentService - -_mod = importlib.import_module("back.objects.registry.CommentService") - - -def _request(email="alice@acme.com"): - req = MagicMock() - req.state.user_email = email - req.headers = {} - return req - - -def _make_svc(*, status="DRAFT", versions=("1", "2"), configured=True, - comments=None, tasks=None): - info = {"status": status} - comment_rows = [dict(c) for c in (comments or [])] - task_rows = [dict(t) for t in (tasks or [])] - events = [] - - svc = MagicMock() - svc.cfg.is_configured = configured - svc.list_versions_sorted.return_value = list(versions) - svc.read_version.return_value = (True, {"info": info}, "") - - def _insert_comment(folder, version, *, author, body, parent_id=None): - row = { - "id": str(len(comment_rows) + 1), "folder": folder, - "version": version, "parent_id": parent_id or "", - "author": author, "body": body, "resolved": False, - "created_at": "2026-01-01T00:00:00", - } - comment_rows.append(row) - return dict(row) - - def _list_comments(folder, version=None, *, include_resolved=True): - return [dict(c) for c in comment_rows] - - def _resolve_comment(folder, comment_id, *, resolved=True): - for c in comment_rows: - if c["id"] == str(comment_id): - c["resolved"] = resolved - return True, "" - return False, "Comment not found" - - def _insert_task(folder, version, *, assignee, created_by, title, - description="", due_date=None, comment_id=None): - row = { - "id": str(len(task_rows) + 1), "folder": folder, - "version": version, "assignee": assignee, - "created_by": created_by, "title": title, - "description": description, "status": "open", - "due_date": due_date or "", "comment_id": comment_id or "", - "created_at": "2026-01-01T00:00:00", - "updated_at": "2026-01-01T00:00:00", - } - task_rows.append(row) - return dict(row) - - def _list_tasks(folder, version=None): - return [dict(t) for t in task_rows] - - def _update_task_status(folder, task_id, status): - for t in task_rows: - if t["id"] == str(task_id): - t["status"] = status - return True, "" - return False, "Task not found" - - def _record(folder, version, actor, action, *, from_status="", - to_status="", comment="", meta=None): - events.append({"action": action, "comment": comment, "meta": meta or {}}) - return True, "" - - svc.insert_comment.side_effect = _insert_comment - svc.list_comments.side_effect = _list_comments - svc.resolve_comment.side_effect = _resolve_comment - svc.insert_task.side_effect = _insert_task - svc.list_tasks.side_effect = _list_tasks - svc.update_task_status.side_effect = _update_task_status - svc.record_review_event.side_effect = _record - return svc, comment_rows, task_rows, events - - -def _patch(svc): - domain = MagicMock() - return patch.object(_mod, "get_domain", MagicMock(return_value=domain)), \ - patch.object(_mod.RegistryService, "from_context", return_value=svc) - - -def _call(method, svc, **kwargs): - email = kwargs.pop("email", "alice@acme.com") - p1, p2 = _patch(svc) - with p1, p2: - return getattr(CommentService, method)( - _request(email), MagicMock(), MagicMock(), "acme", "2", **kwargs - ) - - -# ---------------------------------------------------------------------- -# Comments — create -# ---------------------------------------------------------------------- - - -def test_add_comment_succeeds_on_draft(): - svc, comments, _, _ = _make_svc(status="DRAFT") - result = _call("add_comment", svc, body="rename this", - parent_id=None, user_role="", user_domain_role=ROLE_VIEWER) - assert result["success"] is True - assert result["comment"]["body"] == "rename this" - assert comments[-1]["body"] == "rename this" - - -def test_add_comment_allowed_in_review(): - svc, _, _, _ = _make_svc(status="IN-REVIEW") - result = _call("add_comment", svc, - body="reviewing", parent_id=None, - user_role="", user_domain_role=ROLE_VIEWER) - assert result["success"] is True - - -def test_add_comment_blocked_when_published(): - svc, _, _, _ = _make_svc(status="PUBLISHED") - with pytest.raises(ConflictError): - _call("add_comment", svc, - body="late", parent_id=None, - user_role=ROLE_ADMIN, user_domain_role=ROLE_NONE) - - -def test_add_comment_requires_member(): - svc, _, _, _ = _make_svc(status="DRAFT") - with pytest.raises(AuthorizationError): - _call("add_comment", svc, - body="hi", parent_id=None, - user_role="", user_domain_role=ROLE_NONE) - - -def test_add_comment_requires_body(): - svc, _, _, _ = _make_svc(status="DRAFT") - with pytest.raises(ValidationError): - _call("add_comment", svc, - body=" ", parent_id=None, - user_role=ROLE_ADMIN, user_domain_role=ROLE_NONE) - - -def test_add_comment_resumes_active_ai_agent_task(): - prior = [{ - "id": "1", "folder": "acme", "version": "2", - "assignee": _mod.AI_AGENT_PRINCIPAL, "created_by": "alice@acme.com", - "title": "t", "description": "", "status": "in_progress", - "due_date": "", "comment_id": "5", - "created_at": "t", "updated_at": "t", - }] - svc, _, _, _ = _make_svc(status="DRAFT", tasks=prior) - with patch.object(_mod, "resume_agent_task", return_value="bg7") as resume: - result = _call("add_comment", svc, - body="any update?", parent_id="5", - user_role="", user_domain_role=ROLE_VIEWER) - assert result["success"] is True - resume.assert_called_once() - assert resume.call_args.kwargs["task"]["id"] == "1" - - -def test_add_comment_does_not_resume_done_task(): - prior = [{ - "id": "1", "folder": "acme", "version": "2", - "assignee": _mod.AI_AGENT_PRINCIPAL, "created_by": "alice@acme.com", - "title": "t", "description": "", "status": "done", - "due_date": "", "comment_id": "5", - "created_at": "t", "updated_at": "t", - }] - svc, _, _, _ = _make_svc(status="DRAFT", tasks=prior) - with patch.object(_mod, "resume_agent_task") as resume: - result = _call("add_comment", svc, - body="any update?", parent_id="5", - user_role="", user_domain_role=ROLE_VIEWER) - assert result["success"] is True - resume.assert_not_called() - - -def test_add_comment_does_not_resume_human_task(): - prior = [{ - "id": "1", "folder": "acme", "version": "2", - "assignee": "bob@acme.com", "created_by": "alice@acme.com", - "title": "t", "description": "", "status": "in_progress", - "due_date": "", "comment_id": "5", - "created_at": "t", "updated_at": "t", - }] - svc, _, _, _ = _make_svc(status="DRAFT", tasks=prior) - with patch.object(_mod, "resume_agent_task") as resume: - result = _call("add_comment", svc, - body="any update?", parent_id="5", - user_role="", user_domain_role=ROLE_VIEWER) - assert result["success"] is True - resume.assert_not_called() - - -# ---------------------------------------------------------------------- -# Comments — resolve -# ---------------------------------------------------------------------- - - -def test_resolve_comment_by_author(): - prior = [{ - "id": "1", "folder": "acme", "version": "2", - "parent_id": "", "author": "alice@acme.com", - "body": "x", "resolved": False, "created_at": "t", - }] - svc, comments, _, _ = _make_svc(status="DRAFT", comments=prior) - result = _call("resolve_comment", svc, comment_id="1", resolved=True, - user_role="", user_domain_role=ROLE_VIEWER, - email="alice@acme.com") - assert result["success"] is True - assert comments[0]["resolved"] is True - - -def test_resolve_comment_viewer_non_author_denied(): - prior = [{ - "id": "1", "folder": "acme", "version": "2", - "parent_id": "", "author": "bob@acme.com", - "body": "x", "resolved": False, "created_at": "t", - }] - svc, _, _, _ = _make_svc(status="DRAFT", comments=prior) - with pytest.raises(AuthorizationError): - _call("resolve_comment", svc, comment_id="1", resolved=True, - user_role="", user_domain_role=ROLE_VIEWER, - email="carol@acme.com") - - -def test_resolve_comment_editor_allowed(): - prior = [{ - "id": "1", "folder": "acme", "version": "2", - "parent_id": "", "author": "bob@acme.com", - "body": "x", "resolved": False, "created_at": "t", - }] - svc, comments, _, _ = _make_svc(status="DRAFT", comments=prior) - _call("resolve_comment", svc, comment_id="1", resolved=True, - user_role="", user_domain_role=ROLE_EDITOR, email="carol@acme.com") - assert comments[0]["resolved"] is True - - -# ---------------------------------------------------------------------- -# Tasks -# ---------------------------------------------------------------------- - - -def test_create_task_succeeds_and_audits(): - svc, _, tasks, events = _make_svc(status="DRAFT") - result = _call("create_task", svc, assignee="bob@acme.com", - title="Fix the mapping", description="details", - due_date=None, comment_id="7", - user_role="", user_domain_role=ROLE_VIEWER) - assert result["success"] is True - assert tasks[-1]["assignee"] == "bob@acme.com" - # A `commented` audit row links the task + comment. - assert events[-1]["action"] == "commented" - assert events[-1]["meta"]["comment_id"] == "7" - assert events[-1]["meta"]["task_id"] == tasks[-1]["id"] - - -def test_create_task_ai_agent_triggers_runner(): - svc, _, tasks, _ = _make_svc(status="DRAFT") - with patch.object(_mod, "start_agent_task", return_value="bg42") as start: - result = _call( - "create_task", svc, assignee=_mod.AI_AGENT_PRINCIPAL, - title="Generate the ontology", description="from metadata", - due_date=None, comment_id="7", - user_role="", user_domain_role=ROLE_VIEWER, - ) - assert result["success"] is True - assert result["agent_task_id"] == "bg42" - start.assert_called_once() - assert start.call_args.kwargs["task_id"] == tasks[-1]["id"] - assert start.call_args.kwargs["title"] == "Generate the ontology" - - -def test_create_task_ai_agent_no_comment_inserts_kickoff(): - svc, comments, tasks, _ = _make_svc(status="DRAFT") - with patch.object(_mod, "start_agent_task", return_value="bg99") as start: - result = _call( - "create_task", svc, assignee=_mod.AI_AGENT_PRINCIPAL, - title="Generate the ontology", description="from metadata", - due_date=None, comment_id=None, - user_role="", user_domain_role=ROLE_VIEWER, - ) - assert result["success"] is True - # A kickoff comment was created (body = the task statement) ... - assert comments[-1]["body"] == "Generate the ontology\n\nfrom metadata" - kickoff_id = comments[-1]["id"] - # ... and the task + runner are anchored to it. - assert tasks[-1]["comment_id"] == kickoff_id - start.assert_called_once() - assert start.call_args.kwargs["comment_id"] == kickoff_id - - -def test_create_task_ai_agent_kickoff_failure_still_creates_task(): - svc, _, tasks, _ = _make_svc(status="DRAFT") - # The kickoff comment can't be created (store returns falsy): the task is - # still created, just without a thread root (comment_id stays None). - svc.insert_comment.side_effect = lambda *a, **k: None - with patch.object(_mod, "start_agent_task", return_value="bg00") as start: - result = _call( - "create_task", svc, assignee=_mod.AI_AGENT_PRINCIPAL, - title="Generate the ontology", description="from metadata", - due_date=None, comment_id=None, - user_role="", user_domain_role=ROLE_VIEWER, - ) - assert result["success"] is True - assert svc.insert_task.call_args.kwargs["comment_id"] is None - assert start.call_args.kwargs["comment_id"] == "" - - -def test_create_task_human_assignee_does_not_trigger_runner(): - svc, _, _, _ = _make_svc(status="DRAFT") - with patch.object(_mod, "start_agent_task") as start: - result = _call( - "create_task", svc, assignee="bob@acme.com", title="Fix mapping", - description="", due_date=None, comment_id=None, - user_role="", user_domain_role=ROLE_VIEWER, - ) - assert result["success"] is True - assert "agent_task_id" not in result - start.assert_not_called() - - -def test_create_task_requires_assignee(): - svc, _, _, _ = _make_svc(status="DRAFT") - with pytest.raises(ValidationError): - _call("create_task", svc, assignee="", title="x", - description="", due_date=None, comment_id=None, - user_role=ROLE_ADMIN, user_domain_role=ROLE_NONE) - - -def test_create_task_requires_title(): - svc, _, _, _ = _make_svc(status="DRAFT") - with pytest.raises(ValidationError): - _call("create_task", svc, assignee="bob@acme.com", title=" ", - description="", due_date=None, comment_id=None, - user_role=ROLE_ADMIN, user_domain_role=ROLE_NONE) - - -def test_create_task_blocked_when_published(): - svc, _, _, _ = _make_svc(status="PUBLISHED") - with pytest.raises(ConflictError): - _call("create_task", svc, assignee="bob@acme.com", title="x", - description="", due_date=None, comment_id=None, - user_role=ROLE_ADMIN, user_domain_role=ROLE_NONE) - - -def test_update_task_status_by_assignee(): - prior = [{ - "id": "1", "folder": "acme", "version": "2", "assignee": "bob@acme.com", - "created_by": "alice@acme.com", "title": "t", "description": "", - "status": "open", "due_date": "", "comment_id": "", - "created_at": "t", "updated_at": "t", - }] - svc, _, tasks, events = _make_svc(status="DRAFT", tasks=prior) - result = _call("update_task_status", svc, task_id="1", status="done", - user_role="", user_domain_role=ROLE_VIEWER, - email="bob@acme.com") - assert result["status"] == "done" - assert tasks[0]["status"] == "done" - # Completing a task appends an audit row. - assert events[-1]["meta"]["event"] == "task_done" - - -def test_update_task_status_stranger_denied(): - prior = [{ - "id": "1", "folder": "acme", "version": "2", "assignee": "bob@acme.com", - "created_by": "alice@acme.com", "title": "t", "description": "", - "status": "open", "due_date": "", "comment_id": "", - "created_at": "t", "updated_at": "t", - }] - svc, _, _, _ = _make_svc(status="DRAFT", tasks=prior) - with pytest.raises(AuthorizationError): - _call("update_task_status", svc, task_id="1", status="done", - user_role="", user_domain_role=ROLE_VIEWER, - email="carol@acme.com") - - -def test_update_task_status_admin_allowed(): - prior = [{ - "id": "1", "folder": "acme", "version": "2", "assignee": "bob@acme.com", - "created_by": "alice@acme.com", "title": "t", "description": "", - "status": "open", "due_date": "", "comment_id": "", - "created_at": "t", "updated_at": "t", - }] - svc, _, tasks, _ = _make_svc(status="DRAFT", tasks=prior) - _call("update_task_status", svc, task_id="1", status="in_progress", - user_role=ROLE_ADMIN, user_domain_role=ROLE_NONE, - email="admin@acme.com") - assert tasks[0]["status"] == "in_progress" - - -def test_update_task_status_bad_status_rejected(): - svc, _, _, _ = _make_svc(status="DRAFT") - with pytest.raises(ValidationError): - _call("update_task_status", svc, task_id="1", status="frozen", - user_role=ROLE_ADMIN, user_domain_role=ROLE_NONE) - - -def test_update_unknown_task_raises_not_found(): - svc, _, _, _ = _make_svc(status="DRAFT") - with pytest.raises(NotFoundError): - _call("update_task_status", svc, task_id="999", status="done", - user_role=ROLE_ADMIN, user_domain_role=ROLE_NONE) - - -# ---------------------------------------------------------------------- -# Reads -# ---------------------------------------------------------------------- - - -def test_list_comments_returns_whole_domain_thread(): - prior = [ - {"id": "1", "folder": "acme", "version": "2", - "parent_id": "", "author": "a", "body": "cls", "resolved": False, - "created_at": "t"}, - {"id": "2", "folder": "acme", "version": "2", "parent_id": "", - "author": "a", "body": "dom", "resolved": False, "created_at": "t"}, - ] - svc, _, _, _ = _make_svc(status="DRAFT", comments=prior) - result = _call("list_comments", svc, - user_role="", user_domain_role=ROLE_VIEWER) - assert [c["body"] for c in result["comments"]] == ["cls", "dom"] - - -def test_list_comments_requires_member(): - svc, _, _, _ = _make_svc(status="DRAFT") - with pytest.raises(AuthorizationError): - _call("list_comments", svc, - user_role="", user_domain_role=ROLE_NONE) - - -def test_reads_allowed_on_published(): - """Published versions are read-only, not invisible.""" - svc, _, _, _ = _make_svc(status="PUBLISHED") - result = _call("list_tasks", svc, user_role="", - user_domain_role=ROLE_BUILDER) - assert result["success"] is True - - -def test_unknown_version_raises_not_found(): - svc, _, _, _ = _make_svc(status="DRAFT", versions=("1",)) - with pytest.raises(NotFoundError): - _call("add_comment", svc, - body="hi", parent_id=None, - user_role=ROLE_ADMIN, user_domain_role=ROLE_NONE) - - -# ---------------------------------------------------------------------- -# Assignees (task assignee picker — domain permission holders) -# ---------------------------------------------------------------------- - - -def _call_assignees(*, entries=None, role=ROLE_VIEWER, app_role="", - raise_exc=False): - list_entries = ( - MagicMock(side_effect=RuntimeError("boom")) if raise_exc - else MagicMock(return_value=list(entries or [])) - ) - with ( - patch.object(_mod, "get_domain", MagicMock(return_value=MagicMock())), - patch.object( - _mod.RegistryCfg, "from_domain", - MagicMock(return_value=MagicMock(as_dict=lambda: {})), - ), - patch.object(_mod.permission_service, "list_domain_entries", list_entries), - patch( - "back.core.helpers.get_databricks_host_and_token", - MagicMock(return_value=("https://host", "tok")), - ), - ): - return CommentService.list_assignees( - _request(), MagicMock(), MagicMock(), "acme", - user_role=app_role, user_domain_role=role, - ) - - -def test_list_assignees_returns_domain_holders_sorted(): - entries = [ - {"principal": "v@acme.com", "role": ROLE_VIEWER, - "display_name": "Vic", "principal_type": "user"}, - {"principal": "b@acme.com", "role": ROLE_BUILDER, - "display_name": "Bea", "principal_type": "user"}, - {"principal": "e@acme.com", "role": ROLE_EDITOR, - "display_name": "Ed", "principal_type": "user"}, - {"principal": "x@acme.com", "role": "", "display_name": "Nobody"}, - ] - result = _call_assignees(entries=entries) - assert result["success"] is True - members = result["members"] - # The AI Agent is always offered first. - assert members[0]["principal"] == _mod.AI_AGENT_PRINCIPAL - assert members[0]["principal_type"] == "agent" - # Then domain holders, most-privileged first; the role-less entry is dropped. - assert [m["principal"] for m in members[1:]] == [ - "b@acme.com", "e@acme.com", "v@acme.com", - ] - - -def test_list_assignees_requires_member(): - with pytest.raises(AuthorizationError): - _call_assignees(role=ROLE_NONE, app_role="") - - -def test_list_assignees_resilient_on_backend_error(): - result = _call_assignees(raise_exc=True) - assert result["success"] is True - assert result["members"] == [] diff --git a/tests/units/registry/test_registry_store.py b/tests/units/registry/test_registry_store.py index 22da6e7b..f43fd3d4 100644 --- a/tests/units/registry/test_registry_store.py +++ b/tests/units/registry/test_registry_store.py @@ -53,8 +53,6 @@ def __init__(self, tag: str = "memory"): self._history: Dict[str, List[ScheduleHistoryEntry]] = {} self._build_runs: Dict[str, List[Dict[str, Any]]] = {} self._review_events: List[Dict[str, Any]] = [] - self._comments: List[Dict[str, Any]] = [] - self._tasks: List[Dict[str, Any]] = [] self._global: Dict[str, Any] = {} self._initialized = False @@ -129,15 +127,6 @@ def update_version_status( data.setdefault("info", {})["status"] = status return True, "ok" - def update_last_build( - self, folder: str, version: str, ts: str - ) -> Tuple[bool, str]: - data = self._versions.get((folder, version)) - if data is None: - return False, f"missing {folder}/{version}" - data.setdefault("info", {})["last_build"] = ts - return True, "ok" - def load_domain_permissions(self, folder: str) -> Dict[str, Any]: return dict(self._perms.get(folder, {"version": 1, "permissions": []})) @@ -248,109 +237,6 @@ def list_review_events( def list_all_review_events(self) -> List[Dict[str, Any]]: return [dict(e) for e in self._review_events] - def insert_comment( - self, - folder: str, - version: str, - *, - author: str, - body: str, - parent_id=None, - ): - row = { - "id": str(len(self._comments) + 1), - "folder": folder, - "version": version, - "parent_id": str(parent_id) if parent_id else "", - "author": author or "", - "body": body or "", - "resolved": False, - "created_at": f"2026-01-01T00:00:{len(self._comments):02d}", - } - self._comments.append(row) - return dict(row) - - def list_comments( - self, - folder: str, - version=None, - *, - include_resolved: bool = True, - ) -> List[Dict[str, Any]]: - return [ - dict(c) - for c in self._comments - if c["folder"] == folder - and (version is None or c["version"] == version) - and (include_resolved or not c["resolved"]) - ] - - def resolve_comment( - self, folder: str, comment_id: str, *, resolved: bool = True - ) -> Tuple[bool, str]: - for c in self._comments: - if c["folder"] == folder and c["id"] == str(comment_id): - c["resolved"] = resolved - return True, "" - return False, "Comment not found" - - def insert_task( - self, - folder: str, - version: str, - *, - assignee: str, - created_by: str, - title: str, - description: str = "", - due_date=None, - comment_id=None, - ): - row = { - "id": str(len(self._tasks) + 1), - "folder": folder, - "version": version, - "assignee": assignee or "", - "created_by": created_by or "", - "title": title or "", - "description": description or "", - "status": "open", - "due_date": due_date or "", - "comment_id": str(comment_id) if comment_id else "", - "created_at": f"2026-01-01T00:00:{len(self._tasks):02d}", - "updated_at": f"2026-01-01T00:00:{len(self._tasks):02d}", - } - self._tasks.append(row) - return dict(row) - - def list_tasks(self, folder: str, version=None) -> List[Dict[str, Any]]: - rows = [ - dict(t) - for t in self._tasks - if t["folder"] == folder - and (version is None or t["version"] == version) - ] - rows.reverse() # newest-first - return rows - - def list_tasks_for_assignee(self, assignee: str) -> List[Dict[str, Any]]: - rows = [ - dict(t) - for t in self._tasks - if t["assignee"].lower() == (assignee or "").lower() - ] - rows.reverse() - return rows - - def update_task_status( - self, folder: str, task_id: str, status: str - ) -> Tuple[bool, str]: - for t in self._tasks: - if t["folder"] == folder and t["id"] == str(task_id): - t["status"] = status - return True, "" - return False, "Task not found" - def load_global_config(self) -> Dict[str, Any]: return dict(self._global) @@ -495,19 +381,6 @@ def test_update_version_status_unknown_version(self, store): assert ok is False assert msg - def test_update_last_build_round_trip(self, store): - store.write_version("demo", "1", {"info": {"name": "demo"}}) - ok, msg = store.update_last_build("demo", "1", "2026-06-19T09:00:00+00:00") - assert ok, msg - ok, got, _ = store.read_version("demo", "1") - assert ok - assert got["info"]["last_build"] == "2026-06-19T09:00:00+00:00" - - def test_update_last_build_unknown_version(self, store): - ok, msg = store.update_last_build("ghost", "9", "2026-06-19T09:00:00+00:00") - assert ok is False - assert msg - def test_permissions_default_shape(self, store): out = store.load_domain_permissions("nobody") assert out == {"version": 1, "permissions": []} @@ -613,69 +486,6 @@ def test_list_all_review_events_spans_domains(self, store): folders = {e["folder"] for e in allev} assert folders == {"demo", "other"} - def test_comments_round_trip_oldest_first(self, store): - store.insert_comment( - "demo", "1", author="a@a.com", body="first", - ) - store.insert_comment( - "demo", "1", author="b@a.com", body="second", - ) - comments = store.list_comments("demo", "1") - assert [c["body"] for c in comments] == ["first", "second"] - assert comments[0]["resolved"] is False - - def test_resolve_comment_flips_flag_and_filters(self, store): - c = store.insert_comment( - "demo", "1", author="a@a.com", body="hi", - ) - ok, _ = store.resolve_comment("demo", c["id"], resolved=True) - assert ok - assert store.list_comments("demo", "1", include_resolved=False) == [] - assert len(store.list_comments("demo", "1")) == 1 - - def test_resolve_unknown_comment_returns_false(self, store): - ok, msg = store.resolve_comment("demo", "999") - assert ok is False and msg - - def test_tasks_round_trip_newest_first(self, store): - store.insert_task( - "demo", "1", assignee="x@a.com", created_by="a@a.com", - title="task one", - ) - store.insert_task( - "demo", "1", assignee="y@a.com", created_by="a@a.com", - title="task two", - ) - tasks = store.list_tasks("demo", "1") - assert [t["title"] for t in tasks] == ["task two", "task one"] - assert tasks[0]["status"] == "open" - - def test_tasks_for_assignee_is_case_insensitive_and_cross_domain(self, store): - store.insert_task( - "demo", "1", assignee="X@a.com", created_by="a@a.com", title="t1", - ) - store.insert_task( - "other", "1", assignee="x@a.com", created_by="a@a.com", title="t2", - ) - store.insert_task( - "demo", "1", assignee="z@a.com", created_by="a@a.com", title="t3", - ) - mine = store.list_tasks_for_assignee("x@a.com") - assert {t["title"] for t in mine} == {"t1", "t2"} - assert {t["folder"] for t in mine} == {"demo", "other"} - - def test_update_task_status_round_trip(self, store): - t = store.insert_task( - "demo", "1", assignee="x@a.com", created_by="a@a.com", title="t", - ) - ok, _ = store.update_task_status("demo", t["id"], "done") - assert ok - assert store.list_tasks("demo", "1")[0]["status"] == "done" - - def test_update_unknown_task_returns_false(self, store): - ok, msg = store.update_task_status("demo", "999", "done") - assert ok is False and msg - def test_table_row_counts_defaults_to_zero(self, store): # The base class returns zero for every requested table — only # Lakebase overrides this. Ensures the admin UI can call the @@ -700,13 +510,11 @@ class _ScriptedCursor: """ def __init__(self, script): - # script: list of dicts with keys: contains, fetchone, fetchall, - # rowcount + # script: list of dicts with keys: contains, fetchone, fetchall self._script = list(script) self.executed = [] # captured (sql, params) tuples self._next_one = None self._next_all = [] - self.rowcount = 0 def __enter__(self): return self @@ -721,13 +529,11 @@ def execute(self, sql, params=None): entry["_used"] = True self._next_one = entry.get("fetchone") self._next_all = entry.get("fetchall", []) - self.rowcount = entry.get("rowcount", 0) return # Default to "no row" so unscripted queries don't accidentally # return stale data from the previous script entry. self._next_one = None self._next_all = [] - self.rowcount = 0 def fetchone(self): return self._next_one @@ -741,9 +547,7 @@ def __init__(self, cursor): self._cursor = cursor self.closed = False - def cursor(self, *args, **kwargs): - # Accept ``row_factory=dict_row`` (used by the list/insert paths) - # while staying compatible with the no-arg callers. + def cursor(self): return self._cursor def close(self): @@ -1264,197 +1068,3 @@ def test_distinct_databases_have_distinct_cache_entries(self, monkeypatch): assert first == ("c1", "s1", "v1") assert second == ("c2", "s2", "v2") - - -# --------------------------------------------------------------------- -# Lakebase collaborative comments + tasks — real SQL code paths -# -# The in-memory fake above proves the *contract*; these tests drive the -# concrete Lakebase implementation (row mappers, the lazy -# ``_ensure_collab_tables`` short-circuit, and the rowcount-based -# not-found handling) without a real Postgres, via the scripted cursor. -# --------------------------------------------------------------------- - - -from datetime import datetime # noqa: E402 - - -def _collab_store(monkeypatch, cur): - """A Lakebase store whose ``_connect`` yields *cur* and whose collab - tables are already marked present (skips the lazy DDL probe). - """ - from contextlib import contextmanager - - store = _make_lakebase_store(monkeypatch) - store._registry_id = "rid-1" # skip registry-id resolution - store._collab_tables_ready = True # skip the ensure/CREATE probe - - @contextmanager - def fake_connect(): - yield _ScriptedConn(cur) - - monkeypatch.setattr(store, "_connect", fake_connect) - return store - - -class TestLakebaseCollab: - def test_ensure_collab_tables_short_circuits_when_present(self, monkeypatch): - from contextlib import contextmanager - - store = _make_lakebase_store(monkeypatch) - store._registry_id = "rid-1" - cur = _ScriptedCursor( - [{"contains": "information_schema.tables", "fetchone": (1,)}] - ) - - @contextmanager - def fake_connect(): - yield _ScriptedConn(cur) - - monkeypatch.setattr(store, "_connect", fake_connect) - - assert store._ensure_collab_tables() is True - assert store._collab_tables_ready is True - # Table already exists → must NOT issue any CREATE TABLE. - assert not any("CREATE TABLE" in s for s, _ in cur.executed) - - def test_insert_comment_maps_returning_row(self, monkeypatch): - cur = _ScriptedCursor( - [ - { - "contains": "INSERT INTO", - "fetchone": { - "id": "c-1", "version": "2", - "parent_id": None, - "author": "a@a.com", "body": "rename", - "resolved": False, - "created_at": datetime(2026, 1, 1, 0, 0, 0), - }, - } - ] - ) - store = _collab_store(monkeypatch, cur) - out = store.insert_comment( - "demo", "2", author="a@a.com", body="rename", - ) - assert out["id"] == "c-1" - assert out["body"] == "rename" - assert out["folder"] == "demo" - assert out["resolved"] is False - assert out["created_at"].startswith("2026-01-01") - - def test_insert_comment_returns_none_when_domain_missing(self, monkeypatch): - # No RETURNING row (unknown domain) → fetchone None → None. - cur = _ScriptedCursor([]) - store = _collab_store(monkeypatch, cur) - assert store.insert_comment( - "ghost", "2", author="a@a.com", body="x", - ) is None - - def test_list_comments_maps_rows_and_filters(self, monkeypatch): - cur = _ScriptedCursor( - [ - { - "contains": "FROM", - "fetchall": [ - { - "id": "c-1", "folder": "demo", "version": "2", - "parent_id": None, "author": "a@a.com", - "body": "hi", "resolved": False, - "created_at": datetime(2026, 1, 1), - } - ], - } - ] - ) - store = _collab_store(monkeypatch, cur) - rows = store.list_comments( - "demo", "2", include_resolved=False, - ) - assert [c["body"] for c in rows] == ["hi"] - # The version + resolved filters must reach the SQL. - sql, params = cur.executed[-1] - assert "c.version = %s" in sql - assert "resolved = false" in sql - assert "2" in params - - def test_resolve_comment_not_found_returns_false(self, monkeypatch): - cur = _ScriptedCursor([{"contains": "UPDATE", "rowcount": 0}]) - store = _collab_store(monkeypatch, cur) - ok, msg = store.resolve_comment("demo", "c-9") - assert ok is False and msg == "Comment not found" - - def test_resolve_comment_success(self, monkeypatch): - cur = _ScriptedCursor([{"contains": "UPDATE", "rowcount": 1}]) - store = _collab_store(monkeypatch, cur) - ok, msg = store.resolve_comment("demo", "c-1", resolved=True) - assert ok is True and msg == "" - _, params = cur.executed[-1] - assert params[0] is True # resolved flag forwarded - - def test_insert_task_maps_returning_row(self, monkeypatch): - cur = _ScriptedCursor( - [ - { - "contains": "INSERT INTO", - "fetchone": { - "id": "t-1", "version": "2", - "assignee": "bob@a.com", "created_by": "a@a.com", - "title": "fix", "description": "", "status": "open", - "due_date": None, "comment_id": "c-1", - "created_at": datetime(2026, 1, 1), - "updated_at": datetime(2026, 1, 1), - }, - } - ] - ) - store = _collab_store(monkeypatch, cur) - out = store.insert_task( - "demo", "2", assignee="bob@a.com", created_by="a@a.com", - title="fix", comment_id="c-1", - ) - assert out["id"] == "t-1" - assert out["assignee"] == "bob@a.com" - assert out["comment_id"] == "c-1" - assert out["status"] == "open" - assert out["due_date"] == "" - - def test_list_tasks_for_assignee_maps_rows(self, monkeypatch): - cur = _ScriptedCursor( - [ - { - "contains": "lower(t.assignee) = lower(%s)", - "fetchall": [ - { - "id": "t-1", "folder": "demo", "version": "2", - "assignee": "bob@a.com", "created_by": "a@a.com", - "title": "fix", "description": "", "status": "open", - "due_date": None, "comment_id": None, - "created_at": datetime(2026, 1, 1), - "updated_at": datetime(2026, 1, 1), - } - ], - } - ] - ) - store = _collab_store(monkeypatch, cur) - rows = store.list_tasks_for_assignee("BOB@a.com") - assert [t["title"] for t in rows] == ["fix"] - assert rows[0]["folder"] == "demo" - _, params = cur.executed[-1] - assert params == ("rid-1", "BOB@a.com") - - def test_update_task_status_not_found(self, monkeypatch): - cur = _ScriptedCursor([{"contains": "UPDATE", "rowcount": 0}]) - store = _collab_store(monkeypatch, cur) - ok, msg = store.update_task_status("demo", "t-9", "done") - assert ok is False and msg == "Task not found" - - def test_update_task_status_success(self, monkeypatch): - cur = _ScriptedCursor([{"contains": "UPDATE", "rowcount": 1}]) - store = _collab_store(monkeypatch, cur) - ok, _ = store.update_task_status("demo", "t-1", "in_progress") - assert ok is True - sql, params = cur.executed[-1] - assert "SET status = %s" in sql - assert params[0] == "in_progress" diff --git a/tests/units/registry/test_review_service.py b/tests/units/registry/test_review_service.py index 31da1a41..13f3dfd2 100644 --- a/tests/units/registry/test_review_service.py +++ b/tests/units/registry/test_review_service.py @@ -7,7 +7,6 @@ """ import importlib -from types import SimpleNamespace import pytest from unittest.mock import MagicMock, patch @@ -19,8 +18,6 @@ NotFoundError, ValidationError, ) -from back.objects.digitaltwin._build_pipeline import _BuildPipeline -from back.objects.registry.RegistryService import RegistryService from back.objects.registry.PermissionService import ( ROLE_ADMIN, ROLE_BUILDER, @@ -143,76 +140,6 @@ def test_submit_wrong_status_conflicts(): user_domain_role=ROLE_NONE) -def _build_pipeline_for(folder, version): - """A `_BuildPipeline` whose `_persist_last_build` derives *folder* and - *version* the same way the real interactive/API build does.""" - domain = SimpleNamespace( - info={"name": folder}, - uc_domain_folder=folder, - current_version=version, - last_build="", - ) - return _BuildPipeline( - tm=MagicMock(), - task_id="task-fix", - domain=domain, - settings={}, - domain_snap=SimpleNamespace(current_version=version), - host="host", - token="token", - warehouse_id="wh-1", - view_table="cat.schema.view", - graph_name="g1", - r2rml_content="", - base_uri="http://ex/", - mapping_config={}, - ontology_config={}, - delta_cfg={}, - build_kind="session", - ) - - -def test_interactive_build_unblocks_submit_gate(): - """Regression for the 0.5.1 fix: an interactive build that stamps - `last_build` on the registry flips the Submit gate from blocked to - allowed. Before the fix the build never wrote the registry field, so a - healthy DRAFT stayed blocked with the "never been built" banner. - - The build's `_persist_last_build` and `ReviewService.review_detail` are - wired to the *same* registry service so the stamp the build writes is the - field the gate reads.""" - svc, info, _ = _make_svc(status="DRAFT", last_build="") - - # Gate starts blocked: the version has no recorded build. - blocked = _call("review_detail", svc, - user_role="", user_domain_role=ROLE_BUILDER) - assert blocked["actions"]["can_submit"] is False - assert "never been built" in blocked["actions"]["submit_blocked_reason"] - - # The build stamps last_build via update_last_build -> mutate the shared - # registry record (mirrors the real single-column UPDATE). - def _stamp(folder, version, ts): - info["last_build"] = ts - return True, "" - - svc.update_last_build.side_effect = _stamp - - pipe = _build_pipeline_for("acme", "2") - with patch.object(RegistryService, "from_context", return_value=svc): - pipe._persist_last_build("2026-06-19T10:00:00+00:00") - - svc.update_last_build.assert_called_once_with( - "acme", "2", "2026-06-19T10:00:00+00:00" - ) - assert info["last_build"] == "2026-06-19T10:00:00+00:00" - - # Gate now open for the builder. - unblocked = _call("review_detail", svc, - user_role="", user_domain_role=ROLE_BUILDER) - assert unblocked["actions"]["can_submit"] is True - assert unblocked["actions"]["submit_blocked_reason"] == "" - - # ---------------------------------------------------------------------- # Sign-off # ---------------------------------------------------------------------- @@ -811,54 +738,3 @@ def test_my_tasks_raises_when_domain_listing_fails(): svc.list_domain_details_cached.return_value = (False, [], "boom") with pytest.raises(InfrastructureError): _call_my_tasks(svc) - - -# ---------------------------------------------------------------------- -# My Tasks — assigned collaborative tasks merged into the worklist -# ---------------------------------------------------------------------- - - -def test_my_tasks_includes_assigned_open_and_in_progress(): - svc = _my_tasks_svc([]) # no review actions, only assigned tasks - svc.list_tasks_for_assignee.return_value = [ - {"id": "1", "folder": "acme", "version": "2", "title": "fix", - "status": "open", "assignee": "alice@acme.com"}, - {"id": "2", "folder": "acme", "version": "2", "title": "wip", - "status": "in_progress", "assignee": "alice@acme.com"}, - ] - result = _call_my_tasks(svc) - assert result["success"] is True - assert result["tasks"] == [] - assert [t["id"] for t in result["assigned_tasks"]] == ["1", "2"] - svc.list_tasks_for_assignee.assert_called_once_with("alice@acme.com") - - -def test_my_tasks_assigned_filters_done_and_cancelled(): - svc = _my_tasks_svc([]) - svc.list_tasks_for_assignee.return_value = [ - {"id": "1", "status": "open"}, - {"id": "2", "status": "done"}, - {"id": "3", "status": "cancelled"}, - {"id": "4", "status": "in_progress"}, - ] - result = _call_my_tasks(svc) - assert [t["id"] for t in result["assigned_tasks"]] == ["1", "4"] - - -def test_my_tasks_assigned_resilient_when_backend_errors(): - svc = _my_tasks_svc([]) - svc.list_tasks_for_assignee.side_effect = RuntimeError("tasks table missing") - result = _call_my_tasks(svc) - # Worklist still succeeds; the assigned section degrades to empty. - assert result["success"] is True - assert result["assigned_tasks"] == [] - - -def test_my_tasks_assigned_empty_without_email(): - svc = _my_tasks_svc([]) - svc.list_tasks_for_assignee.return_value = [{"id": "1", "status": "open"}] - # app_role "" short-circuits roles to admin, but an empty email must - # skip the assignee lookup entirely. - result = _call_my_tasks(svc, email="") - assert result["assigned_tasks"] == [] - svc.list_tasks_for_assignee.assert_not_called() diff --git a/uv.lock b/uv.lock index 8a032322..42177a8f 100644 --- a/uv.lock +++ b/uv.lock @@ -12,14 +12,11 @@ resolution-markers = [ [manifest] constraints = [ - { name = "aiohttp", specifier = ">=3.14.1" }, - { name = "cryptography", specifier = ">=48.0.1" }, + { name = "aiohttp", specifier = ">=3.14.0" }, { name = "gitpython", specifier = ">=3.1.50" }, { name = "idna", specifier = ">=3.13" }, { name = "mako", specifier = ">=1.3.12" }, { name = "pygments", specifier = ">=2.20.0" }, - { name = "pyjwt", specifier = ">=2.10.1" }, - { name = "torch", specifier = ">=2.7.0" }, { name = "urllib3", specifier = ">=2.7.0" }, ] @@ -33,9 +30,9 @@ resolution-markers = [ dependencies = [ { name = "caio", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/67/e2/d7cb819de8df6b5c1968a2756c3cb4122d4fa2b8fc768b53b7c9e5edb646/aiofile-3.9.0.tar.gz", hash = "sha256:e5ad718bb148b265b6df1b3752c4d1d83024b93da9bd599df74b9d9ffcf7919b", upload-time = "2024-10-08T10:39:35.846Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/e2/d7cb819de8df6b5c1968a2756c3cb4122d4fa2b8fc768b53b7c9e5edb646/aiofile-3.9.0.tar.gz", hash = "sha256:e5ad718bb148b265b6df1b3752c4d1d83024b93da9bd599df74b9d9ffcf7919b", size = 17943, upload-time = "2024-10-08T10:39:35.846Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/50/25/da1f0b4dd970e52bf5a36c204c107e11a0c6d3ed195eba0bfbc664c312b2/aiofile-3.9.0-py3-none-any.whl", hash = "sha256:ce2f6c1571538cbdfa0143b04e16b208ecb0e9cb4148e528af8a640ed51cc8aa", upload-time = "2024-10-08T10:39:32.955Z" }, + { url = "https://files.pythonhosted.org/packages/50/25/da1f0b4dd970e52bf5a36c204c107e11a0c6d3ed195eba0bfbc664c312b2/aiofile-3.9.0-py3-none-any.whl", hash = "sha256:ce2f6c1571538cbdfa0143b04e16b208ecb0e9cb4148e528af8a640ed51cc8aa", size = 19539, upload-time = "2024-10-08T10:39:32.955Z" }, ] [[package]] @@ -52,32 +49,32 @@ resolution-markers = [ dependencies = [ { name = "caio", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/48/41/2fea7e193e061ce54eacc3b7bc0e6a99e4fcff43c78cf0a76dd781ed8334/aiofile-3.11.1.tar.gz", hash = "sha256:1f91912c6643d2a4e49ca4ae3514f0bf3867ce948a36d99a6411b8f4755f4cf9", upload-time = "2026-05-16T08:18:33.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/48/41/2fea7e193e061ce54eacc3b7bc0e6a99e4fcff43c78cf0a76dd781ed8334/aiofile-3.11.1.tar.gz", hash = "sha256:1f91912c6643d2a4e49ca4ae3514f0bf3867ce948a36d99a6411b8f4755f4cf9", size = 19342, upload-time = "2026-05-16T08:18:33.538Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/67/cd/0d76dfc5de72bde52f55f53e925c7d152d9c7906634ec1e0cbc7e8d4ad93/aiofile-3.11.1-py3-none-any.whl", hash = "sha256:ce77d14ac07f77bc2b757834a5c129321f3f705c474593deed5ab209079a52c9", upload-time = "2026-05-16T08:18:32.051Z" }, + { url = "https://files.pythonhosted.org/packages/67/cd/0d76dfc5de72bde52f55f53e925c7d152d9c7906634ec1e0cbc7e8d4ad93/aiofile-3.11.1-py3-none-any.whl", hash = "sha256:ce77d14ac07f77bc2b757834a5c129321f3f705c474593deed5ab209079a52c9", size = 20446, upload-time = "2026-05-16T08:18:32.051Z" }, ] [[package]] name = "aiofiles" version = "25.1.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/41/c3/534eac40372d8ee36ef40df62ec129bee4fdb5ad9706e58a29be53b2c970/aiofiles-25.1.0.tar.gz", hash = "sha256:a8d728f0a29de45dc521f18f07297428d56992a742f0cd2701ba86e44d23d5b2", upload-time = "2025-10-09T20:51:04.358Z" } +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://pypi-proxy.dev.databricks.com/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl", hash = "sha256:abe311e527c862958650f9438e859c1fa7568a141b22abcd015e120e86a85695", upload-time = "2025-10-09T20:51:03.174Z" }, + { 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.6.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", upload-time = "2025-03-12T01:42:48.764Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", upload-time = "2025-03-12T01:42:47.083Z" }, + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, ] [[package]] name = "aiohttp" -version = "3.14.1" +version = "3.14.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -90,126 +87,126 @@ dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.13'" }, { name = "yarl" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/82/78/8ea7308cac6934de8c74a14f3d5f65d1c89287426688be79538d0e5c013d/aiohttp-3.14.1.tar.gz", hash = "sha256:307f2cff90a764d329e77040603fa032db89c5c24fdad50c4c15334cba744035", upload-time = "2026-06-07T21:09:35.529Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/67/58ded4b3f2e10f94972d8928050c85330e249a31dd45a0e5f3c0e9c3fa05/aiohttp-3.14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8f6bb621e5863cfe8fe5ff5468002d200ec31f30f1280b259dc505b02595099e", upload-time = "2026-06-07T21:05:37.471Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/68/4ae5b4e08943f316594bb68da89957d3baf5760588fa09509594bd777e4b/aiohttp-3.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f7215cb3933784f79ed20e5f050e15984f390424339b22375d5a53c933a0491", upload-time = "2026-06-07T21:05:40.751Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cb/c1/316c8f3549dbe5245f92bfd523ec6f32dd4d98cafe21df3f6a19b1184c75/aiohttp-3.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d9d4e294455b23a68c9b8f042d0e8e377a265bcb15332753695f6e5b6819e0ce", upload-time = "2026-06-07T21:05:42.111Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5a/ee/fb0ac28684e8d753b83c8a4eebc19a5846912aa0a4daaabb6a9936363840/aiohttp-3.14.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b238af795833d5731d049d82bc84b768ae6f8f97f0495963b3ed9935c5901cc3", upload-time = "2026-06-07T21:05:43.427Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3b/57/aa2beab673331f111885db8a7b69dfe3ab0e53e446a0ace18ca694b4dc58/aiohttp-3.14.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e4e5e0ae56914ecdbf446493addefc0159053dd53962cef37d7839f37f73d505", upload-time = "2026-06-07T21:05:44.897Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/47/ea/dad128abe365e79be03b16ed464198ac73e0d257e8260c6f7d6f31cbef26/aiohttp-3.14.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:092e4ce3619a7c6dee52a6bdabda973d9b34b66781f840ce93c7e0cec30cf521", upload-time = "2026-06-07T21:05:46.405Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/63/f3/b5b4e10327cb85d34d24232c6b71b64602f190b3ccb238a043ac6b187dac/aiohttp-3.14.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb33777ea21e8b7ecde0e6fc84f598be0a1192eab1a63bc746d75aa75d38e7bd", upload-time = "2026-06-07T21:05:47.844Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-06-07T21:05:49.982Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/29/c4/93067c85a0373492ce8e577435203c5947c454af074ac48ed4f3a1b9dd4a/aiohttp-3.14.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:57fc6745a4b7d0f5a9eb4f40a69718be6c0bc1b8368cc9fe89e90118719f4f42", upload-time = "2026-06-07T21:05:51.431Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c4/39/9ff91aaf02af8b7b8222a987466da539f154c3e01732c22b5f5a20a8ee66/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6fd35beba67c4183b09375c5fff9accb47524191a244a99f95fd4472f5402c2b", upload-time = "2026-06-07T21:05:53.109Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/e4/77452a3676b8d99ac1375f77691d6bf65ea6e9f4b201b82ef77c916dc767/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:672b9d65f42eb877f5c3f234a4547e4e1a226ca8c2eed879bb34670a0ce51192", upload-time = "2026-06-07T21:05:54.902Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7d/84/b0059a7c7fc05ea23f3bc1596ba91c12f79588b9450564a24cac37536d0a/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:24ba13339fed9251d9b1a1bec8c7ab84c0d1675d79d33501e11f94f8b9a84e05", upload-time = "2026-06-07T21:05:56.458Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8f/3a/e2a513ecbfc362591caa51a7f7e011b3bfc8938b388ae44cd95560d36999/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:94da27378da0610e341c4d30de29a191672683cc82b8f9556e8f7c7212a020fe", upload-time = "2026-06-07T21:05:57.953Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a1/10/08f1654f538f93d36dcac66310a06eefce4641cdafca83f9f0a5317be254/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:52cdac9432d8b4a719f35094a818d95adcae0f0b4fe9b9b921909e0c87de9e7d", upload-time = "2026-06-07T21:05:59.488Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/99/e4/d91b70c57d8b8e9611e4a2e52238ca3698d3dc1c2efe25b7a9bf594ac584/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:672ac254412a24d0d0cf00a9e6c238877e4be5e5fa2d188832c1244f45f31966", upload-time = "2026-06-07T21:06:01.131Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/f1/15340176f35ff61b95dbe34020bcf43f9e624a2d7bbac934715ff97d2033/aiohttp-3.14.1-cp310-cp310-win32.whl", hash = "sha256:2fe3607e71acc6ebb0ec8e492a247bf7a291226192dc0084236dfc12478916f6", upload-time = "2026-06-07T21:06:02.86Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c3/c2/a2f1ec5b37f903109e43ae2862268cfe4a67a60c1b2cf43169fcdff5995f/aiohttp-3.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:30099eda75a53c32efb0920e9c33c195314d2cc1c680fbfd30894932ac5f27df", upload-time = "2026-06-07T21:06:04.666Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d0/7a/7b56f6732ef79530afaa72aa335d41b67c8d79b946995f0b11ad72985435/aiohttp-3.14.1-cp310-cp310-win_arm64.whl", hash = "sha256:5a837f49d901f9e368651b676912bff1104ed8c1a83b280bcd7b29adccef5c9c", upload-time = "2026-06-07T21:06:06.322Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/26/dd/bf526e6f0a1120dd6f2df2e97bacfe4d358f13d17a0ff5847301a1375a51/aiohttp-3.14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aa00140699487bd435fde4342d85c94cb256b7cd3a5b9c3396c67f19922afda2", upload-time = "2026-06-07T21:06:07.957Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8f/e1/a2872aa55495a70f61310d411541c6ee23812d9a884e000c716e1bc3edbf/aiohttp-3.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c1af67559445498b502030c35c59db59966f47041ca9de5b4e707f86bd10b5f", upload-time = "2026-06-07T21:06:09.749Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5b/e7/c60c7b209e509cc787de3cea0550a518538cfc08003e1c1e14c1c63fff71/aiohttp-3.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d44ec478e713ee7f29b439f7eb8dc2b9d4079e11ae114d2c2ac3d5daf30516c8", upload-time = "2026-06-07T21:06:11.26Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5b/8d/614ace2f579702c9840ab1e1447fd8509e35b0b904f7196418fa2f57b25d/aiohttp-3.14.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d3b1a184a9a8f548a6b73f1e26b96b052193e4b3175ed7342aaf1151a1f00a04", upload-time = "2026-06-07T21:06:12.887Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/e0/726e90f99542bf292f81a96a12cc4847deb86f3ccf62c6f4014a201f4d33/aiohttp-3.14.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5f2504bc0322437c9a1ff6d3333ca56c7477b727c995f036b976ae17b98372c8", upload-time = "2026-06-07T21:06:14.564Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/4b/d176d5c4db9d33dacf0543102ea59503bc1d528af4cfd0b719949ca49389/aiohttp-3.14.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:73f05ea02013e02512c3bf42714f1208c57168c779cc6fe23516e4543089d0a6", upload-time = "2026-06-07T21:06:16.228Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dc/d6/5a99b563690ea0cbed912ae94a2ce33993a5709a651a3a4fe761e7dd973a/aiohttp-3.14.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:797457503c2d426bee06eef808d07b31ede30b65e054444e7de64cad0061b7af", upload-time = "2026-06-07T21:06:17.947Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-06-07T21:06:19.677Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/1a/420e5c85a3e73349372ed22ce0b6af86bfa6ce16a4b20a64a2e94608c781/aiohttp-3.14.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4cd96b5ba05d67ed0cf00b5b405c8cd99586d8e3481e8ee0a831057591af7621", upload-time = "2026-06-07T21:06:22.558Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/80/18a592ed3be0a402cc03670bd72ee1f8563ddbe1d8d5542dbf868f274136/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d459b98a932296c6f0e94f87511a0b1b90a8a02c30a50e60a297619cd5a58ee", upload-time = "2026-06-07T21:06:24.8Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ec/0b/8b3d5713373858ff71a617daf6e3b0e81ad63e79d09a3cf2f6b6b983939c/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:764457a7be60825fb770a644852ff717bcbb5042f189f2bd16df61a81b3f6573", upload-time = "2026-06-07T21:06:26.528Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/49/fd564575cf225821d7ba5a117cb8bc27213d8a7e1811162afb43ae077039/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f7a16ef45b081454ef844502d87a848876c490c4cb5c650c230f6ec79ed2c1e7", upload-time = "2026-06-07T21:06:28.297Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ed/1b/e850c9ae6fc91356552ae668bb6c51e93fa29c8aef13398a10b56678557f/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2fbc3ed048b3475b9f0cbcb9978e9d2d3511acd91ead203af26ed9f0056004cf", upload-time = "2026-06-07T21:06:30.242Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/eb/94/3c337ba72451a89806ace6f75bddc92bafc5b8d53d90115a512858024b63/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bedb0cd073cc2dc035e30aeb99444389d3cd2113afe4ef9fcd23d439f5bade85", upload-time = "2026-06-07T21:06:31.943Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2b/9c/9c18cf367a0498212d9ba7daf990b504a5e8ae064cda4b504e2647c89c03/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b6feea921016eb3d4e04d65fc4e9ca402d1a3801f562aef94989f54694917af3", upload-time = "2026-06-07T21:06:33.72Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/63/a251a9d2a6cb45065b2ddc0bde2b3dd10108740a9a42f632c66405a761a2/aiohttp-3.14.1-cp311-cp311-win32.whl", hash = "sha256:313701e488100074ce99850404ee36e741abf6330179fec908a1944ecf570126", upload-time = "2026-06-07T21:06:35.279Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/17/ca/69274c51dcd6e8947d77b2806cf47a4a15f2c846e2cbeb1882547d3da283/aiohttp-3.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:03ab4530fdcb3a543a122ba4b65ac9919da9fe9f78a03d328a6e38ff962f7aa5", upload-time = "2026-06-07T21:06:36.824Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2c/8a/c25904f77690c3688ec140f87591ef11a0cfe36bf3d5c0f1f38056fb62b3/aiohttp-3.14.1-cp311-cp311-win_arm64.whl", hash = "sha256:486f7d16ed54c39c2cbd7ca71fd8ba2b8bb7860df65bd7b6ed640bab96a38a8b", upload-time = "2026-06-07T21:06:38.371Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1d/21/151624b51cd92553d95424daf4bf19f19ce9be9002d19253e7e7ce67197b/aiohttp-3.14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d35143e27778b4bb0fb189562d7f275bff79c62ab8e98459717c0ea617ff2480", upload-time = "2026-06-07T21:06:40.311Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/82/280619e0bd7bf2454987e19282616e84762255dd9c8468f62382e8c191f1/aiohttp-3.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bcfb80a2cc36fba2534e5e5b5264dc7ae6fcd9bf15256da3e53d2f499e6fa29d", upload-time = "2026-06-07T21:06:42.207Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/55/b2/2aac325583aaa1353045f96dffa586d8a34e8322e14a7ba49cffeb103ab4/aiohttp-3.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27fd7c91e51729b4f7e1577865fa6d34c9adccbc39aabe9000285b48af9f0ec2", upload-time = "2026-06-07T21:06:43.813Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8a/72/a60607cb849faa8af8a356c9329ea2eb6f395d49e82cc82ccba1fd8deb8f/aiohttp-3.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:64c567bf9eaf664280116a8688f63016e6b32db2505908e2bdaca1b6438142f2", upload-time = "2026-06-07T21:06:45.391Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/d3/d9fe1c9ec7557ab4d0d82bebaa728c6418f0b93295ec2f4ab015f7710cc7/aiohttp-3.14.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f5e6ff2bdbb8f4cd3fbe41f99e25bbcd58e3bf9f13d3dd31a11e7917251cc77a", upload-time = "2026-06-07T21:06:47.413Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c1/dc/f2cecfaf9337ba3e63f181500814ff502aa3d00d9c7ec93a9d23d10a27b2/aiohttp-3.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2f73e01dc37122325caf079982621262f96d74823c179038a82fddfc50359264", upload-time = "2026-06-07T21:06:50.165Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/d7/2ff65c5e65c0d7476daf7e15c032e0805e36811185b9623e3238ad6c763e/aiohttp-3.14.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb2c0c80d431c0d03f2c7dbf125150fedd4f0de17366a7ca33f7ccb822391842", upload-time = "2026-06-07T21:06:52.035Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-06-07T21:06:54.049Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4d/aa/bf04cb4d865fc6101c2229a294ad744973b72e513fdc5a6b791e6983d72a/aiohttp-3.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:686b6c0d3911ec387b444ddf5dc62fb7f7c0a7d5186a7861626496a5ab4aff95", upload-time = "2026-06-07T21:06:55.911Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dc/b4/4dac0038960427ba832f6609dfb4ea5437d7fd80c72001b9e48f834f428b/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c6fa4dc7ad6f8109c70bb1499e589f76b0b792baf39f9b017eb92c8a81d0a199", upload-time = "2026-06-07T21:06:57.777Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2b/f9/7cd4e8ad7aa3b75f17d56bb5498dd604a93d4e6eece822ba0568c413fff0/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:87a5eea1b2a5e21e1ebdbb33ad4165359189327e63fc4e4894693e7f821ac817", upload-time = "2026-06-07T21:07:00.009Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/df/fc01d9fcad0f73fed3f3d361f1f94f975947b50dff82919f6dc2bf4316cc/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c1421eb01d4fd608d88cc8290211d177a58532b55ad94076fb349c5bf467f0a", upload-time = "2026-06-07T21:07:02.064Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/41/09/47e2d090bddcc8fb4ccb4c314aadc32d7c5d9bb55f50f6ad1c92fc15d501/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:34b257ec41345c1e8f2df68fa908a7952f5de932723871eb633ecbbff396c9a4", upload-time = "2026-06-07T21:07:03.942Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/36/f1a4ce904ae0b6930cfe9afc96d0896f7ec1a620c400405d63783bb95a9c/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:de538791a80e5d862addbc183f70f0158ac9b9bb872bb147f1fd2a683691e087", upload-time = "2026-06-07T21:07:05.987Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/70/0a/e0075ce9ca0279ee1d4f0c0b85f54fea02ebc83c3007651a72bece658fec/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f71173be42d3241d428f760122febb748de0623f44308a6f120d0dd9ec572e3", upload-time = "2026-06-07T21:07:07.873Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3e/61/a0c0a8f327a9c52095cdd8e312391b00d3ed64ab6c72bb5c33d8ec251cf7/aiohttp-3.14.1-cp312-cp312-win32.whl", hash = "sha256:ec8dc383ee57ea3e883477dcca3f11b65d58199f1080acaf4cd6ad9a99698be4", upload-time = "2026-06-07T21:07:09.669Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/d9/ea367c75f16ac9c6cdc8febb25e8318fa21a2b1bc8d6514d4b2d890bface/aiohttp-3.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2aa92c87868cd13674989f9ee83e5f9f7ea4237589b728048e1f0c8f6caa3271", upload-time = "2026-06-07T21:07:11.538Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/64/8d96784a7851156db8a4c6c3f6f91042fdf39fb15a4cc38c8b3c14833c45/aiohttp-3.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:2c840c90759922cb5e6dda94596e079a30fb5a5ba548e7e0dc00574703940847", upload-time = "2026-06-07T21:07:13.637Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/97/bd137012dd97e1649162b099135a80e1fd59aaa807b2430fc448d1029aff/aiohttp-3.14.1-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:b3a03285a7f9c7b016324574a6d92a1c895da6b978cb8f1deee3ac72bc6da178", upload-time = "2026-06-07T21:07:15.501Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ef/79/e5cc690e9d922a66887ceeaca53a8ffd5a7b0be3816142b7abc433742d89/aiohttp-3.14.1-cp313-cp313-android_21_x86_64.whl", hash = "sha256:2a73f487ab8ef5abbb24b7aa9b73e98eaba9e9e031804ff2416f02eca315ccaf", upload-time = "2026-06-07T21:07:17.53Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/22/a73ccbf9dbd6e26dda0b24d5fd5db7da92ee3383a79f47677ffb834c5c5b/aiohttp-3.14.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:915fbb7b41b115192259f8c9ae58f3ddc444d2b5579917270211858e606a4afd", upload-time = "2026-06-07T21:07:19.555Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3b/b9/57ed8eaf596321c2ad747bd480fb1700dbd7177c60dfc9e4c187f629662e/aiohttp-3.14.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:7fb4bdf95b0561a79f259f9d28fbc109728c5ee7f27aff6391f0ca703a329abe", upload-time = "2026-06-07T21:07:21.581Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/78/c0/5ebe5270a7c140d7c6f79dcb018640225f14d406c149e4eec04a7d82fe71/aiohttp-3.14.1-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1b9748363260121d2927704f5d4fc498150669ca3ae93625986ee89c8f80dcd4", upload-time = "2026-06-07T21:07:23.388Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/75/7f/8cdaa24fc7983865e0915153b96a9ac5bcdd3548d64c5a27d17cecccad2d/aiohttp-3.14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:86a6dab78b0e43e2897a3bbe15745aa60dc5423ca437b7b0b164c069bf91b876", upload-time = "2026-06-07T21:07:25.046Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/f4/c4227aacfacc5cb0cc2d119b65301d177912a6842cd64e120c47af76064f/aiohttp-3.14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4dfd6e47d3c44c2279907607f73a4240b88c69eb8b90da7e2441a8045dfd21da", upload-time = "2026-06-07T21:07:27.28Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ab/01/a2d5f96cd4e74424864d30bc0a7e44d0a12dacdcfa91b5b2d1bd3dca6bf3/aiohttp-3.14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:317acd9f8602858dc7d59679812c376c7f0b97bcbbf16e0d6237f54141d8a8a6", upload-time = "2026-06-07T21:07:29.252Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e8/ed/3c0fb5c500fdd8e7ebc10d1889c04384fffa1a9163eac1356088ca9da1b1/aiohttp-3.14.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd869c427324e5cb15195793de951295710db28be7d818247f3097b4ab5d4b96", upload-time = "2026-06-07T21:07:31.03Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/ab/d4c924d9bd5be3050c226612413ce68cb54c70d2c31b661bfc8d9a5b6a70/aiohttp-3.14.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:93b032b5ec3255473c143627d21a69ac74ae12f7f33974cb587c564d11b1066f", upload-time = "2026-06-07T21:07:33.031Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/2a/37326821ff779084020cdc33224d20b19f42f4183a500ff92022a739eda7/aiohttp-3.14.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f234b4deb12f3ad59127e037bc57c40c21e45b45282df7d3a55a0f409f595296", upload-time = "2026-06-07T21:07:35.003Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/4f/6e947ba73e4ce09070761c05ed3a8ceb7c21f5e46798671d8b2aac0e4626/aiohttp-3.14.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9af6779bfb46abf124068327abcdf9ce95c9ef8287a3e8da76ccf2d0f16c28fa", upload-time = "2026-06-07T21:07:36.956Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9d/6e/dbf1d0625dc711fb2851f4f3c3055c39ed58bae92082d8c627dbe6013736/aiohttp-3.14.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:faccab372e66bc76d5731525e7f1143c922271725b9d38c9f97edcc66266b451", upload-time = "2026-06-07T21:07:39.063Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/44/c2/5e25098a67268ed369483ae7d1a58bd0a13d03aab860d2a0e4a6eb25b046/aiohttp-3.14.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f380468b09d2a81633ee863b0ec5648d364bd17bb8ecfb8c2f387f7ac1faf42c", upload-time = "2026-06-07T21:07:41.058Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/bd/cf9cee17e140f942a3de73e658a543aa8fbf35a5fc67a9d2538d52d77f0b/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:97e704dcd26271f5bda3fa07c3ce0fb76d6d3f8659f4baa1a24442cc9ba177ca", upload-time = "2026-06-07T21:07:43.014Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/6d/5684f8c59045c96f81a18cefbc1fbbd79d25b88f1c622f2a5c5c08fcb632/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:269b76ac5394092b95bc4a098f4fc6c191c083c3bd12775d1e30e663132f6a09", upload-time = "2026-06-07T21:07:45.933Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a8/40/35caf3170f8359760740a7d9aa0fff2e344bef98e1d1186f5a0f6dec17e6/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c0b3e614340c889d575451696374c9d17affd54cd607ca0babed8f8c37b9397", upload-time = "2026-06-07T21:07:48.047Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/a1/b0c61e7a137f0d81de49a82023a6df73c3c16d6fefb0f8e4a93d21639002/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5663ee9257cfa1add7253a7da3035a02f31b6600ec48261585e1800a81533080", upload-time = "2026-06-07T21:07:50.069Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/41/194ea4623693009fcefebef7aef63c141754f153e9cd0d39d3b9e36c175c/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:603a2c834142172ffddc054067f5ec0ca65d57a0aa98a71bc81952573208e345", upload-time = "2026-06-07T21:07:52.106Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ba/45/4de841f005cfe1fd63e2a2fe011262c515e2a62aa6994b15947e7d717ac9/aiohttp-3.14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cb21957bb8aca671c1765e32f58164cf0c50e6bf41c0bbbd16da20732ecaf588", upload-time = "2026-06-07T21:07:54.113Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e4/ae/dbce10533d3896d544d5053939ed75b7dc31a1b0973d959b1b5ae21028d6/aiohttp-3.14.1-cp313-cp313-win32.whl", hash = "sha256:e509a55f681e6158c20f70f102f9cf61fb20fbc382272bc6d94b7343f2582780", upload-time = "2026-06-07T21:07:56.06Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7b/d9/0bf1a19362c32f06229da5e7ddfcec91f93474d6307f7a2d3135e9c674dc/aiohttp-3.14.1-cp313-cp313-win_amd64.whl", hash = "sha256:1ac8531b638959718e18c2207fbfe297819875da46a740b29dfa29beba64355a", upload-time = "2026-06-07T21:07:58.319Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/22/0a/62e7232dc9484fbec112ceb32efb6a624cc7994ec6e2b019286f17c4e8f2/aiohttp-3.14.1-cp313-cp313-win_arm64.whl", hash = "sha256:250d14af67f6b6a1a4a811049b1afa69d61d617fca6bf33149b3ab1a6dbcf7b8", upload-time = "2026-06-07T21:08:00.154Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c4/a1/5fafa04e1ca91ddb47608699d60649c1c6db3cf41c99e78fc4056f9513db/aiohttp-3.14.1-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:7c106c26852ca1c2047c6b80384f17100b4e439af276f21ef3d4e2f450ae7e15", upload-time = "2026-06-07T21:08:02.093Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fa/2e/bfa02f699d87ffc86d5959270b28f1cb410add3ccaced8ed2e0b8a5238fc/aiohttp-3.14.1-cp314-cp314-android_24_x86_64.whl", hash = "sha256:20205f7f5ade7aaec9f4b500549bbc071b046453aed72f9c06dcab87896a83e8", upload-time = "2026-06-07T21:08:04.476Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/85/a5/9594ad6289eebbc97d167c44213d557807f90e59115caad24de21ad2c3b1/aiohttp-3.14.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:62a759436b29e677181a9e76bab8b8f689a29cb9c535f45f7c48c9c830d3f8c3", upload-time = "2026-06-07T21:08:06.377Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b4/61/16a32c36c3c49edec122a3dc811f2057df2f94d3b14aa107c8017d981618/aiohttp-3.14.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:2964cbf553df4d7a57348da44d961d871895fc1ee4e8c322b2a95612c7b17fba", upload-time = "2026-06-07T21:08:08.263Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9b/89/3ebcf96ed99c05bec9c434aaac6963fd3cbab4a786ae739908a144d9ce44/aiohttp-3.14.1-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:237651caadc3a59badd39319c54642b5299e9cc98a3a194310e55d5bb9f5e397", upload-time = "2026-06-07T21:08:10.244Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/3d/b74870a0c2d40c355928cd5b96c7a11fa821b8a40fc41365e64479b151fb/aiohttp-3.14.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:896e12dfdbbab9d8f7e16d2b28c6769a60126fa92095d1ebf9473d02593a2448", upload-time = "2026-06-07T21:08:12.447Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/66/f42f5c984d99e49c6cff5f26f590750f2e2f7ef1fcfb99966ab5be1b632e/aiohttp-3.14.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d03f281ed22579314ba00821ce20115a7c0ac430660b4cc05704a3f818b3e004", upload-time = "2026-06-07T21:08:14.624Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e9/a7/248e1aebe0c7810b0271e021a0f2a5eb6e78a051885b3c9df49f42a5802d/aiohttp-3.14.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:07eabb979d236335fed927e137a928c9adfb7df3b9ec7aa31726f133a62be983", upload-time = "2026-06-07T21:08:16.572Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/26/97/2aa0e5ba0727dc3bd5aaebb7ccbc510f7dfb7fb961ec87497cd496635ab1/aiohttp-3.14.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4fe1f1087cbadb280b5e1bb054a4f00d1423c74d6626c5e48400d871d34ecefe", upload-time = "2026-06-07T21:08:18.635Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/00/8d/e97f6c96c891d457c8479d92a514ba194d0412f981d72c70341ee18488ed/aiohttp-3.14.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:367a9314fdc79dab0fac96e216cb41dd73c85bdca85306ce8999118ba7e0f333", upload-time = "2026-06-07T21:08:20.892Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/e6/aa8d7e863048c8fceb5cd6ce74017311cec3ead07847387e12265fb4444e/aiohttp-3.14.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a24f677ebe83749039e7bdf862ff0bbb16818ae4193d4ef96505e269375bcce0", upload-time = "2026-06-07T21:08:23.044Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/83/a8/72193137de57fda4ebfae4563182d082c8856e3b6e9871d0b46f028fb369/aiohttp-3.14.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c83afe0ba876be7e943d2e0ba645809ad441575d2840c895c21ee5de93b9377a", upload-time = "2026-06-07T21:08:25.288Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a0/18/938441025db6769a3464596b2410af3afde0b21eb2f204c6f766f68af4bd/aiohttp-3.14.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:634e385930fb6d2d479cf3aa66515955863b77a5e3c2b5894ca259a25b308602", upload-time = "2026-06-07T21:08:27.363Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/60/29/bf2496b4065e76e09fe48015aaffe5ce161d8f089b06ac6982070f653076/aiohttp-3.14.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eeea07c4397bbc57719c4eed8f9c284874d4f175f9b6d57f7a1546b976d455ca", upload-time = "2026-06-07T21:08:29.805Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/a2/2136674d52123b1354bd05dd5753c318db47dc0c927cc70b27bab3755456/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:335c0cc3e3545ce98dcb9cfcb836f40c3411f43fa03dab757597d80c89af8a35", upload-time = "2026-06-07T21:08:32.094Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/b9/e5fd2e6f915503081c0f9b1e8540947037929c70c191da2e4d54b31a21a1/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:ae6be797afdef264e8a84864a85b196ca06045586481b3df8a967322fd2fa844", upload-time = "2026-06-07T21:08:34.167Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/63/5a/2833e324a2263e104e31e2e91bc5bbee81bc499afd32203faee048a883f0/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:8560b4d712474335d08907db7973f71912d3a9a8f1dee992ec06b5d2fe359496", upload-time = "2026-06-07T21:08:36.95Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/57/fa/dea6511870913162f3b2e8c42a7614eb203a4540b8c2da43e0bfb0548f3c/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7edd08e0a5deb1e8564a2fcd8f4561014a3f05252334671bbf55ddd47db0e5", upload-time = "2026-06-07T21:08:39.292Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/14/bd/3cf0d55e71784b33534e9710a67d382d900598b4787fbce6cc7317f8c42a/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:b6ff7fcee63287ae57b5df3e4f5957ce032122802509246dec1a5bcc55904c95", upload-time = "2026-06-07T21:08:41.407Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c1/af/14bb5843eccbe234f4dfb78ab73e549d99727247e62ae5d62cbd22eaf5b0/aiohttp-3.14.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6ffbb2f4ec1ceaff7e07d43922954da26b223d188bf30658e561b98e23089444", upload-time = "2026-06-07T21:08:43.795Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/1e/fbeb7af9210a67ac0f9c9bec0f8f4568497924e33137a3d5b48e1cf85f3f/aiohttp-3.14.1-cp314-cp314-win32.whl", hash = "sha256:a9875b46d910cff3ea2f5962f9d266b465459fe634e22556ab9bd6fc1192eea0", upload-time = "2026-06-07T21:08:46.168Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f0/2b/13e8d741a9ec5db7d900c060554cf8352ab85e44e2a4469ebb9d377bda17/aiohttp-3.14.1-cp314-cp314-win_amd64.whl", hash = "sha256:af8b4b81a960eeaf1234971ac3cd0ba5901f3cd42eae42a46b4d089a8b492719", upload-time = "2026-06-07T21:08:48.401Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/30/491acfa2c4d6c3ff59c49a14fc1b50be3241e25bbb0c84c09e2da4d11395/aiohttp-3.14.1-cp314-cp314-win_arm64.whl", hash = "sha256:cf4491381b1b57425c315a56a439251b1bdac07b2275f19a8c44bc57744532ec", upload-time = "2026-06-07T21:08:50.7Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/34/e3/19dbe1a1f4cc6230eb9e314de7fe68053b0992f9302b27d12141a0b5db53/aiohttp-3.14.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:819c054312f1af92947e6a55883d1b66feefab11531a7fc45e0fb9b63880b5c2", upload-time = "2026-06-07T21:08:52.775Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7f/20/1b7182219ba1b108430d6e4dc53d25ae02dcfcf5a045b33af4e8c5167527/aiohttp-3.14.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:10ee9c1753a8f706345b22496c79fbddb5be0599e0823f3738b1534058e25340", upload-time = "2026-06-07T21:08:55Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b9/c8/14ce60ec31a2e5f5274bb17d383a6f7a3aabca31ac04eee05585bbadab16/aiohttp-3.14.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1601cc37baf5750ccacae618ec2daf020769581695550e3b654a911f859c563d", upload-time = "2026-06-07T21:08:57.176Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7e/02/9ac85e081e53da2e061b02fa7758fe0a12d17b8ce2d1f5e6c7cb76730328/aiohttp-3.14.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4d6e0ac9da31c9c04c84e1c0182ad8d6df35965a85cae29cd71d089621b3ae94", upload-time = "2026-06-07T21:08:59.563Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/3e/d3ba07a0ab38b5389e10bec4362d21e10a4f667cba2d79ba30837b3a5059/aiohttp-3.14.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:9e8f2d660c350b3d0e259c7a7e3d9b7fc8b41210cbcc3d4a7076ff0a5e5c2fdc", upload-time = "2026-06-07T21:09:01.909Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/cb/e2ee978a00cfb2df829704a69528b18154eba5939f45bc1efa8f33aee4c5/aiohttp-3.14.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4691802dda97be727f79d86818acaad7eb8e9252626a1d6b519fedbb92d5e251", upload-time = "2026-06-07T21:09:04.357Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/5d/1430334858b1022b58ae50399a918f0bd6fe8fa7fa183598d657ff61e040/aiohttp-3.14.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c389c482a7e9b9dc3ee2701ac46c4125297a3818875b9c305ddb603c04828fd1", upload-time = "2026-06-07T21:09:06.722Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/4e/560c7472d3d198a23aa5c8b19a5115bf6a9b77b7d3e4bb363da320430ad2/aiohttp-3.14.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fc0cacab7ba4e56f0f81c82a98c09bed2f39c940107b03a34b168bdf7597edd3", upload-time = "2026-06-07T21:09:09.011Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0d/f1/4745806578d447db4a784a8591e2dae3afdfc2bcb96f8f81271b13df6543/aiohttp-3.14.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:979ed4717f59b8bb12e3963378fa285d93d367e15bcd66c721311826d3c44a6c", upload-time = "2026-06-07T21:09:11.461Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6a/c9/48255813cca749a229ef0ab476004ec623728ad79a9c0840616f6c076325/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:38e1e7daaea81df51c952e18483f323d878499a1e2bfe564790e0f9701d6f203", upload-time = "2026-06-07T21:09:14.118Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/c0/bbd054e2bee909f529523a5af3891052606af5143c09f5f183ec3b234676/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:4132e72c608fe9fecb8f409113567605915b83e9bdd3ea56538d2f9cd35002f1", upload-time = "2026-06-07T21:09:16.447Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a8/ae/90395d4376deceb74e09ec26b6adf7d2015a6f8802d6d84446af860fef04/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:eefd9cc9b6d4a2db5f00a26bc3e4f9acf71926a6ec557cd56c9c6f27c290b665", upload-time = "2026-06-07T21:09:18.742Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/93/bd/fb25f3049957553d4ce0ba6ae480aa2f592a6985497fca590837d16c1be0/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:b165790117eea512d7f3fb22f1f6dad3d55a7189571993eb015591c1401276d1", upload-time = "2026-06-07T21:09:21.458Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3f/22/7f73303d64dd567ff3addca90b556690ed1233a47b8f55d242fb90af3681/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:ed09c7eb1c391271c2ed0314a51903e72a3acb653d5ccfc264cdf3ef11f8269d", upload-time = "2026-06-07T21:09:23.813Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/44/be/0474c5a8b5640e1e4aa1923430a91f4151be82e511373fe764189b89aef5/aiohttp-3.14.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:99abd37084b82f5830c635fddd0b4993b9742a66eb746dacf433c8590e8f9e3c", upload-time = "2026-06-07T21:09:26.207Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7b/3c/bb4a7cba26956cb3da4553cc2056cf67be5b5ff6e6d8fa4fbdff73bfb7ae/aiohttp-3.14.1-cp314-cp314t-win32.whl", hash = "sha256:47ddf841cdecc810749921d25606dee45857d12d2ad5ddb7b5bd7eab12e4b365", upload-time = "2026-06-07T21:09:28.505Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8a/84/ec80c2c1f66a952555a9f86df6b33af65108a6febfa0471b69013a12f807/aiohttp-3.14.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5e78b522b7a6e27e0b25d19b247b75039ac4c94f99823e3c9e53ae1603a9f7e9", upload-time = "2026-06-07T21:09:30.843Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/71/6e22be134a4061ada85a92951b842f2657f17d926b727f3f94c56ae963d6/aiohttp-3.14.1-cp314-cp314t-win_arm64.whl", hash = "sha256:90d53f1609c29ccc2193945ef732428382a28f78d0456ae4d3daf0d48b74f0f6", upload-time = "2026-06-07T21:09:33.028Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ee/ab/93ce242f899b68c51b0578c027aafa791ab3614cb9345fa5d37b5f5c8e3e/aiohttp-3.14.0.tar.gz", hash = "sha256:2882de819734c715fd1b9c11c97e09fa020d14438203d1d354d8ed1702791c9b", size = 7940674, upload-time = "2026-06-01T19:41:02.763Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/f0/f81190ba488cd106c2fc6d92680e56bb223bbbbf1e6908c2617011290112/aiohttp-3.14.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:692e409052e7436029bbb32977cd7c5bf806ac5fa4085b973996785ffadad33c", size = 760606, upload-time = "2026-06-01T19:36:39.054Z" }, + { url = "https://files.pythonhosted.org/packages/f6/54/444d37eebf0f15db661ca44ec7caf93962f3c5ca92eb4c9a5d888b70aaa2/aiohttp-3.14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:40af7ebe53c7990e110dc4ad03566b12c3ac996254298a3d39046dd69cfcb2c2", size = 514677, upload-time = "2026-06-01T19:36:42.408Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d1/da280e23321c132c0a3fa7c8cc2830621d79174edc64c829443346489a36/aiohttp-3.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02cb2ffbb7da32f82e21ad9952669c45bd88a80e0878264c2f59fe1c6fb2badd", size = 510155, upload-time = "2026-06-01T19:36:44.072Z" }, + { url = "https://files.pythonhosted.org/packages/09/b8/2e36d54d0991ec5bba451444004591ee0af58cb1662a3a81c562878b9c1f/aiohttp-3.14.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2514cb7195f6d7c219339635bea71ae47d1569b051300d32df9dcfabcdb869", size = 1699947, upload-time = "2026-06-01T19:36:45.762Z" }, + { url = "https://files.pythonhosted.org/packages/57/95/a31d8ea1a0b9ecc084f5a7dd0b431ce64ef585918bb7bdc82afe11843877/aiohttp-3.14.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:30e8b7eeb42d02c120ca90d6c6e076a221a16b70a6dac9ae44c7ab5104cc7fe4", size = 1664364, upload-time = "2026-06-01T19:36:47.653Z" }, + { url = "https://files.pythonhosted.org/packages/01/f6/5de3ddffc87a9e8d09b3be38fbd6dd1a736b2ad477a7e787dcb85f57f338/aiohttp-3.14.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:63e38be0d75a654deaa06be32fb4cab883a4222940be1d05861b6717679cbadb", size = 1761186, upload-time = "2026-06-01T19:36:49.355Z" }, + { url = "https://files.pythonhosted.org/packages/33/8c/03c5438ec35d7e3a4f33fe895d6c3ec7540a7cec46065f21851211e1ee4d/aiohttp-3.14.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1210d4c87cc00128160c7384ab41877a701295b97cffa6362f908a49b6e8a7ca", size = 1849727, upload-time = "2026-06-01T19:36:51.478Z" }, + { url = "https://files.pythonhosted.org/packages/22/32/5a05303b0874458920b73f48b8779cc3a93d503f121b38dcc0456dbd698c/aiohttp-3.14.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a78a77366ed158a0a54b076990e575d7b7cdb728cbfd02711eadab150f2269f", size = 1708197, upload-time = "2026-06-01T19:36:53.241Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/478f169488d61414c0a05e7fe423b59ae3d9dcc933d1f0e4acc2c5d5bc3e/aiohttp-3.14.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f4d2038c64f36df96cfd3fa0937910e231eafbf897e70a06c155a817bb632fa6", size = 1578147, upload-time = "2026-06-01T19:36:55.154Z" }, + { url = "https://files.pythonhosted.org/packages/1d/af/b20af85765658972d3337834bd5eebba91b962794f2b4fc3e0ee8c85c0e1/aiohttp-3.14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4714c70067a08b604d0bf3bc4dfdf82e52944afab41d0428d460862763d2f79b", size = 1665836, upload-time = "2026-06-01T19:36:56.94Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a3/771879cfd59948f4544b172189048905feff802f20f1c6c5411e998a3e06/aiohttp-3.14.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f79bfd2847513a7ac801bbafd1de02348a37926ac439eeb4bfe96fcff4eada15", size = 1680335, upload-time = "2026-06-01T19:36:58.642Z" }, + { url = "https://files.pythonhosted.org/packages/f4/16/582e36ad1d32133cd40659f3bc98e71c22179665a1cfbbb4713bce339c06/aiohttp-3.14.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:25e9f1d2465a210d60edb64d7b204a147e85d4c194eecef3d1604fb5ace678ce", size = 1731180, upload-time = "2026-06-01T19:37:00.583Z" }, + { url = "https://files.pythonhosted.org/packages/11/bc/80708fe3f64a07a2c306a42fc7b009118a952709761d215f6d1b4c57195b/aiohttp-3.14.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:b5314743ebe926c2fda35d0a298c565c885505f6635c2a30936363404cf274a7", size = 1565805, upload-time = "2026-06-01T19:37:02.446Z" }, + { url = "https://files.pythonhosted.org/packages/57/8f/8d25897f8273a32fe4ad40a8885eec4f397377ed46e8e383078169f60316/aiohttp-3.14.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:28eee8de1d69711c53116df8202f1c2aa0e3f80ef912a88fc18d159d53e7110b", size = 1742496, upload-time = "2026-06-01T19:37:04.222Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7d/c341d32ab2dec56c8478740695743dc6c21b383cace9376a3eab16311a07/aiohttp-3.14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:89ed35666c95d3efe1955056afcde09e62a57a34e2a4398b17f9f6c1564f0b25", size = 1691240, upload-time = "2026-06-01T19:37:06.277Z" }, + { url = "https://files.pythonhosted.org/packages/37/0f/a81207dd7a2d4a4f645b3a3f8b5a1da1159dc63117ffb137b698fd6df50f/aiohttp-3.14.0-cp310-cp310-win32.whl", hash = "sha256:5e4646e9a6af29af354204011bf5769cb0276ec5b64653e42f90b3e13845169f", size = 454686, upload-time = "2026-06-01T19:37:07.96Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ae/842357f2afb9c915715c6f5775239d987f5d0f845abf7675fa794e0a9d40/aiohttp-3.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:22a8d06f204e0518a586d770032db3c7043c9ba3693081b3e3ad425e1458d594", size = 478677, upload-time = "2026-06-01T19:37:09.652Z" }, + { url = "https://files.pythonhosted.org/packages/6b/d1/330fb22c9535ec177b52396905131c6e39447244b6ca876262939af668ef/aiohttp-3.14.0-cp310-cp310-win_arm64.whl", hash = "sha256:4acfc34bd4d3c58754fc9f22ff1b5e92aabce68f3d4bf7b71a0b732d9bceb78a", size = 450364, upload-time = "2026-06-01T19:37:11.279Z" }, + { url = "https://files.pythonhosted.org/packages/67/47/7727bfe8db93f8835a001bd4359d8480cc68d1259b8bce334668f8be97bd/aiohttp-3.14.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:54bf3522d6f7351e55f89a62d5c2bf138ad557b031670266c5df604ae88e0b5a", size = 759147, upload-time = "2026-06-01T19:37:12.918Z" }, + { url = "https://files.pythonhosted.org/packages/eb/f2/cd3fedff6fade73d71df9ec908c210cec518ef90fd00289250684b90aecf/aiohttp-3.14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0746d9fb0ac4fdef643a84494efe3f06d50335dd8c7a530228b86448aae0a803", size = 513705, upload-time = "2026-06-01T19:37:14.633Z" }, + { url = "https://files.pythonhosted.org/packages/5a/fe/49746b6b610144a06323bebd8e1211a390310d8c69b98dd6d52df341bc3e/aiohttp-3.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f3a96b6d39a4872222beee72e1df41d2ff886ae96152cf3e757ef8c5673ef0e", size = 509627, upload-time = "2026-06-01T19:37:16.385Z" }, + { url = "https://files.pythonhosted.org/packages/4c/3f/28f2f6cf3d5c0e7b01b27140d0e7873fd11fb341169ad3ce78ad04aba628/aiohttp-3.14.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d336820adbb914debbc90a1d8c1bfc4bea55996aecf64866a989d35d1f9fd903", size = 1769293, upload-time = "2026-06-01T19:37:18.067Z" }, + { url = "https://files.pythonhosted.org/packages/97/6f/2e5f1b525d5474b12b3c60abf733a755845f3bceff21542081ada515f837/aiohttp-3.14.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:71b2604c9bfc1b115547d63a094d5244b3f02799833513a99a68aaa7b167c4cb", size = 1732363, upload-time = "2026-06-01T19:37:20.138Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ce/596120faa85ca7b19cd061e3f2f3be23aa8f11a0aedf9191db9e0da1bd76/aiohttp-3.14.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:610d68800435903e303ca0542b9d3e4eb72a12ff33a6d471a070c1d81eebd3c2", size = 1840375, upload-time = "2026-06-01T19:37:22.104Z" }, + { url = "https://files.pythonhosted.org/packages/72/3c/a7ffe05a757a4a7867643da69357ec41f506879fbd1b231d2ed90af246b2/aiohttp-3.14.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:514db9a79337068981ee2137310283a07b4b885c584991097a91a4da419bcb81", size = 1921484, upload-time = "2026-06-01T19:37:24.068Z" }, + { url = "https://files.pythonhosted.org/packages/93/fa/2c861170bbd4a491de93a69e081db1d971092569e0d593a98ef62c384dc1/aiohttp-3.14.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c452d17eeb95d563fc8b936f3050301dbd1d268126c4632d8b70ede9696202ee", size = 1774153, upload-time = "2026-06-01T19:37:26.256Z" }, + { url = "https://files.pythonhosted.org/packages/9d/da/1d2f5a165f47ec9b1f69d37b8b977fdc4d501aa72ffb7930db27bb9e49ea/aiohttp-3.14.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ed94a81506e3d1bdbad5108f497a58f2a2354aedb4ca314d5326f07d1fd1ac2d", size = 1632569, upload-time = "2026-06-01T19:37:28.192Z" }, + { url = "https://files.pythonhosted.org/packages/46/1d/7a6e295c4257252f70f69e90864fdad74b6a1293054fb3f9e65a15de6d63/aiohttp-3.14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1394dce36e0f0d260ac0b555a654de19cb989f3c1b8bdd24f505314dfea18a00", size = 1740325, upload-time = "2026-06-01T19:37:30.08Z" }, + { url = "https://files.pythonhosted.org/packages/f1/7e/e1899b1ca3ec62f1eab2a5cbde14039b97493f7f53eb88d9b668562ffa8d/aiohttp-3.14.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:d1467d1e7b48a73ca7237e0ee4335f3d02b923dbc27b82fd254bc301c97d4026", size = 1748691, upload-time = "2026-06-01T19:37:32.211Z" }, + { url = "https://files.pythonhosted.org/packages/ec/54/4e6b61c1fe7d3433f82bcc6bd7e4d7c683a742a10c9b12a025fd3695c047/aiohttp-3.14.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6a5f3532125233c261cf61f32df4059cfcf482eb793c7d3db8452e3142028b86", size = 1814477, upload-time = "2026-06-01T19:37:34.173Z" }, + { url = "https://files.pythonhosted.org/packages/9c/38/86fd51be2e08d8e45c83d879d255f10391903cd9fe2a16512f7591a15873/aiohttp-3.14.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3ea81eb518a2ecb319d8ec6d1424a37c773f6634bd87d6985eb606b2faac419f", size = 1623393, upload-time = "2026-06-01T19:37:36.281Z" }, + { url = "https://files.pythonhosted.org/packages/78/49/466e947a42a88ee23c486d036e7e5d1b097f1bafd8084ad9c9a0a92f0f43/aiohttp-3.14.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:32e735c3182de7b64f6941a4ede48b38c7f47d9437bd615dd30b5bda8fa1bc93", size = 1824097, upload-time = "2026-06-01T19:37:38.421Z" }, + { url = "https://files.pythonhosted.org/packages/f3/89/35f3410bc284682338a1be6b6ea0c5abfa05f063942cfaa9256608440434/aiohttp-3.14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c21ca9a1c63d4509158f478aeb9d02914dcc52adc68d1bc9dee2452284ee5996", size = 1764790, upload-time = "2026-06-01T19:37:40.755Z" }, + { url = "https://files.pythonhosted.org/packages/42/80/2d4291bd5724d3d17e5951aff5a3e02281483fb47295f0788276ee66cd73/aiohttp-3.14.0-cp311-cp311-win32.whl", hash = "sha256:19ca5fc84130675ba11c6ca5c7da5cb65f7bf8a32cdd2b616bf49cd334688aae", size = 454176, upload-time = "2026-06-01T19:37:42.837Z" }, + { url = "https://files.pythonhosted.org/packages/59/ed/41d0ad4f6ececffc32bdf1f7b494e5498f7ca5c849ea2e3cc9bbd1668251/aiohttp-3.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:d488e6e9d3bb8ba5ae7066d5be885ae9670eba021b8c6ccb9a3a568e6b19d6e5", size = 479334, upload-time = "2026-06-01T19:37:44.776Z" }, + { url = "https://files.pythonhosted.org/packages/d1/86/c0b5e305c770053f8c3d069bb52b8196917ba91949d1962d52eb307fb0d2/aiohttp-3.14.0-cp311-cp311-win_arm64.whl", hash = "sha256:8b93618102caf12801638a01a2b478a55410ddd71bd41cfaf6f707953a49ac43", size = 450262, upload-time = "2026-06-01T19:37:46.461Z" }, + { url = "https://files.pythonhosted.org/packages/89/97/2b6889bfb6b6847520d50d95eb8c4307a45e28aaca39faf4a9454b3d1b2f/aiohttp-3.14.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b29518c9c2ec7e373e68259206a137c7f4f5439c58baaec4b5ab3ab799850a4e", size = 750194, upload-time = "2026-06-01T19:37:48.164Z" }, + { url = "https://files.pythonhosted.org/packages/21/e2/62634b7fff918ed98c3c6b2f0e70d520f7f28846cb412d451b04354c6459/aiohttp-3.14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dbec68ce61b64cb73cab4d33df9433427b1713c8bcccb181dce695c1b6f8e87c", size = 506966, upload-time = "2026-06-01T19:37:50.014Z" }, + { url = "https://files.pythonhosted.org/packages/dd/fb/5ce075150828c797a5106f1c2fb26034e709d4289b9d2bf8b07f1e59fac6/aiohttp-3.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3cdf534aa455593e589302990c5097aa5c92c06c4262a20da22934f9186a5fff", size = 507527, upload-time = "2026-06-01T19:37:51.96Z" }, + { url = "https://files.pythonhosted.org/packages/01/d5/405a0ae4e6b081754a3609c1c97c63a950e000a2def16046f1e736933a0e/aiohttp-3.14.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cb6c657104393b5fbff01a5f59b2023db74058a8077d94475d6c25d03882a108", size = 1762420, upload-time = "2026-06-01T19:37:53.839Z" }, + { url = "https://files.pythonhosted.org/packages/ae/1d/e05a7c896b15a6bc6fb8fc5319eb437861c2c49c34559ef928add6590315/aiohttp-3.14.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:46fbbec4e4fab7428d4396a3823f9320e4560aa3113b89eeebce712c27c9ed5a", size = 1733672, upload-time = "2026-06-01T19:37:55.791Z" }, + { url = "https://files.pythonhosted.org/packages/cc/22/a72f7c459e195fa41bf4f7abd1f925b91fe91f8097e51c654229ba144a33/aiohttp-3.14.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2c2c7e05dd5335b298085abf45ddf98673934c3ee1c083d0b9ea13d4186ad500", size = 1805064, upload-time = "2026-06-01T19:37:57.931Z" }, + { url = "https://files.pythonhosted.org/packages/80/50/e85bdaba0be59ca4838005ebfef4048fcdd5f35a02b07057a9a123394440/aiohttp-3.14.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3c7139100fbaae76515b73051d8f0aa3a3ff02e415eec8a8eee8e2223d9ba955", size = 1902125, upload-time = "2026-06-01T19:38:00.225Z" }, + { url = "https://files.pythonhosted.org/packages/19/d8/51de5c6b971c27bb1ef620293b8d1ca611ec78736b34b3f6ccf68e4c8785/aiohttp-3.14.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78d6f9286a629ce52728430afe18f8ed2b6c39a1fddb3802d7244b9983910ad2", size = 1783112, upload-time = "2026-06-01T19:38:02.641Z" }, + { url = "https://files.pythonhosted.org/packages/73/ae/b4402bfde77e43dfb1b6ccff83c7b7ab63ed06b50c4754f0c5423fb374fe/aiohttp-3.14.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cc3c3e12cdaeb92d7dcf13db00e9f6b1956b910e47256e696df1cfa946d02159", size = 1586356, upload-time = "2026-06-01T19:38:04.637Z" }, + { url = "https://files.pythonhosted.org/packages/bc/05/750a3265ca4dc54a460bd0cb1121a8f2ce9171fce4a135fb47ea7fd594d2/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4d6a998191f5ebe3b8c28463ff72bc030250008b3193c402464efadd08b5ca02", size = 1723119, upload-time = "2026-06-01T19:38:06.713Z" }, + { url = "https://files.pythonhosted.org/packages/37/01/8c0812c50b3b1b1c37b323bf170d6be8847a8f234060485b7d1e71953f60/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0fc2b75ae8d169d853be2862d960be8550da6c5c65711d5476407eb3fdb006bd", size = 1757216, upload-time = "2026-06-01T19:38:08.736Z" }, + { url = "https://files.pythonhosted.org/packages/47/2a/50fb98028a26887cbe48dcc1df92a90825615bc73b5584301304090cded8/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:16eee56bcc72d04600bc56c1759982c2385ec0b41d3fd3521f836bf64a0957ef", size = 1770500, upload-time = "2026-06-01T19:38:11.111Z" }, + { url = "https://files.pythonhosted.org/packages/bd/32/0ffd598a2fa2b9a423daf242e700cfdabda35d6e602394ad9ae58972c1c7/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5a2e7ca615c3ddc15b82687e05a624e5f5cba3f1d6c20cb81172d70ea498451e", size = 1576224, upload-time = "2026-06-01T19:38:13.391Z" }, + { url = "https://files.pythonhosted.org/packages/0b/f9/b9fc381dd9b66afb33f2634c40e229d106467be0afcabe79648631ab6712/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f0b7b8bbbec3ce9467ee0ebe334622fd90624f593edd3136c567811453fc4fae", size = 1794252, upload-time = "2026-06-01T19:38:15.498Z" }, + { url = "https://files.pythonhosted.org/packages/a8/fb/05d9214c975f23225a8cd5c439325e338c7c377b315480ef3871db51f54e/aiohttp-3.14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ba10966d4f03dd96a14365be4b8e37c327c76f11c3ca867116966cdd9f98066", size = 1760193, upload-time = "2026-06-01T19:38:17.624Z" }, + { url = "https://files.pythonhosted.org/packages/d9/4b/02992fc4fb9e1b6673ee3f888a8e587a6447afda1f6f4aca776c148c2876/aiohttp-3.14.0-cp312-cp312-win32.whl", hash = "sha256:101df7779c80c0636014a6b2c6642acd3efb5b355d48347c9d7dfb720aee9430", size = 448650, upload-time = "2026-06-01T19:38:19.545Z" }, + { url = "https://files.pythonhosted.org/packages/39/e9/246532214c3abda518477cbaaf16d420295ad8effa5233844cbb38f299ab/aiohttp-3.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:b0a5747586d4467efd1f932710b269131c9717a872dce082cd92a00c1c13123a", size = 476145, upload-time = "2026-06-01T19:38:21.505Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c3/63f8c20090048915711598b0adf475b149216d736157961de06480a45b15/aiohttp-3.14.0-cp312-cp312-win_arm64.whl", hash = "sha256:5f1c5be60add78fabb4aacd13c5a348ae79d2fcbfc7fa78da8f1eb192273b370", size = 444250, upload-time = "2026-06-01T19:38:24.027Z" }, + { url = "https://files.pythonhosted.org/packages/21/61/d11f7d9a3144bffe825247d6367cd93053666da50b94707c9129c78868d5/aiohttp-3.14.0-cp313-cp313-android_21_arm64_v8a.whl", hash = "sha256:25400d710641a8040bf022a8a99f579e581ffa1c5bd42c33255d7d6f3957c127", size = 502399, upload-time = "2026-06-01T19:38:25.955Z" }, + { url = "https://files.pythonhosted.org/packages/4f/9b/a7e317625d36356844f8bb022cabd305b541f968856cc3c2e0b58e53ee6e/aiohttp-3.14.0-cp313-cp313-android_21_x86_64.whl", hash = "sha256:c5492b9929826e07cc3fcb9739ae87aab05dff6b5e67a9b73fd1700c6d008981", size = 510068, upload-time = "2026-06-01T19:38:27.828Z" }, + { url = "https://files.pythonhosted.org/packages/11/41/cc2d2cfbfbdc3126ba258f3cd27d1ac8a33492ae3c35a4583ee21f0ba7f1/aiohttp-3.14.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3366751d68d237c621264233a32f3078bbc21b7904ab90a77e03d21390c742c6", size = 481670, upload-time = "2026-06-01T19:38:29.836Z" }, + { url = "https://files.pythonhosted.org/packages/3c/07/381f4023c3b08cb616e520f566d8c58957abad54e56441d41fe67cfb0195/aiohttp-3.14.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:57ea07d28695a7a40304d42251892a8df765e5588c10ee32afeddcd5df33c0a2", size = 487591, upload-time = "2026-06-01T19:38:31.704Z" }, + { url = "https://files.pythonhosted.org/packages/fb/4d/4506fdb7a022bdf70011a3bbb4ca00c5c570026ef6a3c5bd7bc70c39089c/aiohttp-3.14.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:076cb014191ae2e65d949e1ad01f1dcfe33e32789b5172510f3e79c79fc04d50", size = 496503, upload-time = "2026-06-01T19:38:33.6Z" }, + { url = "https://files.pythonhosted.org/packages/ef/7d/c814111e04894a45d9e2defc94443879a6f118d9633d5fedfe6e2e8af5f0/aiohttp-3.14.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2f3fc37054564dee64a855b5b092d87ec35dcddfaabf7dacb1c8a2b1f83dc0a9", size = 745870, upload-time = "2026-06-01T19:38:36.013Z" }, + { url = "https://files.pythonhosted.org/packages/c6/ee/80eee0efddfe187e7cd05027086b7ce1c0e492e82a4eda58f5c5543a44a0/aiohttp-3.14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8fcaef74d2ab0f607d7ff85a0d15e21bb5a258c4a58df1908396eb50d7f4ed3c", size = 505588, upload-time = "2026-06-01T19:38:38.282Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f8/0f28f04eef75d52fc9c715dde7ce9c0abb810fd20cfeb0fea7afd2ab1e98/aiohttp-3.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e4c01b0bfc6209590960e68eac083cd22d5d87c21f974dd6208cafa5d3542bc8", size = 504492, upload-time = "2026-06-01T19:38:40.611Z" }, + { url = "https://files.pythonhosted.org/packages/ff/db/44c755232085545065c94378dfce38641b1aee647f4939fcd32f5b32e719/aiohttp-3.14.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f12eb7896e81caf403a2b18c9406426f1207361e7239c057ab29c076d4257e83", size = 1752111, upload-time = "2026-06-01T19:38:42.682Z" }, + { url = "https://files.pythonhosted.org/packages/5e/6a/42e030a46743841414402a3b00cd3d78419055e86c66fb5822c14b5abfc6/aiohttp-3.14.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6c79a044cacf360ec46738d863d2f41c9300d2a06ef4a7402ea0df306a350e61", size = 1729674, upload-time = "2026-06-01T19:38:44.79Z" }, + { url = "https://files.pythonhosted.org/packages/34/26/3199beb415202e3108e7b83ecebe10914d806d33fb9860c3e4aa60a19be3/aiohttp-3.14.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:85e0675f47be4eff0636bf88c02140ea89168ae0df3ff1f3f464e9de9610d277", size = 1798808, upload-time = "2026-06-01T19:38:47.01Z" }, + { url = "https://files.pythonhosted.org/packages/bd/94/b9b6fcf0ee17c21d0d19fb8c22bf83ad18f82e702a9c3bd901a868f5e446/aiohttp-3.14.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b33e751cab03fdc960095b1e326cb5a03f5ee577d6ded59f3d1c100f8668882", size = 1891921, upload-time = "2026-06-01T19:38:49.233Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a3/3800dbd095cb2bb165a7ea5d94d790914677e27f45638c7d80e3f34c8945/aiohttp-3.14.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26d9224c6dd7f5c749aba4f61315a894601448b28d94d12f4dea0903e26d2096", size = 1777241, upload-time = "2026-06-01T19:38:52.04Z" }, + { url = "https://files.pythonhosted.org/packages/21/2a/45be91ad1b860508557448d4cc2e165a2ee68dd865657b73bf66cc5a00fb/aiohttp-3.14.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6281aecdf2732940f4fe06bd6adec5ae4d59b78b080b8e3a6b81467301010988", size = 1579554, upload-time = "2026-06-01T19:38:54.508Z" }, + { url = "https://files.pythonhosted.org/packages/b4/3d/dc94df99ed1511fdf28314f722643ed334112643cab00223577085e788c4/aiohttp-3.14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:23e8314e7aed8576fbe33314d218bd81447a3adbc91dc36f1163bf583cd3084c", size = 1714864, upload-time = "2026-06-01T19:38:56.788Z" }, + { url = "https://files.pythonhosted.org/packages/ae/e4/1f1c8acbb3acd5c8f795473b92c9c3d44eb60a5692c6104256c8a1c83a0c/aiohttp-3.14.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:3b54fbff46127aeafdd764cecd0d99fa2f24a0e37ea5c18a7c3a4ac450df1db3", size = 1749803, upload-time = "2026-06-01T19:38:59.367Z" }, + { url = "https://files.pythonhosted.org/packages/0b/c8/c45ea6e7ed84cebba939b9c334498a045ba19d79c61b0110df5f21580de3/aiohttp-3.14.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b27d89af91a555f58e08e4902dbcbc48862fd40095720ca705990476bd93b7ac", size = 1765023, upload-time = "2026-06-01T19:39:01.651Z" }, + { url = "https://files.pythonhosted.org/packages/a8/a1/a932941784432962fe390e1066823aaef64b4e5ac9fa595df57b5fe472a9/aiohttp-3.14.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:25d2326a4967bf705a9f9913a13005e93b6020ad8a9f6bd6bd78850d5171332e", size = 1571671, upload-time = "2026-06-01T19:39:04.044Z" }, + { url = "https://files.pythonhosted.org/packages/b0/01/e1280feac522597a4d46eb67a0cdfa053cfae263033030b761ab146f29fb/aiohttp-3.14.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:a1d209375c503472b3c0a340cdf3c55fcd82e84b46dda7caeaced59faba373ec", size = 1789904, upload-time = "2026-06-01T19:39:06.294Z" }, + { url = "https://files.pythonhosted.org/packages/fa/10/ab28818262f4d26bdb47ed5f1fc7999b69e2fc6e0370b02d0f49011f45ea/aiohttp-3.14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:666c7c5036df57b693026398b69b41874a1931ac5b3485fd910e57bfac253869", size = 1754516, upload-time = "2026-06-01T19:39:08.788Z" }, + { url = "https://files.pythonhosted.org/packages/af/cc/c122eabd7a1b7e0c9bbdd6be60e4715905b858399145d9df872bb94f1427/aiohttp-3.14.0-cp313-cp313-win32.whl", hash = "sha256:23f094a1ef64823fd35854ddf5c7a80a078162f37f9d2f7c6142b51a6affa456", size = 448656, upload-time = "2026-06-01T19:39:11.171Z" }, + { url = "https://files.pythonhosted.org/packages/41/a5/bab07d79848a00eedd8ed979ccb302aaea3ac6eb9fa16bd0ed87135869b4/aiohttp-3.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:e03abdaa17d553f17e1d1d06bb266b3970106c78051d06795723e748d8e49d11", size = 475803, upload-time = "2026-06-01T19:39:13.439Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a0/f03ade8566c153666a3871afccbedf6d99911da006325e1fc6cf72a2de99/aiohttp-3.14.0-cp313-cp313-win_arm64.whl", hash = "sha256:acdb400538cf4769543548bb5d1eb23d39bed4f96554a6078cb728c7cb2c268b", size = 443889, upload-time = "2026-06-01T19:39:15.945Z" }, + { url = "https://files.pythonhosted.org/packages/28/03/5f36ab196a88ba5e9648ae5643e6531e67a3a8c0e96f9c6510ff41540fec/aiohttp-3.14.0-cp314-cp314-android_24_arm64_v8a.whl", hash = "sha256:363ef9e91014e7891679bfb2ac0a7c6ea93435dbbfd10ecf41b9f06fcf506c5f", size = 503330, upload-time = "2026-06-01T19:39:18.195Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ce/8b49ec2f30f68e02f314f4832186cd45e583360a5a386058be36855d23b6/aiohttp-3.14.0-cp314-cp314-android_24_x86_64.whl", hash = "sha256:884a4edbdad77be9d0ef36142c8b504351b170df0bf62b51e784fadabf311c42", size = 509822, upload-time = "2026-06-01T19:39:20.396Z" }, + { url = "https://files.pythonhosted.org/packages/1a/fe/6edbf5d39bf29322b6816365b17ed8ede4dace164a3aea1abcd30110eb78/aiohttp-3.14.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:70ea956f6cc4a37620966b56c2e205d88ca3e6d85ec063277e414b1035cddad3", size = 483329, upload-time = "2026-06-01T19:39:22.607Z" }, + { url = "https://files.pythonhosted.org/packages/1b/5a/fae531bdbc6456fb6241f46b7b81e4d8a0dd3fc09118a0055dc7141ac1ec/aiohttp-3.14.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:ea3b9806c89f61da22fddf1f12dd524fb368e5e28f1261fbdafe5c3cd8ce893b", size = 489502, upload-time = "2026-06-01T19:39:24.881Z" }, + { url = "https://files.pythonhosted.org/packages/36/f4/48a7b0414db7fed77a03d5dde34508c026afd83510ab6bca08c313855776/aiohttp-3.14.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a071be341c2bd9b0188e62d173509f024e0a35b1c342c53c50f8daaeda8c3bd8", size = 497357, upload-time = "2026-06-01T19:39:27.197Z" }, + { url = "https://files.pythonhosted.org/packages/75/75/e85a13a370acc007fca5feb1fd1b88ac2d8426e6dadd625479b7cadd55a3/aiohttp-3.14.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:198cfe61bf253b19da1fb3e0fa122249dc4f14c12709493fed8054aa0411cc76", size = 750898, upload-time = "2026-06-01T19:39:29.563Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e4/3d637f800c724eff0e2bed64df72557444482366fd0a35b0cec0e6968f6c/aiohttp-3.14.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:9dc203d6ce6b9106d54e2a93f41dfdfebfbca2d99962ba503bfd3e5921a6549e", size = 506986, upload-time = "2026-06-01T19:39:31.872Z" }, + { url = "https://files.pythonhosted.org/packages/1d/df/35161f3598bf7501d2b2a805b41ab4f45a2e34150c421bcb4ef8c0d281a7/aiohttp-3.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9e19d17ab02bf16832a2c8c0d55a486792c5b1645665652ee9531aebcc30cb72", size = 508033, upload-time = "2026-06-01T19:39:34.137Z" }, + { url = "https://files.pythonhosted.org/packages/e5/39/b36e5d3d31e850fb4691dd3e941684ac490a2559249f6fa634b6b0fdf020/aiohttp-3.14.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d925fba0c14d5b498a8028b0107beebdfd16c5d48d702ff54f879cb017aaaca3", size = 1746213, upload-time = "2026-06-01T19:39:36.654Z" }, + { url = "https://files.pythonhosted.org/packages/b1/28/24e1409e605a9aa5d84abe0e2acb365354b70ae56d40948101cabe3341ab/aiohttp-3.14.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d33e61021222ce7f9792bcac870d6f58d8adfceda33ab857b01264f4560f2c5f", size = 1705862, upload-time = "2026-06-01T19:39:38.968Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d0/e5eb3ff1daeaf644c7e36a957517672494122628e067c38b263fa04eda77/aiohttp-3.14.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:44eca38755d0105bb32f47d085f5dd449846a449e1245fc105889e3279dcf8e3", size = 1798909, upload-time = "2026-06-01T19:39:41.334Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ba/8943f906f0570342886ababb9a722a44e360f786a028c5e0b0e29e3f735b/aiohttp-3.14.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f13087e06f68fea4941c21a0c541c00553aa16e4f8fd7bbe2b198df761e964d6", size = 1868892, upload-time = "2026-06-01T19:39:43.807Z" }, + { url = "https://files.pythonhosted.org/packages/3a/05/27df32c844b2156e1675a8d8ec22d963e3c8ba469ed7ceb1863320c7b521/aiohttp-3.14.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ff82be7f1ef73634cb77890a770743239bc3d487b848669be1c599889336dc0a", size = 1751659, upload-time = "2026-06-01T19:39:46.398Z" }, + { url = "https://files.pythonhosted.org/packages/7f/62/da182e5910ab912b2e88aa919b61a16046a37a95714a5795b02eb57b2d18/aiohttp-3.14.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a150c0875ac8fd87f1c398650841308a30d65facf7416b12dbdb9cfdcbe5a48c", size = 1578775, upload-time = "2026-06-01T19:39:48.902Z" }, + { url = "https://files.pythonhosted.org/packages/66/e3/53c67097e8a5ce98625e91e3fa7f43c9c6940de680345d03b3509a72a078/aiohttp-3.14.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:edc01ea4e1ec5a1649a28866262bf24195889ff7b27bdd947029a6086741de9b", size = 1710090, upload-time = "2026-06-01T19:39:51.392Z" }, + { url = "https://files.pythonhosted.org/packages/dd/55/0e2732ca598c7a4dfe8a775662376d0ca2977cb1030e48386d4da5d9a456/aiohttp-3.14.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:540632bf882ff8fc88f2e1697be0761578e89e0d79fb4a8a6d65dc5da7e729d4", size = 1715016, upload-time = "2026-06-01T19:39:53.807Z" }, + { url = "https://files.pythonhosted.org/packages/5a/96/f0b73730798c9ca525afc30b39f1f81bbe24e245d9654c54d3b39d63212d/aiohttp-3.14.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:860a86bc2c80237f5dff52edcf427e10a8d8352271fd84845429a3e60199e02c", size = 1763810, upload-time = "2026-06-01T19:39:56.31Z" }, + { url = "https://files.pythonhosted.org/packages/71/cc/11acb6c4518f448323405a7312b6f255d0f974a34373ad1db7633c4aadc8/aiohttp-3.14.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5cbd50e6a50d6b99283a826b18cbdebf65b0797689a7535cb0e9dd37be0f63c3", size = 1573064, upload-time = "2026-06-01T19:39:58.718Z" }, + { url = "https://files.pythonhosted.org/packages/de/2d/28c31dde0a7dc98c0ee7d0da2ddcec3f7688c4fc131e5989e278d0c03c0a/aiohttp-3.14.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:20144819e99db593e22bbd2f3f2691a5e149f879142d6b8670254708853ff4fb", size = 1775765, upload-time = "2026-06-01T19:40:01.195Z" }, + { url = "https://files.pythonhosted.org/packages/b8/69/155c4ef3aec96417d47024800472b33b16c5d8a665371dcd044c2afdf25d/aiohttp-3.14.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:26b6d79aa54cb4ed50cc7d41ed14e99e0f1fc8e7c2d42f2e05b37aea897b2b52", size = 1733716, upload-time = "2026-06-01T19:40:03.631Z" }, + { url = "https://files.pythonhosted.org/packages/5f/44/6126116fd8a316b712bb615660b855c78466bb67ba1bb1742427eafcf7ac/aiohttp-3.14.0-cp314-cp314-win32.whl", hash = "sha256:106ed074a856f3e21d186b8579e2c8afb6da598e267cdaab01059e13db2fc44d", size = 453684, upload-time = "2026-06-01T19:40:06.277Z" }, + { url = "https://files.pythonhosted.org/packages/a2/d7/eff4c58a88c5cac5e38b55f44fb8a6d3929c3cbd77356e383e094d3220bd/aiohttp-3.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:4f770846edae8f00ecc57af825bce811f787f87a7dcf0e90d191790efe5b31f7", size = 481758, upload-time = "2026-06-01T19:40:08.653Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ed/17b5bd9fbcb46e688f02e572f517754a9a75831e7b54702f027761dc4fa5/aiohttp-3.14.0-cp314-cp314-win_arm64.whl", hash = "sha256:acf1581c4f21ed4b80a2dded504d87b055a071a84d5737ea966435f768275ac6", size = 450557, upload-time = "2026-06-01T19:40:11.03Z" }, + { url = "https://files.pythonhosted.org/packages/12/34/6180103ce9aabc8ebff3f7bb55a1228ffe60f61042823031d9692cb7b101/aiohttp-3.14.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:6aa1a40f9cbb3da9f80714c5966b8946c21e6a2530d809b9498b33161e3c8733", size = 787878, upload-time = "2026-06-01T19:40:13.401Z" }, + { url = "https://files.pythonhosted.org/packages/92/e9/08954a40e8b7baa3d8beadd2b074b186e9b1e9c8ddabc288678a6265de50/aiohttp-3.14.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b62af5a8cc96a194eaa01a9ed7b34a3ffa58d3d8daaa1a0d7a749353ad12d228", size = 524400, upload-time = "2026-06-01T19:40:15.972Z" }, + { url = "https://files.pythonhosted.org/packages/08/6a/b5965a634ac4d5ba99a463314cf4ab214ca073fcdc38a15e0294273701fc/aiohttp-3.14.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6eb63b1417efaf7d1002a6ad034a40d44376afcc16508a57f8e74b49ad26a095", size = 527904, upload-time = "2026-06-01T19:40:18.28Z" }, + { url = "https://files.pythonhosted.org/packages/06/b4/932bcdd850c354d9bcca30f360e475d7852e30413fbbd44b182782ed5432/aiohttp-3.14.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c20b9ad156a79eb97be5cf9e069eec01d2f0dc8472ffbd75299a8b2d4c2cbbde", size = 1912162, upload-time = "2026-06-01T19:40:20.825Z" }, + { url = "https://files.pythonhosted.org/packages/c6/85/ce79bab0310d2e3fd2d7bc7e44412abeff7c8338f8a21dd0f2f1714989e5/aiohttp-3.14.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:40ae7b0642c25632c7eabc4a04754012691864d2a1b93becf7cddb76027b838a", size = 1778813, upload-time = "2026-06-01T19:40:23.726Z" }, + { url = "https://files.pythonhosted.org/packages/05/54/ba62ac2d1bc87e010aad23751e383b8794e45d931df67677313a2da78823/aiohttp-3.14.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:95f5217e76a046b9f228a101717ef8d42b1eb3d9d196d15202db5bf41df88936", size = 1899969, upload-time = "2026-06-01T19:40:26.406Z" }, + { url = "https://files.pythonhosted.org/packages/dc/82/7cc7907725d83a19f31551334061e1ab8e108b1d7ac52632a2a844a4acb5/aiohttp-3.14.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1a4a9f17e85b80878c176695c1998c790e83731d8271881e5d356488652a1f9e", size = 1991771, upload-time = "2026-06-01T19:40:29.061Z" }, + { url = "https://files.pythonhosted.org/packages/d0/1c/a57de71a4508c93a830b77c28af3d08cd97f606dedfc6b94275347744508/aiohttp-3.14.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:145262119b07d7f95abc1839add35ba2bfc84551d4b4660ca11542c0b215455b", size = 1868606, upload-time = "2026-06-01T19:40:31.843Z" }, + { url = "https://files.pythonhosted.org/packages/9c/ae/3839726cd49150a53ed340cc24ce5ba09d4c2117020ef9d45542bec5eb2f/aiohttp-3.14.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:49a33ded29b0b2fa7a367a02cf0fb89af602bb87542a16177ec8ce1c9c51d12a", size = 1665437, upload-time = "2026-06-01T19:40:35.01Z" }, + { url = "https://files.pythonhosted.org/packages/35/1e/c237923232c7da7f0392ea25d89fc5e60c0e93f685f4ebca8e7bcdd5271c/aiohttp-3.14.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2cc736a9c9fc2bc4dd71fd404815741b6573df27c3f985948ec4076989ac57de", size = 1834090, upload-time = "2026-06-01T19:40:37.733Z" }, + { url = "https://files.pythonhosted.org/packages/98/02/a5a7a2524f92d3911761b405a7c067c751891942144adc13e2ad79611e39/aiohttp-3.14.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b4141a3e5342ee3053a9cab54d25b64ed28289c1041e4c54b3d99839314d90ce", size = 1816907, upload-time = "2026-06-01T19:40:40.46Z" }, + { url = "https://files.pythonhosted.org/packages/fa/76/a8b9f0d09234d516af9f2d7dd715557f33b5da3b0b56ead41d1170e86e3c/aiohttp-3.14.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e30871b2d58996cb81aac52d2b1d15ac05257131ef0f90f18c2115a380fbfe7c", size = 1840382, upload-time = "2026-06-01T19:40:43.48Z" }, + { url = "https://files.pythonhosted.org/packages/c9/8e/140e715a0a4bbc211979ea30ec8396ad2ed5bf90ab87d8058fc4668b1923/aiohttp-3.14.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:667b881d083ccae3900ea5a241e17e5007ca78844c53ed389bb63d48f729d9c7", size = 1659497, upload-time = "2026-06-01T19:40:46.265Z" }, + { url = "https://files.pythonhosted.org/packages/10/c7/7ba5de8af9650b9767b063c675427b8685f43fa7ce563673a7bc3af60f08/aiohttp-3.14.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:b584dfe615d151e9b8f0a8ecb3aee6147f2927ec5b95ba25fe621f5377510928", size = 1870829, upload-time = "2026-06-01T19:40:49.583Z" }, + { url = "https://files.pythonhosted.org/packages/cc/bc/2aaab2f85cadb26ea59c091fa2b8e370d625154b5c14b478f1b489d07551/aiohttp-3.14.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6199707cc40e0e9cd39c36fbc97bec416c704e1d0ddce03412bb3b3e6a90ccd0", size = 1832281, upload-time = "2026-06-01T19:40:52.303Z" }, + { url = "https://files.pythonhosted.org/packages/39/98/31b9ad9fbc01f0075ee7221002df5fd2d10b647f451ca5f30edc802d9dd6/aiohttp-3.14.0-cp314-cp314t-win32.whl", hash = "sha256:a8d93334d4961c9d566b1f046c81dee475b7c21eb730728d38237bfa70d1c8e6", size = 490597, upload-time = "2026-06-01T19:40:54.937Z" }, + { url = "https://files.pythonhosted.org/packages/59/1f/299b21441c8de42ff70fddc7cfe65e92f810abcf740739a09b56f7835364/aiohttp-3.14.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2d2ffe9b614f50f069068b3b52e73414e4107fc10b7efc939a76acff9251fdd2", size = 525789, upload-time = "2026-06-01T19:40:57.306Z" }, + { url = "https://files.pythonhosted.org/packages/70/11/7f83fcba9ee05d4c54d61b3f8104da0d43a59adac44dd28effc0c9a10422/aiohttp-3.14.0-cp314-cp314t-win_arm64.whl", hash = "sha256:7a3fc4358e65826c515350f199c210de747cf669998211b1ee6c2e46de364b24", size = 467399, upload-time = "2026-06-01T19:40:59.993Z" }, ] [[package]] @@ -220,18 +217,18 @@ dependencies = [ { name = "frozenlist" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", upload-time = "2025-07-03T22:54:43.528Z" } +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://pypi-proxy.dev.databricks.com/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", upload-time = "2025-07-03T22:54:42.156Z" }, + { 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 = "alabaster" version = "1.0.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", upload-time = "2024-07-26T18:15:03.762Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz", hash = "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", size = 24210, upload-time = "2024-07-26T18:15:03.762Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", upload-time = "2024-07-26T18:15:02.05Z" }, + { url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl", hash = "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b", size = 13929, upload-time = "2024-07-26T18:15:02.05Z" }, ] [[package]] @@ -244,27 +241,27 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/94/13/8b084e0f2efb0275a1d534838844926f798bd766566b1375174e2448cd31/alembic-1.18.4.tar.gz", hash = "sha256:cb6e1fd84b6174ab8dbb2329f86d631ba9559dd78df550b57804d607672cedbc", upload-time = "2026-02-10T16:00:47.195Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/13/8b084e0f2efb0275a1d534838844926f798bd766566b1375174e2448cd31/alembic-1.18.4.tar.gz", hash = "sha256:cb6e1fd84b6174ab8dbb2329f86d631ba9559dd78df550b57804d607672cedbc", size = 2056725, upload-time = "2026-02-10T16:00:47.195Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/29/6533c317b74f707ea28f8d633734dbda2119bbadfc61b2f3640ba835d0f7/alembic-1.18.4-py3-none-any.whl", hash = "sha256:a5ed4adcf6d8a4cb575f3d759f071b03cd6e5c7618eb796cb52497be25bfe19a", upload-time = "2026-02-10T16:00:49.997Z" }, + { url = "https://files.pythonhosted.org/packages/d2/29/6533c317b74f707ea28f8d633734dbda2119bbadfc61b2f3640ba835d0f7/alembic-1.18.4-py3-none-any.whl", hash = "sha256:a5ed4adcf6d8a4cb575f3d759f071b03cd6e5c7618eb796cb52497be25bfe19a", size = 263893, upload-time = "2026-02-10T16:00:49.997Z" }, ] [[package]] name = "annotated-doc" version = "0.0.4" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", upload-time = "2025-11-10T22:07:42.062Z" } +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://pypi-proxy.dev.databricks.com/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", upload-time = "2025-11-10T22:07:40.673Z" }, + { 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-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", upload-time = "2024-05-20T21:33:25.928Z" } +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://pypi-proxy.dev.databricks.com/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", upload-time = "2024-05-20T21:33:24.1Z" }, + { 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]] @@ -276,9 +273,9 @@ dependencies = [ { name = "idna" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", upload-time = "2026-01-06T11:45:21.246Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", upload-time = "2026-01-06T11:45:19.497Z" }, + { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, ] [[package]] @@ -288,67 +285,67 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "tzlocal" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/07/12/3e4389e5920b4c1763390c6d371162f3784f86f85cd6d6c1bfe68eef14e2/apscheduler-3.11.2.tar.gz", hash = "sha256:2a9966b052ec805f020c8c4c3ae6e6a06e24b1bf19f2e11d91d8cca0473eef41", upload-time = "2025-12-22T00:39:34.884Z" } +sdist = { url = "https://files.pythonhosted.org/packages/07/12/3e4389e5920b4c1763390c6d371162f3784f86f85cd6d6c1bfe68eef14e2/apscheduler-3.11.2.tar.gz", hash = "sha256:2a9966b052ec805f020c8c4c3ae6e6a06e24b1bf19f2e11d91d8cca0473eef41", size = 108683, upload-time = "2025-12-22T00:39:34.884Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/64/2e54428beba8d9992aa478bb8f6de9e4ecaa5f8f513bcfd567ed7fb0262d/apscheduler-3.11.2-py3-none-any.whl", hash = "sha256:ce005177f741409db4e4dd40a7431b76feb856b9dd69d57e0da49d6715bfd26d", upload-time = "2025-12-22T00:39:33.303Z" }, + { url = "https://files.pythonhosted.org/packages/9f/64/2e54428beba8d9992aa478bb8f6de9e4ecaa5f8f513bcfd567ed7fb0262d/apscheduler-3.11.2-py3-none-any.whl", hash = "sha256:ce005177f741409db4e4dd40a7431b76feb856b9dd69d57e0da49d6715bfd26d", size = 64439, upload-time = "2025-12-22T00:39:33.303Z" }, ] [[package]] name = "ast-serialize" version = "0.5.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/81/9d/09e27731bd5864a9ce04e3244074e674bb8936bf62b45e0357248717adac/ast_serialize-0.5.0.tar.gz", hash = "sha256:5880091bfe6f4f986f22866375c2e884843e7a0b6343ae41aeea659613d879b6", upload-time = "2026-05-17T17:48:29.429Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/9a/13dde51ba9e15f8b97957ab7cb0120d0e381524d651c6bd630b9c359227f/ast_serialize-0.5.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8f5c14f169eb0972c0c21bada5358b23d6047c76583b005234f865b11f1fa00a", upload-time = "2026-05-17T17:47:30.831Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/37/de/5a7f0a9fe68944f536632a5af84676739c7d2582be42deb082634bf3a754/ast_serialize-0.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7d1a2de9de5be04652f0ed60738356ef94f66db37924a9499fffe98dc491aa0b", upload-time = "2026-05-17T17:47:32.551Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/81/0bb853e76e4f6e9a1855d569003c59e19ffac45f7079d91505d1bb212f92/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be5173fb66f9b49026d9d5a2ff0fc7c7009077107c0eb285b2d60fdf1fe10bd1", upload-time = "2026-05-17T17:47:34.731Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/d3/4cf705beeccc08754d0bbda99aefff26110e209b9a07ac8a6b60eec48531/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8015cd071ac1339924ee2b8098c93e00e155f30a16f40ec9816fcf84f4753f6", upload-time = "2026-05-17T17:47:36.287Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/26/c8/ee097e437ea27dd2b8b227865c875492b585650a5802a22d82b304c8201b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5499e8797edff2a9186aa313ed382c6b422e798e9332d9953badcee6e69a88f2", upload-time = "2026-05-17T17:47:38.17Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ff/bd/68063442838f1ba68ec72b5436430bc75b3bb17a1a3c3063f09b0c05ae2b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6848f2a093fb5548751a9a09bff8fcd229e2bbeb0e3331f391b6ae6d26cd9903", upload-time = "2026-05-17T17:47:39.826Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/e2/1e520793bc6a4e4524a6ab022391e827825eaa0c3811828bfdc6852eca26/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:832d4c998e0b091fd60a6d6bceee535483c4d490de9ba85003af835225719261", upload-time = "2026-05-17T17:47:41.369Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4e/e1/49b60f467979979cfe6913b43948ff25bca971ad0591d181812f163a988e/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:16db7c62ec0b8efe1d7afd283a388d8f74f2605d56032e5a37747d2de8dba027", upload-time = "2026-05-17T17:47:43.702Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/74/ba/66ab9555de6275677566f6574e5ef6c29cb185ea866f643bc06f8280a8ee/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:baf5eb061eb5bccade4128ad42da33787d72f6013809cd1b590376ece8b3c937", upload-time = "2026-05-17T17:47:46.256Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/42/6aca9b9abc710014b2be9059689e5dd1679339e78f567ffb4d255a9e2050/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:104e4a35bd7c124173c41760ef9aaea17ddb3f86c65cb643671d59afbe3ee94c", upload-time = "2026-05-17T17:47:47.899Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/47/68/2f76594432a22581ecf878b5e75a9b8601c24b2241cf0bbeb1e21fcf370c/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:36be371028fc1675acb38a331bde160dbab7ff907fdf00b67eb6911aa106951b", upload-time = "2026-05-17T17:47:50.942Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/ac/a93c9b58292653f6c595752f677a08e608f903b710594909e9231a389b3b/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:061ee58bdb52341c8201a6df41182a977736bae3b7ded87ca7176ca25a8a47ab", upload-time = "2026-05-17T17:47:54.093Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/14/2e/b278f68c497ee2f1d1576cbbef8db5281cd4a5f2db040537592ac9c8862e/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b15219e9cdc9f53f6f4cb51c009203507228226148c05c5e8fe451c28b435eb3", upload-time = "2026-05-17T17:47:56.311Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/43/419be1c566a4c504cd8fd60ce2f84e790f295495c0f327cfaeadf3d51012/ast_serialize-0.5.0-cp314-cp314t-win32.whl", hash = "sha256:842d1c004bb466c7df036f95fabef789570541922b10976b12f5592a69cf0b38", upload-time = "2026-05-17T17:47:58.305Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/6f/c9d4d549295ed05111aeb8853232d1afd9d0a179fddb01eeffbb3a4a6842/ast_serialize-0.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b0c06d760909b095cc466356dfccd05a1c7233a6ca191c020dca2c6a6f16c24c", upload-time = "2026-05-17T17:48:00.35Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d0/8e/d00c5ab30c58222e07d62956fca86c59d91b9ad32997e633c38b526623a3/ast_serialize-0.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:787baedb0262cc49e8ce37cc15c00ae818e46a165a3b36f5e21ed174998104cb", upload-time = "2026-05-17T17:48:01.753Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/9e/dc2530acb3a60dc6e46d65abf27d1d9f86721694757906a148d90a6860de/ast_serialize-0.5.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:0668aa9459cfa8c9c49ddd2163ebcf43088ba045ef7492af6fe22e0098303101", upload-time = "2026-05-17T17:48:03.738Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/26/0a/bd3d18a582f273d6c843d16bb9e22e9e16365ff7991e92f18f798e9f1224/ast_serialize-0.5.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bf683d6363edf2b39eed6b6d4fe22d34b6203867a67e27134d9e2a2680c4bc4a", upload-time = "2026-05-17T17:48:05.463Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/ae/1f919100f8620887af58fcc381c61a1f218cdf89c6e155f87b213e61010a/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc22cf0c9be65e71cf88fda130af60d61eb4a79370ad4cfe7900d48a4aa2211", upload-time = "2026-05-17T17:48:07.008Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c6/ca/6376559dcce707cdbc1d0d9a13c8d3baaaa501e949ce0ebdc4230cd881aa/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f66173891548c9f2726bf27957b41cabce12fa679dc6da505ddbde4d4b3b31cf", upload-time = "2026-05-17T17:48:08.46Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/35/b2/a620e206b5aeb7efbf2710336df57d457cffbb3991076bbcc1147ef9abd4/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e42d729ef2be96a14efbad355093284739e3670ece3e534f82cc8832790911d9", upload-time = "2026-05-17T17:48:09.922Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fa/e0/4ad5c04c24a40481b2935ce9a0ccdb6023dc8b667167d06ae530cc3512f2/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b725026bafa801dbd7310eb13a75f0a2e370e7e51b2cb225f9d21fcfadf919ee", upload-time = "2026-05-17T17:48:11.469Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/71/4d1d479aa56d0101c40e17720c3d6ac2af7269ea0487a80b18e7bfd1a5b7/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b54f60c1d78767a53b67eaa663f0dfac3afe606aa07f1301572f588b73d64809", upload-time = "2026-05-17T17:48:13.575Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/4f/0de1bbe06f6edef9fde4ed12ca8e7b3ec7e6e2bd4e672c5af487f7957665/ast_serialize-0.5.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:27d51654fc240a1e87e742d353d98eb45b75f62f129086b3596ab53df2ac2a43", upload-time = "2026-05-17T17:48:15.141Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/75/61/e00872439cfdddcc3c1b6cdaa6e5d904ba8e26a18807c67c4e14409d0ca8/ast_serialize-0.5.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c36237c46dd1674542f2109740ea5ea485a169bf1431939ada0434e17934", upload-time = "2026-05-17T17:48:16.779Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/76/8e/699a5b955f7926956c95e9e1d74132acad73c2fe7a426f94da89123c20aa/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1943db345233cc7194a470f13afa9c59772c0b123dea0c9414c4d4ca54369759", upload-time = "2026-05-17T17:48:18.527Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a9/ae/d5b7626874478997adc7a29ab28accf21e596fb590c944290401dfd0b29e/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df1c00022cbbcb064bfaa505aa9c9295362443ce5dacb459d1331d3da353f887", upload-time = "2026-05-17T17:48:20.133Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/ce/b59e02a82d9c4244d64cde502e0b00e83e38816abe19155ceb5437402c7f/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:cae65289fc456fde04af979a2be09302ef5d8ab92ef23e596d6746dc267ada27", upload-time = "2026-05-17T17:48:21.921Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/38/d8d90042747d05aa08d4efcf1c99035a5f670a6bf4c214d31644392afbca/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:239a4c354e8d676e9d94631d1d4a64edc6b266f86ff3a5a80aedd344f342c01d", upload-time = "2026-05-17T17:48:23.544Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dd/51/5b840c4df7334104cecffa28f23904fe81ca89ca223d2450e288de39fd3c/ast_serialize-0.5.0-cp39-abi3-win32.whl", hash = "sha256:143a4ef63285a075871908fda3672dc21864b83a8ec3ee12304aa3e4c5387b9a", upload-time = "2026-05-17T17:48:25.027Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/41/11/ca5672c7d491825bc4cd6702dea106a6b60d928707712ec257c7833ae476/ast_serialize-0.5.0-cp39-abi3-win_amd64.whl", hash = "sha256:cf25572c526add400f26a4750dc6ce0c3bb93fc1f75e7ae0cad4ce4f2cd5c590", upload-time = "2026-05-17T17:48:26.591Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/45/19/cc8bd127d28a43da249aa955cfd164cf8fd534e79e42cea96c4854d72fd0/ast_serialize-0.5.0-cp39-abi3-win_arm64.whl", hash = "sha256:92a31c9c20d25a076edaeec76b128a3535d74a24f340b9a8a7e96c9b86dc9642", upload-time = "2026-05-17T17:48:28.122Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/81/9d/09e27731bd5864a9ce04e3244074e674bb8936bf62b45e0357248717adac/ast_serialize-0.5.0.tar.gz", hash = "sha256:5880091bfe6f4f986f22866375c2e884843e7a0b6343ae41aeea659613d879b6", size = 61157, upload-time = "2026-05-17T17:48:29.429Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/9a/13dde51ba9e15f8b97957ab7cb0120d0e381524d651c6bd630b9c359227f/ast_serialize-0.5.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8f5c14f169eb0972c0c21bada5358b23d6047c76583b005234f865b11f1fa00a", size = 1183520, upload-time = "2026-05-17T17:47:30.831Z" }, + { url = "https://files.pythonhosted.org/packages/37/de/5a7f0a9fe68944f536632a5af84676739c7d2582be42deb082634bf3a754/ast_serialize-0.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7d1a2de9de5be04652f0ed60738356ef94f66db37924a9499fffe98dc491aa0b", size = 1175779, upload-time = "2026-05-17T17:47:32.551Z" }, + { url = "https://files.pythonhosted.org/packages/9c/81/0bb853e76e4f6e9a1855d569003c59e19ffac45f7079d91505d1bb212f92/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be5173fb66f9b49026d9d5a2ff0fc7c7009077107c0eb285b2d60fdf1fe10bd1", size = 1233750, upload-time = "2026-05-17T17:47:34.731Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d3/4cf705beeccc08754d0bbda99aefff26110e209b9a07ac8a6b60eec48531/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8015cd071ac1339924ee2b8098c93e00e155f30a16f40ec9816fcf84f4753f6", size = 1235942, upload-time = "2026-05-17T17:47:36.287Z" }, + { url = "https://files.pythonhosted.org/packages/26/c8/ee097e437ea27dd2b8b227865c875492b585650a5802a22d82b304c8201b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5499e8797edff2a9186aa313ed382c6b422e798e9332d9953badcee6e69a88f2", size = 1442517, upload-time = "2026-05-17T17:47:38.17Z" }, + { url = "https://files.pythonhosted.org/packages/ff/bd/68063442838f1ba68ec72b5436430bc75b3bb17a1a3c3063f09b0c05ae2b/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6848f2a093fb5548751a9a09bff8fcd229e2bbeb0e3331f391b6ae6d26cd9903", size = 1254081, upload-time = "2026-05-17T17:47:39.826Z" }, + { url = "https://files.pythonhosted.org/packages/50/e2/1e520793bc6a4e4524a6ab022391e827825eaa0c3811828bfdc6852eca26/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:832d4c998e0b091fd60a6d6bceee535483c4d490de9ba85003af835225719261", size = 1259910, upload-time = "2026-05-17T17:47:41.369Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e1/49b60f467979979cfe6913b43948ff25bca971ad0591d181812f163a988e/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:16db7c62ec0b8efe1d7afd283a388d8f74f2605d56032e5a37747d2de8dba027", size = 1250678, upload-time = "2026-05-17T17:47:43.702Z" }, + { url = "https://files.pythonhosted.org/packages/74/ba/66ab9555de6275677566f6574e5ef6c29cb185ea866f643bc06f8280a8ee/ast_serialize-0.5.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:baf5eb061eb5bccade4128ad42da33787d72f6013809cd1b590376ece8b3c937", size = 1301603, upload-time = "2026-05-17T17:47:46.256Z" }, + { url = "https://files.pythonhosted.org/packages/66/42/6aca9b9abc710014b2be9059689e5dd1679339e78f567ffb4d255a9e2050/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:104e4a35bd7c124173c41760ef9aaea17ddb3f86c65cb643671d59afbe3ee94c", size = 1410332, upload-time = "2026-05-17T17:47:47.899Z" }, + { url = "https://files.pythonhosted.org/packages/47/68/2f76594432a22581ecf878b5e75a9b8601c24b2241cf0bbeb1e21fcf370c/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:36be371028fc1675acb38a331bde160dbab7ff907fdf00b67eb6911aa106951b", size = 1509979, upload-time = "2026-05-17T17:47:50.942Z" }, + { url = "https://files.pythonhosted.org/packages/40/ac/a93c9b58292653f6c595752f677a08e608f903b710594909e9231a389b3b/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:061ee58bdb52341c8201a6df41182a977736bae3b7ded87ca7176ca25a8a47ab", size = 1505002, upload-time = "2026-05-17T17:47:54.093Z" }, + { url = "https://files.pythonhosted.org/packages/14/2e/b278f68c497ee2f1d1576cbbef8db5281cd4a5f2db040537592ac9c8862e/ast_serialize-0.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b15219e9cdc9f53f6f4cb51c009203507228226148c05c5e8fe451c28b435eb3", size = 1456231, upload-time = "2026-05-17T17:47:56.311Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/419be1c566a4c504cd8fd60ce2f84e790f295495c0f327cfaeadf3d51012/ast_serialize-0.5.0-cp314-cp314t-win32.whl", hash = "sha256:842d1c004bb466c7df036f95fabef789570541922b10976b12f5592a69cf0b38", size = 1058668, upload-time = "2026-05-17T17:47:58.305Z" }, + { url = "https://files.pythonhosted.org/packages/03/6f/c9d4d549295ed05111aeb8853232d1afd9d0a179fddb01eeffbb3a4a6842/ast_serialize-0.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b0c06d760909b095cc466356dfccd05a1c7233a6ca191c020dca2c6a6f16c24c", size = 1101075, upload-time = "2026-05-17T17:48:00.35Z" }, + { url = "https://files.pythonhosted.org/packages/d0/8e/d00c5ab30c58222e07d62956fca86c59d91b9ad32997e633c38b526623a3/ast_serialize-0.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:787baedb0262cc49e8ce37cc15c00ae818e46a165a3b36f5e21ed174998104cb", size = 1075347, upload-time = "2026-05-17T17:48:01.753Z" }, + { url = "https://files.pythonhosted.org/packages/e0/9e/dc2530acb3a60dc6e46d65abf27d1d9f86721694757906a148d90a6860de/ast_serialize-0.5.0-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:0668aa9459cfa8c9c49ddd2163ebcf43088ba045ef7492af6fe22e0098303101", size = 1191380, upload-time = "2026-05-17T17:48:03.738Z" }, + { url = "https://files.pythonhosted.org/packages/26/0a/bd3d18a582f273d6c843d16bb9e22e9e16365ff7991e92f18f798e9f1224/ast_serialize-0.5.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:bf683d6363edf2b39eed6b6d4fe22d34b6203867a67e27134d9e2a2680c4bc4a", size = 1183879, upload-time = "2026-05-17T17:48:05.463Z" }, + { url = "https://files.pythonhosted.org/packages/40/ae/1f919100f8620887af58fcc381c61a1f218cdf89c6e155f87b213e61010a/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc22cf0c9be65e71cf88fda130af60d61eb4a79370ad4cfe7900d48a4aa2211", size = 1244529, upload-time = "2026-05-17T17:48:07.008Z" }, + { url = "https://files.pythonhosted.org/packages/c6/ca/6376559dcce707cdbc1d0d9a13c8d3baaaa501e949ce0ebdc4230cd881aa/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f66173891548c9f2726bf27957b41cabce12fa679dc6da505ddbde4d4b3b31cf", size = 1240560, upload-time = "2026-05-17T17:48:08.46Z" }, + { url = "https://files.pythonhosted.org/packages/35/b2/a620e206b5aeb7efbf2710336df57d457cffbb3991076bbcc1147ef9abd4/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e42d729ef2be96a14efbad355093284739e3670ece3e534f82cc8832790911d9", size = 1451172, upload-time = "2026-05-17T17:48:09.922Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e0/4ad5c04c24a40481b2935ce9a0ccdb6023dc8b667167d06ae530cc3512f2/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b725026bafa801dbd7310eb13a75f0a2e370e7e51b2cb225f9d21fcfadf919ee", size = 1265072, upload-time = "2026-05-17T17:48:11.469Z" }, + { url = "https://files.pythonhosted.org/packages/b2/71/4d1d479aa56d0101c40e17720c3d6ac2af7269ea0487a80b18e7bfd1a5b7/ast_serialize-0.5.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b54f60c1d78767a53b67eaa663f0dfac3afe606aa07f1301572f588b73d64809", size = 1270488, upload-time = "2026-05-17T17:48:13.575Z" }, + { url = "https://files.pythonhosted.org/packages/6d/4f/0de1bbe06f6edef9fde4ed12ca8e7b3ec7e6e2bd4e672c5af487f7957665/ast_serialize-0.5.0-cp39-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:27d51654fc240a1e87e742d353d98eb45b75f62f129086b3596ab53df2ac2a43", size = 1260702, upload-time = "2026-05-17T17:48:15.141Z" }, + { url = "https://files.pythonhosted.org/packages/75/61/e00872439cfdddcc3c1b6cdaa6e5d904ba8e26a18807c67c4e14409d0ca8/ast_serialize-0.5.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c36237c46dd1674542f2109740ea5ea485a169bf1431939ada0434e17934", size = 1311182, upload-time = "2026-05-17T17:48:16.779Z" }, + { url = "https://files.pythonhosted.org/packages/76/8e/699a5b955f7926956c95e9e1d74132acad73c2fe7a426f94da89123c20aa/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1943db345233cc7194a470f13afa9c59772c0b123dea0c9414c4d4ca54369759", size = 1421410, upload-time = "2026-05-17T17:48:18.527Z" }, + { url = "https://files.pythonhosted.org/packages/a9/ae/d5b7626874478997adc7a29ab28accf21e596fb590c944290401dfd0b29e/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:df1c00022cbbcb064bfaa505aa9c9295362443ce5dacb459d1331d3da353f887", size = 1516587, upload-time = "2026-05-17T17:48:20.133Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ce/b59e02a82d9c4244d64cde502e0b00e83e38816abe19155ceb5437402c7f/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:cae65289fc456fde04af979a2be09302ef5d8ab92ef23e596d6746dc267ada27", size = 1515171, upload-time = "2026-05-17T17:48:21.921Z" }, + { url = "https://files.pythonhosted.org/packages/8b/38/d8d90042747d05aa08d4efcf1c99035a5f670a6bf4c214d31644392afbca/ast_serialize-0.5.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:239a4c354e8d676e9d94631d1d4a64edc6b266f86ff3a5a80aedd344f342c01d", size = 1464668, upload-time = "2026-05-17T17:48:23.544Z" }, + { url = "https://files.pythonhosted.org/packages/dd/51/5b840c4df7334104cecffa28f23904fe81ca89ca223d2450e288de39fd3c/ast_serialize-0.5.0-cp39-abi3-win32.whl", hash = "sha256:143a4ef63285a075871908fda3672dc21864b83a8ec3ee12304aa3e4c5387b9a", size = 1068311, upload-time = "2026-05-17T17:48:25.027Z" }, + { url = "https://files.pythonhosted.org/packages/41/11/ca5672c7d491825bc4cd6702dea106a6b60d928707712ec257c7833ae476/ast_serialize-0.5.0-cp39-abi3-win_amd64.whl", hash = "sha256:cf25572c526add400f26a4750dc6ce0c3bb93fc1f75e7ae0cad4ce4f2cd5c590", size = 1108931, upload-time = "2026-05-17T17:48:26.591Z" }, + { url = "https://files.pythonhosted.org/packages/45/19/cc8bd127d28a43da249aa955cfd164cf8fd534e79e42cea96c4854d72fd0/ast_serialize-0.5.0-cp39-abi3-win_arm64.whl", hash = "sha256:92a31c9c20d25a076edaeec76b128a3535d74a24f340b9a8a7e96c9b86dc9642", size = 1081181, upload-time = "2026-05-17T17:48:28.122Z" }, ] [[package]] name = "async-timeout" version = "5.0.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", upload-time = "2024-11-06T16:41:39.6Z" } +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://pypi-proxy.dev.databricks.com/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", upload-time = "2024-11-06T16:41:37.9Z" }, + { 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-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", upload-time = "2026-03-19T14:22:25.026Z" } +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://pypi-proxy.dev.databricks.com/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", upload-time = "2026-03-19T14:22:23.645Z" }, + { 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]] @@ -359,45 +356,45 @@ dependencies = [ { name = "cryptography" }, { name = "joserfc" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/36/98/7d93f30d029643c0275dbc0bd6d5a6f670661ee6c9a94d93af7ab4887600/authlib-1.7.2.tar.gz", hash = "sha256:2cea25fefcd4e7173bdf1372c0afc265c8034b23a8cd5dcb6a9164b826c64231", upload-time = "2026-05-06T08:10:23.116Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/98/7d93f30d029643c0275dbc0bd6d5a6f670661ee6c9a94d93af7ab4887600/authlib-1.7.2.tar.gz", hash = "sha256:2cea25fefcd4e7173bdf1372c0afc265c8034b23a8cd5dcb6a9164b826c64231", size = 176511, upload-time = "2026-05-06T08:10:23.116Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/fb/95/adcb68e20c34162e9135f370d6e31737719c2b6f94bc953fe7ed1f10fe21/authlib-1.7.2-py2.py3-none-any.whl", hash = "sha256:3e1faedc9d87e7d56a164eca3ccb6ace0d61b94abe83e92242f8dc8bba9b4a9f", upload-time = "2026-05-06T08:10:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/fb/95/adcb68e20c34162e9135f370d6e31737719c2b6f94bc953fe7ed1f10fe21/authlib-1.7.2-py2.py3-none-any.whl", hash = "sha256:3e1faedc9d87e7d56a164eca3ccb6ace0d61b94abe83e92242f8dc8bba9b4a9f", size = 259548, upload-time = "2026-05-06T08:10:21.436Z" }, ] [[package]] name = "babel" version = "2.18.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", upload-time = "2026-02-01T12:30:56.078Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", upload-time = "2026-02-01T12:30:53.445Z" }, + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, ] [[package]] name = "backports-asyncio-runner" version = "1.2.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/8e/ff/70dca7d7cb1cbc0edb2c6cc0c38b65cba36cccc491eca64cabd5fe7f8670/backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162", upload-time = "2025-07-02T02:27:15.685Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/ff/70dca7d7cb1cbc0edb2c6cc0c38b65cba36cccc491eca64cabd5fe7f8670/backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162", size = 69893, upload-time = "2025-07-02T02:27:15.685Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", upload-time = "2025-07-02T02:27:14.263Z" }, + { url = "https://files.pythonhosted.org/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", size = 12313, upload-time = "2025-07-02T02:27:14.263Z" }, ] [[package]] name = "backports-tarfile" version = "1.2.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", upload-time = "2024-05-28T17:01:54.731Z" } +sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406, upload-time = "2024-05-28T17:01:54.731Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", upload-time = "2024-05-28T17:01:53.112Z" }, + { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, ] [[package]] name = "beartype" version = "0.22.9" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/c7/94/1009e248bbfbab11397abca7193bea6626806be9a327d399810d523a07cb/beartype-0.22.9.tar.gz", hash = "sha256:8f82b54aa723a2848a56008d18875f91c1db02c32ef6a62319a002e3e25a975f", upload-time = "2025-12-13T06:50:30.72Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/94/1009e248bbfbab11397abca7193bea6626806be9a327d399810d523a07cb/beartype-0.22.9.tar.gz", hash = "sha256:8f82b54aa723a2848a56008d18875f91c1db02c32ef6a62319a002e3e25a975f", size = 1608866, upload-time = "2025-12-13T06:50:30.72Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl", hash = "sha256:d16c9bbc61ea14637596c5f6fbff2ee99cbe3573e46a716401734ef50c3060c2", upload-time = "2025-12-13T06:50:28.266Z" }, + { url = "https://files.pythonhosted.org/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl", hash = "sha256:d16c9bbc61ea14637596c5f6fbff2ee99cbe3573e46a716401734ef50c3060c2", size = 1333658, upload-time = "2025-12-13T06:50:28.266Z" }, ] [[package]] @@ -414,52 +411,52 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/e1/c5/61175d618685d42b005847464b8fb4743a67b1b8fdb75e50e5a96c31a27a/black-26.3.1.tar.gz", hash = "sha256:2c50f5063a9641c7eed7795014ba37b0f5fa227f3d408b968936e24bc0566b07", upload-time = "2026-03-12T03:36:03.593Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/32/a8/11170031095655d36ebc6664fe0897866f6023892396900eec0e8fdc4299/black-26.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:86a8b5035fce64f5dcd1b794cf8ec4d31fe458cf6ce3986a30deb434df82a1d2", upload-time = "2026-03-12T03:39:58.639Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/69/ce/9e7548d719c3248c6c2abfd555d11169457cbd584d98d179111338423790/black-26.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5602bdb96d52d2d0672f24f6ffe5218795736dd34807fd0fd55ccd6bf206168b", upload-time = "2026-03-12T03:40:00.347Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7f/0a/8d17d1a9c06f88d3d030d0b1d4373c1551146e252afe4547ed601c0e697f/black-26.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c54a4a82e291a1fee5137371ab488866b7c86a3305af4026bdd4dc78642e1ac", upload-time = "2026-03-12T03:40:01.765Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/52/79/c1ee726e221c863cde5164f925bacf183dfdf0397d4e3f94889439b947b4/black-26.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:6e131579c243c98f35bce64a7e08e87fb2d610544754675d4a0e73a070a5aa3a", upload-time = "2026-03-12T03:40:03.252Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/a5/15c01d613f5756f68ed8f6d4ec0a1e24b82b18889fa71affd3d1f7fad058/black-26.3.1-cp310-cp310-win_arm64.whl", hash = "sha256:5ed0ca58586c8d9a487352a96b15272b7fa55d139fc8496b519e78023a8dab0a", upload-time = "2026-03-12T03:40:04.892Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/17/57/5f11c92861f9c92eb9dddf515530bc2d06db843e44bdcf1c83c1427824bc/black-26.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:28ef38aee69e4b12fda8dba75e21f9b4f979b490c8ac0baa7cb505369ac9e1ff", upload-time = "2026-03-12T03:40:06.248Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/54/aa/340a1463660bf6831f9e39646bf774086dbd8ca7fc3cded9d59bbdf4ad0a/black-26.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bf162ed91a26f1adba8efda0b573bc6924ec1408a52cc6f82cb73ec2b142c", upload-time = "2026-03-12T03:40:07.642Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f3/01/b726c93d717d72733da031d2de10b92c9fa4c8d0c67e8a8a372076579279/black-26.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:474c27574d6d7037c1bc875a81d9be0a9a4f9ee95e62800dab3cfaadbf75acd5", upload-time = "2026-03-12T03:40:09.279Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e3/09/61e91881ca291f150cfc9eb7ba19473c2e59df28859a11a88248b5cbbc4d/black-26.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e9d0d86df21f2e1677cc4bd090cd0e446278bcbbe49bf3659c308c3e402843e", upload-time = "2026-03-12T03:40:10.943Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/16/73/544f23891b22e7efe4d8f812371ab85b57f6a01b2fc45e3ba2e52ba985b8/black-26.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:9a5e9f45e5d5e1c5b5c29b3bd4265dcc90e8b92cf4534520896ed77f791f4da5", upload-time = "2026-03-12T03:40:12.597Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dc/f8/da5eae4fc75e78e6dceb60624e1b9662ab00d6b452996046dfa9b8a6025b/black-26.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e6f89631eb88a7302d416594a32faeee9fb8fb848290da9d0a5f2903519fc1", upload-time = "2026-03-12T03:40:13.921Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2c/9f/04e6f26534da2e1629b2b48255c264cabf5eedc5141d04516d9d68a24111/black-26.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cd2012d35b47d589cb8a16faf8a32ef7a336f56356babd9fcf70939ad1897f", upload-time = "2026-03-12T03:40:15.239Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/04/91/a5935b2a63e31b331060c4a9fdb5a6c725840858c599032a6f3aac94055f/black-26.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f76ff19ec5297dd8e66eb64deda23631e642c9393ab592826fd4bdc97a4bce7", upload-time = "2026-03-12T03:40:17.124Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e7/0a/86e462cdd311a3c2a8ece708d22aba17d0b2a0d5348ca34b40cdcbea512e/black-26.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ddb113db38838eb9f043623ba274cfaf7d51d5b0c22ecb30afe58b1bb8322983", upload-time = "2026-03-12T03:40:18.83Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5b/e5/22515a19cb7eaee3440325a6b0d95d2c0e88dd180cb011b12ae488e031d1/black-26.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:dfdd51fc3e64ea4f35873d1b3fb25326773d55d2329ff8449139ebaad7357efb", upload-time = "2026-03-12T03:40:20.425Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/77/5728052a3c0450c53d9bb3945c4c46b91baa62b2cafab6801411b6271e45/black-26.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:855822d90f884905362f602880ed8b5df1b7e3ee7d0db2502d4388a954cc8c54", upload-time = "2026-03-12T03:40:21.813Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/52/73/7cae55fdfdfbe9d19e9a8d25d145018965fe2079fa908101c3733b0c55a0/black-26.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8a33d657f3276328ce00e4d37fe70361e1ec7614da5d7b6e78de5426cb56332f", upload-time = "2026-03-12T03:40:23.666Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e1/87/af89ad449e8254fdbc74654e6467e3c9381b61472cc532ee350d28cfdafb/black-26.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1cd08e99d2f9317292a311dfe578fd2a24b15dbce97792f9c4d752275c1fa56", upload-time = "2026-03-12T03:40:25.497Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/43/10/d6c06a791d8124b843bf325ab4ac7d2f5b98731dff84d6064eafd687ded1/black-26.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:c7e72339f841b5a237ff14f7d3880ddd0fc7f98a1199e8c4327f9a4f478c1839", upload-time = "2026-03-12T03:40:27.14Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/59/4f/40a582c015f2d841ac24fed6390bd68f0fc896069ff3a886317959c9daf8/black-26.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc622538b430aa4c8c853f7f63bc582b3b8030fd8c80b70fb5fa5b834e575c2", upload-time = "2026-03-12T03:40:28.882Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/da/e36e27c9cebc1311b7579210df6f1c86e50f2d7143ae4fcf8a5017dc8809/black-26.3.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2d6bfaf7fd0993b420bed691f20f9492d53ce9a2bcccea4b797d34e947318a78", upload-time = "2026-03-12T03:40:30.964Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0e/7b/9871acf393f64a5fa33668c19350ca87177b181f44bb3d0c33b2d534f22c/black-26.3.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f89f2ab047c76a9c03f78d0d66ca519e389519902fa27e7a91117ef7611c0568", upload-time = "2026-03-12T03:40:32.346Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/87/e766c7f2e90c07fb7586cc787c9ae6462b1eedab390191f2b7fc7f6170a9/black-26.3.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b07fc0dab849d24a80a29cfab8d8a19187d1c4685d8a5e6385a5ce323c1f015f", upload-time = "2026-03-12T03:40:33.636Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ac/94/2424338fb2d1875e9e83eed4c8e9c67f6905ec25afd826a911aea2b02535/black-26.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:0126ae5b7c09957da2bdbd91a9ba1207453feada9e9fe51992848658c6c8e01c", upload-time = "2026-03-12T03:40:35.442Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/43/0c3338bd928afb8ee7471f1a4eec3bdbe2245ccb4a646092a222e8669840/black-26.3.1-cp314-cp314-win_arm64.whl", hash = "sha256:92c0ec1f2cc149551a2b7b47efc32c866406b6891b0ee4625e95967c8f4acfb1", upload-time = "2026-03-12T03:40:36.832Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8e/0d/52d98722666d6fc6c3dd4c76df339501d6efd40e0ff95e6186a7b7f0befd/black-26.3.1-py3-none-any.whl", hash = "sha256:2bd5aa94fc267d38bb21a70d7410a89f1a1d318841855f698746f8e7f51acd1b", upload-time = "2026-03-12T03:36:01.668Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/e1/c5/61175d618685d42b005847464b8fb4743a67b1b8fdb75e50e5a96c31a27a/black-26.3.1.tar.gz", hash = "sha256:2c50f5063a9641c7eed7795014ba37b0f5fa227f3d408b968936e24bc0566b07", size = 666155, upload-time = "2026-03-12T03:36:03.593Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/a8/11170031095655d36ebc6664fe0897866f6023892396900eec0e8fdc4299/black-26.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:86a8b5035fce64f5dcd1b794cf8ec4d31fe458cf6ce3986a30deb434df82a1d2", size = 1866562, upload-time = "2026-03-12T03:39:58.639Z" }, + { url = "https://files.pythonhosted.org/packages/69/ce/9e7548d719c3248c6c2abfd555d11169457cbd584d98d179111338423790/black-26.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5602bdb96d52d2d0672f24f6ffe5218795736dd34807fd0fd55ccd6bf206168b", size = 1703623, upload-time = "2026-03-12T03:40:00.347Z" }, + { url = "https://files.pythonhosted.org/packages/7f/0a/8d17d1a9c06f88d3d030d0b1d4373c1551146e252afe4547ed601c0e697f/black-26.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c54a4a82e291a1fee5137371ab488866b7c86a3305af4026bdd4dc78642e1ac", size = 1768388, upload-time = "2026-03-12T03:40:01.765Z" }, + { url = "https://files.pythonhosted.org/packages/52/79/c1ee726e221c863cde5164f925bacf183dfdf0397d4e3f94889439b947b4/black-26.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:6e131579c243c98f35bce64a7e08e87fb2d610544754675d4a0e73a070a5aa3a", size = 1412969, upload-time = "2026-03-12T03:40:03.252Z" }, + { url = "https://files.pythonhosted.org/packages/73/a5/15c01d613f5756f68ed8f6d4ec0a1e24b82b18889fa71affd3d1f7fad058/black-26.3.1-cp310-cp310-win_arm64.whl", hash = "sha256:5ed0ca58586c8d9a487352a96b15272b7fa55d139fc8496b519e78023a8dab0a", size = 1220345, upload-time = "2026-03-12T03:40:04.892Z" }, + { url = "https://files.pythonhosted.org/packages/17/57/5f11c92861f9c92eb9dddf515530bc2d06db843e44bdcf1c83c1427824bc/black-26.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:28ef38aee69e4b12fda8dba75e21f9b4f979b490c8ac0baa7cb505369ac9e1ff", size = 1851987, upload-time = "2026-03-12T03:40:06.248Z" }, + { url = "https://files.pythonhosted.org/packages/54/aa/340a1463660bf6831f9e39646bf774086dbd8ca7fc3cded9d59bbdf4ad0a/black-26.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bf9bf162ed91a26f1adba8efda0b573bc6924ec1408a52cc6f82cb73ec2b142c", size = 1689499, upload-time = "2026-03-12T03:40:07.642Z" }, + { url = "https://files.pythonhosted.org/packages/f3/01/b726c93d717d72733da031d2de10b92c9fa4c8d0c67e8a8a372076579279/black-26.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:474c27574d6d7037c1bc875a81d9be0a9a4f9ee95e62800dab3cfaadbf75acd5", size = 1754369, upload-time = "2026-03-12T03:40:09.279Z" }, + { url = "https://files.pythonhosted.org/packages/e3/09/61e91881ca291f150cfc9eb7ba19473c2e59df28859a11a88248b5cbbc4d/black-26.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:5e9d0d86df21f2e1677cc4bd090cd0e446278bcbbe49bf3659c308c3e402843e", size = 1413613, upload-time = "2026-03-12T03:40:10.943Z" }, + { url = "https://files.pythonhosted.org/packages/16/73/544f23891b22e7efe4d8f812371ab85b57f6a01b2fc45e3ba2e52ba985b8/black-26.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:9a5e9f45e5d5e1c5b5c29b3bd4265dcc90e8b92cf4534520896ed77f791f4da5", size = 1219719, upload-time = "2026-03-12T03:40:12.597Z" }, + { url = "https://files.pythonhosted.org/packages/dc/f8/da5eae4fc75e78e6dceb60624e1b9662ab00d6b452996046dfa9b8a6025b/black-26.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5e6f89631eb88a7302d416594a32faeee9fb8fb848290da9d0a5f2903519fc1", size = 1895920, upload-time = "2026-03-12T03:40:13.921Z" }, + { url = "https://files.pythonhosted.org/packages/2c/9f/04e6f26534da2e1629b2b48255c264cabf5eedc5141d04516d9d68a24111/black-26.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cd2012d35b47d589cb8a16faf8a32ef7a336f56356babd9fcf70939ad1897f", size = 1718499, upload-time = "2026-03-12T03:40:15.239Z" }, + { url = "https://files.pythonhosted.org/packages/04/91/a5935b2a63e31b331060c4a9fdb5a6c725840858c599032a6f3aac94055f/black-26.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f76ff19ec5297dd8e66eb64deda23631e642c9393ab592826fd4bdc97a4bce7", size = 1794994, upload-time = "2026-03-12T03:40:17.124Z" }, + { url = "https://files.pythonhosted.org/packages/e7/0a/86e462cdd311a3c2a8ece708d22aba17d0b2a0d5348ca34b40cdcbea512e/black-26.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:ddb113db38838eb9f043623ba274cfaf7d51d5b0c22ecb30afe58b1bb8322983", size = 1420867, upload-time = "2026-03-12T03:40:18.83Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e5/22515a19cb7eaee3440325a6b0d95d2c0e88dd180cb011b12ae488e031d1/black-26.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:dfdd51fc3e64ea4f35873d1b3fb25326773d55d2329ff8449139ebaad7357efb", size = 1230124, upload-time = "2026-03-12T03:40:20.425Z" }, + { url = "https://files.pythonhosted.org/packages/f5/77/5728052a3c0450c53d9bb3945c4c46b91baa62b2cafab6801411b6271e45/black-26.3.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:855822d90f884905362f602880ed8b5df1b7e3ee7d0db2502d4388a954cc8c54", size = 1895034, upload-time = "2026-03-12T03:40:21.813Z" }, + { url = "https://files.pythonhosted.org/packages/52/73/7cae55fdfdfbe9d19e9a8d25d145018965fe2079fa908101c3733b0c55a0/black-26.3.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8a33d657f3276328ce00e4d37fe70361e1ec7614da5d7b6e78de5426cb56332f", size = 1718503, upload-time = "2026-03-12T03:40:23.666Z" }, + { url = "https://files.pythonhosted.org/packages/e1/87/af89ad449e8254fdbc74654e6467e3c9381b61472cc532ee350d28cfdafb/black-26.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f1cd08e99d2f9317292a311dfe578fd2a24b15dbce97792f9c4d752275c1fa56", size = 1793557, upload-time = "2026-03-12T03:40:25.497Z" }, + { url = "https://files.pythonhosted.org/packages/43/10/d6c06a791d8124b843bf325ab4ac7d2f5b98731dff84d6064eafd687ded1/black-26.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:c7e72339f841b5a237ff14f7d3880ddd0fc7f98a1199e8c4327f9a4f478c1839", size = 1422766, upload-time = "2026-03-12T03:40:27.14Z" }, + { url = "https://files.pythonhosted.org/packages/59/4f/40a582c015f2d841ac24fed6390bd68f0fc896069ff3a886317959c9daf8/black-26.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:afc622538b430aa4c8c853f7f63bc582b3b8030fd8c80b70fb5fa5b834e575c2", size = 1232140, upload-time = "2026-03-12T03:40:28.882Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/e36e27c9cebc1311b7579210df6f1c86e50f2d7143ae4fcf8a5017dc8809/black-26.3.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2d6bfaf7fd0993b420bed691f20f9492d53ce9a2bcccea4b797d34e947318a78", size = 1889234, upload-time = "2026-03-12T03:40:30.964Z" }, + { url = "https://files.pythonhosted.org/packages/0e/7b/9871acf393f64a5fa33668c19350ca87177b181f44bb3d0c33b2d534f22c/black-26.3.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f89f2ab047c76a9c03f78d0d66ca519e389519902fa27e7a91117ef7611c0568", size = 1720522, upload-time = "2026-03-12T03:40:32.346Z" }, + { url = "https://files.pythonhosted.org/packages/03/87/e766c7f2e90c07fb7586cc787c9ae6462b1eedab390191f2b7fc7f6170a9/black-26.3.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b07fc0dab849d24a80a29cfab8d8a19187d1c4685d8a5e6385a5ce323c1f015f", size = 1787824, upload-time = "2026-03-12T03:40:33.636Z" }, + { url = "https://files.pythonhosted.org/packages/ac/94/2424338fb2d1875e9e83eed4c8e9c67f6905ec25afd826a911aea2b02535/black-26.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:0126ae5b7c09957da2bdbd91a9ba1207453feada9e9fe51992848658c6c8e01c", size = 1445855, upload-time = "2026-03-12T03:40:35.442Z" }, + { url = "https://files.pythonhosted.org/packages/86/43/0c3338bd928afb8ee7471f1a4eec3bdbe2245ccb4a646092a222e8669840/black-26.3.1-cp314-cp314-win_arm64.whl", hash = "sha256:92c0ec1f2cc149551a2b7b47efc32c866406b6891b0ee4625e95967c8f4acfb1", size = 1258109, upload-time = "2026-03-12T03:40:36.832Z" }, + { url = "https://files.pythonhosted.org/packages/8e/0d/52d98722666d6fc6c3dd4c76df339501d6efd40e0ff95e6186a7b7f0befd/black-26.3.1-py3-none-any.whl", hash = "sha256:2bd5aa94fc267d38bb21a70d7410a89f1a1d318841855f698746f8e7f51acd1b", size = 207542, upload-time = "2026-03-12T03:36:01.668Z" }, ] [[package]] name = "blinker" version = "1.9.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", upload-time = "2024-11-08T17:25:47.436Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460, upload-time = "2024-11-08T17:25:47.436Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", upload-time = "2024-11-08T17:25:46.184Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" }, ] [[package]] name = "boolean-py" version = "5.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", upload-time = "2025-04-03T10:39:49.734Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c4/cf/85379f13b76f3a69bca86b60237978af17d6aa0bc5998978c3b8cf05abb2/boolean_py-5.0.tar.gz", hash = "sha256:60cbc4bad079753721d32649545505362c754e121570ada4658b852a3a318d95", size = 37047, upload-time = "2025-04-03T10:39:49.734Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", upload-time = "2025-04-03T10:39:48.449Z" }, + { url = "https://files.pythonhosted.org/packages/e5/ca/78d423b324b8d77900030fa59c4aa9054261ef0925631cd2501dd015b7b7/boolean_py-5.0-py3-none-any.whl", hash = "sha256:ef28a70bd43115208441b53a045d1549e2f0ec6e3d08a9d142cbc41c1938e8d9", size = 26577, upload-time = "2025-04-03T10:39:48.449Z" }, ] [[package]] @@ -470,9 +467,9 @@ dependencies = [ { name = "msgpack" }, { name = "requests" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/2d/f6/c972b32d80760fb79d6b9eeb0b3010a46b89c0b23cf6329417ff7886cd22/cachecontrol-0.14.4.tar.gz", hash = "sha256:e6220afafa4c22a47dd0badb319f84475d79108100d04e26e8542ef7d3ab05a1", upload-time = "2025-11-14T04:32:13.138Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f6/c972b32d80760fb79d6b9eeb0b3010a46b89c0b23cf6329417ff7886cd22/cachecontrol-0.14.4.tar.gz", hash = "sha256:e6220afafa4c22a47dd0badb319f84475d79108100d04e26e8542ef7d3ab05a1", size = 16150, upload-time = "2025-11-14T04:32:13.138Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/ef/79/c45f2d53efe6ada1110cf6f9fca095e4ff47a0454444aefdde6ac4789179/cachecontrol-0.14.4-py3-none-any.whl", hash = "sha256:b7ac014ff72ee199b5f8af1de29d60239954f223e948196fa3d84adaffc71d2b", upload-time = "2025-11-14T04:32:11.733Z" }, + { url = "https://files.pythonhosted.org/packages/ef/79/c45f2d53efe6ada1110cf6f9fca095e4ff47a0454444aefdde6ac4789179/cachecontrol-0.14.4-py3-none-any.whl", hash = "sha256:b7ac014ff72ee199b5f8af1de29d60239954f223e948196fa3d84adaffc71d2b", size = 22247, upload-time = "2025-11-14T04:32:11.733Z" }, ] [package.optional-dependencies] @@ -484,47 +481,47 @@ filecache = [ name = "cachetools" version = "7.0.2" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/6c/c7/342b33cc6877eebc6c9bb45cb9f78e170e575839699f6f3cc96050176431/cachetools-7.0.2.tar.gz", hash = "sha256:7e7f09a4ca8b791d8bb4864afc71e9c17e607a28e6839ca1a644253c97dbeae0", upload-time = "2026-03-02T19:45:16.926Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/c7/342b33cc6877eebc6c9bb45cb9f78e170e575839699f6f3cc96050176431/cachetools-7.0.2.tar.gz", hash = "sha256:7e7f09a4ca8b791d8bb4864afc71e9c17e607a28e6839ca1a644253c97dbeae0", size = 36983, upload-time = "2026-03-02T19:45:16.926Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/ef/04/4b6968e77c110f12da96fdbfcb39c6557c2e5e81bd7afcf8ed893d5bc588/cachetools-7.0.2-py3-none-any.whl", hash = "sha256:938dcad184827c5e94928c4fd5526e2b46692b7fb1ae94472da9131d0299343c", upload-time = "2026-03-02T19:45:15.495Z" }, + { url = "https://files.pythonhosted.org/packages/ef/04/4b6968e77c110f12da96fdbfcb39c6557c2e5e81bd7afcf8ed893d5bc588/cachetools-7.0.2-py3-none-any.whl", hash = "sha256:938dcad184827c5e94928c4fd5526e2b46692b7fb1ae94472da9131d0299343c", size = 13793, upload-time = "2026-03-02T19:45:15.495Z" }, ] [[package]] name = "caio" version = "0.9.25" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/92/88/b8527e1b00c1811db339a1df8bd1ae49d146fcea9d6a5c40e3a80aaeb38d/caio-0.9.25.tar.gz", hash = "sha256:16498e7f81d1d0f5a4c0ad3f2540e65fe25691376e0a5bd367f558067113ed10", upload-time = "2025-12-26T15:21:36.501Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/6a/80/ea4ead0c5d52a9828692e7df20f0eafe8d26e671ce4883a0a146bb91049e/caio-0.9.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ca6c8ecda611478b6016cb94d23fd3eb7124852b985bdec7ecaad9f3116b9619", upload-time = "2025-12-26T15:22:04.662Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/17/b9/36715c97c873649d1029001578f901b50250916295e3dddf20c865438865/caio-0.9.25-cp310-cp310-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db9b5681e4af8176159f0d6598e73b2279bb661e718c7ac23342c550bd78c241", upload-time = "2025-12-26T15:22:18.818Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/ab/07080ecb1adb55a02cbd8ec0126aa8e43af343ffabb6a71125b42670e9a1/caio-0.9.25-cp310-cp310-manylinux_2_34_aarch64.whl", hash = "sha256:bf61d7d0c4fd10ffdd98ca47f7e8db4d7408e74649ffaf4bef40b029ada3c21b", upload-time = "2026-03-04T22:08:16.024Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/88/95/dd55757bb671eb4c376e006c04e83beb413486821f517792ea603ef216e9/caio-0.9.25-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:ab52e5b643f8bbd64a0605d9412796cd3464cb8ca88593b13e95a0f0b10508ae", upload-time = "2026-03-04T22:08:17.202Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ec/90/543f556fcfcfa270713eef906b6352ab048e1e557afec12925c991dc93c2/caio-0.9.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d6956d9e4a27021c8bd6c9677f3a59eb1d820cc32d0343cea7961a03b1371965", upload-time = "2025-12-26T15:21:40.267Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/51/3b/36f3e8ec38dafe8de4831decd2e44c69303d2a3892d16ceda42afed44e1b/caio-0.9.25-cp311-cp311-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bf84bfa039f25ad91f4f52944452a5f6f405e8afab4d445450978cd6241d1478", upload-time = "2025-12-26T15:22:20.271Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/ce/65e64867d928e6aff1b4f0e12dba0ef6d5bf412c240dc1df9d421ac10573/caio-0.9.25-cp311-cp311-manylinux_2_34_aarch64.whl", hash = "sha256:ae3d62587332bce600f861a8de6256b1014d6485cfd25d68c15caf1611dd1f7c", upload-time = "2026-03-04T22:08:20.402Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/46/90/e278863c47e14ec58309aa2e38a45882fbe67b4cc29ec9bc8f65852d3e45/caio-0.9.25-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:fc220b8533dcf0f238a6b1a4a937f92024c71e7b10b5a2dfc1c73604a25709bc", upload-time = "2026-03-04T22:08:21.368Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/25/79c98ebe12df31548ba4eaf44db11b7cad6b3e7b4203718335620939083c/caio-0.9.25-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fb7ff95af4c31ad3f03179149aab61097a71fd85e05f89b4786de0359dffd044", upload-time = "2025-12-26T15:21:36.075Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a3/2b/21288691f16d479945968a0a4f2856818c1c5be56881d51d4dac9b255d26/caio-0.9.25-cp312-cp312-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:97084e4e30dfa598449d874c4d8e0c8d5ea17d2f752ef5e48e150ff9d240cd64", upload-time = "2025-12-26T15:22:20.983Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/c4/8a1b580875303500a9c12b9e0af58cb82e47f5bcf888c2457742a138273c/caio-0.9.25-cp312-cp312-manylinux_2_34_aarch64.whl", hash = "sha256:4fa69eba47e0f041b9d4f336e2ad40740681c43e686b18b191b6c5f4c5544bfb", upload-time = "2026-03-04T22:08:22.381Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/1c/0fe770b8ffc8362c48134d1592d653a81a3d8748d764bec33864db36319d/caio-0.9.25-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:6bebf6f079f1341d19f7386db9b8b1f07e8cc15ae13bfdaff573371ba0575d69", upload-time = "2026-03-04T22:08:23.382Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/31/57/5e6ff127e6f62c9f15d989560435c642144aa4210882f9494204bc892305/caio-0.9.25-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d6c2a3411af97762a2b03840c3cec2f7f728921ff8adda53d7ea2315a8563451", upload-time = "2025-12-26T15:21:35.484Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a3/9f/f21af50e72117eb528c422d4276cbac11fb941b1b812b182e0a9c70d19c5/caio-0.9.25-cp313-cp313-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0998210a4d5cd5cb565b32ccfe4e53d67303f868a76f212e002a8554692870e6", upload-time = "2025-12-26T15:22:21.919Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/12/c39ae2a4037cb10ad5eb3578eb4d5f8c1a2575c62bba675f3406b7ef0824/caio-0.9.25-cp313-cp313-manylinux_2_34_aarch64.whl", hash = "sha256:1a177d4777141b96f175fe2c37a3d96dec7911ed9ad5f02bac38aaa1c936611f", upload-time = "2026-03-04T22:08:25.187Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/22/59/f8f2e950eb4f1a5a3883e198dca514b9d475415cb6cd7b78b9213a0dd45a/caio-0.9.25-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:9ed3cfb28c0e99fec5e208c934e5c157d0866aa9c32aa4dc5e9b6034af6286b7", upload-time = "2026-03-04T22:08:26.449Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/69/ca/a08fdc7efdcc24e6a6131a93c85be1f204d41c58f474c42b0670af8c016b/caio-0.9.25-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fab6078b9348e883c80a5e14b382e6ad6aabbc4429ca034e76e730cf464269db", upload-time = "2025-12-26T15:21:41.055Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5e/6c/d4d24f65e690213c097174d26eda6831f45f4734d9d036d81790a27e7b78/caio-0.9.25-cp314-cp314-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:44a6b58e52d488c75cfaa5ecaa404b2b41cc965e6c417e03251e868ecd5b6d77", upload-time = "2025-12-26T15:22:22.757Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/87/a4/e534cf7d2d0e8d880e25dd61e8d921ffcfe15bd696734589826f5a2df727/caio-0.9.25-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:628a630eb7fb22381dd8e3c8ab7f59e854b9c806639811fc3f4310c6bd711d79", upload-time = "2026-03-04T22:08:27.483Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3f/ed/bf81aeac1d290017e5e5ac3e880fd56ee15e50a6d0353986799d1bc5cfd5/caio-0.9.25-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:0ba16aa605ccb174665357fc729cf500679c2d94d5f1458a6f0d5ca48f2060a7", upload-time = "2026-03-04T22:08:28.751Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/93/1f76c8d1bafe3b0614e06b2195784a3765bbf7b0a067661af9e2dd47fc33/caio-0.9.25-py3-none-any.whl", hash = "sha256:06c0bb02d6b929119b1cfbe1ca403c768b2013a369e2db46bfa2a5761cf82e40", upload-time = "2025-12-26T15:22:00.221Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/92/88/b8527e1b00c1811db339a1df8bd1ae49d146fcea9d6a5c40e3a80aaeb38d/caio-0.9.25.tar.gz", hash = "sha256:16498e7f81d1d0f5a4c0ad3f2540e65fe25691376e0a5bd367f558067113ed10", size = 26781, upload-time = "2025-12-26T15:21:36.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/80/ea4ead0c5d52a9828692e7df20f0eafe8d26e671ce4883a0a146bb91049e/caio-0.9.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ca6c8ecda611478b6016cb94d23fd3eb7124852b985bdec7ecaad9f3116b9619", size = 36836, upload-time = "2025-12-26T15:22:04.662Z" }, + { url = "https://files.pythonhosted.org/packages/17/b9/36715c97c873649d1029001578f901b50250916295e3dddf20c865438865/caio-0.9.25-cp310-cp310-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db9b5681e4af8176159f0d6598e73b2279bb661e718c7ac23342c550bd78c241", size = 79695, upload-time = "2025-12-26T15:22:18.818Z" }, + { url = "https://files.pythonhosted.org/packages/0b/ab/07080ecb1adb55a02cbd8ec0126aa8e43af343ffabb6a71125b42670e9a1/caio-0.9.25-cp310-cp310-manylinux_2_34_aarch64.whl", hash = "sha256:bf61d7d0c4fd10ffdd98ca47f7e8db4d7408e74649ffaf4bef40b029ada3c21b", size = 79457, upload-time = "2026-03-04T22:08:16.024Z" }, + { url = "https://files.pythonhosted.org/packages/88/95/dd55757bb671eb4c376e006c04e83beb413486821f517792ea603ef216e9/caio-0.9.25-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:ab52e5b643f8bbd64a0605d9412796cd3464cb8ca88593b13e95a0f0b10508ae", size = 77705, upload-time = "2026-03-04T22:08:17.202Z" }, + { url = "https://files.pythonhosted.org/packages/ec/90/543f556fcfcfa270713eef906b6352ab048e1e557afec12925c991dc93c2/caio-0.9.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d6956d9e4a27021c8bd6c9677f3a59eb1d820cc32d0343cea7961a03b1371965", size = 36839, upload-time = "2025-12-26T15:21:40.267Z" }, + { url = "https://files.pythonhosted.org/packages/51/3b/36f3e8ec38dafe8de4831decd2e44c69303d2a3892d16ceda42afed44e1b/caio-0.9.25-cp311-cp311-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bf84bfa039f25ad91f4f52944452a5f6f405e8afab4d445450978cd6241d1478", size = 80255, upload-time = "2025-12-26T15:22:20.271Z" }, + { url = "https://files.pythonhosted.org/packages/df/ce/65e64867d928e6aff1b4f0e12dba0ef6d5bf412c240dc1df9d421ac10573/caio-0.9.25-cp311-cp311-manylinux_2_34_aarch64.whl", hash = "sha256:ae3d62587332bce600f861a8de6256b1014d6485cfd25d68c15caf1611dd1f7c", size = 80052, upload-time = "2026-03-04T22:08:20.402Z" }, + { url = "https://files.pythonhosted.org/packages/46/90/e278863c47e14ec58309aa2e38a45882fbe67b4cc29ec9bc8f65852d3e45/caio-0.9.25-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:fc220b8533dcf0f238a6b1a4a937f92024c71e7b10b5a2dfc1c73604a25709bc", size = 78273, upload-time = "2026-03-04T22:08:21.368Z" }, + { url = "https://files.pythonhosted.org/packages/d3/25/79c98ebe12df31548ba4eaf44db11b7cad6b3e7b4203718335620939083c/caio-0.9.25-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fb7ff95af4c31ad3f03179149aab61097a71fd85e05f89b4786de0359dffd044", size = 36983, upload-time = "2025-12-26T15:21:36.075Z" }, + { url = "https://files.pythonhosted.org/packages/a3/2b/21288691f16d479945968a0a4f2856818c1c5be56881d51d4dac9b255d26/caio-0.9.25-cp312-cp312-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:97084e4e30dfa598449d874c4d8e0c8d5ea17d2f752ef5e48e150ff9d240cd64", size = 82012, upload-time = "2025-12-26T15:22:20.983Z" }, + { url = "https://files.pythonhosted.org/packages/03/c4/8a1b580875303500a9c12b9e0af58cb82e47f5bcf888c2457742a138273c/caio-0.9.25-cp312-cp312-manylinux_2_34_aarch64.whl", hash = "sha256:4fa69eba47e0f041b9d4f336e2ad40740681c43e686b18b191b6c5f4c5544bfb", size = 81502, upload-time = "2026-03-04T22:08:22.381Z" }, + { url = "https://files.pythonhosted.org/packages/d1/1c/0fe770b8ffc8362c48134d1592d653a81a3d8748d764bec33864db36319d/caio-0.9.25-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:6bebf6f079f1341d19f7386db9b8b1f07e8cc15ae13bfdaff573371ba0575d69", size = 80200, upload-time = "2026-03-04T22:08:23.382Z" }, + { url = "https://files.pythonhosted.org/packages/31/57/5e6ff127e6f62c9f15d989560435c642144aa4210882f9494204bc892305/caio-0.9.25-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d6c2a3411af97762a2b03840c3cec2f7f728921ff8adda53d7ea2315a8563451", size = 36979, upload-time = "2025-12-26T15:21:35.484Z" }, + { url = "https://files.pythonhosted.org/packages/a3/9f/f21af50e72117eb528c422d4276cbac11fb941b1b812b182e0a9c70d19c5/caio-0.9.25-cp313-cp313-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0998210a4d5cd5cb565b32ccfe4e53d67303f868a76f212e002a8554692870e6", size = 81900, upload-time = "2025-12-26T15:22:21.919Z" }, + { url = "https://files.pythonhosted.org/packages/9c/12/c39ae2a4037cb10ad5eb3578eb4d5f8c1a2575c62bba675f3406b7ef0824/caio-0.9.25-cp313-cp313-manylinux_2_34_aarch64.whl", hash = "sha256:1a177d4777141b96f175fe2c37a3d96dec7911ed9ad5f02bac38aaa1c936611f", size = 81523, upload-time = "2026-03-04T22:08:25.187Z" }, + { url = "https://files.pythonhosted.org/packages/22/59/f8f2e950eb4f1a5a3883e198dca514b9d475415cb6cd7b78b9213a0dd45a/caio-0.9.25-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:9ed3cfb28c0e99fec5e208c934e5c157d0866aa9c32aa4dc5e9b6034af6286b7", size = 80243, upload-time = "2026-03-04T22:08:26.449Z" }, + { url = "https://files.pythonhosted.org/packages/69/ca/a08fdc7efdcc24e6a6131a93c85be1f204d41c58f474c42b0670af8c016b/caio-0.9.25-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fab6078b9348e883c80a5e14b382e6ad6aabbc4429ca034e76e730cf464269db", size = 36978, upload-time = "2025-12-26T15:21:41.055Z" }, + { url = "https://files.pythonhosted.org/packages/5e/6c/d4d24f65e690213c097174d26eda6831f45f4734d9d036d81790a27e7b78/caio-0.9.25-cp314-cp314-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:44a6b58e52d488c75cfaa5ecaa404b2b41cc965e6c417e03251e868ecd5b6d77", size = 81832, upload-time = "2025-12-26T15:22:22.757Z" }, + { url = "https://files.pythonhosted.org/packages/87/a4/e534cf7d2d0e8d880e25dd61e8d921ffcfe15bd696734589826f5a2df727/caio-0.9.25-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:628a630eb7fb22381dd8e3c8ab7f59e854b9c806639811fc3f4310c6bd711d79", size = 81565, upload-time = "2026-03-04T22:08:27.483Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ed/bf81aeac1d290017e5e5ac3e880fd56ee15e50a6d0353986799d1bc5cfd5/caio-0.9.25-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:0ba16aa605ccb174665357fc729cf500679c2d94d5f1458a6f0d5ca48f2060a7", size = 80071, upload-time = "2026-03-04T22:08:28.751Z" }, + { url = "https://files.pythonhosted.org/packages/86/93/1f76c8d1bafe3b0614e06b2195784a3765bbf7b0a067661af9e2dd47fc33/caio-0.9.25-py3-none-any.whl", hash = "sha256:06c0bb02d6b929119b1cfbe1ca403c768b2013a369e2db46bfa2a5761cf82e40", size = 19087, upload-time = "2025-12-26T15:22:00.221Z" }, ] [[package]] name = "certifi" version = "2026.1.4" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", upload-time = "2026-01-04T02:42:41.825Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", upload-time = "2026-01-04T02:42:40.15Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, ] [[package]] @@ -534,168 +531,168 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", upload-time = "2025-09-08T23:24:04.541Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", upload-time = "2025-09-08T23:22:08.01Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", upload-time = "2025-09-08T23:22:10.637Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-09-08T23:22:12.267Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", upload-time = "2025-09-08T23:22:13.455Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", upload-time = "2025-09-08T23:22:14.596Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", upload-time = "2025-09-08T23:22:15.769Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", upload-time = "2025-09-08T23:22:17.427Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", upload-time = "2025-09-08T23:22:19.069Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", upload-time = "2025-09-08T23:22:20.588Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", upload-time = "2025-09-08T23:22:22.143Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", upload-time = "2025-09-08T23:22:23.328Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", upload-time = "2025-09-08T23:22:24.752Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", upload-time = "2025-09-08T23:22:26.456Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", upload-time = "2025-09-08T23:22:28.197Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-09-08T23:22:29.475Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", upload-time = "2025-09-08T23:22:31.063Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", upload-time = "2025-09-08T23:22:32.507Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", upload-time = "2025-09-08T23:22:34.132Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", upload-time = "2025-09-08T23:22:35.443Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", upload-time = "2025-09-08T23:22:36.805Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", upload-time = "2025-09-08T23:22:38.436Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", upload-time = "2025-09-08T23:22:39.776Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", upload-time = "2025-09-08T23:22:40.95Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", upload-time = "2025-09-08T23:22:42.463Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", upload-time = "2025-09-08T23:22:43.623Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", upload-time = "2025-09-08T23:22:44.795Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", upload-time = "2025-09-08T23:22:45.938Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-09-08T23:22:47.349Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", upload-time = "2025-09-08T23:22:48.677Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", upload-time = "2025-09-08T23:22:50.06Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", upload-time = "2025-09-08T23:22:51.364Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", upload-time = "2025-09-08T23:22:52.902Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", upload-time = "2025-09-08T23:22:54.518Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", upload-time = "2025-09-08T23:22:55.867Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", upload-time = "2025-09-08T23:22:57.188Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", upload-time = "2025-09-08T23:22:58.351Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", upload-time = "2025-09-08T23:22:59.668Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", upload-time = "2025-09-08T23:23:00.879Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", upload-time = "2025-09-08T23:23:02.231Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", upload-time = "2025-09-08T23:23:03.472Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", upload-time = "2025-09-08T23:23:04.792Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", upload-time = "2025-09-08T23:23:06.127Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", upload-time = "2025-09-08T23:23:07.753Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", upload-time = "2025-09-08T23:23:09.648Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", upload-time = "2025-09-08T23:23:10.928Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", upload-time = "2025-09-08T23:23:12.42Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", upload-time = "2025-09-08T23:23:14.32Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", upload-time = "2025-09-08T23:23:15.535Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", upload-time = "2025-09-08T23:23:16.761Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", upload-time = "2025-09-08T23:23:18.087Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", upload-time = "2025-09-08T23:23:19.622Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", upload-time = "2025-09-08T23:23:20.853Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", upload-time = "2025-09-08T23:23:22.08Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", upload-time = "2025-09-08T23:23:23.314Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", upload-time = "2025-09-08T23:23:24.541Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", upload-time = "2025-09-08T23:23:26.143Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", upload-time = "2025-09-08T23:23:27.873Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", upload-time = "2025-09-08T23:23:44.61Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", upload-time = "2025-09-08T23:23:45.848Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", upload-time = "2025-09-08T23:23:47.105Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", upload-time = "2025-09-08T23:23:29.347Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", upload-time = "2025-09-08T23:23:30.63Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", upload-time = "2025-09-08T23:23:31.91Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", upload-time = "2025-09-08T23:23:33.214Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", upload-time = "2025-09-08T23:23:34.495Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", upload-time = "2025-09-08T23:23:36.096Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", upload-time = "2025-09-08T23:23:37.328Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", upload-time = "2025-09-08T23:23:38.945Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", upload-time = "2025-09-08T23:23:40.423Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", upload-time = "2025-09-08T23:23:41.742Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", upload-time = "2025-09-08T23:23:43.004Z" }, +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" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, ] [[package]] name = "charset-normalizer" version = "3.4.4" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", upload-time = "2025-10-14T04:42:32.879Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", upload-time = "2025-10-14T04:40:11.385Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", upload-time = "2025-10-14T04:40:13.135Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", upload-time = "2025-10-14T04:40:14.728Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", upload-time = "2025-10-14T04:40:16.14Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", upload-time = "2025-10-14T04:40:17.567Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", upload-time = "2025-10-14T04:40:19.08Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", upload-time = "2025-10-14T04:40:20.607Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", upload-time = "2025-10-14T04:40:21.719Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", upload-time = "2025-10-14T04:40:23.069Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", upload-time = "2025-10-14T04:40:24.17Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", upload-time = "2025-10-14T04:40:25.368Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", upload-time = "2025-10-14T04:40:26.806Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", upload-time = "2025-10-14T04:40:28.284Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", upload-time = "2025-10-14T04:40:29.613Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", upload-time = "2025-10-14T04:40:30.644Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", upload-time = "2025-10-14T04:40:32.108Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", upload-time = "2025-10-14T04:40:33.79Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", upload-time = "2025-10-14T04:40:34.961Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", upload-time = "2025-10-14T04:40:36.105Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", upload-time = "2025-10-14T04:40:37.188Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", upload-time = "2025-10-14T04:40:38.435Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", upload-time = "2025-10-14T04:40:40.053Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", upload-time = "2025-10-14T04:40:41.163Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", upload-time = "2025-10-14T04:40:42.276Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", upload-time = "2025-10-14T04:40:43.439Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", upload-time = "2025-10-14T04:40:44.547Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", upload-time = "2025-10-14T04:40:46.018Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", upload-time = "2025-10-14T04:40:47.081Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", upload-time = "2025-10-14T04:40:48.246Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", upload-time = "2025-10-14T04:40:49.376Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", upload-time = "2025-10-14T04:40:50.844Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", upload-time = "2025-10-14T04:40:52.272Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", upload-time = "2025-10-14T04:40:53.353Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", upload-time = "2025-10-14T04:40:54.558Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", upload-time = "2025-10-14T04:40:55.677Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", upload-time = "2025-10-14T04:40:57.217Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", upload-time = "2025-10-14T04:40:58.358Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", upload-time = "2025-10-14T04:40:59.468Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", upload-time = "2025-10-14T04:41:00.623Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", upload-time = "2025-10-14T04:41:01.754Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", upload-time = "2025-10-14T04:41:03.231Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", upload-time = "2025-10-14T04:41:04.715Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", upload-time = "2025-10-14T04:41:05.827Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", upload-time = "2025-10-14T04:41:06.938Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", upload-time = "2025-10-14T04:41:08.101Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", upload-time = "2025-10-14T04:41:09.23Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", upload-time = "2025-10-14T04:41:10.467Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", upload-time = "2025-10-14T04:41:11.915Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", upload-time = "2025-10-14T04:41:13.346Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", upload-time = "2025-10-14T04:41:14.461Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", upload-time = "2025-10-14T04:41:15.588Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", upload-time = "2025-10-14T04:41:16.738Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", upload-time = "2025-10-14T04:41:17.923Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", upload-time = "2025-10-14T04:41:19.106Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", upload-time = "2025-10-14T04:41:20.245Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", upload-time = "2025-10-14T04:41:21.398Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", upload-time = "2025-10-14T04:41:22.583Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", upload-time = "2025-10-14T04:41:23.754Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", upload-time = "2025-10-14T04:41:25.27Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", upload-time = "2025-10-14T04:41:26.725Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", upload-time = "2025-10-14T04:41:28.322Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", upload-time = "2025-10-14T04:41:29.95Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", upload-time = "2025-10-14T04:41:31.188Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", upload-time = "2025-10-14T04:41:32.624Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", upload-time = "2025-10-14T04:41:33.773Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", upload-time = "2025-10-14T04:41:34.897Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", upload-time = "2025-10-14T04:41:36.116Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", upload-time = "2025-10-14T04:41:37.229Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", upload-time = "2025-10-14T04:41:38.368Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", upload-time = "2025-10-14T04:41:39.862Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", upload-time = "2025-10-14T04:41:41.319Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", upload-time = "2025-10-14T04:41:42.539Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", upload-time = "2025-10-14T04:41:43.661Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", upload-time = "2025-10-14T04:41:44.821Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", upload-time = "2025-10-14T04:41:46.442Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", upload-time = "2025-10-14T04:41:47.631Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", upload-time = "2025-10-14T04:41:48.81Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", upload-time = "2025-10-14T04:41:49.946Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", upload-time = "2025-10-14T04:41:51.051Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", upload-time = "2025-10-14T04:41:52.122Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", upload-time = "2025-10-14T04:42:31.76Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709, upload-time = "2025-10-14T04:40:11.385Z" }, + { url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814, upload-time = "2025-10-14T04:40:13.135Z" }, + { url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467, upload-time = "2025-10-14T04:40:14.728Z" }, + { url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280, upload-time = "2025-10-14T04:40:16.14Z" }, + { url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454, upload-time = "2025-10-14T04:40:17.567Z" }, + { url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609, upload-time = "2025-10-14T04:40:19.08Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849, upload-time = "2025-10-14T04:40:20.607Z" }, + { url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586, upload-time = "2025-10-14T04:40:21.719Z" }, + { url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290, upload-time = "2025-10-14T04:40:23.069Z" }, + { url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663, upload-time = "2025-10-14T04:40:24.17Z" }, + { url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964, upload-time = "2025-10-14T04:40:25.368Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064, upload-time = "2025-10-14T04:40:26.806Z" }, + { url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015, upload-time = "2025-10-14T04:40:28.284Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792, upload-time = "2025-10-14T04:40:29.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198, upload-time = "2025-10-14T04:40:30.644Z" }, + { url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262, upload-time = "2025-10-14T04:40:32.108Z" }, + { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, + { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, + { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, + { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, + { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, + { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, + { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, + { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, + { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, + { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, + { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, + { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, + { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, + { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, + { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, + { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, + { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, + { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, + { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, + { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, + { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, + { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, + { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, + { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, + { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, + { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, ] [[package]] @@ -705,27 +702,27 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", upload-time = "2025-11-15T20:45:42.706Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", upload-time = "2025-11-15T20:45:41.139Z" }, + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, ] [[package]] name = "cloudpickle" version = "3.1.2" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", upload-time = "2025-11-03T09:25:26.604Z" } +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://pypi-proxy.dev.databricks.com/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", upload-time = "2025-11-03T09:25:25.534Z" }, + { 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-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", upload-time = "2022-10-25T02:36:22.414Z" } +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://pypi-proxy.dev.databricks.com/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", upload-time = "2022-10-25T02:36:20.889Z" }, + { 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]] @@ -738,64 +735,64 @@ resolution-markers = [ dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", upload-time = "2025-04-15T17:47:53.79Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", upload-time = "2025-04-15T17:34:46.581Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", upload-time = "2025-04-15T17:34:51.427Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", upload-time = "2025-04-15T17:34:55.961Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", upload-time = "2025-04-15T17:35:00.992Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", upload-time = "2025-04-15T17:35:06.177Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", upload-time = "2025-04-15T17:35:11.244Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", upload-time = "2025-04-15T17:35:26.701Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", upload-time = "2025-04-15T17:35:43.204Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", upload-time = "2025-04-15T17:35:46.554Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", upload-time = "2025-04-15T17:35:50.064Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", upload-time = "2025-04-15T17:35:54.473Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", upload-time = "2025-04-15T17:35:58.283Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", upload-time = "2025-04-15T17:36:03.235Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", upload-time = "2025-04-15T17:36:08.275Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", upload-time = "2025-04-15T17:36:13.29Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", upload-time = "2025-04-15T17:36:18.329Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", upload-time = "2025-04-15T17:36:33.878Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", upload-time = "2025-04-15T17:36:51.295Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", upload-time = "2025-04-15T17:36:55.002Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", upload-time = "2025-04-15T17:36:58.576Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", upload-time = "2025-04-15T17:37:03.105Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", upload-time = "2025-04-15T17:37:07.026Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", upload-time = "2025-04-15T17:37:11.481Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", upload-time = "2025-04-15T17:37:18.212Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", upload-time = "2025-04-15T17:37:22.76Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", upload-time = "2025-04-15T17:37:33.001Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", upload-time = "2025-04-15T17:37:48.64Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", upload-time = "2025-04-15T17:38:06.7Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", upload-time = "2025-04-15T17:38:10.338Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", upload-time = "2025-04-15T17:38:14.239Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", upload-time = "2025-04-15T17:38:19.142Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", upload-time = "2025-04-15T17:38:23.688Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", upload-time = "2025-04-15T17:38:28.238Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", upload-time = "2025-04-15T17:38:33.502Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", upload-time = "2025-04-15T17:38:38.672Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", upload-time = "2025-04-15T17:38:43.712Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", upload-time = "2025-04-15T17:39:00.224Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", upload-time = "2025-04-15T17:43:29.649Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", upload-time = "2025-04-15T17:44:44.532Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", upload-time = "2025-04-15T17:44:48.194Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", upload-time = "2025-04-15T17:43:34.084Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", upload-time = "2025-04-15T17:43:38.626Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", upload-time = "2025-04-15T17:43:44.522Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", upload-time = "2025-04-15T17:43:49.545Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", upload-time = "2025-04-15T17:43:54.203Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", upload-time = "2025-04-15T17:44:01.025Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", upload-time = "2025-04-15T17:44:17.322Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", upload-time = "2025-04-15T17:44:33.43Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", upload-time = "2025-04-15T17:44:37.092Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", upload-time = "2025-04-15T17:44:40.827Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", upload-time = "2025-04-15T17:44:59.314Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", upload-time = "2025-04-15T17:45:04.165Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", upload-time = "2025-04-15T17:45:08.456Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", upload-time = "2025-04-15T17:45:15.535Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", upload-time = "2025-04-15T17:45:20.166Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", upload-time = "2025-04-15T17:45:24.794Z" }, +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/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630, upload-time = "2025-04-15T17:38:19.142Z" }, + { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670, upload-time = "2025-04-15T17:38:23.688Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694, upload-time = "2025-04-15T17:38:28.238Z" }, + { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986, upload-time = "2025-04-15T17:38:33.502Z" }, + { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060, upload-time = "2025-04-15T17:38:38.672Z" }, + { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747, upload-time = "2025-04-15T17:38:43.712Z" }, + { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895, upload-time = "2025-04-15T17:39:00.224Z" }, + { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098, upload-time = "2025-04-15T17:43:29.649Z" }, + { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535, upload-time = "2025-04-15T17:44:44.532Z" }, + { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096, upload-time = "2025-04-15T17:44:48.194Z" }, + { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090, upload-time = "2025-04-15T17:43:34.084Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643, upload-time = "2025-04-15T17:43:38.626Z" }, + { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443, upload-time = "2025-04-15T17:43:44.522Z" }, + { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865, upload-time = "2025-04-15T17:43:49.545Z" }, + { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162, upload-time = "2025-04-15T17:43:54.203Z" }, + { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355, upload-time = "2025-04-15T17:44:01.025Z" }, + { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935, upload-time = "2025-04-15T17:44:17.322Z" }, + { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168, upload-time = "2025-04-15T17:44:33.43Z" }, + { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550, upload-time = "2025-04-15T17:44:37.092Z" }, + { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214, upload-time = "2025-04-15T17:44:40.827Z" }, + { 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]] @@ -812,192 +809,192 @@ resolution-markers = [ dependencies = [ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", upload-time = "2025-07-26T12:03:12.549Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", upload-time = "2025-07-26T12:01:02.277Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", upload-time = "2025-07-26T12:01:04.072Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", upload-time = "2025-07-26T12:01:05.688Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", upload-time = "2025-07-26T12:01:07.054Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", upload-time = "2025-07-26T12:01:08.801Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", upload-time = "2025-07-26T12:01:10.319Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", upload-time = "2025-07-26T12:01:12.659Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", upload-time = "2025-07-26T12:01:15.533Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", upload-time = "2025-07-26T12:01:17.088Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", upload-time = "2025-07-26T12:01:18.256Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", upload-time = "2025-07-26T12:01:19.848Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", upload-time = "2025-07-26T12:01:21.16Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", upload-time = "2025-07-26T12:01:22.448Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", upload-time = "2025-07-26T12:01:24.155Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", upload-time = "2025-07-26T12:01:25.91Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", upload-time = "2025-07-26T12:01:27.152Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", upload-time = "2025-07-26T12:01:28.808Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", upload-time = "2025-07-26T12:01:31.198Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", upload-time = "2025-07-26T12:01:33.947Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", upload-time = "2025-07-26T12:01:35.64Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", upload-time = "2025-07-26T12:01:36.804Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", upload-time = "2025-07-26T12:01:37.999Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", upload-time = "2025-07-26T12:01:39.367Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", upload-time = "2025-07-26T12:01:40.645Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", upload-time = "2025-07-26T12:01:41.942Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", upload-time = "2025-07-26T12:01:43.499Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", upload-time = "2025-07-26T12:01:45.219Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", upload-time = "2025-07-26T12:01:46.519Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", upload-time = "2025-07-26T12:01:48.964Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", upload-time = "2025-07-26T12:01:51.979Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", upload-time = "2025-07-26T12:01:53.245Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", upload-time = "2025-07-26T12:01:54.422Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", upload-time = "2025-07-26T12:01:55.73Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", upload-time = "2025-07-26T12:01:57.051Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", upload-time = "2025-07-26T12:01:58.663Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", upload-time = "2025-07-26T12:02:00.343Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", upload-time = "2025-07-26T12:02:02.128Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", upload-time = "2025-07-26T12:02:03.615Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", upload-time = "2025-07-26T12:02:05.165Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", upload-time = "2025-07-26T12:02:07.379Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", upload-time = "2025-07-26T12:02:10.171Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", upload-time = "2025-07-26T12:02:11.488Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", upload-time = "2025-07-26T12:02:12.754Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", upload-time = "2025-07-26T12:02:14.4Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", upload-time = "2025-07-26T12:02:16.095Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", upload-time = "2025-07-26T12:02:17.524Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", upload-time = "2025-07-26T12:02:18.9Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", upload-time = "2025-07-26T12:02:20.418Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", upload-time = "2025-07-26T12:02:21.916Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", upload-time = "2025-07-26T12:02:23.759Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", upload-time = "2025-07-26T12:02:26.181Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", upload-time = "2025-07-26T12:02:28.782Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", upload-time = "2025-07-26T12:02:30.128Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", upload-time = "2025-07-26T12:02:31.395Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", upload-time = "2025-07-26T12:02:32.956Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", upload-time = "2025-07-26T12:02:34.2Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", upload-time = "2025-07-26T12:02:35.807Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", upload-time = "2025-07-26T12:02:37.193Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", upload-time = "2025-07-26T12:02:38.894Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", upload-time = "2025-07-26T12:02:40.642Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", upload-time = "2025-07-26T12:02:42.25Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", upload-time = "2025-07-26T12:02:44.668Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", upload-time = "2025-07-26T12:02:47.09Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", upload-time = "2025-07-26T12:02:48.691Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", upload-time = "2025-07-26T12:02:50.137Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", upload-time = "2025-07-26T12:02:51.449Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", upload-time = "2025-07-26T12:02:52.74Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", upload-time = "2025-07-26T12:02:54.037Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", upload-time = "2025-07-26T12:02:55.947Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-07-26T12:02:57.468Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", upload-time = "2025-07-26T12:02:58.801Z" }, +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/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, + { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, + { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, + { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, + { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, + { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, + { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, + { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, + { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, + { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, + { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, + { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, + { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, + { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, + { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, + { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, + { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, + { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, + { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, + { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, + { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, + { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, + { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, + { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, + { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, + { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, + { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, + { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, + { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, + { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, + { 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 = "coverage" version = "7.13.4" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/24/56/95b7e30fa389756cb56630faa728da46a27b8c6eb46f9d557c68fff12b65/coverage-7.13.4.tar.gz", hash = "sha256:e5c8f6ed1e61a8b2dcdf31eb0b9bbf0130750ca79c1c49eb898e2ad86f5ccc91", upload-time = "2026-02-09T12:59:03.86Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/44/d4/7827d9ffa34d5d4d752eec907022aa417120936282fc488306f5da08c292/coverage-7.13.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fc31c787a84f8cd6027eba44010517020e0d18487064cd3d8968941856d1415", upload-time = "2026-02-09T12:56:11.974Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/35/b0/d69df26607c64043292644dbb9dc54b0856fabaa2cbb1eeee3331cc9e280/coverage-7.13.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a32ebc02a1805adf637fc8dec324b5cdacd2e493515424f70ee33799573d661b", upload-time = "2026-02-09T12:56:13.33Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/82/a4/c1523f7c9e47b2271dbf8c2a097e7a1f89ef0d66f5840bb59b7e8814157b/coverage-7.13.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e24f9156097ff9dc286f2f913df3a7f63c0e333dcafa3c196f2c18b4175ca09a", upload-time = "2026-02-09T12:56:14.552Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/02/aa7ec01d1a5023c4b680ab7257f9bfde9defe8fdddfe40be096ac19e8177/coverage-7.13.4-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8041b6c5bfdc03257666e9881d33b1abc88daccaf73f7b6340fb7946655cd10f", upload-time = "2026-02-09T12:56:16.31Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/35/98/85aba0aed5126d896162087ef3f0e789a225697245256fc6181b95f47207/coverage-7.13.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a09cfa6a5862bc2fc6ca7c3def5b2926194a56b8ab78ffcf617d28911123012", upload-time = "2026-02-09T12:56:18.024Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/96/72/1db59bd67494bc162e3e4cd5fbc7edba2c7026b22f7c8ef1496d58c2b94c/coverage-7.13.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:296f8b0af861d3970c2a4d8c91d48eb4dd4771bcef9baedec6a9b515d7de3def", upload-time = "2026-02-09T12:56:19.272Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9d/97/72899c59c7066961de6e3daa142d459d47d104956db43e057e034f015c8a/coverage-7.13.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e101609bcbbfb04605ea1027b10dc3735c094d12d40826a60f897b98b1c30256", upload-time = "2026-02-09T12:56:21.051Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/39/1f/f1885573b5970235e908da4389176936c8933e86cb316b9620aab1585fa2/coverage-7.13.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aa3feb8db2e87ff5e6d00d7e1480ae241876286691265657b500886c98f38bda", upload-time = "2026-02-09T12:56:22.585Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a8/cf/e80390c5b7480b722fa3e994f8202807799b85bc562aa4f1dde209fbb7be/coverage-7.13.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4fc7fa81bbaf5a02801b65346c8b3e657f1d93763e58c0abdf7c992addd81a92", upload-time = "2026-02-09T12:56:23.748Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/44/bf/f89a8350d85572f95412debb0fb9bb4795b1d5b5232bd652923c759e787b/coverage-7.13.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:33901f604424145c6e9c2398684b92e176c0b12df77d52db81c20abd48c3794c", upload-time = "2026-02-09T12:56:25.209Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f7/6e/612a02aece8178c818df273e8d1642190c4875402ca2ba74514394b27aba/coverage-7.13.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:bb28c0f2cf2782508a40cec377935829d5fcc3ad9a3681375af4e84eb34b6b58", upload-time = "2026-02-09T12:56:26.475Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cb/98/b5afc39af67c2fa6786b03c3a7091fc300947387ce8914b096db8a73d67a/coverage-7.13.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d107aff57a83222ddbd8d9ee705ede2af2cc926608b57abed8ef96b50b7e8f9", upload-time = "2026-02-09T12:56:27.727Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/51/30/2bba8ef0682d5bd210c38fe497e12a06c9f8d663f7025e9f5c2c31ce847d/coverage-7.13.4-cp310-cp310-win32.whl", hash = "sha256:a6f94a7d00eb18f1b6d403c91a88fd58cfc92d4b16080dfdb774afc8294469bf", upload-time = "2026-02-09T12:56:29.051Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/78/13/331f94934cf6c092b8ea59ff868eb587bc8fe0893f02c55bc6c0183a192e/coverage-7.13.4-cp310-cp310-win_amd64.whl", hash = "sha256:2cb0f1e000ebc419632bbe04366a8990b6e32c4e0b51543a6484ffe15eaeda95", upload-time = "2026-02-09T12:56:30.366Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b4/ad/b59e5b451cf7172b8d1043dc0fa718f23aab379bc1521ee13d4bd9bfa960/coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053", upload-time = "2026-02-09T12:56:31.673Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/17/0cb7ca3de72e5f4ef2ec2fa0089beafbcaaaead1844e8b8a63d35173d77d/coverage-7.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:19bc3c88078789f8ef36acb014d7241961dbf883fd2533d18cb1e7a5b4e28b11", upload-time = "2026-02-09T12:56:33.104Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ab/63/325d8e5b11e0eaf6d0f6a44fad444ae58820929a9b0de943fa377fe73e85/coverage-7.13.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3998e5a32e62fdf410c0dbd3115df86297995d6e3429af80b8798aad894ca7aa", upload-time = "2026-02-09T12:56:34.474Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/76/53/c16972708cbb79f2942922571a687c52bd109a7bd51175aeb7558dff2236/coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7", upload-time = "2026-02-09T12:56:35.749Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/eb/c2/7ab36d8b8cc412bec9ea2d07c83c48930eb4ba649634ba00cb7e4e0f9017/coverage-7.13.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a3aa4e7b9e416774b21797365b358a6e827ffadaaca81b69ee02946852449f00", upload-time = "2026-02-09T12:56:37.796Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d6/4d/cf52c9a3322c89a0e6febdfbc83bb45c0ed3c64ad14081b9503adee702e7/coverage-7.13.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:71ca20079dd8f27fcf808817e281e90220475cd75115162218d0e27549f95fef", upload-time = "2026-02-09T12:56:39.016Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/78/e9/eb1dd17bd6de8289df3580e967e78294f352a5df8a57ff4671ee5fc3dcd0/coverage-7.13.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e2f25215f1a359ab17320b47bcdaca3e6e6356652e8256f2441e4ef972052903", upload-time = "2026-02-09T12:56:40.668Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/71/07/8c1542aa873728f72267c07278c5cc0ec91356daf974df21335ccdb46368/coverage-7.13.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d65b2d373032411e86960604dc4edac91fdfb5dca539461cf2cbe78327d1e64f", upload-time = "2026-02-09T12:56:41.97Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/74/d7/c62e2c5e4483a748e27868e4c32ad3daa9bdddbba58e1bc7a15e252baa74/coverage-7.13.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94eb63f9b363180aff17de3e7c8760c3ba94664ea2695c52f10111244d16a299", upload-time = "2026-02-09T12:56:43.323Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/98/9f/4c5c015a6e98ced54efd0f5cf8d31b88e5504ecb6857585fc0161bb1e600/coverage-7.13.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e856bf6616714c3a9fbc270ab54103f4e685ba236fa98c054e8f87f266c93505", upload-time = "2026-02-09T12:56:45.155Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bd/59/0f4eef89b9f0fcd9633b5d350016f54126ab49426a70ff4c4e87446cabdc/coverage-7.13.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:65dfcbe305c3dfe658492df2d85259e0d79ead4177f9ae724b6fb245198f55d6", upload-time = "2026-02-09T12:56:46.636Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/2c/b7476f938deb07166f3eb281a385c262675d688ff4659ad56c6c6b8e2e70/coverage-7.13.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b507778ae8a4c915436ed5c2e05b4a6cecfa70f734e19c22a005152a11c7b6a9", upload-time = "2026-02-09T12:56:48.13Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b8/34/c3420709d9846ee3785b9f2831b4d94f276f38884032dca1457fa83f7476/coverage-7.13.4-cp311-cp311-win32.whl", hash = "sha256:784fc3cf8be001197b652d51d3fd259b1e2262888693a4636e18879f613a62a9", upload-time = "2026-02-09T12:56:50.479Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/61/08/3d9c8613079d2b11c185b865de9a4c1a68850cfda2b357fae365cf609f29/coverage-7.13.4-cp311-cp311-win_amd64.whl", hash = "sha256:2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f", upload-time = "2026-02-09T12:56:51.815Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/1a/54c3c80b2f056164cc0a6cdcb040733760c7c4be9d780fe655f356f433e4/coverage-7.13.4-cp311-cp311-win_arm64.whl", hash = "sha256:79e73a76b854d9c6088fe5d8b2ebe745f8681c55f7397c3c0a016192d681045f", upload-time = "2026-02-09T12:56:53.194Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/81/4ce2fdd909c5a0ed1f6dedb88aa57ab79b6d1fbd9b588c1ac7ef45659566/coverage-7.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02231499b08dabbe2b96612993e5fc34217cdae907a51b906ac7fca8027a4459", upload-time = "2026-02-09T12:56:54.889Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/96/5238b1efc5922ddbdc9b0db9243152c09777804fb7c02ad1741eb18a11c0/coverage-7.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40aa8808140e55dc022b15d8aa7f651b6b3d68b365ea0398f1441e0b04d859c3", upload-time = "2026-02-09T12:56:56.33Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/78/72/2f372b726d433c9c35e56377cf1d513b4c16fe51841060d826b95caacec1/coverage-7.13.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5b856a8ccf749480024ff3bd7310adaef57bf31fd17e1bfc404b7940b6986634", upload-time = "2026-02-09T12:56:57.858Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/a0/2ea570925524ef4e00bb6c82649f5682a77fac5ab910a65c9284de422600/coverage-7.13.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c048ea43875fbf8b45d476ad79f179809c590ec7b79e2035c662e7afa3192e3", upload-time = "2026-02-09T12:56:59.754Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e8/ac/45dc2e19a1939098d783c846e130b8f862fbb50d09e0af663988f2f21973/coverage-7.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7b38448866e83176e28086674fe7368ab8590e4610fb662b44e345b86d63ffa", upload-time = "2026-02-09T12:57:01.287Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2d/4d/26d236ff35abc3b5e63540d3386e4c3b192168c1d96da5cb2f43c640970f/coverage-7.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de6defc1c9badbf8b9e67ae90fd00519186d6ab64e5cc5f3d21359c2a9b2c1d3", upload-time = "2026-02-09T12:57:02.637Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ec/55/14a966c757d1348b2e19caf699415a2a4c4f7feaa4bbc6326a51f5c7dd1b/coverage-7.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7eda778067ad7ffccd23ecffce537dface96212576a07924cbf0d8799d2ded5a", upload-time = "2026-02-09T12:57:04.056Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/33/50116647905837c66d28b2af1321b845d5f5d19be9655cb84d4a0ea806b4/coverage-7.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e87f6c587c3f34356c3759f0420693e35e7eb0e2e41e4c011cb6ec6ecbbf1db7", upload-time = "2026-02-09T12:57:05.503Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/b4/8efb11a46e3665d92635a56e4f2d4529de6d33f2cb38afd47d779d15fc99/coverage-7.13.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8248977c2e33aecb2ced42fef99f2d319e9904a36e55a8a68b69207fb7e43edc", upload-time = "2026-02-09T12:57:06.879Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/51/24/8cd73dd399b812cc76bb0ac260e671c4163093441847ffe058ac9fda1e32/coverage-7.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:25381386e80ae727608e662474db537d4df1ecd42379b5ba33c84633a2b36d47", upload-time = "2026-02-09T12:57:08.245Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/94/0a4b12f1d0e029ce1ccc1c800944a9984cbe7d678e470bb6d3c6bc38a0da/coverage-7.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ee756f00726693e5ba94d6df2bdfd64d4852d23b09bb0bc700e3b30e6f333985", upload-time = "2026-02-09T12:57:10.142Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/44/6002fbf88f6698ca034360ce474c406be6d5a985b3fdb3401128031eef6b/coverage-7.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fdfc1e28e7c7cdce44985b3043bc13bbd9c747520f94a4d7164af8260b3d91f0", upload-time = "2026-02-09T12:57:12.197Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/de/c6/a0279f7c00e786be75a749a5674e6fa267bcbd8209cd10c9a450c655dfa7/coverage-7.13.4-cp312-cp312-win32.whl", hash = "sha256:01d4cbc3c283a17fc1e42d614a119f7f438eabb593391283adca8dc86eff1246", upload-time = "2026-02-09T12:57:14.085Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/4e/c0a25a425fcf5557d9abd18419c95b63922e897bc86c1f327f155ef234a9/coverage-7.13.4-cp312-cp312-win_amd64.whl", hash = "sha256:9401ebc7ef522f01d01d45532c68c5ac40fb27113019b6b7d8b208f6e9baa126", upload-time = "2026-02-09T12:57:15.944Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/47/ac/92da44ad9a6f4e3a7debd178949d6f3769bedca33830ce9b1dcdab589a37/coverage-7.13.4-cp312-cp312-win_arm64.whl", hash = "sha256:b1ec7b6b6e93255f952e27ab58fbc68dcc468844b16ecbee881aeb29b6ab4d8d", upload-time = "2026-02-09T12:57:17.497Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b66a2da594b6068b48b2692f043f35d4d3693fb639d5ea8b39533c2ad9ac3ab9", upload-time = "2026-02-09T12:57:19.332Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3599eb3992d814d23b35c536c28df1a882caa950f8f507cef23d1cbf334995ac", upload-time = "2026-02-09T12:57:20.66Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/97/fd/7e859f8fab324cef6c4ad7cff156ca7c489fef9179d5749b0c8d321281c2/coverage-7.13.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:93550784d9281e374fb5a12bf1324cc8a963fd63b2d2f223503ef0fd4aa339ea", upload-time = "2026-02-09T12:57:22.007Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b720ce6a88a2755f7c697c23268ddc47a571b88052e6b155224347389fdf6a3b", upload-time = "2026-02-09T12:57:23.339Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5a/88/6728a7ad17428b18d836540630487231f5470fb82454871149502f5e5aa2/coverage-7.13.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b322db1284a2ed3aa28ffd8ebe3db91c929b7a333c0820abec3d838ef5b3525", upload-time = "2026-02-09T12:57:24.774Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7c/bc/21244b1b8cedf0dff0a2b53b208015fe798d5f2a8d5348dbfece04224fff/coverage-7.13.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4594c67d8a7c89cf922d9df0438c7c7bb022ad506eddb0fdb2863359ff78242", upload-time = "2026-02-09T12:57:26.125Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/97/a0/ddba7ed3251cff51006737a727d84e05b61517d1784a9988a846ba508877/coverage-7.13.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53d133df809c743eb8bce33b24bcababb371f4441340578cd406e084d94a6148", upload-time = "2026-02-09T12:57:27.614Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9b/55/e289addf7ff54d3a540526f33751951bf0878f3809b47f6dfb3def69c6f7/coverage-7.13.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76451d1978b95ba6507a039090ba076105c87cc76fc3efd5d35d72093964d49a", upload-time = "2026-02-09T12:57:29.066Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/13/4e/cc276b1fa4a59be56d96f1dabddbdc30f4ba22e3b1cd42504c37b3313255/coverage-7.13.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7f57b33491e281e962021de110b451ab8a24182589be17e12a22c79047935e23", upload-time = "2026-02-09T12:57:30.522Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/94/44/1093b8f93018f8b41a8cf29636c9292502f05e4a113d4d107d14a3acd044/coverage-7.13.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1731dc33dc276dafc410a885cbf5992f1ff171393e48a21453b78727d090de80", upload-time = "2026-02-09T12:57:31.946Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/55/ea2796da2d42257f37dbea1aab239ba9263b31bd91d5527cdd6db5efe174/coverage-7.13.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:bd60d4fe2f6fa7dff9223ca1bbc9f05d2b6697bc5961072e5d3b952d46e1b1ea", upload-time = "2026-02-09T12:57:33.842Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/fa/7c4bb72aacf8af5020675aa633e59c1fbe296d22aed191b6a5b711eb2bc7/coverage-7.13.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9181a3ccead280b828fae232df12b16652702b49d41e99d657f46cc7b1f6ec7a", upload-time = "2026-02-09T12:57:35.743Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5c/38/a8d2ec0146479c20bbaa7181b5b455a0c41101eed57f10dd19a78ab44c80/coverage-7.13.4-cp313-cp313-win32.whl", hash = "sha256:f53d492307962561ac7de4cd1de3e363589b000ab69617c6156a16ba7237998d", upload-time = "2026-02-09T12:57:37.25Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl", hash = "sha256:e6f70dec1cc557e52df5306d051ef56003f74d56e9c4dd7ddb07e07ef32a84dd", upload-time = "2026-02-09T12:57:38.734Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/04/d1/934918a138c932c90d78301f45f677fb05c39a3112b96fd2c8e60503cdc7/coverage-7.13.4-cp313-cp313-win_arm64.whl", hash = "sha256:fb07dc5da7e849e2ad31a5d74e9bece81f30ecf5a42909d0a695f8bd1874d6af", upload-time = "2026-02-09T12:57:40.223Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/52/57/ee93ced533bcb3e6df961c0c6e42da2fc6addae53fb95b94a89b1e33ebd7/coverage-7.13.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40d74da8e6c4b9ac18b15331c4b5ebc35a17069410cad462ad4f40dcd2d50c0d", upload-time = "2026-02-09T12:57:41.639Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c5/e0/969fc285a6fbdda49d91af278488d904dcd7651b2693872f0ff94e40e84a/coverage-7.13.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4223b4230a376138939a9173f1bdd6521994f2aff8047fae100d6d94d50c5a12", upload-time = "2026-02-09T12:57:44.215Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b1/b8/9531944e16267e2735a30a9641ff49671f07e8138ecf1ca13db9fd2560c7/coverage-7.13.4-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1d4be36a5114c499f9f1f9195e95ebf979460dbe2d88e6816ea202010ba1c34b", upload-time = "2026-02-09T12:57:45.989Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8a/f3/e63df6d500314a2a60390d1989240d5f27318a7a68fa30ad3806e2a9323e/coverage-7.13.4-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:200dea7d1e8095cc6e98cdabe3fd1d21ab17d3cee6dab00cadbb2fe35d9c15b9", upload-time = "2026-02-09T12:57:47.42Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f3/67/7654810de580e14b37670b60a09c599fa348e48312db5b216d730857ffe6/coverage-7.13.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8eb931ee8e6d8243e253e5ed7336deea6904369d2fd8ae6e43f68abbf167092", upload-time = "2026-02-09T12:57:49.345Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/37/6f/39d41eca0eab3cc82115953ad41c4e77935286c930e8fad15eaed1389d83/coverage-7.13.4-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:75eab1ebe4f2f64d9509b984f9314d4aa788540368218b858dad56dc8f3e5eb9", upload-time = "2026-02-09T12:57:50.811Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/6d/39c0fbb8fc5cd4d2090811e553c2108cf5112e882f82505ee7495349a6bf/coverage-7.13.4-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c35eb28c1d085eb7d8c9b3296567a1bebe03ce72962e932431b9a61f28facf26", upload-time = "2026-02-09T12:57:52.447Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a4/a2/60010c669df5fa603bb5a97fb75407e191a846510da70ac657eb696b7fce/coverage-7.13.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb88b316ec33760714a4720feb2816a3a59180fd58c1985012054fa7aebee4c2", upload-time = "2026-02-09T12:57:53.938Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3e/d9/63b22a6bdbd17f1f96e9ed58604c2a6b0e72a9133e37d663bef185877cf6/coverage-7.13.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7d41eead3cc673cbd38a4417deb7fd0b4ca26954ff7dc6078e33f6ff97bed940", upload-time = "2026-02-09T12:57:56.012Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/70/bf/69f86ba1ad85bc3ad240e4c0e57a2e620fbc0e1645a47b5c62f0e941ad7f/coverage-7.13.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:fb26a934946a6afe0e326aebe0730cdff393a8bc0bbb65a2f41e30feddca399c", upload-time = "2026-02-09T12:57:57.5Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ae/f2/5f65a278a8c2148731831574c73e42f57204243d33bedaaf18fa79c5958f/coverage-7.13.4-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:dae88bc0fc77edaa65c14be099bd57ee140cf507e6bfdeea7938457ab387efb0", upload-time = "2026-02-09T12:57:59.027Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ef/80/6e8280a350ee9fea92f14b8357448a242dcaa243cb2c72ab0ca591f66c8c/coverage-7.13.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:845f352911777a8e722bfce168958214951e07e47e5d5d9744109fa5fe77f79b", upload-time = "2026-02-09T12:58:01.129Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/22/63/01ff182fc95f260b539590fb12c11ad3e21332c15f9799cb5e2386f71d9f/coverage-7.13.4-cp313-cp313t-win32.whl", hash = "sha256:2fa8d5f8de70688a28240de9e139fa16b153cc3cbb01c5f16d88d6505ebdadf9", upload-time = "2026-02-09T12:58:02.736Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a9/43/89de4ef5d3cd53b886afa114065f7e9d3707bdb3e5efae13535b46ae483d/coverage-7.13.4-cp313-cp313t-win_amd64.whl", hash = "sha256:9351229c8c8407645840edcc277f4a2d44814d1bc34a2128c11c2a031d45a5dd", upload-time = "2026-02-09T12:58:05.362Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/35/39/7cf0aa9a10d470a5309b38b289b9bb07ddeac5d61af9b664fe9775a4cb3e/coverage-7.13.4-cp313-cp313t-win_arm64.whl", hash = "sha256:30b8d0512f2dc8c8747557e8fb459d6176a2c9e5731e2b74d311c03b78451997", upload-time = "2026-02-09T12:58:06.952Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/92/11/a9cf762bb83386467737d32187756a42094927150c3e107df4cb078e8590/coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:300deaee342f90696ed186e3a00c71b5b3d27bffe9e827677954f4ee56969601", upload-time = "2026-02-09T12:58:08.623Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/28/56e6d892b7b052236d67c95f1936b6a7cf7c3e2634bf27610b8cbd7f9c60/coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29e3220258d682b6226a9b0925bc563ed9a1ebcff3cad30f043eceea7eaf2689", upload-time = "2026-02-09T12:58:10.176Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/69/233459ee9eb0c0d10fcc2fe425a029b3fa5ce0f040c966ebce851d030c70/coverage-7.13.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:391ee8f19bef69210978363ca930f7328081c6a0152f1166c91f0b5fdd2a773c", upload-time = "2026-02-09T12:58:12.503Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/06/90/2cdab0974b9b5bbc1623f7876b73603aecac11b8d95b85b5b86b32de5eab/coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0dd7ab8278f0d58a0128ba2fca25824321f05d059c1441800e934ff2efa52129", upload-time = "2026-02-09T12:58:14.615Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ac/15/ea4da0f85bf7d7b27635039e649e99deb8173fe551096ea15017f7053537/coverage-7.13.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78cdf0d578b15148b009ccf18c686aa4f719d887e76e6b40c38ffb61d264a552", upload-time = "2026-02-09T12:58:16.162Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/99/11/bb356e86920c655ca4d61daee4e2bbc7258f0a37de0be32d233b561134ff/coverage-7.13.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:48685fee12c2eb3b27c62f2658e7ea21e9c3239cba5a8a242801a0a3f6a8c62a", upload-time = "2026-02-09T12:58:17.892Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c9/0f/9ae1f8cb17029e09da06ca4e28c9e1d5c1c0a511c7074592e37e0836c915/coverage-7.13.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4e83efc079eb39480e6346a15a1bcb3e9b04759c5202d157e1dd4303cd619356", upload-time = "2026-02-09T12:58:19.495Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/3a/adfb68558fa815cbc29747b553bc833d2150228f251b127f1ce97e48547c/coverage-7.13.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ecae9737b72408d6a950f7e525f30aca12d4bd8dd95e37342e5beb3a2a8c4f71", upload-time = "2026-02-09T12:58:21.064Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/32/b1/540d0c27c4e748bd3cd0bd001076ee416eda993c2bae47a73b7cc9357931/coverage-7.13.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ae4578f8528569d3cf303fef2ea569c7f4c4059a38c8667ccef15c6e1f118aa5", upload-time = "2026-02-09T12:58:22.622Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/95/383609462b3ffb1fe133014a7c84fc0dd01ed55ac6140fa1093b5af7ebb1/coverage-7.13.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6fdef321fdfbb30a197efa02d48fcd9981f0d8ad2ae8903ac318adc653f5df98", upload-time = "2026-02-09T12:58:24.548Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f7/ba/1761138e86c81680bfc3c49579d66312865457f9fe405b033184e5793cb3/coverage-7.13.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b0f6ccf3dbe577170bebfce1318707d0e8c3650003cb4b3a9dd744575daa8b5", upload-time = "2026-02-09T12:58:26.271Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/8e/05900df797a9c11837ab59c4d6fe94094e029582aab75c3309a93e6fb4e3/coverage-7.13.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75fcd519f2a5765db3f0e391eb3b7d150cce1a771bf4c9f861aeab86c767a3c0", upload-time = "2026-02-09T12:58:27.807Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/00/bd/29c9f2db9ea4ed2738b8a9508c35626eb205d51af4ab7bf56a21a2e49926/coverage-7.13.4-cp314-cp314-win32.whl", hash = "sha256:8e798c266c378da2bd819b0677df41ab46d78065fb2a399558f3f6cae78b2fbb", upload-time = "2026-02-09T12:58:29.441Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/4d/1f8e723f6829977410efeb88f73673d794075091c8c7c18848d273dc9d73/coverage-7.13.4-cp314-cp314-win_amd64.whl", hash = "sha256:245e37f664d89861cf2329c9afa2c1fe9e6d4e1a09d872c947e70718aeeac505", upload-time = "2026-02-09T12:58:31.026Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/51/5b/84100025be913b44e082ea32abcf1afbf4e872f5120b7a1cab1d331b1e13/coverage-7.13.4-cp314-cp314-win_arm64.whl", hash = "sha256:ad27098a189e5838900ce4c2a99f2fe42a0bf0c2093c17c69b45a71579e8d4a2", upload-time = "2026-02-09T12:58:32.599Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/e4/c884a405d6ead1370433dad1e3720216b4f9fd8ef5b64bfd984a2a60a11a/coverage-7.13.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:85480adfb35ffc32d40918aad81b89c69c9cc5661a9b8a81476d3e645321a056", upload-time = "2026-02-09T12:58:34.181Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/81/5c/4d7ed8b23b233b0fffbc9dfec53c232be2e695468523242ea9fd30f97ad2/coverage-7.13.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:79be69cf7f3bf9b0deeeb062eab7ac7f36cd4cc4c4dd694bd28921ba4d8596cc", upload-time = "2026-02-09T12:58:35.704Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2f/6f/3284d4203fd2f28edd73034968398cd2d4cb04ab192abc8cff007ea35679/coverage-7.13.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:caa421e2684e382c5d8973ac55e4f36bed6821a9bad5c953494de960c74595c9", upload-time = "2026-02-09T12:58:37.864Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/09/aa/b672a647bbe1556a85337dc95bfd40d146e9965ead9cc2fe81bde1e5cbce/coverage-7.13.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14375934243ee05f56c45393fe2ce81fe5cc503c07cee2bdf1725fb8bef3ffaf", upload-time = "2026-02-09T12:58:39.492Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/79/a1/aa384dbe9181f98bba87dd23dda436f0c6cf2e148aecbb4e50fc51c1a656/coverage-7.13.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25a41c3104d08edb094d9db0d905ca54d0cd41c928bb6be3c4c799a54753af55", upload-time = "2026-02-09T12:58:41.852Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/53/5e/5150bf17b4019bc600799f376bb9606941e55bd5a775dc1e096b6ffea952/coverage-7.13.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f01afcff62bf9a08fb32b2c1d6e924236c0383c02c790732b6537269e466a72", upload-time = "2026-02-09T12:58:44.093Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/ed/f1de5c675987a4a7a672250d2c5c9d73d289dbf13410f00ed7181d8017dd/coverage-7.13.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eb9078108fbf0bcdde37c3f4779303673c2fa1fe8f7956e68d447d0dd426d38a", upload-time = "2026-02-09T12:58:45.721Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/e3/fe758d01850aa172419a6743fe76ba8b92c29d181d4f676ffe2dae2ba631/coverage-7.13.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e086334e8537ddd17e5f16a344777c1ab8194986ec533711cbe6c41cde841b6", upload-time = "2026-02-09T12:58:47.334Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b6/76/b829869d464115e22499541def9796b25312b8cf235d3bb00b39f1675395/coverage-7.13.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:725d985c5ab621268b2edb8e50dfe57633dc69bda071abc470fed55a14935fd3", upload-time = "2026-02-09T12:58:48.995Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/14/9e/caedb1679e73e2f6ad240173f55218488bfe043e38da577c4ec977489915/coverage-7.13.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3c06f0f1337c667b971ca2f975523347e63ec5e500b9aa5882d91931cd3ef750", upload-time = "2026-02-09T12:58:51.178Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3a/10/0dd02cb009b16ede425b49ec344aba13a6ae1dc39600840ea6abcb085ac4/coverage-7.13.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:590c0ed4bf8e85f745e6b805b2e1c457b2e33d5255dd9729743165253bc9ad39", upload-time = "2026-02-09T12:58:53.081Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/92/8e/234d2c927af27c6d7a5ffad5bd2cf31634c46a477b4c7adfbfa66baf7ebb/coverage-7.13.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eb30bf180de3f632cd043322dad5751390e5385108b2807368997d1a92a509d0", upload-time = "2026-02-09T12:58:55.258Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2f/64/e5547c8ff6964e5965c35a480855911b61509cce544f4d442caa759a0702/coverage-7.13.4-cp314-cp314t-win32.whl", hash = "sha256:c4240e7eded42d131a2d2c4dec70374b781b043ddc79a9de4d55ca71f8e98aea", upload-time = "2026-02-09T12:58:56.936Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/96/38086d58a181aac86d503dfa9c47eb20715a79c3e3acbdf786e92e5c09a8/coverage-7.13.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4c7d3cc01e7350f2f0f6f7036caaf5673fb56b6998889ccfe9e1c1fe75a9c932", upload-time = "2026-02-09T12:58:58.645Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ce/72/8d10abd3740a0beb98c305e0c3faf454366221c0f37a8bcf8f60020bb65a/coverage-7.13.4-cp314-cp314t-win_arm64.whl", hash = "sha256:23e3f687cf945070d1c90f85db66d11e3025665d8dafa831301a0e0038f3db9b", upload-time = "2026-02-09T12:59:00.396Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0d/4a/331fe2caf6799d591109bb9c08083080f6de90a823695d412a935622abb2/coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0", upload-time = "2026-02-09T12:59:02.032Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/24/56/95b7e30fa389756cb56630faa728da46a27b8c6eb46f9d557c68fff12b65/coverage-7.13.4.tar.gz", hash = "sha256:e5c8f6ed1e61a8b2dcdf31eb0b9bbf0130750ca79c1c49eb898e2ad86f5ccc91", size = 827239, upload-time = "2026-02-09T12:59:03.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/d4/7827d9ffa34d5d4d752eec907022aa417120936282fc488306f5da08c292/coverage-7.13.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fc31c787a84f8cd6027eba44010517020e0d18487064cd3d8968941856d1415", size = 219152, upload-time = "2026-02-09T12:56:11.974Z" }, + { url = "https://files.pythonhosted.org/packages/35/b0/d69df26607c64043292644dbb9dc54b0856fabaa2cbb1eeee3331cc9e280/coverage-7.13.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a32ebc02a1805adf637fc8dec324b5cdacd2e493515424f70ee33799573d661b", size = 219667, upload-time = "2026-02-09T12:56:13.33Z" }, + { url = "https://files.pythonhosted.org/packages/82/a4/c1523f7c9e47b2271dbf8c2a097e7a1f89ef0d66f5840bb59b7e8814157b/coverage-7.13.4-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e24f9156097ff9dc286f2f913df3a7f63c0e333dcafa3c196f2c18b4175ca09a", size = 246425, upload-time = "2026-02-09T12:56:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/f8/02/aa7ec01d1a5023c4b680ab7257f9bfde9defe8fdddfe40be096ac19e8177/coverage-7.13.4-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8041b6c5bfdc03257666e9881d33b1abc88daccaf73f7b6340fb7946655cd10f", size = 248229, upload-time = "2026-02-09T12:56:16.31Z" }, + { url = "https://files.pythonhosted.org/packages/35/98/85aba0aed5126d896162087ef3f0e789a225697245256fc6181b95f47207/coverage-7.13.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a09cfa6a5862bc2fc6ca7c3def5b2926194a56b8ab78ffcf617d28911123012", size = 250106, upload-time = "2026-02-09T12:56:18.024Z" }, + { url = "https://files.pythonhosted.org/packages/96/72/1db59bd67494bc162e3e4cd5fbc7edba2c7026b22f7c8ef1496d58c2b94c/coverage-7.13.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:296f8b0af861d3970c2a4d8c91d48eb4dd4771bcef9baedec6a9b515d7de3def", size = 252021, upload-time = "2026-02-09T12:56:19.272Z" }, + { url = "https://files.pythonhosted.org/packages/9d/97/72899c59c7066961de6e3daa142d459d47d104956db43e057e034f015c8a/coverage-7.13.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e101609bcbbfb04605ea1027b10dc3735c094d12d40826a60f897b98b1c30256", size = 247114, upload-time = "2026-02-09T12:56:21.051Z" }, + { url = "https://files.pythonhosted.org/packages/39/1f/f1885573b5970235e908da4389176936c8933e86cb316b9620aab1585fa2/coverage-7.13.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:aa3feb8db2e87ff5e6d00d7e1480ae241876286691265657b500886c98f38bda", size = 248143, upload-time = "2026-02-09T12:56:22.585Z" }, + { url = "https://files.pythonhosted.org/packages/a8/cf/e80390c5b7480b722fa3e994f8202807799b85bc562aa4f1dde209fbb7be/coverage-7.13.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4fc7fa81bbaf5a02801b65346c8b3e657f1d93763e58c0abdf7c992addd81a92", size = 246152, upload-time = "2026-02-09T12:56:23.748Z" }, + { url = "https://files.pythonhosted.org/packages/44/bf/f89a8350d85572f95412debb0fb9bb4795b1d5b5232bd652923c759e787b/coverage-7.13.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:33901f604424145c6e9c2398684b92e176c0b12df77d52db81c20abd48c3794c", size = 249959, upload-time = "2026-02-09T12:56:25.209Z" }, + { url = "https://files.pythonhosted.org/packages/f7/6e/612a02aece8178c818df273e8d1642190c4875402ca2ba74514394b27aba/coverage-7.13.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:bb28c0f2cf2782508a40cec377935829d5fcc3ad9a3681375af4e84eb34b6b58", size = 246416, upload-time = "2026-02-09T12:56:26.475Z" }, + { url = "https://files.pythonhosted.org/packages/cb/98/b5afc39af67c2fa6786b03c3a7091fc300947387ce8914b096db8a73d67a/coverage-7.13.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d107aff57a83222ddbd8d9ee705ede2af2cc926608b57abed8ef96b50b7e8f9", size = 247025, upload-time = "2026-02-09T12:56:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/51/30/2bba8ef0682d5bd210c38fe497e12a06c9f8d663f7025e9f5c2c31ce847d/coverage-7.13.4-cp310-cp310-win32.whl", hash = "sha256:a6f94a7d00eb18f1b6d403c91a88fd58cfc92d4b16080dfdb774afc8294469bf", size = 221758, upload-time = "2026-02-09T12:56:29.051Z" }, + { url = "https://files.pythonhosted.org/packages/78/13/331f94934cf6c092b8ea59ff868eb587bc8fe0893f02c55bc6c0183a192e/coverage-7.13.4-cp310-cp310-win_amd64.whl", hash = "sha256:2cb0f1e000ebc419632bbe04366a8990b6e32c4e0b51543a6484ffe15eaeda95", size = 222693, upload-time = "2026-02-09T12:56:30.366Z" }, + { url = "https://files.pythonhosted.org/packages/b4/ad/b59e5b451cf7172b8d1043dc0fa718f23aab379bc1521ee13d4bd9bfa960/coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053", size = 219278, upload-time = "2026-02-09T12:56:31.673Z" }, + { url = "https://files.pythonhosted.org/packages/f1/17/0cb7ca3de72e5f4ef2ec2fa0089beafbcaaaead1844e8b8a63d35173d77d/coverage-7.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:19bc3c88078789f8ef36acb014d7241961dbf883fd2533d18cb1e7a5b4e28b11", size = 219783, upload-time = "2026-02-09T12:56:33.104Z" }, + { url = "https://files.pythonhosted.org/packages/ab/63/325d8e5b11e0eaf6d0f6a44fad444ae58820929a9b0de943fa377fe73e85/coverage-7.13.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3998e5a32e62fdf410c0dbd3115df86297995d6e3429af80b8798aad894ca7aa", size = 250200, upload-time = "2026-02-09T12:56:34.474Z" }, + { url = "https://files.pythonhosted.org/packages/76/53/c16972708cbb79f2942922571a687c52bd109a7bd51175aeb7558dff2236/coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7", size = 252114, upload-time = "2026-02-09T12:56:35.749Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c2/7ab36d8b8cc412bec9ea2d07c83c48930eb4ba649634ba00cb7e4e0f9017/coverage-7.13.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a3aa4e7b9e416774b21797365b358a6e827ffadaaca81b69ee02946852449f00", size = 254220, upload-time = "2026-02-09T12:56:37.796Z" }, + { url = "https://files.pythonhosted.org/packages/d6/4d/cf52c9a3322c89a0e6febdfbc83bb45c0ed3c64ad14081b9503adee702e7/coverage-7.13.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:71ca20079dd8f27fcf808817e281e90220475cd75115162218d0e27549f95fef", size = 256164, upload-time = "2026-02-09T12:56:39.016Z" }, + { url = "https://files.pythonhosted.org/packages/78/e9/eb1dd17bd6de8289df3580e967e78294f352a5df8a57ff4671ee5fc3dcd0/coverage-7.13.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e2f25215f1a359ab17320b47bcdaca3e6e6356652e8256f2441e4ef972052903", size = 250325, upload-time = "2026-02-09T12:56:40.668Z" }, + { url = "https://files.pythonhosted.org/packages/71/07/8c1542aa873728f72267c07278c5cc0ec91356daf974df21335ccdb46368/coverage-7.13.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d65b2d373032411e86960604dc4edac91fdfb5dca539461cf2cbe78327d1e64f", size = 251913, upload-time = "2026-02-09T12:56:41.97Z" }, + { url = "https://files.pythonhosted.org/packages/74/d7/c62e2c5e4483a748e27868e4c32ad3daa9bdddbba58e1bc7a15e252baa74/coverage-7.13.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94eb63f9b363180aff17de3e7c8760c3ba94664ea2695c52f10111244d16a299", size = 249974, upload-time = "2026-02-09T12:56:43.323Z" }, + { url = "https://files.pythonhosted.org/packages/98/9f/4c5c015a6e98ced54efd0f5cf8d31b88e5504ecb6857585fc0161bb1e600/coverage-7.13.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e856bf6616714c3a9fbc270ab54103f4e685ba236fa98c054e8f87f266c93505", size = 253741, upload-time = "2026-02-09T12:56:45.155Z" }, + { url = "https://files.pythonhosted.org/packages/bd/59/0f4eef89b9f0fcd9633b5d350016f54126ab49426a70ff4c4e87446cabdc/coverage-7.13.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:65dfcbe305c3dfe658492df2d85259e0d79ead4177f9ae724b6fb245198f55d6", size = 249695, upload-time = "2026-02-09T12:56:46.636Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2c/b7476f938deb07166f3eb281a385c262675d688ff4659ad56c6c6b8e2e70/coverage-7.13.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b507778ae8a4c915436ed5c2e05b4a6cecfa70f734e19c22a005152a11c7b6a9", size = 250599, upload-time = "2026-02-09T12:56:48.13Z" }, + { url = "https://files.pythonhosted.org/packages/b8/34/c3420709d9846ee3785b9f2831b4d94f276f38884032dca1457fa83f7476/coverage-7.13.4-cp311-cp311-win32.whl", hash = "sha256:784fc3cf8be001197b652d51d3fd259b1e2262888693a4636e18879f613a62a9", size = 221780, upload-time = "2026-02-09T12:56:50.479Z" }, + { url = "https://files.pythonhosted.org/packages/61/08/3d9c8613079d2b11c185b865de9a4c1a68850cfda2b357fae365cf609f29/coverage-7.13.4-cp311-cp311-win_amd64.whl", hash = "sha256:2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f", size = 222715, upload-time = "2026-02-09T12:56:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/18/1a/54c3c80b2f056164cc0a6cdcb040733760c7c4be9d780fe655f356f433e4/coverage-7.13.4-cp311-cp311-win_arm64.whl", hash = "sha256:79e73a76b854d9c6088fe5d8b2ebe745f8681c55f7397c3c0a016192d681045f", size = 221385, upload-time = "2026-02-09T12:56:53.194Z" }, + { url = "https://files.pythonhosted.org/packages/d1/81/4ce2fdd909c5a0ed1f6dedb88aa57ab79b6d1fbd9b588c1ac7ef45659566/coverage-7.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02231499b08dabbe2b96612993e5fc34217cdae907a51b906ac7fca8027a4459", size = 219449, upload-time = "2026-02-09T12:56:54.889Z" }, + { url = "https://files.pythonhosted.org/packages/5d/96/5238b1efc5922ddbdc9b0db9243152c09777804fb7c02ad1741eb18a11c0/coverage-7.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40aa8808140e55dc022b15d8aa7f651b6b3d68b365ea0398f1441e0b04d859c3", size = 219810, upload-time = "2026-02-09T12:56:56.33Z" }, + { url = "https://files.pythonhosted.org/packages/78/72/2f372b726d433c9c35e56377cf1d513b4c16fe51841060d826b95caacec1/coverage-7.13.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5b856a8ccf749480024ff3bd7310adaef57bf31fd17e1bfc404b7940b6986634", size = 251308, upload-time = "2026-02-09T12:56:57.858Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a0/2ea570925524ef4e00bb6c82649f5682a77fac5ab910a65c9284de422600/coverage-7.13.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c048ea43875fbf8b45d476ad79f179809c590ec7b79e2035c662e7afa3192e3", size = 254052, upload-time = "2026-02-09T12:56:59.754Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ac/45dc2e19a1939098d783c846e130b8f862fbb50d09e0af663988f2f21973/coverage-7.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7b38448866e83176e28086674fe7368ab8590e4610fb662b44e345b86d63ffa", size = 255165, upload-time = "2026-02-09T12:57:01.287Z" }, + { url = "https://files.pythonhosted.org/packages/2d/4d/26d236ff35abc3b5e63540d3386e4c3b192168c1d96da5cb2f43c640970f/coverage-7.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de6defc1c9badbf8b9e67ae90fd00519186d6ab64e5cc5f3d21359c2a9b2c1d3", size = 257432, upload-time = "2026-02-09T12:57:02.637Z" }, + { url = "https://files.pythonhosted.org/packages/ec/55/14a966c757d1348b2e19caf699415a2a4c4f7feaa4bbc6326a51f5c7dd1b/coverage-7.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7eda778067ad7ffccd23ecffce537dface96212576a07924cbf0d8799d2ded5a", size = 251716, upload-time = "2026-02-09T12:57:04.056Z" }, + { url = "https://files.pythonhosted.org/packages/77/33/50116647905837c66d28b2af1321b845d5f5d19be9655cb84d4a0ea806b4/coverage-7.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e87f6c587c3f34356c3759f0420693e35e7eb0e2e41e4c011cb6ec6ecbbf1db7", size = 253089, upload-time = "2026-02-09T12:57:05.503Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b4/8efb11a46e3665d92635a56e4f2d4529de6d33f2cb38afd47d779d15fc99/coverage-7.13.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8248977c2e33aecb2ced42fef99f2d319e9904a36e55a8a68b69207fb7e43edc", size = 251232, upload-time = "2026-02-09T12:57:06.879Z" }, + { url = "https://files.pythonhosted.org/packages/51/24/8cd73dd399b812cc76bb0ac260e671c4163093441847ffe058ac9fda1e32/coverage-7.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:25381386e80ae727608e662474db537d4df1ecd42379b5ba33c84633a2b36d47", size = 255299, upload-time = "2026-02-09T12:57:08.245Z" }, + { url = "https://files.pythonhosted.org/packages/03/94/0a4b12f1d0e029ce1ccc1c800944a9984cbe7d678e470bb6d3c6bc38a0da/coverage-7.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ee756f00726693e5ba94d6df2bdfd64d4852d23b09bb0bc700e3b30e6f333985", size = 250796, upload-time = "2026-02-09T12:57:10.142Z" }, + { url = "https://files.pythonhosted.org/packages/73/44/6002fbf88f6698ca034360ce474c406be6d5a985b3fdb3401128031eef6b/coverage-7.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fdfc1e28e7c7cdce44985b3043bc13bbd9c747520f94a4d7164af8260b3d91f0", size = 252673, upload-time = "2026-02-09T12:57:12.197Z" }, + { url = "https://files.pythonhosted.org/packages/de/c6/a0279f7c00e786be75a749a5674e6fa267bcbd8209cd10c9a450c655dfa7/coverage-7.13.4-cp312-cp312-win32.whl", hash = "sha256:01d4cbc3c283a17fc1e42d614a119f7f438eabb593391283adca8dc86eff1246", size = 221990, upload-time = "2026-02-09T12:57:14.085Z" }, + { url = "https://files.pythonhosted.org/packages/77/4e/c0a25a425fcf5557d9abd18419c95b63922e897bc86c1f327f155ef234a9/coverage-7.13.4-cp312-cp312-win_amd64.whl", hash = "sha256:9401ebc7ef522f01d01d45532c68c5ac40fb27113019b6b7d8b208f6e9baa126", size = 222800, upload-time = "2026-02-09T12:57:15.944Z" }, + { url = "https://files.pythonhosted.org/packages/47/ac/92da44ad9a6f4e3a7debd178949d6f3769bedca33830ce9b1dcdab589a37/coverage-7.13.4-cp312-cp312-win_arm64.whl", hash = "sha256:b1ec7b6b6e93255f952e27ab58fbc68dcc468844b16ecbee881aeb29b6ab4d8d", size = 221415, upload-time = "2026-02-09T12:57:17.497Z" }, + { url = "https://files.pythonhosted.org/packages/db/23/aad45061a31677d68e47499197a131eea55da4875d16c1f42021ab963503/coverage-7.13.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b66a2da594b6068b48b2692f043f35d4d3693fb639d5ea8b39533c2ad9ac3ab9", size = 219474, upload-time = "2026-02-09T12:57:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/a5/70/9b8b67a0945f3dfec1fd896c5cefb7c19d5a3a6d74630b99a895170999ae/coverage-7.13.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3599eb3992d814d23b35c536c28df1a882caa950f8f507cef23d1cbf334995ac", size = 219844, upload-time = "2026-02-09T12:57:20.66Z" }, + { url = "https://files.pythonhosted.org/packages/97/fd/7e859f8fab324cef6c4ad7cff156ca7c489fef9179d5749b0c8d321281c2/coverage-7.13.4-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:93550784d9281e374fb5a12bf1324cc8a963fd63b2d2f223503ef0fd4aa339ea", size = 250832, upload-time = "2026-02-09T12:57:22.007Z" }, + { url = "https://files.pythonhosted.org/packages/e4/dc/b2442d10020c2f52617828862d8b6ee337859cd8f3a1f13d607dddda9cf7/coverage-7.13.4-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b720ce6a88a2755f7c697c23268ddc47a571b88052e6b155224347389fdf6a3b", size = 253434, upload-time = "2026-02-09T12:57:23.339Z" }, + { url = "https://files.pythonhosted.org/packages/5a/88/6728a7ad17428b18d836540630487231f5470fb82454871149502f5e5aa2/coverage-7.13.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7b322db1284a2ed3aa28ffd8ebe3db91c929b7a333c0820abec3d838ef5b3525", size = 254676, upload-time = "2026-02-09T12:57:24.774Z" }, + { url = "https://files.pythonhosted.org/packages/7c/bc/21244b1b8cedf0dff0a2b53b208015fe798d5f2a8d5348dbfece04224fff/coverage-7.13.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f4594c67d8a7c89cf922d9df0438c7c7bb022ad506eddb0fdb2863359ff78242", size = 256807, upload-time = "2026-02-09T12:57:26.125Z" }, + { url = "https://files.pythonhosted.org/packages/97/a0/ddba7ed3251cff51006737a727d84e05b61517d1784a9988a846ba508877/coverage-7.13.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:53d133df809c743eb8bce33b24bcababb371f4441340578cd406e084d94a6148", size = 251058, upload-time = "2026-02-09T12:57:27.614Z" }, + { url = "https://files.pythonhosted.org/packages/9b/55/e289addf7ff54d3a540526f33751951bf0878f3809b47f6dfb3def69c6f7/coverage-7.13.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76451d1978b95ba6507a039090ba076105c87cc76fc3efd5d35d72093964d49a", size = 252805, upload-time = "2026-02-09T12:57:29.066Z" }, + { url = "https://files.pythonhosted.org/packages/13/4e/cc276b1fa4a59be56d96f1dabddbdc30f4ba22e3b1cd42504c37b3313255/coverage-7.13.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7f57b33491e281e962021de110b451ab8a24182589be17e12a22c79047935e23", size = 250766, upload-time = "2026-02-09T12:57:30.522Z" }, + { url = "https://files.pythonhosted.org/packages/94/44/1093b8f93018f8b41a8cf29636c9292502f05e4a113d4d107d14a3acd044/coverage-7.13.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:1731dc33dc276dafc410a885cbf5992f1ff171393e48a21453b78727d090de80", size = 254923, upload-time = "2026-02-09T12:57:31.946Z" }, + { url = "https://files.pythonhosted.org/packages/8b/55/ea2796da2d42257f37dbea1aab239ba9263b31bd91d5527cdd6db5efe174/coverage-7.13.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:bd60d4fe2f6fa7dff9223ca1bbc9f05d2b6697bc5961072e5d3b952d46e1b1ea", size = 250591, upload-time = "2026-02-09T12:57:33.842Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fa/7c4bb72aacf8af5020675aa633e59c1fbe296d22aed191b6a5b711eb2bc7/coverage-7.13.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9181a3ccead280b828fae232df12b16652702b49d41e99d657f46cc7b1f6ec7a", size = 252364, upload-time = "2026-02-09T12:57:35.743Z" }, + { url = "https://files.pythonhosted.org/packages/5c/38/a8d2ec0146479c20bbaa7181b5b455a0c41101eed57f10dd19a78ab44c80/coverage-7.13.4-cp313-cp313-win32.whl", hash = "sha256:f53d492307962561ac7de4cd1de3e363589b000ab69617c6156a16ba7237998d", size = 222010, upload-time = "2026-02-09T12:57:37.25Z" }, + { url = "https://files.pythonhosted.org/packages/e2/0c/dbfafbe90a185943dcfbc766fe0e1909f658811492d79b741523a414a6cc/coverage-7.13.4-cp313-cp313-win_amd64.whl", hash = "sha256:e6f70dec1cc557e52df5306d051ef56003f74d56e9c4dd7ddb07e07ef32a84dd", size = 222818, upload-time = "2026-02-09T12:57:38.734Z" }, + { url = "https://files.pythonhosted.org/packages/04/d1/934918a138c932c90d78301f45f677fb05c39a3112b96fd2c8e60503cdc7/coverage-7.13.4-cp313-cp313-win_arm64.whl", hash = "sha256:fb07dc5da7e849e2ad31a5d74e9bece81f30ecf5a42909d0a695f8bd1874d6af", size = 221438, upload-time = "2026-02-09T12:57:40.223Z" }, + { url = "https://files.pythonhosted.org/packages/52/57/ee93ced533bcb3e6df961c0c6e42da2fc6addae53fb95b94a89b1e33ebd7/coverage-7.13.4-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40d74da8e6c4b9ac18b15331c4b5ebc35a17069410cad462ad4f40dcd2d50c0d", size = 220165, upload-time = "2026-02-09T12:57:41.639Z" }, + { url = "https://files.pythonhosted.org/packages/c5/e0/969fc285a6fbdda49d91af278488d904dcd7651b2693872f0ff94e40e84a/coverage-7.13.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4223b4230a376138939a9173f1bdd6521994f2aff8047fae100d6d94d50c5a12", size = 220516, upload-time = "2026-02-09T12:57:44.215Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b8/9531944e16267e2735a30a9641ff49671f07e8138ecf1ca13db9fd2560c7/coverage-7.13.4-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1d4be36a5114c499f9f1f9195e95ebf979460dbe2d88e6816ea202010ba1c34b", size = 261804, upload-time = "2026-02-09T12:57:45.989Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f3/e63df6d500314a2a60390d1989240d5f27318a7a68fa30ad3806e2a9323e/coverage-7.13.4-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:200dea7d1e8095cc6e98cdabe3fd1d21ab17d3cee6dab00cadbb2fe35d9c15b9", size = 263885, upload-time = "2026-02-09T12:57:47.42Z" }, + { url = "https://files.pythonhosted.org/packages/f3/67/7654810de580e14b37670b60a09c599fa348e48312db5b216d730857ffe6/coverage-7.13.4-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8eb931ee8e6d8243e253e5ed7336deea6904369d2fd8ae6e43f68abbf167092", size = 266308, upload-time = "2026-02-09T12:57:49.345Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/39d41eca0eab3cc82115953ad41c4e77935286c930e8fad15eaed1389d83/coverage-7.13.4-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:75eab1ebe4f2f64d9509b984f9314d4aa788540368218b858dad56dc8f3e5eb9", size = 267452, upload-time = "2026-02-09T12:57:50.811Z" }, + { url = "https://files.pythonhosted.org/packages/50/6d/39c0fbb8fc5cd4d2090811e553c2108cf5112e882f82505ee7495349a6bf/coverage-7.13.4-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c35eb28c1d085eb7d8c9b3296567a1bebe03ce72962e932431b9a61f28facf26", size = 261057, upload-time = "2026-02-09T12:57:52.447Z" }, + { url = "https://files.pythonhosted.org/packages/a4/a2/60010c669df5fa603bb5a97fb75407e191a846510da70ac657eb696b7fce/coverage-7.13.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:eb88b316ec33760714a4720feb2816a3a59180fd58c1985012054fa7aebee4c2", size = 263875, upload-time = "2026-02-09T12:57:53.938Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d9/63b22a6bdbd17f1f96e9ed58604c2a6b0e72a9133e37d663bef185877cf6/coverage-7.13.4-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7d41eead3cc673cbd38a4417deb7fd0b4ca26954ff7dc6078e33f6ff97bed940", size = 261500, upload-time = "2026-02-09T12:57:56.012Z" }, + { url = "https://files.pythonhosted.org/packages/70/bf/69f86ba1ad85bc3ad240e4c0e57a2e620fbc0e1645a47b5c62f0e941ad7f/coverage-7.13.4-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:fb26a934946a6afe0e326aebe0730cdff393a8bc0bbb65a2f41e30feddca399c", size = 265212, upload-time = "2026-02-09T12:57:57.5Z" }, + { url = "https://files.pythonhosted.org/packages/ae/f2/5f65a278a8c2148731831574c73e42f57204243d33bedaaf18fa79c5958f/coverage-7.13.4-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:dae88bc0fc77edaa65c14be099bd57ee140cf507e6bfdeea7938457ab387efb0", size = 260398, upload-time = "2026-02-09T12:57:59.027Z" }, + { url = "https://files.pythonhosted.org/packages/ef/80/6e8280a350ee9fea92f14b8357448a242dcaa243cb2c72ab0ca591f66c8c/coverage-7.13.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:845f352911777a8e722bfce168958214951e07e47e5d5d9744109fa5fe77f79b", size = 262584, upload-time = "2026-02-09T12:58:01.129Z" }, + { url = "https://files.pythonhosted.org/packages/22/63/01ff182fc95f260b539590fb12c11ad3e21332c15f9799cb5e2386f71d9f/coverage-7.13.4-cp313-cp313t-win32.whl", hash = "sha256:2fa8d5f8de70688a28240de9e139fa16b153cc3cbb01c5f16d88d6505ebdadf9", size = 222688, upload-time = "2026-02-09T12:58:02.736Z" }, + { url = "https://files.pythonhosted.org/packages/a9/43/89de4ef5d3cd53b886afa114065f7e9d3707bdb3e5efae13535b46ae483d/coverage-7.13.4-cp313-cp313t-win_amd64.whl", hash = "sha256:9351229c8c8407645840edcc277f4a2d44814d1bc34a2128c11c2a031d45a5dd", size = 223746, upload-time = "2026-02-09T12:58:05.362Z" }, + { url = "https://files.pythonhosted.org/packages/35/39/7cf0aa9a10d470a5309b38b289b9bb07ddeac5d61af9b664fe9775a4cb3e/coverage-7.13.4-cp313-cp313t-win_arm64.whl", hash = "sha256:30b8d0512f2dc8c8747557e8fb459d6176a2c9e5731e2b74d311c03b78451997", size = 222003, upload-time = "2026-02-09T12:58:06.952Z" }, + { url = "https://files.pythonhosted.org/packages/92/11/a9cf762bb83386467737d32187756a42094927150c3e107df4cb078e8590/coverage-7.13.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:300deaee342f90696ed186e3a00c71b5b3d27bffe9e827677954f4ee56969601", size = 219522, upload-time = "2026-02-09T12:58:08.623Z" }, + { url = "https://files.pythonhosted.org/packages/d3/28/56e6d892b7b052236d67c95f1936b6a7cf7c3e2634bf27610b8cbd7f9c60/coverage-7.13.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:29e3220258d682b6226a9b0925bc563ed9a1ebcff3cad30f043eceea7eaf2689", size = 219855, upload-time = "2026-02-09T12:58:10.176Z" }, + { url = "https://files.pythonhosted.org/packages/e5/69/233459ee9eb0c0d10fcc2fe425a029b3fa5ce0f040c966ebce851d030c70/coverage-7.13.4-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:391ee8f19bef69210978363ca930f7328081c6a0152f1166c91f0b5fdd2a773c", size = 250887, upload-time = "2026-02-09T12:58:12.503Z" }, + { url = "https://files.pythonhosted.org/packages/06/90/2cdab0974b9b5bbc1623f7876b73603aecac11b8d95b85b5b86b32de5eab/coverage-7.13.4-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0dd7ab8278f0d58a0128ba2fca25824321f05d059c1441800e934ff2efa52129", size = 253396, upload-time = "2026-02-09T12:58:14.615Z" }, + { url = "https://files.pythonhosted.org/packages/ac/15/ea4da0f85bf7d7b27635039e649e99deb8173fe551096ea15017f7053537/coverage-7.13.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78cdf0d578b15148b009ccf18c686aa4f719d887e76e6b40c38ffb61d264a552", size = 254745, upload-time = "2026-02-09T12:58:16.162Z" }, + { url = "https://files.pythonhosted.org/packages/99/11/bb356e86920c655ca4d61daee4e2bbc7258f0a37de0be32d233b561134ff/coverage-7.13.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:48685fee12c2eb3b27c62f2658e7ea21e9c3239cba5a8a242801a0a3f6a8c62a", size = 257055, upload-time = "2026-02-09T12:58:17.892Z" }, + { url = "https://files.pythonhosted.org/packages/c9/0f/9ae1f8cb17029e09da06ca4e28c9e1d5c1c0a511c7074592e37e0836c915/coverage-7.13.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4e83efc079eb39480e6346a15a1bcb3e9b04759c5202d157e1dd4303cd619356", size = 250911, upload-time = "2026-02-09T12:58:19.495Z" }, + { url = "https://files.pythonhosted.org/packages/89/3a/adfb68558fa815cbc29747b553bc833d2150228f251b127f1ce97e48547c/coverage-7.13.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ecae9737b72408d6a950f7e525f30aca12d4bd8dd95e37342e5beb3a2a8c4f71", size = 252754, upload-time = "2026-02-09T12:58:21.064Z" }, + { url = "https://files.pythonhosted.org/packages/32/b1/540d0c27c4e748bd3cd0bd001076ee416eda993c2bae47a73b7cc9357931/coverage-7.13.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ae4578f8528569d3cf303fef2ea569c7f4c4059a38c8667ccef15c6e1f118aa5", size = 250720, upload-time = "2026-02-09T12:58:22.622Z" }, + { url = "https://files.pythonhosted.org/packages/c7/95/383609462b3ffb1fe133014a7c84fc0dd01ed55ac6140fa1093b5af7ebb1/coverage-7.13.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:6fdef321fdfbb30a197efa02d48fcd9981f0d8ad2ae8903ac318adc653f5df98", size = 254994, upload-time = "2026-02-09T12:58:24.548Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ba/1761138e86c81680bfc3c49579d66312865457f9fe405b033184e5793cb3/coverage-7.13.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b0f6ccf3dbe577170bebfce1318707d0e8c3650003cb4b3a9dd744575daa8b5", size = 250531, upload-time = "2026-02-09T12:58:26.271Z" }, + { url = "https://files.pythonhosted.org/packages/f8/8e/05900df797a9c11837ab59c4d6fe94094e029582aab75c3309a93e6fb4e3/coverage-7.13.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75fcd519f2a5765db3f0e391eb3b7d150cce1a771bf4c9f861aeab86c767a3c0", size = 252189, upload-time = "2026-02-09T12:58:27.807Z" }, + { url = "https://files.pythonhosted.org/packages/00/bd/29c9f2db9ea4ed2738b8a9508c35626eb205d51af4ab7bf56a21a2e49926/coverage-7.13.4-cp314-cp314-win32.whl", hash = "sha256:8e798c266c378da2bd819b0677df41ab46d78065fb2a399558f3f6cae78b2fbb", size = 222258, upload-time = "2026-02-09T12:58:29.441Z" }, + { url = "https://files.pythonhosted.org/packages/a7/4d/1f8e723f6829977410efeb88f73673d794075091c8c7c18848d273dc9d73/coverage-7.13.4-cp314-cp314-win_amd64.whl", hash = "sha256:245e37f664d89861cf2329c9afa2c1fe9e6d4e1a09d872c947e70718aeeac505", size = 223073, upload-time = "2026-02-09T12:58:31.026Z" }, + { url = "https://files.pythonhosted.org/packages/51/5b/84100025be913b44e082ea32abcf1afbf4e872f5120b7a1cab1d331b1e13/coverage-7.13.4-cp314-cp314-win_arm64.whl", hash = "sha256:ad27098a189e5838900ce4c2a99f2fe42a0bf0c2093c17c69b45a71579e8d4a2", size = 221638, upload-time = "2026-02-09T12:58:32.599Z" }, + { url = "https://files.pythonhosted.org/packages/a7/e4/c884a405d6ead1370433dad1e3720216b4f9fd8ef5b64bfd984a2a60a11a/coverage-7.13.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:85480adfb35ffc32d40918aad81b89c69c9cc5661a9b8a81476d3e645321a056", size = 220246, upload-time = "2026-02-09T12:58:34.181Z" }, + { url = "https://files.pythonhosted.org/packages/81/5c/4d7ed8b23b233b0fffbc9dfec53c232be2e695468523242ea9fd30f97ad2/coverage-7.13.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:79be69cf7f3bf9b0deeeb062eab7ac7f36cd4cc4c4dd694bd28921ba4d8596cc", size = 220514, upload-time = "2026-02-09T12:58:35.704Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6f/3284d4203fd2f28edd73034968398cd2d4cb04ab192abc8cff007ea35679/coverage-7.13.4-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:caa421e2684e382c5d8973ac55e4f36bed6821a9bad5c953494de960c74595c9", size = 261877, upload-time = "2026-02-09T12:58:37.864Z" }, + { url = "https://files.pythonhosted.org/packages/09/aa/b672a647bbe1556a85337dc95bfd40d146e9965ead9cc2fe81bde1e5cbce/coverage-7.13.4-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14375934243ee05f56c45393fe2ce81fe5cc503c07cee2bdf1725fb8bef3ffaf", size = 264004, upload-time = "2026-02-09T12:58:39.492Z" }, + { url = "https://files.pythonhosted.org/packages/79/a1/aa384dbe9181f98bba87dd23dda436f0c6cf2e148aecbb4e50fc51c1a656/coverage-7.13.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:25a41c3104d08edb094d9db0d905ca54d0cd41c928bb6be3c4c799a54753af55", size = 266408, upload-time = "2026-02-09T12:58:41.852Z" }, + { url = "https://files.pythonhosted.org/packages/53/5e/5150bf17b4019bc600799f376bb9606941e55bd5a775dc1e096b6ffea952/coverage-7.13.4-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f01afcff62bf9a08fb32b2c1d6e924236c0383c02c790732b6537269e466a72", size = 267544, upload-time = "2026-02-09T12:58:44.093Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ed/f1de5c675987a4a7a672250d2c5c9d73d289dbf13410f00ed7181d8017dd/coverage-7.13.4-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:eb9078108fbf0bcdde37c3f4779303673c2fa1fe8f7956e68d447d0dd426d38a", size = 260980, upload-time = "2026-02-09T12:58:45.721Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e3/fe758d01850aa172419a6743fe76ba8b92c29d181d4f676ffe2dae2ba631/coverage-7.13.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e086334e8537ddd17e5f16a344777c1ab8194986ec533711cbe6c41cde841b6", size = 263871, upload-time = "2026-02-09T12:58:47.334Z" }, + { url = "https://files.pythonhosted.org/packages/b6/76/b829869d464115e22499541def9796b25312b8cf235d3bb00b39f1675395/coverage-7.13.4-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:725d985c5ab621268b2edb8e50dfe57633dc69bda071abc470fed55a14935fd3", size = 261472, upload-time = "2026-02-09T12:58:48.995Z" }, + { url = "https://files.pythonhosted.org/packages/14/9e/caedb1679e73e2f6ad240173f55218488bfe043e38da577c4ec977489915/coverage-7.13.4-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3c06f0f1337c667b971ca2f975523347e63ec5e500b9aa5882d91931cd3ef750", size = 265210, upload-time = "2026-02-09T12:58:51.178Z" }, + { url = "https://files.pythonhosted.org/packages/3a/10/0dd02cb009b16ede425b49ec344aba13a6ae1dc39600840ea6abcb085ac4/coverage-7.13.4-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:590c0ed4bf8e85f745e6b805b2e1c457b2e33d5255dd9729743165253bc9ad39", size = 260319, upload-time = "2026-02-09T12:58:53.081Z" }, + { url = "https://files.pythonhosted.org/packages/92/8e/234d2c927af27c6d7a5ffad5bd2cf31634c46a477b4c7adfbfa66baf7ebb/coverage-7.13.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:eb30bf180de3f632cd043322dad5751390e5385108b2807368997d1a92a509d0", size = 262638, upload-time = "2026-02-09T12:58:55.258Z" }, + { url = "https://files.pythonhosted.org/packages/2f/64/e5547c8ff6964e5965c35a480855911b61509cce544f4d442caa759a0702/coverage-7.13.4-cp314-cp314t-win32.whl", hash = "sha256:c4240e7eded42d131a2d2c4dec70374b781b043ddc79a9de4d55ca71f8e98aea", size = 223040, upload-time = "2026-02-09T12:58:56.936Z" }, + { url = "https://files.pythonhosted.org/packages/c7/96/38086d58a181aac86d503dfa9c47eb20715a79c3e3acbdf786e92e5c09a8/coverage-7.13.4-cp314-cp314t-win_amd64.whl", hash = "sha256:4c7d3cc01e7350f2f0f6f7036caaf5673fb56b6998889ccfe9e1c1fe75a9c932", size = 224148, upload-time = "2026-02-09T12:58:58.645Z" }, + { url = "https://files.pythonhosted.org/packages/ce/72/8d10abd3740a0beb98c305e0c3faf454366221c0f37a8bcf8f60020bb65a/coverage-7.13.4-cp314-cp314t-win_arm64.whl", hash = "sha256:23e3f687cf945070d1c90f85db66d11e3025665d8dafa831301a0e0038f3db9b", size = 222172, upload-time = "2026-02-09T12:59:00.396Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4a/331fe2caf6799d591109bb9c08083080f6de90a823695d412a935622abb2/coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0", size = 211242, upload-time = "2026-02-09T12:59:02.032Z" }, ] [package.optional-dependencies] @@ -1012,69 +1009,69 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/ad/83/b5ef04565acc065387dda3a4fbf0c4cfb6bab805c81b66b2bc5b5ac9a282/cross_web-0.6.0.tar.gz", hash = "sha256:ae90570802615365ca1a781117b43bfd0d6cd3bf611649d24c3a206a82a693c9", upload-time = "2026-04-13T14:29:12.718Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ad/83/b5ef04565acc065387dda3a4fbf0c4cfb6bab805c81b66b2bc5b5ac9a282/cross_web-0.6.0.tar.gz", hash = "sha256:ae90570802615365ca1a781117b43bfd0d6cd3bf611649d24c3a206a82a693c9", size = 331315, upload-time = "2026-04-13T14:29:12.718Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/35/a2/dab06d9b80cb76c700883186a9a2e6fd103342c9b4def4d88f5787796e17/cross_web-0.6.0-py3-none-any.whl", hash = "sha256:bdebf0c08d02f3a48cf67b6904d3a6d8fd8cab2cd905592ab96ab00b259cd582", upload-time = "2026-04-13T14:29:11.198Z" }, + { url = "https://files.pythonhosted.org/packages/35/a2/dab06d9b80cb76c700883186a9a2e6fd103342c9b4def4d88f5787796e17/cross_web-0.6.0-py3-none-any.whl", hash = "sha256:bdebf0c08d02f3a48cf67b6904d3a6d8fd8cab2cd905592ab96ab00b259cd582", size = 24820, upload-time = "2026-04-13T14:29:11.198Z" }, ] [[package]] name = "cryptography" -version = "48.0.1" +version = "46.0.7" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/12/45/870e7f4bef50e5f53b9f51d4428aee5290eedf58ba443f16b1ebb7ab8e66/cryptography-48.0.1.tar.gz", hash = "sha256:266f4ee051abb2f725b74ef8072b521ce1feacf685a3364fa6a6b45548db791a", upload-time = "2026-06-09T22:32:31.8Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/1b/bc/ee4137cbbe105652c0ee4252792b78fc8e7afa4b8e61d9d5dc05a7f45731/cryptography-48.0.1-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:3e4a1a3232eef2e6c732827d5722db29a0cc8b27af2a4d865b094cf954be9ca1", upload-time = "2026-06-09T22:31:00.702Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/85/6379d42181bfc713094f081360fc5784d6c816b599d45e7f082502d173ce/cryptography-48.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:32143b24adb918f078134e1e230f1eb8cc04886b92c28b5f0041aaf3e5699225", upload-time = "2026-06-09T22:32:33.446Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/87/c85d147b53323c7eb4d850920c8901377323c2a0ff8d79c262d4fee89aa2/cryptography-48.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0d27a5696721ef7a672b8c810f6aded391058e0b9486e63e6d93baf765da691", upload-time = "2026-06-09T22:31:40.141Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/79/58/67cbf8cf1ee7c54b439ca07bbecf8362c07afc11a3724fea70f745784add/cryptography-48.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:eb86ce1af36fe65041b6db9a8bb064ee621a7e5fded0f80d475ec243477cd242", upload-time = "2026-06-09T22:31:42.191Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/c6/24266ac10c47f6cd2a865f4446062b466da1d1f10b27189eac00e61bf0c9/cryptography-48.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:b024e784ad6c077ee0147b35ea9cbfc1e34e1fd4c1dcca214c2794d73a12df08", upload-time = "2026-06-09T22:31:58.703Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/bb/cc4b78784f97efc8c5874c2a9743708d172be6663024b34a0467885ae0c8/cryptography-48.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3752f2dbc8f07a30aad2932c986cea495b03bb554887828225da104f732852b6", upload-time = "2026-06-09T22:31:31.01Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/52/0c44de3f5267f8fbe8e835138017522a333436166e406f0db9b9e6e3033f/cryptography-48.0.1-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:bd81490cd5801d755cf97bb68ac191f14b708470b1c7cf4580f669b9c9264cd8", upload-time = "2026-06-09T22:32:28.096Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9a/2e/772d7adbfa931537bc401640b7cac9976bff689bda187833e5d63b428e49/cryptography-48.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:66fd0771e7b9c6dcd44cf1120690d2338d16d72795cf40cae2786a39eba65429", upload-time = "2026-06-09T22:31:38.284Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/a3/b06844f303873493c963caf581c04df31c7035e0c1b0f02c4814d319ec80/cryptography-48.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:3fd2ca57062b241c856670b073487d2e86c4637937ca5601e48f97bf8e11fc8f", upload-time = "2026-06-09T22:31:04.187Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/13/8b765e2e12b07c74941caadb9d1c8fdc006c4dfbf2b8f2d610519758954d/cryptography-48.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:0ee6ea481db1ab889cba043ec1eda17bb9c1ea79db6722f779c3667f9f70322f", upload-time = "2026-06-09T22:32:30.07Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2e/aa/48972bce55049b32a94f4907eda4d75fa385aad8a39506cc2fc72196ecf0/cryptography-48.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f2ceef93cb096aa3c4cc4b5c94ca6131f9196d28c64d6111533402a9b2054d41", upload-time = "2026-06-09T22:31:43.868Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/47/a2/e5079a032fb85cf6005046ca92bbd78b0c82dad2b5751ab8c311659da06f/cryptography-48.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9bd3f92d76217892b15df84ca256c2c113d386fdda7a7d8691aeeced976507c6", upload-time = "2026-06-09T22:31:05.845Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/a0/8f50cae9c74e718ed769d63ed5c74bd0ea830c9550a74629cebd1b9c7bc7/cryptography-48.0.1-cp311-abi3-win32.whl", hash = "sha256:b9a32b876490d66c8bcc9963ef220199569748434ab01a9d6aaeabf88e7f5158", upload-time = "2026-06-09T22:32:16.845Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c5/69/0572c77dbace6fef72f33755bd52ea399c71367250d366237f8691826b9e/cryptography-48.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:39489bfca54c7a1f6b297efcd8bc608ab92d16c4ca631b0cad4da46724588b24", upload-time = "2026-06-09T22:32:00.388Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/42/06/3e768b4c3bc78201583fa35a0e18f640dd782ff41afba88f8545481a8874/cryptography-48.0.1-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:f817adc181390bd54f2f700107a7419040fb7c1bdf2fc26f36551a06a68c3345", upload-time = "2026-06-09T22:31:07.8Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8a/13/6476736484b94041110c8340a3eb63962fea4975baea8cb4a512adb44d4d/cryptography-48.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d5d30989c6917b478b5817902e85fddaea2261efa8648383d965381ccb9e1ac4", upload-time = "2026-06-09T22:31:09.745Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/79/62/65a87f34d2a431546e2509b85d55e8c90df86d668f6731da64d538512ac2/cryptography-48.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:df637c05205ea7c1d7fbcbe54bbfea648a52951155f997af13d895d0ecc96991", upload-time = "2026-06-09T22:32:24.409Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7f/59/810b5204b0a9b10f4b6bc06bd551a8b609803cd931806bc3b71884b225e5/cryptography-48.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:869c3b8a53bfe27147832df48b32adadf558249d50e76cb3769d40e986b13265", upload-time = "2026-06-09T22:32:08.737Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/dc/d8ca05ffea724eec6d232ea6f18e74c269eb6bdfdcc9bfba689790d1325f/cryptography-48.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:e361afba8918070d376df76f408a4f67fec0ee9cff81a99e48fe9a233ef59e17", upload-time = "2026-06-09T22:31:15.212Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/8c/3be6cb4da181f5bb6c19cf560c2359d60644a6b5fc5b57854e528f47b296/cryptography-48.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:d069066deead00ac7f090be101be875a06855908f7ec004c27b8fefb4acfb411", upload-time = "2026-06-09T22:32:22.66Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/f6/d5f60a5a1434dbfd949e227fd0065d194c7e6b6ac526b17f5c06152b8231/cryptography-48.0.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:09f73a725d582cef64b91281a322cd798d14a33b2b6f2b7ad9531dc336d84c02", upload-time = "2026-06-09T22:32:10.777Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/17/b7/ba75dd947a14b6ad907b01ae8f6b5b348cdd1b48142f0063dee9e20c1d9d/cryptography-48.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:15254441469dd6bf027039453288e2072124f8b6603563f5d759e1c9b69273fa", upload-time = "2026-06-09T22:31:53.105Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/62/29/50d6b9e8aff12d8b67afaeb3569335e32dc83a5723e3bbded24fdac9f809/cryptography-48.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:8ace4507d1e6533c125f4fac754f8bb8b6a74c08e92179dabd7e16571a3efbf3", upload-time = "2026-06-09T22:31:25.774Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/04/618f4115cfc0add0838c82507aa18a346089428da8653ad38b3ff36f5cb3/cryptography-48.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:b4e391975f038e66432328639620a4aff2d307513b004f1ca06d6225bced815c", upload-time = "2026-06-09T22:32:12.676Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/9c/06e062462a0de28a3b3911322eded4c16deb9f441b1b7575d3dc59488ab5/cryptography-48.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42fcd8e26fe555d9b3577a135f5091fefa0aa4e99129c23fb56787a1bd4ada72", upload-time = "2026-06-09T22:31:17.062Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f4/be/0561971eaaee4b8a0e7d5113c536921063ab91aaf23278ac374eaf881e11/cryptography-48.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1400da5e32a43253392277eac7490a60e497d810a63dd5608d71bbd7af507c9", upload-time = "2026-06-09T22:31:32.842Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a4/27/728c77876f12b000820b69ae490f3c4083775e79e07827e9e60be07ad209/cryptography-48.0.1-cp314-cp314t-win32.whl", hash = "sha256:0df56b056bc17c1b7d6821dfa65216e62bd232d8ab05eb3db44e71d235651471", upload-time = "2026-06-09T22:31:29.154Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/06/e3/79a612c6d7b1e6ee0edd43633d53035bec2cfb78c82b76f7864f39e36f34/cryptography-48.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:9de21387aa95e2a895823d0745b430bed4f33503ba9ab5e0b5311f33e37d66d2", upload-time = "2026-06-09T22:31:56.697Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ca/6c/00fa2a95997164c8b2072ce327c23d4ab20809ccc323ea5fab91e53a4bba/cryptography-48.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:4fdc69f8e4316bcf0c8c8ec1f26f285d12e8142d88d96c876a59a03be3f6ae67", upload-time = "2026-06-09T22:32:20.777Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/d9/45f309a7e4e5f3f8f121d6d3be9e94024a7726ec598d6e08ae04edb2f04d/cryptography-48.0.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48fe40804d4caa2288f24e70ca8c64c42dd826da0ad7e4f1b41b2128d679e6c8", upload-time = "2026-06-09T22:31:54.74Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/9f/a1bc8bcc798811b8527eb374bbccf30a3f3e806829d967118222bf1125eb/cryptography-48.0.1-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:86be3b1b0b6bf09482fb50a979c508d2950ed95f5621ec77f4e385962006b83a", upload-time = "2026-06-09T22:31:45.615Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/c2/81a4fb4e4373c500bb526bc337ac5719dd31dd15b970b84a238168c6aa08/cryptography-48.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4ab0a343c807bbcd90c971cd1ecf072937cd01847a9e002bef88fb47ac6be577", upload-time = "2026-06-09T22:31:11.564Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/0b/aa68b221dde92d09cb29a024ede17550ee21e77a404e59fc093c82bb51e1/cryptography-48.0.1-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9621de99d2da096006b629979efd8ae7eb2d8b822488d0c89ee4000c306c59b1", upload-time = "2026-06-09T22:31:20.368Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/78/13/fba657f958d2af66ea959a4ba01212632089249d34af1ae48054136344d7/cryptography-48.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:88c852a0ae366e262e5a1744b685e6a433dc8788dd2a277e418bf4904203609d", upload-time = "2026-06-09T22:31:22.253Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4c/4c/9a964756d24a26b3e34dfcb16f961b89838786e6700b635b0d1e3adff4b6/cryptography-48.0.1-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:43c5835e2cb98c8733d86f57d6fc879b613f5c3478607281c3e36daffc6dd8a6", upload-time = "2026-06-09T22:31:36.56Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/0f/a10f3a6eb12950a10e3a874070283aa2dd5875b2bfd15fad8a3e17b3f13e/cryptography-48.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:fe0180af5bf9236518a087e35bf2d9a347d5f5f51e63c579d683ddff424e3d46", upload-time = "2026-06-09T22:31:13.351Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f3/6f/5cd12f951165ea73ef85266775d97e4c763b2474ccfd816dd69d3a18d6f8/cryptography-48.0.1-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:b7a2d1a937a738a881737cec135a38bb61470589b17515b9f73f571d0ae10401", upload-time = "2026-06-09T22:32:02.193Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/68/ab/8aaa12e4516ec4464033ab79b6f3b592bd5a92102467c4ace8a0d970203f/cryptography-48.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:b74ca3b8e5ecdd833bf6a002ca41b4793bb27fb8f1c06ffaf2643c9e9140e31b", upload-time = "2026-06-09T22:32:04.019Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1b/24/50027ea4dca85ec1f40688f3c24fb32ccacd520583c9592c3cc95628e6fb/cryptography-48.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:2c37f2461406063b417837f5f3daab668652acd82423efcd7f0a9f04be972de1", upload-time = "2026-06-09T22:32:18.707Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/52/41/04cb5eb17085ade6f50cc611fb657df6a0f5885350de8764ece89c050197/cryptography-48.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:86fe77abb1bd87afb251d4d02ada7ecf53a32cee9b67d976abb2e45a13297475", upload-time = "2026-06-09T22:31:18.793Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/36/bf/ed70785c496e89d7e73b7cda2d21f2447fd6d4e821714b8d04ff217fed92/cryptography-48.0.1-cp39-abi3-win32.whl", hash = "sha256:6b2c0c3e6ccf3ade7750f836ef3ee36eea250cc467d45c256895573ac08cc6f1", upload-time = "2026-06-09T22:30:53.162Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/ff/371ea7d252656ee1eb6d83eeeef3d1d0c6baf1d6497687d081ea03814670/cryptography-48.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:9a49ca6c81417f6a5edb50375a60cccdd70fa0a91a5211829dbea74eba94d2ac", upload-time = "2026-06-09T22:32:15.191Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a9/d3/eb4e394e587341fdad09a09101fa76478ead3a78b0ad63e55c22f0d75c02/cryptography-48.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:08a597acce1ff37f347400087776599e2348a3a8bc53b44120e463cd274efe4a", upload-time = "2026-06-09T22:31:23.871Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/4a/3f43451b4f858bfceaaaffc649e6e787e8d4fb332a1d443af39ab02cc8f1/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:735824ec41b7f74a7c45fb1591349333e4c696cb6c044e5f46356e560143e4cd", upload-time = "2026-06-09T22:31:02.532Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/4e/855584c2c23b09e4ce2d3b9c30e983e679cd60b068c513c6bbdb91e11782/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:92a46e1d638daa264ba2971c0b0489c9409787943efae4d60ffda3d091ef832c", upload-time = "2026-06-09T22:32:06.213Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/42/3b/d35750e41d803d1e516fd6d6011f065424924da7af1748cef4cc9cb3ede1/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:7e234ac052af99f2700826a5c29ea99d9c1b1f80341cde62d11c8154dc8e0bd9", upload-time = "2026-06-09T22:32:26.331Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ca/aa/cdb7181fe865285e87e96825aaab239400f1de0c3bfba9bd9769b79f1a92/cryptography-48.0.1-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:33842cf0888951cef5bc7ac724ab844a42044c1727b967b7f8997289a0464f92", upload-time = "2026-06-09T22:31:27.534Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/8c/ce3823c06c2804f194f9e64f0d67fa3f4094a39f2bb1a990cd03603af8fc/cryptography-48.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:6184ca7b174f28d7c703f1290d4b297217c45355f77a98f67e9b7f14549ac54a", upload-time = "2026-06-09T22:31:34.773Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/47/93/ac8f3d5ff04d54bc814e961a43ae5b0b146154c89c61b47bb07557679b18/cryptography-46.0.7.tar.gz", hash = "sha256:e4cfd68c5f3e0bfdad0d38e023239b96a2fe84146481852dffbcca442c245aa5", size = 750652, upload-time = "2026-04-08T01:57:54.692Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/5d/4a8f770695d73be252331e60e526291e3df0c9b27556a90a6b47bccca4c2/cryptography-46.0.7-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:ea42cbe97209df307fdc3b155f1b6fa2577c0defa8f1f7d3be7d31d189108ad4", size = 7179869, upload-time = "2026-04-08T01:56:17.157Z" }, + { url = "https://files.pythonhosted.org/packages/5f/45/6d80dc379b0bbc1f9d1e429f42e4cb9e1d319c7a8201beffd967c516ea01/cryptography-46.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b36a4695e29fe69215d75960b22577197aca3f7a25b9cf9d165dcfe9d80bc325", size = 4275492, upload-time = "2026-04-08T01:56:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9a/1765afe9f572e239c3469f2cb429f3ba7b31878c893b246b4b2994ffe2fe/cryptography-46.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ad9ef796328c5e3c4ceed237a183f5d41d21150f972455a9d926593a1dcb308", size = 4426670, upload-time = "2026-04-08T01:56:21.415Z" }, + { url = "https://files.pythonhosted.org/packages/8f/3e/af9246aaf23cd4ee060699adab1e47ced3f5f7e7a8ffdd339f817b446462/cryptography-46.0.7-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:73510b83623e080a2c35c62c15298096e2a5dc8d51c3b4e1740211839d0dea77", size = 4280275, upload-time = "2026-04-08T01:56:23.539Z" }, + { url = "https://files.pythonhosted.org/packages/0f/54/6bbbfc5efe86f9d71041827b793c24811a017c6ac0fd12883e4caa86b8ed/cryptography-46.0.7-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cbd5fb06b62bd0721e1170273d3f4d5a277044c47ca27ee257025146c34cbdd1", size = 4928402, upload-time = "2026-04-08T01:56:25.624Z" }, + { url = "https://files.pythonhosted.org/packages/2d/cf/054b9d8220f81509939599c8bdbc0c408dbd2bdd41688616a20731371fe0/cryptography-46.0.7-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:420b1e4109cc95f0e5700eed79908cef9268265c773d3a66f7af1eef53d409ef", size = 4459985, upload-time = "2026-04-08T01:56:27.309Z" }, + { url = "https://files.pythonhosted.org/packages/f9/46/4e4e9c6040fb01c7467d47217d2f882daddeb8828f7df800cb806d8a2288/cryptography-46.0.7-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:24402210aa54baae71d99441d15bb5a1919c195398a87b563df84468160a65de", size = 3990652, upload-time = "2026-04-08T01:56:29.095Z" }, + { url = "https://files.pythonhosted.org/packages/36/5f/313586c3be5a2fbe87e4c9a254207b860155a8e1f3cca99f9910008e7d08/cryptography-46.0.7-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8a469028a86f12eb7d2fe97162d0634026d92a21f3ae0ac87ed1c4a447886c83", size = 4279805, upload-time = "2026-04-08T01:56:30.928Z" }, + { url = "https://files.pythonhosted.org/packages/69/33/60dfc4595f334a2082749673386a4d05e4f0cf4df8248e63b2c3437585f2/cryptography-46.0.7-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9694078c5d44c157ef3162e3bf3946510b857df5a3955458381d1c7cfc143ddb", size = 4892883, upload-time = "2026-04-08T01:56:32.614Z" }, + { url = "https://files.pythonhosted.org/packages/c7/0b/333ddab4270c4f5b972f980adef4faa66951a4aaf646ca067af597f15563/cryptography-46.0.7-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:42a1e5f98abb6391717978baf9f90dc28a743b7d9be7f0751a6f56a75d14065b", size = 4459756, upload-time = "2026-04-08T01:56:34.306Z" }, + { url = "https://files.pythonhosted.org/packages/d2/14/633913398b43b75f1234834170947957c6b623d1701ffc7a9600da907e89/cryptography-46.0.7-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91bbcb08347344f810cbe49065914fe048949648f6bd5c2519f34619142bbe85", size = 4410244, upload-time = "2026-04-08T01:56:35.977Z" }, + { url = "https://files.pythonhosted.org/packages/10/f2/19ceb3b3dc14009373432af0c13f46aa08e3ce334ec6eff13492e1812ccd/cryptography-46.0.7-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5d1c02a14ceb9148cc7816249f64f623fbfee39e8c03b3650d842ad3f34d637e", size = 4674868, upload-time = "2026-04-08T01:56:38.034Z" }, + { url = "https://files.pythonhosted.org/packages/1a/bb/a5c213c19ee94b15dfccc48f363738633a493812687f5567addbcbba9f6f/cryptography-46.0.7-cp311-abi3-win32.whl", hash = "sha256:d23c8ca48e44ee015cd0a54aeccdf9f09004eba9fc96f38c911011d9ff1bd457", size = 3026504, upload-time = "2026-04-08T01:56:39.666Z" }, + { url = "https://files.pythonhosted.org/packages/2b/02/7788f9fefa1d060ca68717c3901ae7fffa21ee087a90b7f23c7a603c32ae/cryptography-46.0.7-cp311-abi3-win_amd64.whl", hash = "sha256:397655da831414d165029da9bc483bed2fe0e75dde6a1523ec2fe63f3c46046b", size = 3488363, upload-time = "2026-04-08T01:56:41.893Z" }, + { url = "https://files.pythonhosted.org/packages/7b/56/15619b210e689c5403bb0540e4cb7dbf11a6bf42e483b7644e471a2812b3/cryptography-46.0.7-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:d151173275e1728cf7839aaa80c34fe550c04ddb27b34f48c232193df8db5842", size = 7119671, upload-time = "2026-04-08T01:56:44Z" }, + { url = "https://files.pythonhosted.org/packages/74/66/e3ce040721b0b5599e175ba91ab08884c75928fbeb74597dd10ef13505d2/cryptography-46.0.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:db0f493b9181c7820c8134437eb8b0b4792085d37dbb24da050476ccb664e59c", size = 4268551, upload-time = "2026-04-08T01:56:46.071Z" }, + { url = "https://files.pythonhosted.org/packages/03/11/5e395f961d6868269835dee1bafec6a1ac176505a167f68b7d8818431068/cryptography-46.0.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ebd6daf519b9f189f85c479427bbd6e9c9037862cf8fe89ee35503bd209ed902", size = 4408887, upload-time = "2026-04-08T01:56:47.718Z" }, + { url = "https://files.pythonhosted.org/packages/40/53/8ed1cf4c3b9c8e611e7122fb56f1c32d09e1fff0f1d77e78d9ff7c82653e/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:b7b412817be92117ec5ed95f880defe9cf18a832e8cafacf0a22337dc1981b4d", size = 4271354, upload-time = "2026-04-08T01:56:49.312Z" }, + { url = "https://files.pythonhosted.org/packages/50/46/cf71e26025c2e767c5609162c866a78e8a2915bbcfa408b7ca495c6140c4/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:fbfd0e5f273877695cb93baf14b185f4878128b250cc9f8e617ea0c025dfb022", size = 4905845, upload-time = "2026-04-08T01:56:50.916Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ea/01276740375bac6249d0a971ebdf6b4dc9ead0ee0a34ef3b5a88c1a9b0d4/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:ffca7aa1d00cf7d6469b988c581598f2259e46215e0140af408966a24cf086ce", size = 4444641, upload-time = "2026-04-08T01:56:52.882Z" }, + { url = "https://files.pythonhosted.org/packages/3d/4c/7d258f169ae71230f25d9f3d06caabcff8c3baf0978e2b7d65e0acac3827/cryptography-46.0.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:60627cf07e0d9274338521205899337c5d18249db56865f943cbe753aa96f40f", size = 3967749, upload-time = "2026-04-08T01:56:54.597Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2a/2ea0767cad19e71b3530e4cad9605d0b5e338b6a1e72c37c9c1ceb86c333/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:80406c3065e2c55d7f49a9550fe0c49b3f12e5bfff5dedb727e319e1afb9bf99", size = 4270942, upload-time = "2026-04-08T01:56:56.416Z" }, + { url = "https://files.pythonhosted.org/packages/41/3d/fe14df95a83319af25717677e956567a105bb6ab25641acaa093db79975d/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:c5b1ccd1239f48b7151a65bc6dd54bcfcc15e028c8ac126d3fada09db0e07ef1", size = 4871079, upload-time = "2026-04-08T01:56:58.31Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/4a479e0f36f8f378d397f4eab4c850b4ffb79a2f0d58704b8fa0703ddc11/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:d5f7520159cd9c2154eb61eb67548ca05c5774d39e9c2c4339fd793fe7d097b2", size = 4443999, upload-time = "2026-04-08T01:57:00.508Z" }, + { url = "https://files.pythonhosted.org/packages/28/17/b59a741645822ec6d04732b43c5d35e4ef58be7bfa84a81e5ae6f05a1d33/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fcd8eac50d9138c1d7fc53a653ba60a2bee81a505f9f8850b6b2888555a45d0e", size = 4399191, upload-time = "2026-04-08T01:57:02.654Z" }, + { url = "https://files.pythonhosted.org/packages/59/6a/bb2e166d6d0e0955f1e9ff70f10ec4b2824c9cfcdb4da772c7dd69cc7d80/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:65814c60f8cc400c63131584e3e1fad01235edba2614b61fbfbfa954082db0ee", size = 4655782, upload-time = "2026-04-08T01:57:04.592Z" }, + { url = "https://files.pythonhosted.org/packages/95/b6/3da51d48415bcb63b00dc17c2eff3a651b7c4fed484308d0f19b30e8cb2c/cryptography-46.0.7-cp314-cp314t-win32.whl", hash = "sha256:fdd1736fed309b4300346f88f74cd120c27c56852c3838cab416e7a166f67298", size = 3002227, upload-time = "2026-04-08T01:57:06.91Z" }, + { url = "https://files.pythonhosted.org/packages/32/a8/9f0e4ed57ec9cebe506e58db11ae472972ecb0c659e4d52bbaee80ca340a/cryptography-46.0.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e06acf3c99be55aa3b516397fe42f5855597f430add9c17fa46bf2e0fb34c9bb", size = 3475332, upload-time = "2026-04-08T01:57:08.807Z" }, + { url = "https://files.pythonhosted.org/packages/a7/7f/cd42fc3614386bc0c12f0cb3c4ae1fc2bbca5c9662dfed031514911d513d/cryptography-46.0.7-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:462ad5cb1c148a22b2e3bcc5ad52504dff325d17daf5df8d88c17dda1f75f2a4", size = 7165618, upload-time = "2026-04-08T01:57:10.645Z" }, + { url = "https://files.pythonhosted.org/packages/a5/d0/36a49f0262d2319139d2829f773f1b97ef8aef7f97e6e5bd21455e5a8fb5/cryptography-46.0.7-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:84d4cced91f0f159a7ddacad249cc077e63195c36aac40b4150e7a57e84fffe7", size = 4270628, upload-time = "2026-04-08T01:57:12.885Z" }, + { url = "https://files.pythonhosted.org/packages/8a/6c/1a42450f464dda6ffbe578a911f773e54dd48c10f9895a23a7e88b3e7db5/cryptography-46.0.7-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:128c5edfe5e5938b86b03941e94fac9ee793a94452ad1365c9fc3f4f62216832", size = 4415405, upload-time = "2026-04-08T01:57:14.923Z" }, + { url = "https://files.pythonhosted.org/packages/9a/92/4ed714dbe93a066dc1f4b4581a464d2d7dbec9046f7c8b7016f5286329e2/cryptography-46.0.7-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5e51be372b26ef4ba3de3c167cd3d1022934bc838ae9eaad7e644986d2a3d163", size = 4272715, upload-time = "2026-04-08T01:57:16.638Z" }, + { url = "https://files.pythonhosted.org/packages/b7/e6/a26b84096eddd51494bba19111f8fffe976f6a09f132706f8f1bf03f51f7/cryptography-46.0.7-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cdf1a610ef82abb396451862739e3fc93b071c844399e15b90726ef7470eeaf2", size = 4918400, upload-time = "2026-04-08T01:57:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/c7/08/ffd537b605568a148543ac3c2b239708ae0bd635064bab41359252ef88ed/cryptography-46.0.7-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1d25aee46d0c6f1a501adcddb2d2fee4b979381346a78558ed13e50aa8a59067", size = 4450634, upload-time = "2026-04-08T01:57:21.185Z" }, + { url = "https://files.pythonhosted.org/packages/16/01/0cd51dd86ab5b9befe0d031e276510491976c3a80e9f6e31810cce46c4ad/cryptography-46.0.7-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:cdfbe22376065ffcf8be74dc9a909f032df19bc58a699456a21712d6e5eabfd0", size = 3985233, upload-time = "2026-04-08T01:57:22.862Z" }, + { url = "https://files.pythonhosted.org/packages/92/49/819d6ed3a7d9349c2939f81b500a738cb733ab62fbecdbc1e38e83d45e12/cryptography-46.0.7-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:abad9dac36cbf55de6eb49badd4016806b3165d396f64925bf2999bcb67837ba", size = 4271955, upload-time = "2026-04-08T01:57:24.814Z" }, + { url = "https://files.pythonhosted.org/packages/80/07/ad9b3c56ebb95ed2473d46df0847357e01583f4c52a85754d1a55e29e4d0/cryptography-46.0.7-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:935ce7e3cfdb53e3536119a542b839bb94ec1ad081013e9ab9b7cfd478b05006", size = 4879888, upload-time = "2026-04-08T01:57:26.88Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c7/201d3d58f30c4c2bdbe9b03844c291feb77c20511cc3586daf7edc12a47b/cryptography-46.0.7-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:35719dc79d4730d30f1c2b6474bd6acda36ae2dfae1e3c16f2051f215df33ce0", size = 4449961, upload-time = "2026-04-08T01:57:29.068Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ef/649750cbf96f3033c3c976e112265c33906f8e462291a33d77f90356548c/cryptography-46.0.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7bbc6ccf49d05ac8f7d7b5e2e2c33830d4fe2061def88210a126d130d7f71a85", size = 4401696, upload-time = "2026-04-08T01:57:31.029Z" }, + { url = "https://files.pythonhosted.org/packages/41/52/a8908dcb1a389a459a29008c29966c1d552588d4ae6d43f3a1a4512e0ebe/cryptography-46.0.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a1529d614f44b863a7b480c6d000fe93b59acee9c82ffa027cfadc77521a9f5e", size = 4664256, upload-time = "2026-04-08T01:57:33.144Z" }, + { url = "https://files.pythonhosted.org/packages/4b/fa/f0ab06238e899cc3fb332623f337a7364f36f4bb3f2534c2bb95a35b132c/cryptography-46.0.7-cp38-abi3-win32.whl", hash = "sha256:f247c8c1a1fb45e12586afbb436ef21ff1e80670b2861a90353d9b025583d246", size = 3013001, upload-time = "2026-04-08T01:57:34.933Z" }, + { url = "https://files.pythonhosted.org/packages/d2/f1/00ce3bde3ca542d1acd8f8cfa38e446840945aa6363f9b74746394b14127/cryptography-46.0.7-cp38-abi3-win_amd64.whl", hash = "sha256:506c4ff91eff4f82bdac7633318a526b1d1309fc07ca76a3ad182cb5b686d6d3", size = 3472985, upload-time = "2026-04-08T01:57:36.714Z" }, + { url = "https://files.pythonhosted.org/packages/63/0c/dca8abb64e7ca4f6b2978769f6fea5ad06686a190cec381f0a796fdcaaba/cryptography-46.0.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:fc9ab8856ae6cf7c9358430e49b368f3108f050031442eaeb6b9d87e4dcf4e4f", size = 3476879, upload-time = "2026-04-08T01:57:38.664Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ea/075aac6a84b7c271578d81a2f9968acb6e273002408729f2ddff517fed4a/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d3b99c535a9de0adced13d159c5a9cf65c325601aa30f4be08afd680643e9c15", size = 4219700, upload-time = "2026-04-08T01:57:40.625Z" }, + { url = "https://files.pythonhosted.org/packages/6c/7b/1c55db7242b5e5612b29fc7a630e91ee7a6e3c8e7bf5406d22e206875fbd/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d02c738dacda7dc2a74d1b2b3177042009d5cab7c7079db74afc19e56ca1b455", size = 4385982, upload-time = "2026-04-08T01:57:42.725Z" }, + { url = "https://files.pythonhosted.org/packages/cb/da/9870eec4b69c63ef5925bf7d8342b7e13bc2ee3d47791461c4e49ca212f4/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:04959522f938493042d595a736e7dbdff6eb6cc2339c11465b3ff89343b65f65", size = 4219115, upload-time = "2026-04-08T01:57:44.939Z" }, + { url = "https://files.pythonhosted.org/packages/f4/72/05aa5832b82dd341969e9a734d1812a6aadb088d9eb6f0430fc337cc5a8f/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:3986ac1dee6def53797289999eabe84798ad7817f3e97779b5061a95b0ee4968", size = 4385479, upload-time = "2026-04-08T01:57:46.86Z" }, + { url = "https://files.pythonhosted.org/packages/20/2a/1b016902351a523aa2bd446b50a5bc1175d7a7d1cf90fe2ef904f9b84ebc/cryptography-46.0.7-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:258514877e15963bd43b558917bc9f54cf7cf866c38aa576ebf47a77ddbc43a4", size = 3412829, upload-time = "2026-04-08T01:57:48.874Z" }, ] [[package]] @@ -1085,18 +1082,18 @@ dependencies = [ { name = "cuda-pathfinder" }, ] wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/1a/fe/7351d7e586a8b4c9f89731bfe4cf0148223e8f9903ff09571f78b3fb0682/cuda_bindings-13.2.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08b395f79cb89ce0cd8effff07c4a1e20101b873c256a1aeb286e8fd7bd0f556", upload-time = "2026-03-11T00:12:29.798Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/ef/184aa775e970fc089942cd9ec6302e6e44679d4c14549c6a7ea45bf7f798/cuda_bindings-13.2.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6f3682ec3c4769326aafc67c2ba669d97d688d0b7e63e659d36d2f8b72f32d6", upload-time = "2026-03-11T00:12:32.319Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/a9/3a8241c6e19483ac1f1dcf5c10238205dcb8a6e9d0d4d4709240dff28ff4/cuda_bindings-13.2.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:721104c603f059780d287969be3d194a18d0cc3b713ed9049065a1107706759d", upload-time = "2026-03-11T00:12:37.18Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e9/94/2748597f47bb1600cd466b20cab4159f1530a3a33fe7f70fee199b3abb9e/cuda_bindings-13.2.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1eba9504ac70667dd48313395fe05157518fd6371b532790e96fbb31bbb5a5e1", upload-time = "2026-03-11T00:12:39.462Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/52/c8/b2589d68acf7e3d63e2be330b84bc25712e97ed799affbca7edd7eae25d6/cuda_bindings-13.2.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e865447abfb83d6a98ad5130ed3c70b1fc295ae3eeee39fd07b4ddb0671b6788", upload-time = "2026-03-11T00:12:44.041Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/92/f899f7bbb5617bb65ec52a6eac1e9a1447a86b916c4194f8a5001b8cde0c/cuda_bindings-13.2.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:46d8776a55d6d5da9dd6e9858fba2efcda2abe6743871dee47dd06eb8cb6d955", upload-time = "2026-03-11T00:12:45.939Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/93/eef988860a3ca985f82c4f3174fc0cdd94e07331ba9a92e8e064c260337f/cuda_bindings-13.2.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6629ca2df6f795b784752409bcaedbd22a7a651b74b56a165ebc0c9dcbd504d0", upload-time = "2026-03-11T00:12:50.337Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/23/6db3aba46864aee357ab2415135b3fe3da7e9f1fa0221fa2a86a5968099c/cuda_bindings-13.2.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7dca0da053d3b4cc4869eff49c61c03f3c5dbaa0bcd712317a358d5b8f3f385d", upload-time = "2026-03-11T00:12:52.374Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/87/87a014f045b77c6de5c8527b0757fe644417b184e5367db977236a141602/cuda_bindings-13.2.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6464b30f46692d6c7f65d4a0e0450d81dd29de3afc1bb515653973d01c2cd6e", upload-time = "2026-03-11T00:12:56.371Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ee/5e/c0fe77a73aaefd3fff25ffaccaac69c5a63eafdf8b9a4c476626ef0ac703/cuda_bindings-13.2.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4af9f3e1be603fa12d5ad6cfca7844c9d230befa9792b5abdf7dd79979c3626", upload-time = "2026-03-11T00:12:58.965Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/58/ed2c3b39c8dd5f96aa7a4abef0d47a73932c7a988e30f5fa428f00ed0da1/cuda_bindings-13.2.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df850a1ff8ce1b3385257b08e47b70e959932f5f432d0a4e46a355962b4e4771", upload-time = "2026-03-11T00:13:04.063Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/01/0c941b112ceeb21439b05895eace78ca1aa2eaaf695c8521a068fd9b4c00/cuda_bindings-13.2.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8a16384c6494e5485f39314b0b4afb04bee48d49edb16d5d8593fd35bbd231b", upload-time = "2026-03-11T00:13:06.003Z" }, + { url = "https://files.pythonhosted.org/packages/1a/fe/7351d7e586a8b4c9f89731bfe4cf0148223e8f9903ff09571f78b3fb0682/cuda_bindings-13.2.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08b395f79cb89ce0cd8effff07c4a1e20101b873c256a1aeb286e8fd7bd0f556", size = 5744254, upload-time = "2026-03-11T00:12:29.798Z" }, + { url = "https://files.pythonhosted.org/packages/aa/ef/184aa775e970fc089942cd9ec6302e6e44679d4c14549c6a7ea45bf7f798/cuda_bindings-13.2.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6f3682ec3c4769326aafc67c2ba669d97d688d0b7e63e659d36d2f8b72f32d6", size = 6329075, upload-time = "2026-03-11T00:12:32.319Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a9/3a8241c6e19483ac1f1dcf5c10238205dcb8a6e9d0d4d4709240dff28ff4/cuda_bindings-13.2.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:721104c603f059780d287969be3d194a18d0cc3b713ed9049065a1107706759d", size = 5730273, upload-time = "2026-03-11T00:12:37.18Z" }, + { url = "https://files.pythonhosted.org/packages/e9/94/2748597f47bb1600cd466b20cab4159f1530a3a33fe7f70fee199b3abb9e/cuda_bindings-13.2.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1eba9504ac70667dd48313395fe05157518fd6371b532790e96fbb31bbb5a5e1", size = 6313924, upload-time = "2026-03-11T00:12:39.462Z" }, + { url = "https://files.pythonhosted.org/packages/52/c8/b2589d68acf7e3d63e2be330b84bc25712e97ed799affbca7edd7eae25d6/cuda_bindings-13.2.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e865447abfb83d6a98ad5130ed3c70b1fc295ae3eeee39fd07b4ddb0671b6788", size = 5722404, upload-time = "2026-03-11T00:12:44.041Z" }, + { url = "https://files.pythonhosted.org/packages/1f/92/f899f7bbb5617bb65ec52a6eac1e9a1447a86b916c4194f8a5001b8cde0c/cuda_bindings-13.2.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:46d8776a55d6d5da9dd6e9858fba2efcda2abe6743871dee47dd06eb8cb6d955", size = 6320619, upload-time = "2026-03-11T00:12:45.939Z" }, + { url = "https://files.pythonhosted.org/packages/df/93/eef988860a3ca985f82c4f3174fc0cdd94e07331ba9a92e8e064c260337f/cuda_bindings-13.2.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6629ca2df6f795b784752409bcaedbd22a7a651b74b56a165ebc0c9dcbd504d0", size = 5614610, upload-time = "2026-03-11T00:12:50.337Z" }, + { url = "https://files.pythonhosted.org/packages/18/23/6db3aba46864aee357ab2415135b3fe3da7e9f1fa0221fa2a86a5968099c/cuda_bindings-13.2.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7dca0da053d3b4cc4869eff49c61c03f3c5dbaa0bcd712317a358d5b8f3f385d", size = 6149914, upload-time = "2026-03-11T00:12:52.374Z" }, + { url = "https://files.pythonhosted.org/packages/c0/87/87a014f045b77c6de5c8527b0757fe644417b184e5367db977236a141602/cuda_bindings-13.2.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6464b30f46692d6c7f65d4a0e0450d81dd29de3afc1bb515653973d01c2cd6e", size = 5685673, upload-time = "2026-03-11T00:12:56.371Z" }, + { url = "https://files.pythonhosted.org/packages/ee/5e/c0fe77a73aaefd3fff25ffaccaac69c5a63eafdf8b9a4c476626ef0ac703/cuda_bindings-13.2.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4af9f3e1be603fa12d5ad6cfca7844c9d230befa9792b5abdf7dd79979c3626", size = 6191386, upload-time = "2026-03-11T00:12:58.965Z" }, + { url = "https://files.pythonhosted.org/packages/5f/58/ed2c3b39c8dd5f96aa7a4abef0d47a73932c7a988e30f5fa428f00ed0da1/cuda_bindings-13.2.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df850a1ff8ce1b3385257b08e47b70e959932f5f432d0a4e46a355962b4e4771", size = 5507469, upload-time = "2026-03-11T00:13:04.063Z" }, + { url = "https://files.pythonhosted.org/packages/1f/01/0c941b112ceeb21439b05895eace78ca1aa2eaaf695c8521a068fd9b4c00/cuda_bindings-13.2.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8a16384c6494e5485f39314b0b4afb04bee48d49edb16d5d8593fd35bbd231b", size = 6059693, upload-time = "2026-03-11T00:13:06.003Z" }, ] [[package]] @@ -1104,7 +1101,7 @@ name = "cuda-pathfinder" version = "1.5.4" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/11/d0/c177e29701cf1d3008d7d2b16b5fc626592ce13bd535f8795c5f57187e0e/cuda_pathfinder-1.5.4-py3-none-any.whl", hash = "sha256:9563d3175ce1828531acf4b94e1c1c7d67208c347ca002493e2654878b26f4b7", upload-time = "2026-04-27T22:42:07.712Z" }, + { url = "https://files.pythonhosted.org/packages/11/d0/c177e29701cf1d3008d7d2b16b5fc626592ce13bd535f8795c5f57187e0e/cuda_pathfinder-1.5.4-py3-none-any.whl", hash = "sha256:9563d3175ce1828531acf4b94e1c1c7d67208c347ca002493e2654878b26f4b7", size = 51657, upload-time = "2026-04-27T22:42:07.712Z" }, ] [[package]] @@ -1112,7 +1109,7 @@ name = "cuda-toolkit" version = "13.0.2" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/57/b2/453099f5f3b698d7d0eab38916aac44c7f76229f451709e2eb9db6615dcd/cuda_toolkit-13.0.2-py2.py3-none-any.whl", hash = "sha256:b198824cf2f54003f50d64ada3a0f184b42ca0846c1c94192fa269ecd97a66eb", upload-time = "2025-12-19T23:24:07.328Z" }, + { url = "https://files.pythonhosted.org/packages/57/b2/453099f5f3b698d7d0eab38916aac44c7f76229f451709e2eb9db6615dcd/cuda_toolkit-13.0.2-py2.py3-none-any.whl", hash = "sha256:b198824cf2f54003f50d64ada3a0f184b42ca0846c1c94192fa269ecd97a66eb", size = 2364, upload-time = "2025-12-19T23:24:07.328Z" }, ] [package.optional-dependencies] @@ -1154,9 +1151,9 @@ nvtx = [ name = "cycler" version = "0.12.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", upload-time = "2023-10-07T05:32:18.335Z" } +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://pypi-proxy.dev.databricks.com/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", upload-time = "2023-10-07T05:32:16.783Z" }, + { 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]] @@ -1170,9 +1167,9 @@ dependencies = [ { name = "sortedcontainers" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/21/0d/64f02d3fd9c116d6f50a540d04d1e4f2e3c487f5062d2db53733ddb25917/cyclonedx_python_lib-11.7.0.tar.gz", hash = "sha256:fb1bc3dedfa31208444dbd743007f478ab6984010a184e5bd466bffd969e936e", upload-time = "2026-03-17T15:19:16.606Z" } +sdist = { url = "https://files.pythonhosted.org/packages/21/0d/64f02d3fd9c116d6f50a540d04d1e4f2e3c487f5062d2db53733ddb25917/cyclonedx_python_lib-11.7.0.tar.gz", hash = "sha256:fb1bc3dedfa31208444dbd743007f478ab6984010a184e5bd466bffd969e936e", size = 1411174, upload-time = "2026-03-17T15:19:16.606Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/30/09/fe0e3bc32bd33707c519b102fc064ad2a2ce5a1b53e2be38b86936b476b1/cyclonedx_python_lib-11.7.0-py3-none-any.whl", hash = "sha256:02fa4f15ddbba21ac9093039f8137c0d1813af7fe88b760c5dcd3311a8da2178", upload-time = "2026-03-17T15:19:14.369Z" }, + { url = "https://files.pythonhosted.org/packages/30/09/fe0e3bc32bd33707c519b102fc064ad2a2ce5a1b53e2be38b86936b476b1/cyclonedx_python_lib-11.7.0-py3-none-any.whl", hash = "sha256:02fa4f15ddbba21ac9093039f8137c0d1813af7fe88b760c5dcd3311a8da2178", size = 513041, upload-time = "2026-03-17T15:19:14.369Z" }, ] [[package]] @@ -1187,9 +1184,9 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/34/07/bf61d13de86d96a4c46aff00c9ca0eced44bcc8c3e16280605c1253e5720/cyclopts-4.16.1.tar.gz", hash = "sha256:8aa47bf92a5fb33abca5af05e576eecdb0d2f79893ad29238046df78370fc4a8", upload-time = "2026-05-25T15:29:08.518Z" } +sdist = { url = "https://files.pythonhosted.org/packages/34/07/bf61d13de86d96a4c46aff00c9ca0eced44bcc8c3e16280605c1253e5720/cyclopts-4.16.1.tar.gz", hash = "sha256:8aa47bf92a5fb33abca5af05e576eecdb0d2f79893ad29238046df78370fc4a8", size = 181196, upload-time = "2026-05-25T15:29:08.518Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/00/8d/7f362c2fb8ef4decd2160bc24d4292c6ca658cc6d9a161b89ca5122bbdbf/cyclopts-4.16.1-py3-none-any.whl", hash = "sha256:617795392c4113a2c2cc7af716f20244900e87f23daa05442d1268d81472a592", upload-time = "2026-05-25T15:29:09.646Z" }, + { url = "https://files.pythonhosted.org/packages/00/8d/7f362c2fb8ef4decd2160bc24d4292c6ca658cc6d9a161b89ca5122bbdbf/cyclopts-4.16.1-py3-none-any.whl", hash = "sha256:617795392c4113a2c2cc7af716f20244900e87f23daa05442d1268d81472a592", size = 219020, upload-time = "2026-05-25T15:29:09.646Z" }, ] [[package]] @@ -1201,9 +1198,9 @@ dependencies = [ { name = "protobuf" }, { name = "requests" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/91/ae/dbc1a08b969e48a63e1df2be535caecb16c9eaefd03277065ee1aa2aaf3c/databricks_sdk-0.82.0.tar.gz", hash = "sha256:148399cb0d15d63000e2db2a2a354b3640494cb0ed78e939d3e99a676c3f7ec0", upload-time = "2026-01-29T12:48:30.479Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/ae/dbc1a08b969e48a63e1df2be535caecb16c9eaefd03277065ee1aa2aaf3c/databricks_sdk-0.82.0.tar.gz", hash = "sha256:148399cb0d15d63000e2db2a2a354b3640494cb0ed78e939d3e99a676c3f7ec0", size = 838560, upload-time = "2026-01-29T12:48:30.479Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/81/0f/f1e2c17c4e5d37eb0135bbc816c9e77d39d34365d8e3a5bf699a9efc39ea/databricks_sdk-0.82.0-py3-none-any.whl", hash = "sha256:927fc575d3019be910839bceba332e7252a0d4e588df64c47e44dd416bd561c8", upload-time = "2026-01-29T12:48:28.369Z" }, + { url = "https://files.pythonhosted.org/packages/81/0f/f1e2c17c4e5d37eb0135bbc816c9e77d39d34365d8e3a5bf699a9efc39ea/databricks_sdk-0.82.0-py3-none-any.whl", hash = "sha256:927fc575d3019be910839bceba332e7252a0d4e588df64c47e44dd416bd561c8", size = 789223, upload-time = "2026-01-29T12:48:28.369Z" }, ] [[package]] @@ -1222,27 +1219,27 @@ dependencies = [ { name = "thrift" }, { name = "urllib3" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/1b/b0/e2d573b8f27212699e651aa3c4fcef49046ba712fe025faffc1e5f022db4/databricks_sql_connector-4.2.3.tar.gz", hash = "sha256:01ebeeaaa85a84bc3910e3fd1ddf969c56ce0e5f825dc84881a65d16eaa681b6", upload-time = "2025-12-18T19:41:38.481Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/b0/e2d573b8f27212699e651aa3c4fcef49046ba712fe025faffc1e5f022db4/databricks_sql_connector-4.2.3.tar.gz", hash = "sha256:01ebeeaaa85a84bc3910e3fd1ddf969c56ce0e5f825dc84881a65d16eaa681b6", size = 186274, upload-time = "2025-12-18T19:41:38.481Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/f7/70/db8dfef0fbd0af5bb74d04126a53ae1ed06d3d350f863d97efab229675a5/databricks_sql_connector-4.2.3-py3-none-any.whl", hash = "sha256:0baa351c46a05f81722bef32f8a1de6a5aee86490ee8ec67254370dcd36e9e10", upload-time = "2025-12-18T19:41:37.058Z" }, + { url = "https://files.pythonhosted.org/packages/f7/70/db8dfef0fbd0af5bb74d04126a53ae1ed06d3d350f863d97efab229675a5/databricks_sql_connector-4.2.3-py3-none-any.whl", hash = "sha256:0baa351c46a05f81722bef32f8a1de6a5aee86490ee8ec67254370dcd36e9e10", size = 212344, upload-time = "2025-12-18T19:41:37.058Z" }, ] [[package]] name = "defusedxml" version = "0.7.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", upload-time = "2021-03-08T10:59:26.269Z" } +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://pypi-proxy.dev.databricks.com/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", upload-time = "2021-03-08T10:59:24.45Z" }, + { 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 = "dnspython" version = "2.8.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", upload-time = "2025-09-07T18:58:00.022Z" } +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://pypi-proxy.dev.databricks.com/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", upload-time = "2025-09-07T18:57:58.071Z" }, + { 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]] @@ -1254,18 +1251,18 @@ dependencies = [ { name = "requests" }, { name = "urllib3" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", upload-time = "2024-05-23T11:13:57.216Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/9b/4a2ea29aeba62471211598dac5d96825bb49348fa07e906ea930394a83ce/docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c", size = 117834, upload-time = "2024-05-23T11:13:57.216Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", upload-time = "2024-05-23T11:13:55.01Z" }, + { url = "https://files.pythonhosted.org/packages/e3/26/57c6fb270950d476074c087527a558ccb6f4436657314bfb6cdf484114c4/docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0", size = 147774, upload-time = "2024-05-23T11:13:55.01Z" }, ] [[package]] name = "docstring-parser" version = "0.18.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/e0/4d/f332313098c1de1b2d2ff91cf2674415cc7cddab2ca1b01ae29774bd5fdf/docstring_parser-0.18.0.tar.gz", hash = "sha256:292510982205c12b1248696f44959db3cdd1740237a968ea1e2e7a900eeb2015", upload-time = "2026-04-14T04:09:19.867Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/4d/f332313098c1de1b2d2ff91cf2674415cc7cddab2ca1b01ae29774bd5fdf/docstring_parser-0.18.0.tar.gz", hash = "sha256:292510982205c12b1248696f44959db3cdd1740237a968ea1e2e7a900eeb2015", size = 29341, upload-time = "2026-04-14T04:09:19.867Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/5f/ed01f9a3cdffbd5a008556fc7b2a08ddb1cc6ace7effa7340604b1d16699/docstring_parser-0.18.0-py3-none-any.whl", hash = "sha256:b3fcbed555c47d8479be0796ef7e19c2670d428d72e96da63f3a40122860374b", upload-time = "2026-04-14T04:09:18.638Z" }, + { url = "https://files.pythonhosted.org/packages/a7/5f/ed01f9a3cdffbd5a008556fc7b2a08ddb1cc6ace7effa7340604b1d16699/docstring_parser-0.18.0-py3-none-any.whl", hash = "sha256:b3fcbed555c47d8479be0796ef7e19c2670d428d72e96da63f3a40122860374b", size = 22484, upload-time = "2026-04-14T04:09:18.638Z" }, ] [[package]] @@ -1275,9 +1272,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } resolution-markers = [ "python_full_version < '3.11'", ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", upload-time = "2024-04-23T18:57:18.24Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/ed/aefcc8cd0ba62a0560c3c18c33925362d46c6075480bfa4df87b28e169a9/docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f", size = 2204444, upload-time = "2024-04-23T18:57:18.24Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", upload-time = "2024-04-23T18:57:14.835Z" }, + { url = "https://files.pythonhosted.org/packages/8f/d7/9322c609343d929e75e7e5e6255e614fcc67572cfd083959cdef3b7aad79/docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2", size = 587408, upload-time = "2024-04-23T18:57:14.835Z" }, ] [[package]] @@ -1291,9 +1288,9 @@ resolution-markers = [ "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", upload-time = "2025-12-18T19:00:26.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", size = 2291750, upload-time = "2025-12-18T19:00:26.443Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", upload-time = "2025-12-18T19:00:18.077Z" }, + { url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, ] [[package]] @@ -1304,18 +1301,18 @@ dependencies = [ { name = "dnspython" }, { name = "idna" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", upload-time = "2025-08-26T13:09:06.831Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", size = 51238, upload-time = "2025-08-26T13:09:06.831Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", upload-time = "2025-08-26T13:09:05.858Z" }, + { url = "https://files.pythonhosted.org/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", size = 35604, upload-time = "2025-08-26T13:09:05.858Z" }, ] [[package]] name = "et-xmlfile" version = "2.0.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", upload-time = "2024-10-25T17:25:40.039Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/38/af70d7ab1ae9d4da450eeec1fa3918940a5fafb9055e934af8d6eb0c2313/et_xmlfile-2.0.0.tar.gz", hash = "sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54", size = 17234, upload-time = "2024-10-25T17:25:40.039Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", upload-time = "2024-10-25T17:25:39.051Z" }, + { url = "https://files.pythonhosted.org/packages/c1/8b/5fe2cc11fee489817272089c4203e679c63b570a5aaeb18d852ae3cbba6a/et_xmlfile-2.0.0-py3-none-any.whl", hash = "sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa", size = 18059, upload-time = "2024-10-25T17:25:39.051Z" }, ] [[package]] @@ -1325,9 +1322,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", upload-time = "2025-11-21T23:01:54.787Z" } +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://pypi-proxy.dev.databricks.com/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", upload-time = "2025-11-21T23:01:53.443Z" }, + { 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]] @@ -1341,9 +1338,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/81/2d/ff8d91d7b564d464629a0fd50a4489c97fcb836ac230bf3a7269232a9b1f/fastapi-0.136.3.tar.gz", hash = "sha256:e487fae93ad408e6f47641ee4dfe389864fd7bec92e547ea8498fc13f43e83ab", upload-time = "2026-05-23T18:53:15.192Z" } +sdist = { url = "https://files.pythonhosted.org/packages/81/2d/ff8d91d7b564d464629a0fd50a4489c97fcb836ac230bf3a7269232a9b1f/fastapi-0.136.3.tar.gz", hash = "sha256:e487fae93ad408e6f47641ee4dfe389864fd7bec92e547ea8498fc13f43e83ab", size = 396410, upload-time = "2026-05-23T18:53:15.192Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/82/45359b62a067409bd929ae8a56b8ed13e5a8c8a61194b3c236920999ab83/fastapi-0.136.3-py3-none-any.whl", hash = "sha256:3d2a69bdf04b7e9f3afa292c3bc7a98816bbfafa10bc9b45f3f3700d2f761620", upload-time = "2026-05-23T18:53:16.924Z" }, + { url = "https://files.pythonhosted.org/packages/e0/82/45359b62a067409bd929ae8a56b8ed13e5a8c8a61194b3c236920999ab83/fastapi-0.136.3-py3-none-any.whl", hash = "sha256:3d2a69bdf04b7e9f3afa292c3bc7a98816bbfafa10bc9b45f3f3700d2f761620", size = 117481, upload-time = "2026-05-23T18:53:16.924Z" }, ] [[package]] @@ -1353,9 +1350,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "fastmcp-slim", extra = ["client", "server"] }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/3b/a9/5c5a01b6abd5346bf60b97cfd29e4a86661940c27dd562bfcda07fd03519/fastmcp-3.3.1.tar.gz", hash = "sha256:979362ea557de42a5f40342563c7e4b236bcc8e7cd192715f50030695d1a71cd", upload-time = "2026-05-15T15:50:39.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/a9/5c5a01b6abd5346bf60b97cfd29e4a86661940c27dd562bfcda07fd03519/fastmcp-3.3.1.tar.gz", hash = "sha256:979362ea557de42a5f40342563c7e4b236bcc8e7cd192715f50030695d1a71cd", size = 28681699, upload-time = "2026-05-15T15:50:39.673Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/11/6b1bdada6ccfe647d615ae63f9106f8136aec17971e9361546af01c7d38e/fastmcp-3.3.1-py3-none-any.whl", hash = "sha256:862440c5c4d281363a5995eee59d77f0f7cac1f18869038729cecf03b02fc522", upload-time = "2026-05-15T15:50:36.424Z" }, + { url = "https://files.pythonhosted.org/packages/9f/11/6b1bdada6ccfe647d615ae63f9106f8136aec17971e9361546af01c7d38e/fastmcp-3.3.1-py3-none-any.whl", hash = "sha256:862440c5c4d281363a5995eee59d77f0f7cac1f18869038729cecf03b02fc522", size = 7903, upload-time = "2026-05-15T15:50:36.424Z" }, ] [[package]] @@ -1370,9 +1367,9 @@ dependencies = [ { name = "rich" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/d1/a0/627103e517e1d0d6f1eec633d5662d13e776f01b45ad188e4f5f7478b438/fastmcp_slim-3.3.1.tar.gz", hash = "sha256:0957835fc59452e143ab2f4b7836d2d2df9b2d9958408edc79ba8b56232b2a88", upload-time = "2026-05-15T15:50:10.426Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/a0/627103e517e1d0d6f1eec633d5662d13e776f01b45ad188e4f5f7478b438/fastmcp_slim-3.3.1.tar.gz", hash = "sha256:0957835fc59452e143ab2f4b7836d2d2df9b2d9958408edc79ba8b56232b2a88", size = 567007, upload-time = "2026-05-15T15:50:10.426Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/ee/97047f4cc2d7b1d46670d08d8ad01a96e7a748cc01c0b4b351ad8eddbc7a/fastmcp_slim-3.3.1-py3-none-any.whl", hash = "sha256:6cf1c2d77e3adb0d409d6825ed6b0b2a999062973e00b8eea03bd48bf9b4c043", upload-time = "2026-05-15T15:50:08.336Z" }, + { url = "https://files.pythonhosted.org/packages/7a/ee/97047f4cc2d7b1d46670d08d8ad01a96e7a748cc01c0b4b351ad8eddbc7a/fastmcp_slim-3.3.1-py3-none-any.whl", hash = "sha256:6cf1c2d77e3adb0d409d6825ed6b0b2a999062973e00b8eea03bd48bf9b4c043", size = 738644, upload-time = "2026-05-15T15:50:08.336Z" }, ] [package.optional-dependencies] @@ -1410,9 +1407,9 @@ server = [ name = "filelock" version = "3.29.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b5/fe/997687a931ab51049acce6fa1f23e8f01216374ea81374ddee763c493db5/filelock-3.29.0.tar.gz", hash = "sha256:69974355e960702e789734cb4871f884ea6fe50bd8404051a3530bc07809cf90", upload-time = "2026-04-19T15:39:10.068Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/fe/997687a931ab51049acce6fa1f23e8f01216374ea81374ddee763c493db5/filelock-3.29.0.tar.gz", hash = "sha256:69974355e960702e789734cb4871f884ea6fe50bd8404051a3530bc07809cf90", size = 57571, upload-time = "2026-04-19T15:39:10.068Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/81/47/dd9a212ef6e343a6857485ffe25bba537304f1913bdbed446a23f7f592e1/filelock-3.29.0-py3-none-any.whl", hash = "sha256:96f5f6344709aa1572bbf631c640e4ebeeb519e08da902c39a001882f30ac258", upload-time = "2026-04-19T15:39:08.752Z" }, + { url = "https://files.pythonhosted.org/packages/81/47/dd9a212ef6e343a6857485ffe25bba537304f1913bdbed446a23f7f592e1/filelock-3.29.0-py3-none-any.whl", hash = "sha256:96f5f6344709aa1572bbf631c640e4ebeeb519e08da902c39a001882f30ac258", size = 39812, upload-time = "2026-04-19T15:39:08.752Z" }, ] [[package]] @@ -1424,9 +1421,9 @@ dependencies = [ { name = "pycodestyle" }, { name = "pyflakes" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/9b/af/fbfe3c4b5a657d79e5c47a2827a362f9e1b763336a52f926126aa6dc7123/flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872", upload-time = "2025-06-20T19:31:35.838Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9b/af/fbfe3c4b5a657d79e5c47a2827a362f9e1b763336a52f926126aa6dc7123/flake8-7.3.0.tar.gz", hash = "sha256:fe044858146b9fc69b551a4b490d69cf960fcb78ad1edcb84e7fbb1b4a8e3872", size = 48326, upload-time = "2025-06-20T19:31:35.838Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e", upload-time = "2025-06-20T19:31:34.425Z" }, + { url = "https://files.pythonhosted.org/packages/9f/56/13ab06b4f93ca7cac71078fbe37fcea175d3216f31f85c3168a6bbd0bb9a/flake8-7.3.0-py2.py3-none-any.whl", hash = "sha256:b9696257b9ce8beb888cdbe31cf885c90d31928fe202be0889a7cdafad32f01e", size = 57922, upload-time = "2025-06-20T19:31:34.425Z" }, ] [[package]] @@ -1441,9 +1438,9 @@ dependencies = [ { name = "markupsafe" }, { name = "werkzeug" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/26/00/35d85dcce6c57fdc871f3867d465d780f302a175ea360f62533f12b27e2b/flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb", upload-time = "2026-02-19T05:00:57.678Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/00/35d85dcce6c57fdc871f3867d465d780f302a175ea360f62533f12b27e2b/flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb", size = 759004, upload-time = "2026-02-19T05:00:57.678Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/7f/9c/34f6962f9b9e9c71f6e5ed806e0d0ff03c9d1b0b2340088a0cf4bce09b18/flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c", upload-time = "2026-02-19T05:00:56.027Z" }, + { url = "https://files.pythonhosted.org/packages/7f/9c/34f6962f9b9e9c71f6e5ed806e0d0ff03c9d1b0b2340088a0cf4bce09b18/flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c", size = 103424, upload-time = "2026-02-19T05:00:56.027Z" }, ] [[package]] @@ -1454,196 +1451,196 @@ dependencies = [ { name = "flask" }, { name = "werkzeug" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/70/74/0fc0fa68d62f21daef41017dafab19ef4b36551521260987eb3a5394c7ba/flask_cors-6.0.2.tar.gz", hash = "sha256:6e118f3698249ae33e429760db98ce032a8bf9913638d085ca0f4c5534ad2423", upload-time = "2025-12-12T20:31:42.861Z" } +sdist = { url = "https://files.pythonhosted.org/packages/70/74/0fc0fa68d62f21daef41017dafab19ef4b36551521260987eb3a5394c7ba/flask_cors-6.0.2.tar.gz", hash = "sha256:6e118f3698249ae33e429760db98ce032a8bf9913638d085ca0f4c5534ad2423", size = 13472, upload-time = "2025-12-12T20:31:42.861Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/4f/af/72ad54402e599152de6d067324c46fe6a4f531c7c65baf7e96c63db55eaf/flask_cors-6.0.2-py3-none-any.whl", hash = "sha256:e57544d415dfd7da89a9564e1e3a9e515042df76e12130641ca6f3f2f03b699a", upload-time = "2025-12-12T20:31:41.3Z" }, + { url = "https://files.pythonhosted.org/packages/4f/af/72ad54402e599152de6d067324c46fe6a4f531c7c65baf7e96c63db55eaf/flask_cors-6.0.2-py3-none-any.whl", hash = "sha256:e57544d415dfd7da89a9564e1e3a9e515042df76e12130641ca6f3f2f03b699a", size = 13257, upload-time = "2025-12-12T20:31:41.3Z" }, ] [[package]] name = "fonttools" version = "4.61.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", upload-time = "2025-12-12T17:31:24.246Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/5b/94/8a28707adb00bed1bf22dac16ccafe60faf2ade353dcb32c3617ee917307/fonttools-4.61.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c7db70d57e5e1089a274cbb2b1fd635c9a24de809a231b154965d415d6c6d24", upload-time = "2025-12-12T17:29:27.5Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/94/93/c2e682faaa5ee92034818d8f8a8145ae73eb83619600495dcf8503fa7771/fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fe9fd43882620017add5eabb781ebfbc6998ee49b35bd7f8f79af1f9f99a958", upload-time = "2025-12-12T17:29:30.115Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/62/1748f7e7e1ee41aa52279fd2e3a6d0733dc42a673b16932bad8e5d0c8b28/fonttools-4.61.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8db08051fc9e7d8bc622f2112511b8107d8f27cd89e2f64ec45e9825e8288da", upload-time = "2025-12-12T17:29:32.535Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/69/69/4ca02ee367d2c98edcaeb83fc278d20972502ee071214ad9d8ca85e06080/fonttools-4.61.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a76d4cb80f41ba94a6691264be76435e5f72f2cb3cab0b092a6212855f71c2f6", upload-time = "2025-12-12T17:29:34.907Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8c/f5/660f9e3cefa078861a7f099107c6d203b568a6227eef163dd173bfc56bdc/fonttools-4.61.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a13fc8aeb24bad755eea8f7f9d409438eb94e82cf86b08fe77a03fbc8f6a96b1", upload-time = "2025-12-12T17:29:37.33Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/63/d1/9d7c5091d2276ed47795c131c1bf9316c3c1ab2789c22e2f59e0572ccd38/fonttools-4.61.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b846a1fcf8beadeb9ea4f44ec5bdde393e2f1569e17d700bfc49cd69bde75881", upload-time = "2025-12-12T17:29:39.781Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/2d/28def73837885ae32260d07660a052b99f0aa00454867d33745dfe49dbf0/fonttools-4.61.1-cp310-cp310-win32.whl", hash = "sha256:78a7d3ab09dc47ac1a363a493e6112d8cabed7ba7caad5f54dbe2f08676d1b47", upload-time = "2025-12-12T17:29:42.217Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/63/fa/bfdc98abb4dd2bd491033e85e3ba69a2313c850e759a6daa014bc9433b0f/fonttools-4.61.1-cp310-cp310-win_amd64.whl", hash = "sha256:eff1ac3cc66c2ac7cda1e64b4e2f3ffef474b7335f92fc3833fc632d595fcee6", upload-time = "2025-12-12T17:29:44.564Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09", upload-time = "2025-12-12T17:29:46.675Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ac/49/4138d1acb6261499bedde1c07f8c2605d1d8f9d77a151e5507fd3ef084b6/fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37", upload-time = "2025-12-12T17:29:48.769Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/fe/e6ce0fe20a40e03aef906af60aa87668696f9e4802fa283627d0b5ed777f/fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb", upload-time = "2025-12-12T17:29:51.701Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/79/61/1ca198af22f7dd22c17ab86e9024ed3c06299cfdb08170640e9996d501a0/fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9", upload-time = "2025-12-12T17:29:53.659Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/99/cc/fa1801e408586b5fce4da9f5455af8d770f4fc57391cd5da7256bb364d38/fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87", upload-time = "2025-12-12T17:29:55.592Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/aa/b7aeafe65adb1b0a925f8f25725e09f078c635bc22754f3fecb7456955b0/fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56", upload-time = "2025-12-12T17:29:57.861Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/99/f9/08ea7a38663328881384c6e7777bbefc46fd7d282adfd87a7d2b84ec9d50/fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a", upload-time = "2025-12-12T17:29:59.943Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/07/ad/37dd1ae5fa6e01612a1fbb954f0927681f282925a86e86198ccd7b15d515/fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7", upload-time = "2025-12-12T17:30:02.254Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", upload-time = "2025-12-12T17:30:04.225Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", upload-time = "2025-12-12T17:30:06.47Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796", upload-time = "2025-12-12T17:30:08.432Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", upload-time = "2025-12-12T17:30:10.56Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", upload-time = "2025-12-12T17:30:12.874Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", upload-time = "2025-12-12T17:30:15.79Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", upload-time = "2025-12-12T17:30:18.058Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", upload-time = "2025-12-12T17:30:22.862Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c", upload-time = "2025-12-12T17:30:24.938Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e", upload-time = "2025-12-12T17:30:27.343Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5", upload-time = "2025-12-12T17:30:29.771Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/8d/6fb3494dfe61a46258cd93d979cf4725ded4eb46c2a4ca35e4490d84daea/fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd", upload-time = "2025-12-12T17:30:32.073Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f7/f1/a47f1d30b3dc00d75e7af762652d4cbc3dff5c2697a0dbd5203c81afd9c3/fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3", upload-time = "2025-12-12T17:30:34.339Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/01/e6ae64a0981076e8a66906fab01539799546181e32a37a0257b77e4aa88b/fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d", upload-time = "2025-12-12T17:30:36.593Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/aa/28e40b8d6809a9b5075350a86779163f074d2b617c15d22343fce81918db/fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c", upload-time = "2025-12-12T17:30:38.478Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b", upload-time = "2025-12-12T17:30:40.951Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd", upload-time = "2025-12-12T17:30:43.511Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e", upload-time = "2025-12-12T17:30:45.681Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c", upload-time = "2025-12-12T17:30:47.709Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8a/ec/9e6b38c7ba1e09eb51db849d5450f4c05b7e78481f662c3b79dbde6f3d04/fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75", upload-time = "2025-12-12T17:30:49.656Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5e/87/b5339da8e0256734ba0dbbf5b6cdebb1dd79b01dc8c270989b7bcd465541/fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063", upload-time = "2025-12-12T17:30:51.735Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/47/e3409f1e1e69c073a3a6fd8cb886eb18c0bae0ee13db2c8d5e7f8495e8b7/fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2", upload-time = "2025-12-12T17:30:54.823Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/b6/1f6600161b1073a984294c6c031e1a56ebf95b6164249eecf30012bb2e38/fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c", upload-time = "2025-12-12T17:30:57.913Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c", upload-time = "2025-12-12T17:30:59.804Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/39/5c/908ad78e46c61c3e3ed70c3b58ff82ab48437faf84ec84f109592cabbd9f/fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa", upload-time = "2025-12-12T17:31:02.574Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bd/41/975804132c6dea64cdbfbaa59f3518a21c137a10cccf962805b301ac6ab2/fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91", upload-time = "2025-12-12T17:31:04.974Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/5a/aef2a0a8daf1ebaae4cfd83f84186d4a72ee08fd6a8451289fcd03ffa8a4/fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19", upload-time = "2025-12-12T17:31:07.456Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/33/d6db3485b645b81cea538c9d1c9219d5805f0877fda18777add4671c5240/fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba", upload-time = "2025-12-12T17:31:09.732Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6c/d6/675ba631454043c75fcf76f0ca5463eac8eb0666ea1d7badae5fea001155/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7", upload-time = "2025-12-12T17:31:11.681Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7f/33/d3ec753d547a8d2bdaedd390d4a814e8d5b45a093d558f025c6b990b554c/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118", upload-time = "2025-12-12T17:31:13.764Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b4/40/cc11f378b561a67bea850ab50063366a0d1dd3f6d0a30ce0f874b0ad5664/fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5", upload-time = "2025-12-12T17:31:16.49Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e4/ff/c9a2b66b39f8628531ea58b320d66d951267c98c6a38684daa8f50fb02f8/fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b", upload-time = "2025-12-12T17:31:18.769Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", upload-time = "2025-12-12T17:31:21.03Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/94/8a28707adb00bed1bf22dac16ccafe60faf2ade353dcb32c3617ee917307/fonttools-4.61.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c7db70d57e5e1089a274cbb2b1fd635c9a24de809a231b154965d415d6c6d24", size = 2854799, upload-time = "2025-12-12T17:29:27.5Z" }, + { url = "https://files.pythonhosted.org/packages/94/93/c2e682faaa5ee92034818d8f8a8145ae73eb83619600495dcf8503fa7771/fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fe9fd43882620017add5eabb781ebfbc6998ee49b35bd7f8f79af1f9f99a958", size = 2403032, upload-time = "2025-12-12T17:29:30.115Z" }, + { url = "https://files.pythonhosted.org/packages/f1/62/1748f7e7e1ee41aa52279fd2e3a6d0733dc42a673b16932bad8e5d0c8b28/fonttools-4.61.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8db08051fc9e7d8bc622f2112511b8107d8f27cd89e2f64ec45e9825e8288da", size = 4897863, upload-time = "2025-12-12T17:29:32.535Z" }, + { url = "https://files.pythonhosted.org/packages/69/69/4ca02ee367d2c98edcaeb83fc278d20972502ee071214ad9d8ca85e06080/fonttools-4.61.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a76d4cb80f41ba94a6691264be76435e5f72f2cb3cab0b092a6212855f71c2f6", size = 4859076, upload-time = "2025-12-12T17:29:34.907Z" }, + { url = "https://files.pythonhosted.org/packages/8c/f5/660f9e3cefa078861a7f099107c6d203b568a6227eef163dd173bfc56bdc/fonttools-4.61.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a13fc8aeb24bad755eea8f7f9d409438eb94e82cf86b08fe77a03fbc8f6a96b1", size = 4875623, upload-time = "2025-12-12T17:29:37.33Z" }, + { url = "https://files.pythonhosted.org/packages/63/d1/9d7c5091d2276ed47795c131c1bf9316c3c1ab2789c22e2f59e0572ccd38/fonttools-4.61.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b846a1fcf8beadeb9ea4f44ec5bdde393e2f1569e17d700bfc49cd69bde75881", size = 4993327, upload-time = "2025-12-12T17:29:39.781Z" }, + { url = "https://files.pythonhosted.org/packages/6f/2d/28def73837885ae32260d07660a052b99f0aa00454867d33745dfe49dbf0/fonttools-4.61.1-cp310-cp310-win32.whl", hash = "sha256:78a7d3ab09dc47ac1a363a493e6112d8cabed7ba7caad5f54dbe2f08676d1b47", size = 1502180, upload-time = "2025-12-12T17:29:42.217Z" }, + { url = "https://files.pythonhosted.org/packages/63/fa/bfdc98abb4dd2bd491033e85e3ba69a2313c850e759a6daa014bc9433b0f/fonttools-4.61.1-cp310-cp310-win_amd64.whl", hash = "sha256:eff1ac3cc66c2ac7cda1e64b4e2f3ffef474b7335f92fc3833fc632d595fcee6", size = 1550654, upload-time = "2025-12-12T17:29:44.564Z" }, + { url = "https://files.pythonhosted.org/packages/69/12/bf9f4eaa2fad039356cc627587e30ed008c03f1cebd3034376b5ee8d1d44/fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09", size = 2852213, upload-time = "2025-12-12T17:29:46.675Z" }, + { url = "https://files.pythonhosted.org/packages/ac/49/4138d1acb6261499bedde1c07f8c2605d1d8f9d77a151e5507fd3ef084b6/fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37", size = 2401689, upload-time = "2025-12-12T17:29:48.769Z" }, + { url = "https://files.pythonhosted.org/packages/e5/fe/e6ce0fe20a40e03aef906af60aa87668696f9e4802fa283627d0b5ed777f/fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb", size = 5058809, upload-time = "2025-12-12T17:29:51.701Z" }, + { url = "https://files.pythonhosted.org/packages/79/61/1ca198af22f7dd22c17ab86e9024ed3c06299cfdb08170640e9996d501a0/fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9", size = 5036039, upload-time = "2025-12-12T17:29:53.659Z" }, + { url = "https://files.pythonhosted.org/packages/99/cc/fa1801e408586b5fce4da9f5455af8d770f4fc57391cd5da7256bb364d38/fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87", size = 5034714, upload-time = "2025-12-12T17:29:55.592Z" }, + { url = "https://files.pythonhosted.org/packages/bf/aa/b7aeafe65adb1b0a925f8f25725e09f078c635bc22754f3fecb7456955b0/fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56", size = 5158648, upload-time = "2025-12-12T17:29:57.861Z" }, + { url = "https://files.pythonhosted.org/packages/99/f9/08ea7a38663328881384c6e7777bbefc46fd7d282adfd87a7d2b84ec9d50/fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a", size = 2280681, upload-time = "2025-12-12T17:29:59.943Z" }, + { url = "https://files.pythonhosted.org/packages/07/ad/37dd1ae5fa6e01612a1fbb954f0927681f282925a86e86198ccd7b15d515/fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7", size = 2331951, upload-time = "2025-12-12T17:30:02.254Z" }, + { url = "https://files.pythonhosted.org/packages/6f/16/7decaa24a1bd3a70c607b2e29f0adc6159f36a7e40eaba59846414765fd4/fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e", size = 2851593, upload-time = "2025-12-12T17:30:04.225Z" }, + { url = "https://files.pythonhosted.org/packages/94/98/3c4cb97c64713a8cf499b3245c3bf9a2b8fd16a3e375feff2aed78f96259/fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2", size = 2400231, upload-time = "2025-12-12T17:30:06.47Z" }, + { url = "https://files.pythonhosted.org/packages/b7/37/82dbef0f6342eb01f54bca073ac1498433d6ce71e50c3c3282b655733b31/fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796", size = 4954103, upload-time = "2025-12-12T17:30:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/6c/44/f3aeac0fa98e7ad527f479e161aca6c3a1e47bb6996b053d45226fe37bf2/fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d", size = 5004295, upload-time = "2025-12-12T17:30:10.56Z" }, + { url = "https://files.pythonhosted.org/packages/14/e8/7424ced75473983b964d09f6747fa09f054a6d656f60e9ac9324cf40c743/fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8", size = 4944109, upload-time = "2025-12-12T17:30:12.874Z" }, + { url = "https://files.pythonhosted.org/packages/c8/8b/6391b257fa3d0b553d73e778f953a2f0154292a7a7a085e2374b111e5410/fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0", size = 5093598, upload-time = "2025-12-12T17:30:15.79Z" }, + { url = "https://files.pythonhosted.org/packages/d9/71/fd2ea96cdc512d92da5678a1c98c267ddd4d8c5130b76d0f7a80f9a9fde8/fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261", size = 2269060, upload-time = "2025-12-12T17:30:18.058Z" }, + { url = "https://files.pythonhosted.org/packages/80/3b/a3e81b71aed5a688e89dfe0e2694b26b78c7d7f39a5ffd8a7d75f54a12a8/fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9", size = 2319078, upload-time = "2025-12-12T17:30:22.862Z" }, + { url = "https://files.pythonhosted.org/packages/4b/cf/00ba28b0990982530addb8dc3e9e6f2fa9cb5c20df2abdda7baa755e8fe1/fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c", size = 2846454, upload-time = "2025-12-12T17:30:24.938Z" }, + { url = "https://files.pythonhosted.org/packages/5a/ca/468c9a8446a2103ae645d14fee3f610567b7042aba85031c1c65e3ef7471/fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e", size = 2398191, upload-time = "2025-12-12T17:30:27.343Z" }, + { url = "https://files.pythonhosted.org/packages/a3/4b/d67eedaed19def5967fade3297fed8161b25ba94699efc124b14fb68cdbc/fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5", size = 4928410, upload-time = "2025-12-12T17:30:29.771Z" }, + { url = "https://files.pythonhosted.org/packages/b0/8d/6fb3494dfe61a46258cd93d979cf4725ded4eb46c2a4ca35e4490d84daea/fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd", size = 4984460, upload-time = "2025-12-12T17:30:32.073Z" }, + { url = "https://files.pythonhosted.org/packages/f7/f1/a47f1d30b3dc00d75e7af762652d4cbc3dff5c2697a0dbd5203c81afd9c3/fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3", size = 4925800, upload-time = "2025-12-12T17:30:34.339Z" }, + { url = "https://files.pythonhosted.org/packages/a7/01/e6ae64a0981076e8a66906fab01539799546181e32a37a0257b77e4aa88b/fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d", size = 5067859, upload-time = "2025-12-12T17:30:36.593Z" }, + { url = "https://files.pythonhosted.org/packages/73/aa/28e40b8d6809a9b5075350a86779163f074d2b617c15d22343fce81918db/fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c", size = 2267821, upload-time = "2025-12-12T17:30:38.478Z" }, + { url = "https://files.pythonhosted.org/packages/1a/59/453c06d1d83dc0951b69ef692d6b9f1846680342927df54e9a1ca91c6f90/fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b", size = 2318169, upload-time = "2025-12-12T17:30:40.951Z" }, + { url = "https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd", size = 2846094, upload-time = "2025-12-12T17:30:43.511Z" }, + { url = "https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e", size = 2396589, upload-time = "2025-12-12T17:30:45.681Z" }, + { url = "https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c", size = 4877892, upload-time = "2025-12-12T17:30:47.709Z" }, + { url = "https://files.pythonhosted.org/packages/8a/ec/9e6b38c7ba1e09eb51db849d5450f4c05b7e78481f662c3b79dbde6f3d04/fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75", size = 4972884, upload-time = "2025-12-12T17:30:49.656Z" }, + { url = "https://files.pythonhosted.org/packages/5e/87/b5339da8e0256734ba0dbbf5b6cdebb1dd79b01dc8c270989b7bcd465541/fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063", size = 4924405, upload-time = "2025-12-12T17:30:51.735Z" }, + { url = "https://files.pythonhosted.org/packages/0b/47/e3409f1e1e69c073a3a6fd8cb886eb18c0bae0ee13db2c8d5e7f8495e8b7/fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2", size = 5035553, upload-time = "2025-12-12T17:30:54.823Z" }, + { url = "https://files.pythonhosted.org/packages/bf/b6/1f6600161b1073a984294c6c031e1a56ebf95b6164249eecf30012bb2e38/fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c", size = 2271915, upload-time = "2025-12-12T17:30:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c", size = 2323487, upload-time = "2025-12-12T17:30:59.804Z" }, + { url = "https://files.pythonhosted.org/packages/39/5c/908ad78e46c61c3e3ed70c3b58ff82ab48437faf84ec84f109592cabbd9f/fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa", size = 2929571, upload-time = "2025-12-12T17:31:02.574Z" }, + { url = "https://files.pythonhosted.org/packages/bd/41/975804132c6dea64cdbfbaa59f3518a21c137a10cccf962805b301ac6ab2/fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91", size = 2435317, upload-time = "2025-12-12T17:31:04.974Z" }, + { url = "https://files.pythonhosted.org/packages/b0/5a/aef2a0a8daf1ebaae4cfd83f84186d4a72ee08fd6a8451289fcd03ffa8a4/fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19", size = 4882124, upload-time = "2025-12-12T17:31:07.456Z" }, + { url = "https://files.pythonhosted.org/packages/80/33/d6db3485b645b81cea538c9d1c9219d5805f0877fda18777add4671c5240/fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba", size = 5100391, upload-time = "2025-12-12T17:31:09.732Z" }, + { url = "https://files.pythonhosted.org/packages/6c/d6/675ba631454043c75fcf76f0ca5463eac8eb0666ea1d7badae5fea001155/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7", size = 4978800, upload-time = "2025-12-12T17:31:11.681Z" }, + { url = "https://files.pythonhosted.org/packages/7f/33/d3ec753d547a8d2bdaedd390d4a814e8d5b45a093d558f025c6b990b554c/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118", size = 5006426, upload-time = "2025-12-12T17:31:13.764Z" }, + { url = "https://files.pythonhosted.org/packages/b4/40/cc11f378b561a67bea850ab50063366a0d1dd3f6d0a30ce0f874b0ad5664/fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5", size = 2335377, upload-time = "2025-12-12T17:31:16.49Z" }, + { url = "https://files.pythonhosted.org/packages/e4/ff/c9a2b66b39f8628531ea58b320d66d951267c98c6a38684daa8f50fb02f8/fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b", size = 2400613, upload-time = "2025-12-12T17:31:18.769Z" }, + { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" }, ] [[package]] name = "frozenlist" version = "1.8.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", upload-time = "2025-10-06T05:38:17.865Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/83/4a/557715d5047da48d54e659203b9335be7bfaafda2c3f627b7c47e0b3aaf3/frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011", upload-time = "2025-10-06T05:35:23.699Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a2/fb/c85f9fed3ea8fe8740e5b46a59cc141c23b842eca617da8876cfce5f760e/frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565", upload-time = "2025-10-06T05:35:25.341Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/63/70/26ca3f06aace16f2352796b08704338d74b6d1a24ca38f2771afbb7ed915/frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad", upload-time = "2025-10-06T05:35:26.797Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-10-06T05:35:28.254Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6b/83/4d587dccbfca74cb8b810472392ad62bfa100bf8108c7223eb4c4fa2f7b3/frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186", upload-time = "2025-10-06T05:35:29.454Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6a/c6/fd3b9cd046ec5fff9dab66831083bc2077006a874a2d3d9247dea93ddf7e/frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e", upload-time = "2025-10-06T05:35:30.951Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ce/80/6693f55eb2e085fc8afb28cf611448fb5b90e98e068fa1d1b8d8e66e5c7d/frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450", upload-time = "2025-10-06T05:35:32.101Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/97/d6/e9459f7c5183854abd989ba384fe0cc1a0fb795a83c033f0571ec5933ca4/frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef", upload-time = "2025-10-06T05:35:33.834Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/97/92/24e97474b65c0262e9ecd076e826bfd1d3074adcc165a256e42e7b8a7249/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4", upload-time = "2025-10-06T05:35:35.205Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ee/bf/dc394a097508f15abff383c5108cb8ad880d1f64a725ed3b90d5c2fbf0bb/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff", upload-time = "2025-10-06T05:35:36.354Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/90/25b201b9c015dbc999a5baf475a257010471a1fa8c200c843fd4abbee725/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c", upload-time = "2025-10-06T05:35:37.949Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/84/f4/b5bc148df03082f05d2dd30c089e269acdbe251ac9a9cf4e727b2dbb8a3d/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f", upload-time = "2025-10-06T05:35:39.178Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/db/4b/87e95b5d15097c302430e647136b7d7ab2398a702390cf4c8601975709e7/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7", upload-time = "2025-10-06T05:35:40.377Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/70/78a0315d1fea97120591a83e0acd644da638c872f142fd72a6cebee825f3/frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a", upload-time = "2025-10-06T05:35:41.863Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/aa/3f04523fb189a00e147e60c5b2205126118f216b0aa908035c45336e27e4/frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6", upload-time = "2025-10-06T05:35:43.205Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/39/75/1135feecdd7c336938bd55b4dc3b0dfc46d85b9be12ef2628574b28de776/frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e", upload-time = "2025-10-06T05:35:44.596Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", upload-time = "2025-10-06T05:35:45.98Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", upload-time = "2025-10-06T05:35:47.009Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", upload-time = "2025-10-06T05:35:48.38Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-10-06T05:35:49.97Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", upload-time = "2025-10-06T05:35:51.729Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", upload-time = "2025-10-06T05:35:53.246Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", upload-time = "2025-10-06T05:35:54.497Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", upload-time = "2025-10-06T05:35:55.861Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", upload-time = "2025-10-06T05:35:57.399Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", upload-time = "2025-10-06T05:35:58.563Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", upload-time = "2025-10-06T05:35:59.719Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", upload-time = "2025-10-06T05:36:00.959Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", upload-time = "2025-10-06T05:36:02.22Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/95/a3/c8fb25aac55bf5e12dae5c5aa6a98f85d436c1dc658f21c3ac73f9fa95e5/frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25", upload-time = "2025-10-06T05:36:03.409Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b", upload-time = "2025-10-06T05:36:04.368Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/16/c2c9ab44e181f043a86f9a8f84d5124b62dbcb3a02c0977ec72b9ac1d3e0/frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a", upload-time = "2025-10-06T05:36:05.669Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", upload-time = "2025-10-06T05:36:06.649Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", upload-time = "2025-10-06T05:36:07.69Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", upload-time = "2025-10-06T05:36:08.78Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-10-06T05:36:09.801Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", upload-time = "2025-10-06T05:36:11.394Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", upload-time = "2025-10-06T05:36:12.598Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", upload-time = "2025-10-06T05:36:14.065Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", upload-time = "2025-10-06T05:36:15.39Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", upload-time = "2025-10-06T05:36:16.558Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", upload-time = "2025-10-06T05:36:17.821Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", upload-time = "2025-10-06T05:36:19.046Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", upload-time = "2025-10-06T05:36:20.763Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", upload-time = "2025-10-06T05:36:22.129Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", upload-time = "2025-10-06T05:36:23.661Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", upload-time = "2025-10-06T05:36:24.958Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", upload-time = "2025-10-06T05:36:26.333Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", upload-time = "2025-10-06T05:36:27.341Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", upload-time = "2025-10-06T05:36:28.855Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", upload-time = "2025-10-06T05:36:29.877Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", upload-time = "2025-10-06T05:36:31.301Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", upload-time = "2025-10-06T05:36:32.531Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", upload-time = "2025-10-06T05:36:33.706Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", upload-time = "2025-10-06T05:36:34.947Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", upload-time = "2025-10-06T05:36:36.534Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", upload-time = "2025-10-06T05:36:38.582Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", upload-time = "2025-10-06T05:36:40.152Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", upload-time = "2025-10-06T05:36:41.355Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", upload-time = "2025-10-06T05:36:42.716Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", upload-time = "2025-10-06T05:36:44.251Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", upload-time = "2025-10-06T05:36:45.423Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", upload-time = "2025-10-06T05:36:46.796Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", upload-time = "2025-10-06T05:36:47.8Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", upload-time = "2025-10-06T05:36:48.78Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", upload-time = "2025-10-06T05:36:49.837Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", upload-time = "2025-10-06T05:36:50.851Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", upload-time = "2025-10-06T05:36:51.898Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", upload-time = "2025-10-06T05:36:53.101Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", upload-time = "2025-10-06T05:36:54.309Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", upload-time = "2025-10-06T05:36:55.566Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", upload-time = "2025-10-06T05:36:56.758Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", upload-time = "2025-10-06T05:36:57.965Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", upload-time = "2025-10-06T05:36:59.237Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", upload-time = "2025-10-06T05:37:00.811Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", upload-time = "2025-10-06T05:37:02.115Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", upload-time = "2025-10-06T05:37:03.711Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", upload-time = "2025-10-06T05:37:04.915Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", upload-time = "2025-10-06T05:37:06.343Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", upload-time = "2025-10-06T05:37:07.431Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", upload-time = "2025-10-06T05:37:08.438Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", upload-time = "2025-10-06T05:37:09.48Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", upload-time = "2025-10-06T05:37:10.569Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", upload-time = "2025-10-06T05:37:11.993Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", upload-time = "2025-10-06T05:37:13.194Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", upload-time = "2025-10-06T05:37:14.577Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", upload-time = "2025-10-06T05:37:15.781Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", upload-time = "2025-10-06T05:37:17.037Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", upload-time = "2025-10-06T05:37:18.221Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", upload-time = "2025-10-06T05:37:19.771Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", upload-time = "2025-10-06T05:37:20.969Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", upload-time = "2025-10-06T05:37:22.252Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", upload-time = "2025-10-06T05:37:23.5Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", upload-time = "2025-10-06T05:37:25.581Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", upload-time = "2025-10-06T05:37:26.928Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", upload-time = "2025-10-06T05:37:28.075Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", upload-time = "2025-10-06T05:37:29.373Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", upload-time = "2025-10-06T05:37:30.792Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", upload-time = "2025-10-06T05:37:32.127Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", upload-time = "2025-10-06T05:37:33.21Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", upload-time = "2025-10-06T05:37:36.107Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", upload-time = "2025-10-06T05:37:37.663Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", upload-time = "2025-10-06T05:37:39.261Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", upload-time = "2025-10-06T05:37:43.213Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", upload-time = "2025-10-06T05:37:45.337Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", upload-time = "2025-10-06T05:37:46.657Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", upload-time = "2025-10-06T05:37:47.946Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", upload-time = "2025-10-06T05:37:49.499Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", upload-time = "2025-10-06T05:37:50.745Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", upload-time = "2025-10-06T05:37:52.222Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", upload-time = "2025-10-06T05:37:53.425Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", upload-time = "2025-10-06T05:37:54.513Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", upload-time = "2025-10-06T05:38:16.721Z" }, +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/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, + { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, + { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, + { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, + { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, + { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, + { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, + { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" }, + { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" }, + { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, + { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, + { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, + { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, + { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, + { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, + { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, + { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, + { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, + { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, + { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, + { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" }, + { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" }, + { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" }, + { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" }, + { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" }, + { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" }, + { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" }, + { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" }, + { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" }, + { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" }, + { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" }, + { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" }, + { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" }, + { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" }, + { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" }, + { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" }, + { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" }, + { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" }, + { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" }, + { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" }, + { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" }, + { 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.4.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/d5/8d/1c51c094345df128ca4a990d633fe1a0ff28726c9e6b3c41ba65087bba1d/fsspec-2026.4.0.tar.gz", hash = "sha256:301d8ac70ae90ef3ad05dcf94d6c3754a097f9b5fe4667d2787aa359ec7df7e4", upload-time = "2026-04-29T20:42:38.635Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d5/8d/1c51c094345df128ca4a990d633fe1a0ff28726c9e6b3c41ba65087bba1d/fsspec-2026.4.0.tar.gz", hash = "sha256:301d8ac70ae90ef3ad05dcf94d6c3754a097f9b5fe4667d2787aa359ec7df7e4", size = 312760, upload-time = "2026-04-29T20:42:38.635Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl", hash = "sha256:11ef7bb35dab8a394fde6e608221d5cf3e8499401c249bebaeaad760a1a8dec2", upload-time = "2026-04-29T20:42:36.842Z" }, + { url = "https://files.pythonhosted.org/packages/d5/0c/043d5e551459da400957a1395e0febbf771446ff34291afcbe3d8be2a279/fsspec-2026.4.0-py3-none-any.whl", hash = "sha256:11ef7bb35dab8a394fde6e608221d5cf3e8499401c249bebaeaad760a1a8dec2", size = 203402, upload-time = "2026-04-29T20:42:36.842Z" }, ] [[package]] @@ -1653,9 +1650,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "smmap" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", upload-time = "2025-01-02T07:20:46.413Z" } +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://pypi-proxy.dev.databricks.com/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", upload-time = "2025-01-02T07:20:43.624Z" }, + { 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]] @@ -1665,9 +1662,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "gitdb" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/33/f6/354ae6491228b5eb40e10d89c4d13c651fe1cf7556e35ebdded50cff57ce/gitpython-3.1.50.tar.gz", hash = "sha256:80da2d12504d52e1f998772dc5baf6e553f8d2fcfe1fcc226c9d9a2ee3372dcc", upload-time = "2026-05-06T04:01:26.571Z" } +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://pypi-proxy.dev.databricks.com/packages/20/7a/1c6e3562dfd8950adbb11ffbc65d21e7c89d01a6e4f137fa981056de25c5/gitpython-3.1.50-py3-none-any.whl", hash = "sha256:d352abe2908d07355014abdd21ddf798c2a961469239afec4962e9da884858f9", upload-time = "2026-05-06T04:01:23.799Z" }, + { 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]] @@ -1679,9 +1676,9 @@ dependencies = [ { name = "pyasn1-modules" }, { name = "rsa" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/0c/41/242044323fbd746615884b1c16639749e73665b718209946ebad7ba8a813/google_auth-2.48.0.tar.gz", hash = "sha256:4f7e706b0cd3208a3d940a19a822c37a476ddba5450156c3e6624a71f7c841ce", upload-time = "2026-01-26T19:22:47.157Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0c/41/242044323fbd746615884b1c16639749e73665b718209946ebad7ba8a813/google_auth-2.48.0.tar.gz", hash = "sha256:4f7e706b0cd3208a3d940a19a822c37a476ddba5450156c3e6624a71f7c841ce", size = 326522, upload-time = "2026-01-26T19:22:47.157Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/83/1d/d6466de3a5249d35e832a52834115ca9d1d0de6abc22065f049707516d47/google_auth-2.48.0-py3-none-any.whl", hash = "sha256:2e2a537873d449434252a9632c28bfc268b0adb1e53f9fb62afc5333a975903f", upload-time = "2026-01-26T19:22:45.099Z" }, + { url = "https://files.pythonhosted.org/packages/83/1d/d6466de3a5249d35e832a52834115ca9d1d0de6abc22065f049707516d47/google_auth-2.48.0-py3-none-any.whl", hash = "sha256:2e2a537873d449434252a9632c28bfc268b0adb1e53f9fb62afc5333a975903f", size = 236499, upload-time = "2026-01-26T19:22:45.099Z" }, ] [[package]] @@ -1694,18 +1691,18 @@ dependencies = [ { name = "python-dateutil" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/cc/f6/bf62ff950c317ed03e77f3f6ddd7e34aaa98fe89d79ebd660c55343d8054/graphene-3.4.3.tar.gz", hash = "sha256:2a3786948ce75fe7e078443d37f609cbe5bb36ad8d6b828740ad3b95ed1a0aaa", upload-time = "2024-11-09T20:44:25.757Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/f6/bf62ff950c317ed03e77f3f6ddd7e34aaa98fe89d79ebd660c55343d8054/graphene-3.4.3.tar.gz", hash = "sha256:2a3786948ce75fe7e078443d37f609cbe5bb36ad8d6b828740ad3b95ed1a0aaa", size = 44739, upload-time = "2024-11-09T20:44:25.757Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/66/e0/61d8e98007182e6b2aca7cf65904721fb2e4bce0192272ab9cb6f69d8812/graphene-3.4.3-py2.py3-none-any.whl", hash = "sha256:820db6289754c181007a150db1f7fff544b94142b556d12e3ebc777a7bf36c71", upload-time = "2024-11-09T20:44:23.851Z" }, + { url = "https://files.pythonhosted.org/packages/66/e0/61d8e98007182e6b2aca7cf65904721fb2e4bce0192272ab9cb6f69d8812/graphene-3.4.3-py2.py3-none-any.whl", hash = "sha256:820db6289754c181007a150db1f7fff544b94142b556d12e3ebc777a7bf36c71", size = 114894, upload-time = "2024-11-09T20:44:23.851Z" }, ] [[package]] name = "graphql-core" version = "3.2.7" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/ac/9b/037a640a2983b09aed4a823f9cf1729e6d780b0671f854efa4727a7affbe/graphql_core-3.2.7.tar.gz", hash = "sha256:27b6904bdd3b43f2a0556dad5d579bdfdeab1f38e8e8788e555bdcb586a6f62c", upload-time = "2025-11-01T22:30:40.436Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/9b/037a640a2983b09aed4a823f9cf1729e6d780b0671f854efa4727a7affbe/graphql_core-3.2.7.tar.gz", hash = "sha256:27b6904bdd3b43f2a0556dad5d579bdfdeab1f38e8e8788e555bdcb586a6f62c", size = 513484, upload-time = "2025-11-01T22:30:40.436Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/14/933037032608787fb92e365883ad6a741c235e0ff992865ec5d904a38f1e/graphql_core-3.2.7-py3-none-any.whl", hash = "sha256:17fc8f3ca4a42913d8e24d9ac9f08deddf0a0b2483076575757f6c412ead2ec0", upload-time = "2025-11-01T22:30:38.912Z" }, + { url = "https://files.pythonhosted.org/packages/0a/14/933037032608787fb92e365883ad6a741c235e0ff992865ec5d904a38f1e/graphql_core-3.2.7-py3-none-any.whl", hash = "sha256:17fc8f3ca4a42913d8e24d9ac9f08deddf0a0b2483076575757f6c412ead2ec0", size = 207262, upload-time = "2025-11-01T22:30:38.912Z" }, ] [[package]] @@ -1715,78 +1712,78 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "graphql-core" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/d1/13/98fbf8d67552f102488ffc16c6f559ce71ea15f6294728d33928ab5ff14d/graphql-relay-3.2.0.tar.gz", hash = "sha256:1ff1c51298356e481a0be009ccdff249832ce53f30559c1338f22a0e0d17250c", upload-time = "2022-04-16T11:03:45.447Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/13/98fbf8d67552f102488ffc16c6f559ce71ea15f6294728d33928ab5ff14d/graphql-relay-3.2.0.tar.gz", hash = "sha256:1ff1c51298356e481a0be009ccdff249832ce53f30559c1338f22a0e0d17250c", size = 50027, upload-time = "2022-04-16T11:03:45.447Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/74/16/a4cf06adbc711bd364a73ce043b0b08d8fa5aae3df11b6ee4248bcdad2e0/graphql_relay-3.2.0-py3-none-any.whl", hash = "sha256:c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5", upload-time = "2022-04-16T11:03:43.895Z" }, + { url = "https://files.pythonhosted.org/packages/74/16/a4cf06adbc711bd364a73ce043b0b08d8fa5aae3df11b6ee4248bcdad2e0/graphql_relay-3.2.0-py3-none-any.whl", hash = "sha256:c9b22bd28b170ba1fe674c74384a8ff30a76c8e26f88ac3aa1584dd3179953e5", size = 16940, upload-time = "2022-04-16T11:03:43.895Z" }, ] [[package]] name = "greenlet" version = "3.3.2" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/a3/51/1664f6b78fc6ebbd98019a1fd730e83fa78f2db7058f72b1463d3612b8db/greenlet-3.3.2.tar.gz", hash = "sha256:2eaf067fc6d886931c7962e8c6bede15d2f01965560f3359b27c80bde2d151f2", upload-time = "2026-02-20T20:54:15.531Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/38/3f/9859f655d11901e7b2996c6e3d33e0caa9a1d4572c3bc61ed0faa64b2f4c/greenlet-3.3.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9bc885b89709d901859cf95179ec9f6bb67a3d2bb1f0e88456461bd4b7f8fd0d", upload-time = "2026-02-20T20:16:21.325Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fb/07/cb284a8b5c6498dbd7cba35d31380bb123d7dceaa7907f606c8ff5993cbf/greenlet-3.3.2-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b568183cf65b94919be4438dc28416b234b678c608cafac8874dfeeb2a9bbe13", upload-time = "2026-02-20T20:47:28.955Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ed/45/67922992b3a152f726163b19f890a85129a992f39607a2a53155de3448b8/greenlet-3.3.2-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:527fec58dc9f90efd594b9b700662ed3fb2493c2122067ac9c740d98080a620e", upload-time = "2026-02-20T20:55:55.581Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/5f/6e2a7d80c353587751ef3d44bb947f0565ec008a2e0927821c007e96d3a7/greenlet-3.3.2-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:508c7f01f1791fbc8e011bd508f6794cb95397fdb198a46cb6635eb5b78d85a7", upload-time = "2026-02-20T21:02:43.261Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ad/55/9f1ebb5a825215fadcc0f7d5073f6e79e3007e3282b14b22d6aba7ca6cb8/greenlet-3.3.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad0c8917dd42a819fe77e6bdfcb84e3379c0de956469301d9fd36427a1ca501f", upload-time = "2026-02-20T20:20:58.395Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/b4/21f5455773d37f94b866eb3cf5caed88d6cea6dd2c6e1f9c34f463cba3ec/greenlet-3.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:97245cc10e5515dbc8c3104b2928f7f02b6813002770cfaffaf9a6e0fc2b94ef", upload-time = "2026-02-20T20:49:31.102Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/00/68/91f061a926abead128fe1a87f0b453ccf07368666bd59ffa46016627a930/greenlet-3.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8c1fdd7d1b309ff0da81d60a9688a8bd044ac4e18b250320a96fc68d31c209ca", upload-time = "2026-02-20T20:21:06.541Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ac/78/f93e840cbaef8becaf6adafbaf1319682a6c2d8c1c20224267a5c6c8c891/greenlet-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:5d0e35379f93a6d0222de929a25ab47b5eb35b5ef4721c2b9cbcc4036129ff1f", upload-time = "2026-02-20T20:17:09.379Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f3/47/16400cb42d18d7a6bb46f0626852c1718612e35dcb0dffa16bbaffdf5dd2/greenlet-3.3.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:c56692189a7d1c7606cb794be0a8381470d95c57ce5be03fb3d0ef57c7853b86", upload-time = "2026-02-20T20:19:39.263Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a3/90/42762b77a5b6aa96cd8c0e80612663d39211e8ae8a6cd47c7f1249a66262/greenlet-3.3.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ebd458fa8285960f382841da585e02201b53a5ec2bac6b156fc623b5ce4499f", upload-time = "2026-02-20T20:47:30.161Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/6f/f3d64f4fa0a9c7b5c5b3c810ff1df614540d5aa7d519261b53fba55d4df9/greenlet-3.3.2-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a443358b33c4ec7b05b79a7c8b466f5d275025e750298be7340f8fc63dff2a55", upload-time = "2026-02-20T20:55:56.965Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/8b/1430a04657735a3f23116c2e0d5eb10220928846e4537a938a41b350bed6/greenlet-3.3.2-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4375a58e49522698d3e70cc0b801c19433021b5c37686f7ce9c65b0d5c8677d2", upload-time = "2026-02-20T21:02:45.234Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/72/83/3e06a52aca8128bdd4dcd67e932b809e76a96ab8c232a8b025b2850264c5/greenlet-3.3.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e2cd90d413acbf5e77ae41e5d3c9b3ac1d011a756d7284d7f3f2b806bbd6358", upload-time = "2026-02-20T20:20:59.955Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/70/79/0de5e62b873e08fe3cef7dbe84e5c4bc0e8ed0c7ff131bccb8405cd107c8/greenlet-3.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:442b6057453c8cb29b4fb36a2ac689382fc71112273726e2423f7f17dc73bf99", upload-time = "2026-02-20T20:49:32.293Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5a/00/32d30dee8389dc36d42170a9c66217757289e2afb0de59a3565260f38373/greenlet-3.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:45abe8eb6339518180d5a7fa47fa01945414d7cca5ecb745346fc6a87d2750be", upload-time = "2026-02-20T20:21:07.966Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/3a/efb2cf697fbccdf75b24e2c18025e7dfa54c4f31fab75c51d0fe79942cef/greenlet-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e692b2dae4cc7077cbb11b47d258533b48c8fde69a33d0d8a82e2fe8d8531d5", upload-time = "2026-02-20T20:17:18.772Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e1/a1/65bbc059a43a7e2143ec4fc1f9e3f673e04f9c7b371a494a101422ac4fd5/greenlet-3.3.2-cp311-cp311-win_arm64.whl", hash = "sha256:02b0a8682aecd4d3c6c18edf52bc8e51eacdd75c8eac52a790a210b06aa295fd", upload-time = "2026-02-20T20:18:18.695Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ea/ab/1608e5a7578e62113506740b88066bf09888322a311cff602105e619bd87/greenlet-3.3.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:ac8d61d4343b799d1e526db579833d72f23759c71e07181c2d2944e429eb09cd", upload-time = "2026-02-20T20:17:43.971Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a5/23/0eae412a4ade4e6623ff7626e38998cb9b11e9ff1ebacaa021e4e108ec15/greenlet-3.3.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ceec72030dae6ac0c8ed7591b96b70410a8be370b6a477b1dbc072856ad02bd", upload-time = "2026-02-20T20:47:31.462Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/16/5b1678a9c07098ecb9ab2dd159fafaf12e963293e61ee8d10ecb55273e5e/greenlet-3.3.2-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2a5be83a45ce6188c045bcc44b0ee037d6a518978de9a5d97438548b953a1ac", upload-time = "2026-02-20T20:55:58.423Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5c/c5/cc09412a29e43406eba18d61c70baa936e299bc27e074e2be3806ed29098/greenlet-3.3.2-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ae9e21c84035c490506c17002f5c8ab25f980205c3e61ddb3a2a2a2e6c411fcb", upload-time = "2026-02-20T21:02:46.596Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/1f/5155f55bd71cabd03765a4aac9ac446be129895271f73872c36ebd4b04b6/greenlet-3.3.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43e99d1749147ac21dde49b99c9abffcbc1e2d55c67501465ef0930d6e78e070", upload-time = "2026-02-20T20:21:01.102Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fc/dd/845f249c3fcd69e32df80cdab059b4be8b766ef5830a3d0aa9d6cad55beb/greenlet-3.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c956a19350e2c37f2c48b336a3afb4bff120b36076d9d7fb68cb44e05d95b79", upload-time = "2026-02-20T20:49:33.495Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/50/2649fe21fcc2b56659a452868e695634722a6655ba245d9f77f5656010bf/greenlet-3.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c6f8ba97d17a1e7d664151284cb3315fc5f8353e75221ed4324f84eb162b395", upload-time = "2026-02-20T20:21:09.154Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9b/40/cc802e067d02af8b60b6771cea7d57e21ef5e6659912814babb42b864713/greenlet-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:34308836d8370bddadb41f5a7ce96879b72e2fdfb4e87729330c6ab52376409f", upload-time = "2026-02-20T20:17:28.121Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/2e/fe7f36ff1982d6b10a60d5e0740c759259a7d6d2e1dc41da6d96de32fff6/greenlet-3.3.2-cp312-cp312-win_arm64.whl", hash = "sha256:d3a62fa76a32b462a97198e4c9e99afb9ab375115e74e9a83ce180e7a496f643", upload-time = "2026-02-20T20:17:23.34Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ac/48/f8b875fa7dea7dd9b33245e37f065af59df6a25af2f9561efa8d822fde51/greenlet-3.3.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:aa6ac98bdfd716a749b84d4034486863fd81c3abde9aa3cf8eff9127981a4ae4", upload-time = "2026-02-20T20:19:01.9Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/8d/9771d03e7a8b1ee456511961e1b97a6d77ae1dea4a34a5b98eee706689d3/greenlet-3.3.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab0c7e7901a00bc0a7284907273dc165b32e0d109a6713babd04471327ff7986", upload-time = "2026-02-20T20:47:32.873Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/59/0e/4223c2bbb63cd5c97f28ffb2a8aee71bdfb30b323c35d409450f51b91e3e/greenlet-3.3.2-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d248d8c23c67d2291ffd47af766e2a3aa9fa1c6703155c099feb11f526c63a92", upload-time = "2026-02-20T20:55:59.817Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/94/2b/4d012a69759ac9d77210b8bfb128bc621125f5b20fc398bce3940d036b1c/greenlet-3.3.2-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ccd21bb86944ca9be6d967cf7691e658e43417782bce90b5d2faeda0ff78a7dd", upload-time = "2026-02-20T21:02:48.024Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/34/259b28ea7a2a0c904b11cd36c79b8cef8019b26ee5dbe24e73b469dea347/greenlet-3.3.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6997d360a4e6a4e936c0f9625b1c20416b8a0ea18a8e19cabbefc712e7397ab", upload-time = "2026-02-20T20:21:02.454Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/03/996c2d1689d486a6e199cb0f1cf9e4aa940c500e01bdf201299d7d61fa69/greenlet-3.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:64970c33a50551c7c50491671265d8954046cb6e8e2999aacdd60e439b70418a", upload-time = "2026-02-20T20:49:34.795Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d9/c4/2570fc07f34a39f2caf0bf9f24b0a1a0a47bc2e8e465b2c2424821389dfc/greenlet-3.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1a9172f5bf6bd88e6ba5a84e0a68afeac9dc7b6b412b245dd64f52d83c81e55b", upload-time = "2026-02-20T20:21:10.261Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/91/39/5ef5aa23bc545aa0d31e1b9b55822b32c8da93ba657295840b6b34124009/greenlet-3.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:a7945dd0eab63ded0a48e4dcade82939783c172290a7903ebde9e184333ca124", upload-time = "2026-02-20T20:16:58.461Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/62/6b/a89f8456dcb06becff288f563618e9f20deed8dd29beea14f9a168aef64b/greenlet-3.3.2-cp313-cp313-win_arm64.whl", hash = "sha256:394ead29063ee3515b4e775216cb756b2e3b4a7e55ae8fd884f17fa579e6b327", upload-time = "2026-02-20T20:17:37.152Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3f/ae/8bffcbd373b57a5992cd077cbe8858fff39110480a9d50697091faea6f39/greenlet-3.3.2-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:8d1658d7291f9859beed69a776c10822a0a799bc4bfe1bd4272bb60e62507dab", upload-time = "2026-02-20T20:18:00.783Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/c0/45f93f348fa49abf32ac8439938726c480bd96b2a3c6f4d949ec0124b69f/greenlet-3.3.2-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:18cb1b7337bca281915b3c5d5ae19f4e76d35e1df80f4ad3c1a7be91fadf1082", upload-time = "2026-02-20T20:47:34.036Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/de/dd7589b3f2b8372069ab3e4763ea5329940fc7ad9dcd3e272a37516d7c9b/greenlet-3.3.2-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c2e47408e8ce1c6f1ceea0dffcdf6ebb85cc09e55c7af407c99f1112016e45e9", upload-time = "2026-02-20T20:56:01.295Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cd/ac/85804f74f1ccea31ba518dcc8ee6f14c79f73fe36fa1beba38930806df09/greenlet-3.3.2-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e3cb43ce200f59483eb82949bf1835a99cf43d7571e900d7c8d5c62cdf25d2f9", upload-time = "2026-02-20T21:02:49.664Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63d10328839d1973e5ba35e98cccbca71b232b14051fd957b6f8b6e8e80d0506", upload-time = "2026-02-20T20:21:04.015Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/48/cf/56832f0c8255d27f6c35d41b5ec91168d74ec721d85f01a12131eec6b93c/greenlet-3.3.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8e4ab3cfb02993c8cc248ea73d7dae6cec0253e9afa311c9b37e603ca9fad2ce", upload-time = "2026-02-20T20:49:36.052Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/23/b90b60a4aabb4cec0796e55f25ffbfb579a907c3898cd2905c8918acaa16/greenlet-3.3.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94ad81f0fd3c0c0681a018a976e5c2bd2ca2d9d94895f23e7bb1af4e8af4e2d5", upload-time = "2026-02-20T20:21:11.684Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f3/ca/2101ca3d9223a1dc125140dbc063644dca76df6ff356531eb27bc267b446/greenlet-3.3.2-cp314-cp314-win_amd64.whl", hash = "sha256:8c4dd0f3997cf2512f7601563cc90dfb8957c0cff1e3a1b23991d4ea1776c492", upload-time = "2026-02-20T20:20:08.186Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f6/4a/ecf894e962a59dea60f04877eea0fd5724618da89f1867b28ee8b91e811f/greenlet-3.3.2-cp314-cp314-win_arm64.whl", hash = "sha256:cd6f9e2bbd46321ba3bbb4c8a15794d32960e3b0ae2cc4d49a1a53d314805d71", upload-time = "2026-02-20T20:18:59.722Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/98/6d/8f2ef704e614bcf58ed43cfb8d87afa1c285e98194ab2cfad351bf04f81e/greenlet-3.3.2-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:e26e72bec7ab387ac80caa7496e0f908ff954f31065b0ffc1f8ecb1338b11b54", upload-time = "2026-02-20T20:19:29.856Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5e/0d/93894161d307c6ea237a43988f27eba0947b360b99ac5239ad3fe09f0b47/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b466dff7a4ffda6ca975979bab80bdadde979e29fc947ac3be4451428d8b0e4", upload-time = "2026-02-20T20:47:35.742Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/2c/d2d506ebd8abcb57386ec4f7ba20f4030cbe56eae541bc6fd6ef399c0b41/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b8bddc5b73c9720bea487b3bffdb1840fe4e3656fba3bd40aa1489e9f37877ff", upload-time = "2026-02-20T20:56:02.527Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/67/8197b7e7e602150938049d8e7f30de1660cfb87e4c8ee349b42b67bdb2e1/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:59b3e2c40f6706b05a9cd299c836c6aa2378cabe25d021acd80f13abf81181cf", upload-time = "2026-02-20T21:02:51.526Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8e/30/3a09155fbf728673a1dea713572d2d31159f824a37c22da82127056c44e4/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b26b0f4428b871a751968285a1ac9648944cea09807177ac639b030bddebcea4", upload-time = "2026-02-20T20:21:05.259Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f3/fd/d05a4b7acd0154ed758797f0a43b4c0962a843bedfe980115e842c5b2d08/greenlet-3.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1fb39a11ee2e4d94be9a76671482be9398560955c9e568550de0224e41104727", upload-time = "2026-02-20T20:49:37.309Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/e1/50ee92a5db521de8f35075b5eff060dd43d39ebd46c2181a2042f7070385/greenlet-3.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:20154044d9085151bc309e7689d6f7ba10027f8f5a8c0676ad398b951913d89e", upload-time = "2026-02-20T20:21:13.427Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/29/4b/45d90626aef8e65336bed690106d1382f7a43665e2249017e9527df8823b/greenlet-3.3.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c04c5e06ec3e022cbfe2cd4a846e1d4e50087444f875ff6d2c2ad8445495cf1a", upload-time = "2026-02-20T20:20:45.786Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a3/51/1664f6b78fc6ebbd98019a1fd730e83fa78f2db7058f72b1463d3612b8db/greenlet-3.3.2.tar.gz", hash = "sha256:2eaf067fc6d886931c7962e8c6bede15d2f01965560f3359b27c80bde2d151f2", size = 188267, upload-time = "2026-02-20T20:54:15.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/3f/9859f655d11901e7b2996c6e3d33e0caa9a1d4572c3bc61ed0faa64b2f4c/greenlet-3.3.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9bc885b89709d901859cf95179ec9f6bb67a3d2bb1f0e88456461bd4b7f8fd0d", size = 277747, upload-time = "2026-02-20T20:16:21.325Z" }, + { url = "https://files.pythonhosted.org/packages/fb/07/cb284a8b5c6498dbd7cba35d31380bb123d7dceaa7907f606c8ff5993cbf/greenlet-3.3.2-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b568183cf65b94919be4438dc28416b234b678c608cafac8874dfeeb2a9bbe13", size = 579202, upload-time = "2026-02-20T20:47:28.955Z" }, + { url = "https://files.pythonhosted.org/packages/ed/45/67922992b3a152f726163b19f890a85129a992f39607a2a53155de3448b8/greenlet-3.3.2-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:527fec58dc9f90efd594b9b700662ed3fb2493c2122067ac9c740d98080a620e", size = 590620, upload-time = "2026-02-20T20:55:55.581Z" }, + { url = "https://files.pythonhosted.org/packages/03/5f/6e2a7d80c353587751ef3d44bb947f0565ec008a2e0927821c007e96d3a7/greenlet-3.3.2-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:508c7f01f1791fbc8e011bd508f6794cb95397fdb198a46cb6635eb5b78d85a7", size = 602132, upload-time = "2026-02-20T21:02:43.261Z" }, + { url = "https://files.pythonhosted.org/packages/ad/55/9f1ebb5a825215fadcc0f7d5073f6e79e3007e3282b14b22d6aba7ca6cb8/greenlet-3.3.2-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad0c8917dd42a819fe77e6bdfcb84e3379c0de956469301d9fd36427a1ca501f", size = 591729, upload-time = "2026-02-20T20:20:58.395Z" }, + { url = "https://files.pythonhosted.org/packages/24/b4/21f5455773d37f94b866eb3cf5caed88d6cea6dd2c6e1f9c34f463cba3ec/greenlet-3.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:97245cc10e5515dbc8c3104b2928f7f02b6813002770cfaffaf9a6e0fc2b94ef", size = 1551946, upload-time = "2026-02-20T20:49:31.102Z" }, + { url = "https://files.pythonhosted.org/packages/00/68/91f061a926abead128fe1a87f0b453ccf07368666bd59ffa46016627a930/greenlet-3.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8c1fdd7d1b309ff0da81d60a9688a8bd044ac4e18b250320a96fc68d31c209ca", size = 1618494, upload-time = "2026-02-20T20:21:06.541Z" }, + { url = "https://files.pythonhosted.org/packages/ac/78/f93e840cbaef8becaf6adafbaf1319682a6c2d8c1c20224267a5c6c8c891/greenlet-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:5d0e35379f93a6d0222de929a25ab47b5eb35b5ef4721c2b9cbcc4036129ff1f", size = 230092, upload-time = "2026-02-20T20:17:09.379Z" }, + { url = "https://files.pythonhosted.org/packages/f3/47/16400cb42d18d7a6bb46f0626852c1718612e35dcb0dffa16bbaffdf5dd2/greenlet-3.3.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:c56692189a7d1c7606cb794be0a8381470d95c57ce5be03fb3d0ef57c7853b86", size = 278890, upload-time = "2026-02-20T20:19:39.263Z" }, + { url = "https://files.pythonhosted.org/packages/a3/90/42762b77a5b6aa96cd8c0e80612663d39211e8ae8a6cd47c7f1249a66262/greenlet-3.3.2-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ebd458fa8285960f382841da585e02201b53a5ec2bac6b156fc623b5ce4499f", size = 581120, upload-time = "2026-02-20T20:47:30.161Z" }, + { url = "https://files.pythonhosted.org/packages/bf/6f/f3d64f4fa0a9c7b5c5b3c810ff1df614540d5aa7d519261b53fba55d4df9/greenlet-3.3.2-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a443358b33c4ec7b05b79a7c8b466f5d275025e750298be7340f8fc63dff2a55", size = 594363, upload-time = "2026-02-20T20:55:56.965Z" }, + { url = "https://files.pythonhosted.org/packages/9c/8b/1430a04657735a3f23116c2e0d5eb10220928846e4537a938a41b350bed6/greenlet-3.3.2-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4375a58e49522698d3e70cc0b801c19433021b5c37686f7ce9c65b0d5c8677d2", size = 605046, upload-time = "2026-02-20T21:02:45.234Z" }, + { url = "https://files.pythonhosted.org/packages/72/83/3e06a52aca8128bdd4dcd67e932b809e76a96ab8c232a8b025b2850264c5/greenlet-3.3.2-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e2cd90d413acbf5e77ae41e5d3c9b3ac1d011a756d7284d7f3f2b806bbd6358", size = 594156, upload-time = "2026-02-20T20:20:59.955Z" }, + { url = "https://files.pythonhosted.org/packages/70/79/0de5e62b873e08fe3cef7dbe84e5c4bc0e8ed0c7ff131bccb8405cd107c8/greenlet-3.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:442b6057453c8cb29b4fb36a2ac689382fc71112273726e2423f7f17dc73bf99", size = 1554649, upload-time = "2026-02-20T20:49:32.293Z" }, + { url = "https://files.pythonhosted.org/packages/5a/00/32d30dee8389dc36d42170a9c66217757289e2afb0de59a3565260f38373/greenlet-3.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:45abe8eb6339518180d5a7fa47fa01945414d7cca5ecb745346fc6a87d2750be", size = 1619472, upload-time = "2026-02-20T20:21:07.966Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3a/efb2cf697fbccdf75b24e2c18025e7dfa54c4f31fab75c51d0fe79942cef/greenlet-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e692b2dae4cc7077cbb11b47d258533b48c8fde69a33d0d8a82e2fe8d8531d5", size = 230389, upload-time = "2026-02-20T20:17:18.772Z" }, + { url = "https://files.pythonhosted.org/packages/e1/a1/65bbc059a43a7e2143ec4fc1f9e3f673e04f9c7b371a494a101422ac4fd5/greenlet-3.3.2-cp311-cp311-win_arm64.whl", hash = "sha256:02b0a8682aecd4d3c6c18edf52bc8e51eacdd75c8eac52a790a210b06aa295fd", size = 229645, upload-time = "2026-02-20T20:18:18.695Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ab/1608e5a7578e62113506740b88066bf09888322a311cff602105e619bd87/greenlet-3.3.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:ac8d61d4343b799d1e526db579833d72f23759c71e07181c2d2944e429eb09cd", size = 280358, upload-time = "2026-02-20T20:17:43.971Z" }, + { url = "https://files.pythonhosted.org/packages/a5/23/0eae412a4ade4e6623ff7626e38998cb9b11e9ff1ebacaa021e4e108ec15/greenlet-3.3.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ceec72030dae6ac0c8ed7591b96b70410a8be370b6a477b1dbc072856ad02bd", size = 601217, upload-time = "2026-02-20T20:47:31.462Z" }, + { url = "https://files.pythonhosted.org/packages/f8/16/5b1678a9c07098ecb9ab2dd159fafaf12e963293e61ee8d10ecb55273e5e/greenlet-3.3.2-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2a5be83a45ce6188c045bcc44b0ee037d6a518978de9a5d97438548b953a1ac", size = 611792, upload-time = "2026-02-20T20:55:58.423Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c5/cc09412a29e43406eba18d61c70baa936e299bc27e074e2be3806ed29098/greenlet-3.3.2-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ae9e21c84035c490506c17002f5c8ab25f980205c3e61ddb3a2a2a2e6c411fcb", size = 626250, upload-time = "2026-02-20T21:02:46.596Z" }, + { url = "https://files.pythonhosted.org/packages/50/1f/5155f55bd71cabd03765a4aac9ac446be129895271f73872c36ebd4b04b6/greenlet-3.3.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43e99d1749147ac21dde49b99c9abffcbc1e2d55c67501465ef0930d6e78e070", size = 613875, upload-time = "2026-02-20T20:21:01.102Z" }, + { url = "https://files.pythonhosted.org/packages/fc/dd/845f249c3fcd69e32df80cdab059b4be8b766ef5830a3d0aa9d6cad55beb/greenlet-3.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c956a19350e2c37f2c48b336a3afb4bff120b36076d9d7fb68cb44e05d95b79", size = 1571467, upload-time = "2026-02-20T20:49:33.495Z" }, + { url = "https://files.pythonhosted.org/packages/2a/50/2649fe21fcc2b56659a452868e695634722a6655ba245d9f77f5656010bf/greenlet-3.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c6f8ba97d17a1e7d664151284cb3315fc5f8353e75221ed4324f84eb162b395", size = 1640001, upload-time = "2026-02-20T20:21:09.154Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/cc802e067d02af8b60b6771cea7d57e21ef5e6659912814babb42b864713/greenlet-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:34308836d8370bddadb41f5a7ce96879b72e2fdfb4e87729330c6ab52376409f", size = 231081, upload-time = "2026-02-20T20:17:28.121Z" }, + { url = "https://files.pythonhosted.org/packages/58/2e/fe7f36ff1982d6b10a60d5e0740c759259a7d6d2e1dc41da6d96de32fff6/greenlet-3.3.2-cp312-cp312-win_arm64.whl", hash = "sha256:d3a62fa76a32b462a97198e4c9e99afb9ab375115e74e9a83ce180e7a496f643", size = 230331, upload-time = "2026-02-20T20:17:23.34Z" }, + { url = "https://files.pythonhosted.org/packages/ac/48/f8b875fa7dea7dd9b33245e37f065af59df6a25af2f9561efa8d822fde51/greenlet-3.3.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:aa6ac98bdfd716a749b84d4034486863fd81c3abde9aa3cf8eff9127981a4ae4", size = 279120, upload-time = "2026-02-20T20:19:01.9Z" }, + { url = "https://files.pythonhosted.org/packages/49/8d/9771d03e7a8b1ee456511961e1b97a6d77ae1dea4a34a5b98eee706689d3/greenlet-3.3.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab0c7e7901a00bc0a7284907273dc165b32e0d109a6713babd04471327ff7986", size = 603238, upload-time = "2026-02-20T20:47:32.873Z" }, + { url = "https://files.pythonhosted.org/packages/59/0e/4223c2bbb63cd5c97f28ffb2a8aee71bdfb30b323c35d409450f51b91e3e/greenlet-3.3.2-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d248d8c23c67d2291ffd47af766e2a3aa9fa1c6703155c099feb11f526c63a92", size = 614219, upload-time = "2026-02-20T20:55:59.817Z" }, + { url = "https://files.pythonhosted.org/packages/94/2b/4d012a69759ac9d77210b8bfb128bc621125f5b20fc398bce3940d036b1c/greenlet-3.3.2-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ccd21bb86944ca9be6d967cf7691e658e43417782bce90b5d2faeda0ff78a7dd", size = 628268, upload-time = "2026-02-20T21:02:48.024Z" }, + { url = "https://files.pythonhosted.org/packages/7a/34/259b28ea7a2a0c904b11cd36c79b8cef8019b26ee5dbe24e73b469dea347/greenlet-3.3.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6997d360a4e6a4e936c0f9625b1c20416b8a0ea18a8e19cabbefc712e7397ab", size = 616774, upload-time = "2026-02-20T20:21:02.454Z" }, + { url = "https://files.pythonhosted.org/packages/0a/03/996c2d1689d486a6e199cb0f1cf9e4aa940c500e01bdf201299d7d61fa69/greenlet-3.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:64970c33a50551c7c50491671265d8954046cb6e8e2999aacdd60e439b70418a", size = 1571277, upload-time = "2026-02-20T20:49:34.795Z" }, + { url = "https://files.pythonhosted.org/packages/d9/c4/2570fc07f34a39f2caf0bf9f24b0a1a0a47bc2e8e465b2c2424821389dfc/greenlet-3.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1a9172f5bf6bd88e6ba5a84e0a68afeac9dc7b6b412b245dd64f52d83c81e55b", size = 1640455, upload-time = "2026-02-20T20:21:10.261Z" }, + { url = "https://files.pythonhosted.org/packages/91/39/5ef5aa23bc545aa0d31e1b9b55822b32c8da93ba657295840b6b34124009/greenlet-3.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:a7945dd0eab63ded0a48e4dcade82939783c172290a7903ebde9e184333ca124", size = 230961, upload-time = "2026-02-20T20:16:58.461Z" }, + { url = "https://files.pythonhosted.org/packages/62/6b/a89f8456dcb06becff288f563618e9f20deed8dd29beea14f9a168aef64b/greenlet-3.3.2-cp313-cp313-win_arm64.whl", hash = "sha256:394ead29063ee3515b4e775216cb756b2e3b4a7e55ae8fd884f17fa579e6b327", size = 230221, upload-time = "2026-02-20T20:17:37.152Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ae/8bffcbd373b57a5992cd077cbe8858fff39110480a9d50697091faea6f39/greenlet-3.3.2-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:8d1658d7291f9859beed69a776c10822a0a799bc4bfe1bd4272bb60e62507dab", size = 279650, upload-time = "2026-02-20T20:18:00.783Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c0/45f93f348fa49abf32ac8439938726c480bd96b2a3c6f4d949ec0124b69f/greenlet-3.3.2-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:18cb1b7337bca281915b3c5d5ae19f4e76d35e1df80f4ad3c1a7be91fadf1082", size = 650295, upload-time = "2026-02-20T20:47:34.036Z" }, + { url = "https://files.pythonhosted.org/packages/b3/de/dd7589b3f2b8372069ab3e4763ea5329940fc7ad9dcd3e272a37516d7c9b/greenlet-3.3.2-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c2e47408e8ce1c6f1ceea0dffcdf6ebb85cc09e55c7af407c99f1112016e45e9", size = 662163, upload-time = "2026-02-20T20:56:01.295Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ac/85804f74f1ccea31ba518dcc8ee6f14c79f73fe36fa1beba38930806df09/greenlet-3.3.2-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e3cb43ce200f59483eb82949bf1835a99cf43d7571e900d7c8d5c62cdf25d2f9", size = 675371, upload-time = "2026-02-20T21:02:49.664Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63d10328839d1973e5ba35e98cccbca71b232b14051fd957b6f8b6e8e80d0506", size = 664160, upload-time = "2026-02-20T20:21:04.015Z" }, + { url = "https://files.pythonhosted.org/packages/48/cf/56832f0c8255d27f6c35d41b5ec91168d74ec721d85f01a12131eec6b93c/greenlet-3.3.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8e4ab3cfb02993c8cc248ea73d7dae6cec0253e9afa311c9b37e603ca9fad2ce", size = 1619181, upload-time = "2026-02-20T20:49:36.052Z" }, + { url = "https://files.pythonhosted.org/packages/0a/23/b90b60a4aabb4cec0796e55f25ffbfb579a907c3898cd2905c8918acaa16/greenlet-3.3.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94ad81f0fd3c0c0681a018a976e5c2bd2ca2d9d94895f23e7bb1af4e8af4e2d5", size = 1687713, upload-time = "2026-02-20T20:21:11.684Z" }, + { url = "https://files.pythonhosted.org/packages/f3/ca/2101ca3d9223a1dc125140dbc063644dca76df6ff356531eb27bc267b446/greenlet-3.3.2-cp314-cp314-win_amd64.whl", hash = "sha256:8c4dd0f3997cf2512f7601563cc90dfb8957c0cff1e3a1b23991d4ea1776c492", size = 232034, upload-time = "2026-02-20T20:20:08.186Z" }, + { url = "https://files.pythonhosted.org/packages/f6/4a/ecf894e962a59dea60f04877eea0fd5724618da89f1867b28ee8b91e811f/greenlet-3.3.2-cp314-cp314-win_arm64.whl", hash = "sha256:cd6f9e2bbd46321ba3bbb4c8a15794d32960e3b0ae2cc4d49a1a53d314805d71", size = 231437, upload-time = "2026-02-20T20:18:59.722Z" }, + { url = "https://files.pythonhosted.org/packages/98/6d/8f2ef704e614bcf58ed43cfb8d87afa1c285e98194ab2cfad351bf04f81e/greenlet-3.3.2-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:e26e72bec7ab387ac80caa7496e0f908ff954f31065b0ffc1f8ecb1338b11b54", size = 286617, upload-time = "2026-02-20T20:19:29.856Z" }, + { url = "https://files.pythonhosted.org/packages/5e/0d/93894161d307c6ea237a43988f27eba0947b360b99ac5239ad3fe09f0b47/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b466dff7a4ffda6ca975979bab80bdadde979e29fc947ac3be4451428d8b0e4", size = 655189, upload-time = "2026-02-20T20:47:35.742Z" }, + { url = "https://files.pythonhosted.org/packages/f5/2c/d2d506ebd8abcb57386ec4f7ba20f4030cbe56eae541bc6fd6ef399c0b41/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b8bddc5b73c9720bea487b3bffdb1840fe4e3656fba3bd40aa1489e9f37877ff", size = 658225, upload-time = "2026-02-20T20:56:02.527Z" }, + { url = "https://files.pythonhosted.org/packages/d1/67/8197b7e7e602150938049d8e7f30de1660cfb87e4c8ee349b42b67bdb2e1/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:59b3e2c40f6706b05a9cd299c836c6aa2378cabe25d021acd80f13abf81181cf", size = 666581, upload-time = "2026-02-20T21:02:51.526Z" }, + { url = "https://files.pythonhosted.org/packages/8e/30/3a09155fbf728673a1dea713572d2d31159f824a37c22da82127056c44e4/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b26b0f4428b871a751968285a1ac9648944cea09807177ac639b030bddebcea4", size = 657907, upload-time = "2026-02-20T20:21:05.259Z" }, + { url = "https://files.pythonhosted.org/packages/f3/fd/d05a4b7acd0154ed758797f0a43b4c0962a843bedfe980115e842c5b2d08/greenlet-3.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1fb39a11ee2e4d94be9a76671482be9398560955c9e568550de0224e41104727", size = 1618857, upload-time = "2026-02-20T20:49:37.309Z" }, + { url = "https://files.pythonhosted.org/packages/6f/e1/50ee92a5db521de8f35075b5eff060dd43d39ebd46c2181a2042f7070385/greenlet-3.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:20154044d9085151bc309e7689d6f7ba10027f8f5a8c0676ad398b951913d89e", size = 1680010, upload-time = "2026-02-20T20:21:13.427Z" }, + { url = "https://files.pythonhosted.org/packages/29/4b/45d90626aef8e65336bed690106d1382f7a43665e2249017e9527df8823b/greenlet-3.3.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c04c5e06ec3e022cbfe2cd4a846e1d4e50087444f875ff6d2c2ad8445495cf1a", size = 237086, upload-time = "2026-02-20T20:20:45.786Z" }, ] [[package]] name = "griffelib" version = "2.0.2" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/9d/82/74f4a3310cdabfbb10da554c3a672847f1ed33c6f61dd472681ce7f1fe67/griffelib-2.0.2.tar.gz", hash = "sha256:3cf20b3bc470e83763ffbf236e0076b1211bac1bc67de13daf494640f2de707e", upload-time = "2026-03-27T11:34:51.091Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/82/74f4a3310cdabfbb10da554c3a672847f1ed33c6f61dd472681ce7f1fe67/griffelib-2.0.2.tar.gz", hash = "sha256:3cf20b3bc470e83763ffbf236e0076b1211bac1bc67de13daf494640f2de707e", size = 166461, upload-time = "2026-03-27T11:34:51.091Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/11/8c/c9138d881c79aa0ea9ed83cbd58d5ca75624378b38cee225dcf5c42cc91f/griffelib-2.0.2-py3-none-any.whl", hash = "sha256:925c857658fb1ba40c0772c37acbc2ab650bd794d9c1b9726922e36ea4117ea1", upload-time = "2026-03-27T11:34:46.275Z" }, + { url = "https://files.pythonhosted.org/packages/11/8c/c9138d881c79aa0ea9ed83cbd58d5ca75624378b38cee225dcf5c42cc91f/griffelib-2.0.2-py3-none-any.whl", hash = "sha256:925c857658fb1ba40c0772c37acbc2ab650bd794d9c1b9726922e36ea4117ea1", size = 142357, upload-time = "2026-03-27T11:34:46.275Z" }, ] [[package]] @@ -1796,59 +1793,59 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "packaging" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/66/13/ef67f59f6a7896fdc2c1d62b5665c5219d6b0a9a1784938eb9a28e55e128/gunicorn-25.1.0.tar.gz", hash = "sha256:1426611d959fa77e7de89f8c0f32eed6aa03ee735f98c01efba3e281b1c47616", upload-time = "2026-02-13T11:09:58.989Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/13/ef67f59f6a7896fdc2c1d62b5665c5219d6b0a9a1784938eb9a28e55e128/gunicorn-25.1.0.tar.gz", hash = "sha256:1426611d959fa77e7de89f8c0f32eed6aa03ee735f98c01efba3e281b1c47616", size = 594377, upload-time = "2026-02-13T11:09:58.989Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/da/73/4ad5b1f6a2e21cf1e85afdaad2b7b1a933985e2f5d679147a1953aaa192c/gunicorn-25.1.0-py3-none-any.whl", hash = "sha256:d0b1236ccf27f72cfe14bce7caadf467186f19e865094ca84221424e839b8b8b", upload-time = "2026-02-13T11:09:57.146Z" }, + { url = "https://files.pythonhosted.org/packages/da/73/4ad5b1f6a2e21cf1e85afdaad2b7b1a933985e2f5d679147a1953aaa192c/gunicorn-25.1.0-py3-none-any.whl", hash = "sha256:d0b1236ccf27f72cfe14bce7caadf467186f19e865094ca84221424e839b8b8b", size = 197067, upload-time = "2026-02-13T11:09:57.146Z" }, ] [[package]] name = "h11" version = "0.16.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", upload-time = "2025-04-24T03:35:25.427Z" } +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://pypi-proxy.dev.databricks.com/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", upload-time = "2025-04-24T03:35:24.344Z" }, + { 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 = "hf-xet" version = "1.5.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/74/d8/5c06fc76461418326a7decf8367480c35be11a41fd938633929c60a9ec6b/hf_xet-1.5.0.tar.gz", hash = "sha256:e0fb0a34d9f406eed88233e829a67ec016bec5af19e480eac65a233ea289a948", upload-time = "2026-05-06T06:18:15.583Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/68/9b/6912c99070915a4f28119e3c5b52a9abd1eec0ad5cb293b8c967a0c6f5a2/hf_xet-1.5.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:7d70fe2ce97b9db73b9c9b9c81fe3693640aec83416a966c446afea54acfae3c", upload-time = "2026-05-06T06:17:53.947Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0f/6d/9563cfde59b5d8128a9c7ec972a087f4c782e4f7bac5a85234edfd5d5e49/hf_xet-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:73a0dae8c71de3b0633a45c73f4a4a5ed09e94b43441d82981a781d4f12baa42", upload-time = "2026-05-06T06:17:51.791Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/07/a5/ed5a0cf35b49a0571af5a8f53416dad1877a718c021c9937c3a53cb45781/hf_xet-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a60290ec57e9b71767fba7c3645ddafdd0759974b540441510c629c6db6db24a", upload-time = "2026-05-06T06:17:40.735Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/60/fb/3ae8bf2a7a37a4197d0195d7247fd25b3952e15cb8a599e285dfaa6f52b3/hf_xet-1.5.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:e5de0f6deada0dada870bb376a11bcd1f08abf3a968a6d118f33e72d1b1eb480", upload-time = "2026-05-06T06:17:38.412Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a2/9b/8bae40d4d91525085137196e84eb0ed49cf65b5e96e5c3ecdadd8bd0fac2/hf_xet-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c799d49f1a5544a0ef7591c0ee75e0d6b93d6f56dc7a4979f59f7518d2872216", upload-time = "2026-05-06T06:18:04.219Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/13/59/c74efbbd4e8728172b2cc72a2bc014d2947a4b7bdced932fbd3f5da1a4e5/hf_xet-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2baea1b0b989e5c152fe81425f7745ddc8901280ba3d97c98d8cdece7b706c60", upload-time = "2026-05-06T06:18:06.1Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/32/8e1e0410af64cda9b139d1dcebdc993a8ff9c8c7c0e2696ae356d75ccc0d/hf_xet-1.5.0-cp313-cp313t-win_amd64.whl", hash = "sha256:526345b3ed45f374f6317349df489167606736c876241ba984105afe7fd4839d", upload-time = "2026-05-06T06:18:19.74Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fc/34/a8febc8f4edbea8b3e21b02ebc8b628679b84ba7e45cde624a7736b51500/hf_xet-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:786d28e2eb8315d5035544b9d137b4a842d600c434bb91bf7d0d953cce906ad4", upload-time = "2026-05-06T06:18:17.568Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/20/8fc8996afe5815fa1a6be8e9e5c02f24500f409d599e905800d498a4e14d/hf_xet-1.5.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:872d5601e6deea30d15865ede55d29eac6daf5a534ab417b99b6ef6b076dd96c", upload-time = "2026-05-06T06:18:01.94Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/32/6a/93d84463c00cecb561a7508aa6303e35ee2894294eac14245526924415fe/hf_xet-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9929561f5abf4581c8ea79587881dfef6b8abb2a0d8a51915936fc2a614f4e73", upload-time = "2026-05-06T06:18:00.021Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9d/5a/8ec8e0c863b382d00b3c2e2af6ded6b06371be617144a625903a6d562f4b/hf_xet-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f7b7bbae318e583a86fb21e5a4a175d6721d628a2874f4bd022d0e660c32a682", upload-time = "2026-05-06T06:17:49.574Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c5/ca/f7effa1a67717da2bcc6b6c28f71c6ca648c77acaec4e2c32f40cbe16d85/hf_xet-1.5.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:cf7b2dc6f31a4ea754bb50f74cde482dcf5d366d184076d8530b9872787f3761", upload-time = "2026-05-06T06:17:47.096Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/65/f2/19247dba3e231cf77dec59ddfb878f00057635ff773d099c9b59d37812c3/hf_xet-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8dbcbab554c9ef158ef2c991545c3e970ddd8cc7acdcd0a78c5a41095dab4ded", upload-time = "2026-05-06T06:18:11.983Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7f/64/6f116801a3bcfb6f59f5c251f48cadc47ea54026441c4a385079286a94fa/hf_xet-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5906bf7718d3636dc13402914736abe723492cb730f744834f5f5b67d3a12702", upload-time = "2026-05-06T06:18:13.771Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5c/e8/069542d37946ed08669b127e1496fa99e78196d71de8d41eda5e9f1b7a58/hf_xet-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5f3dc2248fc01cc0a00cd392ab497f1ca373fcbc7e3f2da1f452480b384e839e", upload-time = "2026-05-06T06:18:28.162Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/91/fc6fdec27b14d04e88c386ac0a0129732b53fa23f7c4a78f4b83a039c567/hf_xet-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:b285cea1b5bab46b758772716ba8d6854a1a0310fed1c249d678a8b38601e5a0", upload-time = "2026-05-06T06:18:26.287Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/fb/69ff198a82cae7eb1a69fb84d93b3a3e4816564d76817fe541ddc96874eb/hf_xet-1.5.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:dad0dc84e941b8ba3c860659fe1fdc35c049d47cce293f003287757e971a8f56", upload-time = "2026-05-06T06:17:57.933Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9b/ff/edcc2b40162bef3ff78e14ab637e5f3b89243d6aee72f5949d3bb6a5af83/hf_xet-1.5.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:fd6e5a9b0fdac4ed03ed45ef79254a655b1aaab514a02202617fbf643f5fdf7a", upload-time = "2026-05-06T06:17:55.79Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/4d/103f76b04310e5e57656696cc184690d20c466af0bca3ca88f8c8ea5d4f3/hf_xet-1.5.0-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3531b1823a0e6d77d80f9ed15ca0e00f0d115094f8ac033d5cae88f4564cc949", upload-time = "2026-05-06T06:17:44.886Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c4/a2/546f47f464737b3edbab6f8ddb57f2599b93d2cbb66f06abb475ccb48651/hf_xet-1.5.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9a0ee58cd18d5ea799f7ed11290bbccbe56bdd8b1d97ca74b9cc49a3945d7a3b", upload-time = "2026-05-06T06:17:42.639Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/95/7f/1be593c1f28613be2e196473481cd81bfc5910795e30a34e8f744f6cac4f/hf_xet-1.5.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1e60df5a42e9bed8628b6416af2cba4cba57ae9f02de226a06b020d98e1aab18", upload-time = "2026-05-06T06:18:08.026Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/b2/703569fc881f3284487e68cda7b42179978480da3c438042a6bbbb4a671c/hf_xet-1.5.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4b35549ce62601b84da4ff9b24d970032ace3d4430f52d91bcbb26c901d6c690", upload-time = "2026-05-06T06:18:09.864Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/af/37/1b6def445c567286b50aa3b33828158e135b1be44938dde59f11382a500c/hf_xet-1.5.0-cp37-abi3-win_amd64.whl", hash = "sha256:2806c7c17b4d23f8d88f7c4814f838c3b6150773fe339c20af23e1cfaf2797e4", upload-time = "2026-05-06T06:18:23.621Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/62/94/3b66b148778ee100dcfd69c2ca22b57b41b44d3063ceec934f209e9184ce/hf_xet-1.5.0-cp37-abi3-win_arm64.whl", hash = "sha256:b6c9df403040248c76d808d3e047d64db2d923bae593eb244c41e425cf6cd7be", upload-time = "2026-05-06T06:18:21.7Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/74/d8/5c06fc76461418326a7decf8367480c35be11a41fd938633929c60a9ec6b/hf_xet-1.5.0.tar.gz", hash = "sha256:e0fb0a34d9f406eed88233e829a67ec016bec5af19e480eac65a233ea289a948", size = 837196, upload-time = "2026-05-06T06:18:15.583Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/9b/6912c99070915a4f28119e3c5b52a9abd1eec0ad5cb293b8c967a0c6f5a2/hf_xet-1.5.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:7d70fe2ce97b9db73b9c9b9c81fe3693640aec83416a966c446afea54acfae3c", size = 4023383, upload-time = "2026-05-06T06:17:53.947Z" }, + { url = "https://files.pythonhosted.org/packages/0f/6d/9563cfde59b5d8128a9c7ec972a087f4c782e4f7bac5a85234edfd5d5e49/hf_xet-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:73a0dae8c71de3b0633a45c73f4a4a5ed09e94b43441d82981a781d4f12baa42", size = 3792751, upload-time = "2026-05-06T06:17:51.791Z" }, + { url = "https://files.pythonhosted.org/packages/07/a5/ed5a0cf35b49a0571af5a8f53416dad1877a718c021c9937c3a53cb45781/hf_xet-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a60290ec57e9b71767fba7c3645ddafdd0759974b540441510c629c6db6db24a", size = 4456058, upload-time = "2026-05-06T06:17:40.735Z" }, + { url = "https://files.pythonhosted.org/packages/60/fb/3ae8bf2a7a37a4197d0195d7247fd25b3952e15cb8a599e285dfaa6f52b3/hf_xet-1.5.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:e5de0f6deada0dada870bb376a11bcd1f08abf3a968a6d118f33e72d1b1eb480", size = 4250783, upload-time = "2026-05-06T06:17:38.412Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9b/8bae40d4d91525085137196e84eb0ed49cf65b5e96e5c3ecdadd8bd0fac2/hf_xet-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c799d49f1a5544a0ef7591c0ee75e0d6b93d6f56dc7a4979f59f7518d2872216", size = 4445594, upload-time = "2026-05-06T06:18:04.219Z" }, + { url = "https://files.pythonhosted.org/packages/13/59/c74efbbd4e8728172b2cc72a2bc014d2947a4b7bdced932fbd3f5da1a4e5/hf_xet-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2baea1b0b989e5c152fe81425f7745ddc8901280ba3d97c98d8cdece7b706c60", size = 4663995, upload-time = "2026-05-06T06:18:06.1Z" }, + { url = "https://files.pythonhosted.org/packages/73/32/8e1e0410af64cda9b139d1dcebdc993a8ff9c8c7c0e2696ae356d75ccc0d/hf_xet-1.5.0-cp313-cp313t-win_amd64.whl", hash = "sha256:526345b3ed45f374f6317349df489167606736c876241ba984105afe7fd4839d", size = 3966608, upload-time = "2026-05-06T06:18:19.74Z" }, + { url = "https://files.pythonhosted.org/packages/fc/34/a8febc8f4edbea8b3e21b02ebc8b628679b84ba7e45cde624a7736b51500/hf_xet-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:786d28e2eb8315d5035544b9d137b4a842d600c434bb91bf7d0d953cce906ad4", size = 3796946, upload-time = "2026-05-06T06:18:17.568Z" }, + { url = "https://files.pythonhosted.org/packages/2a/20/8fc8996afe5815fa1a6be8e9e5c02f24500f409d599e905800d498a4e14d/hf_xet-1.5.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:872d5601e6deea30d15865ede55d29eac6daf5a534ab417b99b6ef6b076dd96c", size = 4023495, upload-time = "2026-05-06T06:18:01.94Z" }, + { url = "https://files.pythonhosted.org/packages/32/6a/93d84463c00cecb561a7508aa6303e35ee2894294eac14245526924415fe/hf_xet-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9929561f5abf4581c8ea79587881dfef6b8abb2a0d8a51915936fc2a614f4e73", size = 3792731, upload-time = "2026-05-06T06:18:00.021Z" }, + { url = "https://files.pythonhosted.org/packages/9d/5a/8ec8e0c863b382d00b3c2e2af6ded6b06371be617144a625903a6d562f4b/hf_xet-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f7b7bbae318e583a86fb21e5a4a175d6721d628a2874f4bd022d0e660c32a682", size = 4456738, upload-time = "2026-05-06T06:17:49.574Z" }, + { url = "https://files.pythonhosted.org/packages/c5/ca/f7effa1a67717da2bcc6b6c28f71c6ca648c77acaec4e2c32f40cbe16d85/hf_xet-1.5.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:cf7b2dc6f31a4ea754bb50f74cde482dcf5d366d184076d8530b9872787f3761", size = 4251622, upload-time = "2026-05-06T06:17:47.096Z" }, + { url = "https://files.pythonhosted.org/packages/65/f2/19247dba3e231cf77dec59ddfb878f00057635ff773d099c9b59d37812c3/hf_xet-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8dbcbab554c9ef158ef2c991545c3e970ddd8cc7acdcd0a78c5a41095dab4ded", size = 4445667, upload-time = "2026-05-06T06:18:11.983Z" }, + { url = "https://files.pythonhosted.org/packages/7f/64/6f116801a3bcfb6f59f5c251f48cadc47ea54026441c4a385079286a94fa/hf_xet-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5906bf7718d3636dc13402914736abe723492cb730f744834f5f5b67d3a12702", size = 4664619, upload-time = "2026-05-06T06:18:13.771Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e8/069542d37946ed08669b127e1496fa99e78196d71de8d41eda5e9f1b7a58/hf_xet-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:5f3dc2248fc01cc0a00cd392ab497f1ca373fcbc7e3f2da1f452480b384e839e", size = 3966802, upload-time = "2026-05-06T06:18:28.162Z" }, + { url = "https://files.pythonhosted.org/packages/f9/91/fc6fdec27b14d04e88c386ac0a0129732b53fa23f7c4a78f4b83a039c567/hf_xet-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:b285cea1b5bab46b758772716ba8d6854a1a0310fed1c249d678a8b38601e5a0", size = 3797168, upload-time = "2026-05-06T06:18:26.287Z" }, + { url = "https://files.pythonhosted.org/packages/3d/fb/69ff198a82cae7eb1a69fb84d93b3a3e4816564d76817fe541ddc96874eb/hf_xet-1.5.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:dad0dc84e941b8ba3c860659fe1fdc35c049d47cce293f003287757e971a8f56", size = 4030814, upload-time = "2026-05-06T06:17:57.933Z" }, + { url = "https://files.pythonhosted.org/packages/9b/ff/edcc2b40162bef3ff78e14ab637e5f3b89243d6aee72f5949d3bb6a5af83/hf_xet-1.5.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:fd6e5a9b0fdac4ed03ed45ef79254a655b1aaab514a02202617fbf643f5fdf7a", size = 3798444, upload-time = "2026-05-06T06:17:55.79Z" }, + { url = "https://files.pythonhosted.org/packages/49/4d/103f76b04310e5e57656696cc184690d20c466af0bca3ca88f8c8ea5d4f3/hf_xet-1.5.0-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3531b1823a0e6d77d80f9ed15ca0e00f0d115094f8ac033d5cae88f4564cc949", size = 4465986, upload-time = "2026-05-06T06:17:44.886Z" }, + { url = "https://files.pythonhosted.org/packages/c4/a2/546f47f464737b3edbab6f8ddb57f2599b93d2cbb66f06abb475ccb48651/hf_xet-1.5.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:9a0ee58cd18d5ea799f7ed11290bbccbe56bdd8b1d97ca74b9cc49a3945d7a3b", size = 4259865, upload-time = "2026-05-06T06:17:42.639Z" }, + { url = "https://files.pythonhosted.org/packages/95/7f/1be593c1f28613be2e196473481cd81bfc5910795e30a34e8f744f6cac4f/hf_xet-1.5.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1e60df5a42e9bed8628b6416af2cba4cba57ae9f02de226a06b020d98e1aab18", size = 4459835, upload-time = "2026-05-06T06:18:08.026Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b2/703569fc881f3284487e68cda7b42179978480da3c438042a6bbbb4a671c/hf_xet-1.5.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4b35549ce62601b84da4ff9b24d970032ace3d4430f52d91bcbb26c901d6c690", size = 4672414, upload-time = "2026-05-06T06:18:09.864Z" }, + { url = "https://files.pythonhosted.org/packages/af/37/1b6def445c567286b50aa3b33828158e135b1be44938dde59f11382a500c/hf_xet-1.5.0-cp37-abi3-win_amd64.whl", hash = "sha256:2806c7c17b4d23f8d88f7c4814f838c3b6150773fe339c20af23e1cfaf2797e4", size = 3977238, upload-time = "2026-05-06T06:18:23.621Z" }, + { url = "https://files.pythonhosted.org/packages/62/94/3b66b148778ee100dcfd69c2ca22b57b41b44d3063ceec934f209e9184ce/hf_xet-1.5.0-cp37-abi3-win_arm64.whl", hash = "sha256:b6c9df403040248c76d808d3e047d64db2d923bae593eb244c41e425cf6cd7be", size = 3806916, upload-time = "2026-05-06T06:18:21.7Z" }, ] [[package]] name = "html5rdf" version = "1.2.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/4c/55/1b839c43f5ed8207e17a9a02d8b395179520b8b4f00c00a41e113bc205ca/html5rdf-1.2.1.tar.gz", hash = "sha256:ace9b420ce52995bb4f05e7425eedf19e433c981dfe7a831ab391e2fa2e1a195", upload-time = "2024-10-30T05:06:56.384Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/55/1b839c43f5ed8207e17a9a02d8b395179520b8b4f00c00a41e113bc205ca/html5rdf-1.2.1.tar.gz", hash = "sha256:ace9b420ce52995bb4f05e7425eedf19e433c981dfe7a831ab391e2fa2e1a195", size = 287899, upload-time = "2024-10-30T05:06:56.384Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/7d/c9/f6e1e8567660bc5b0aba281f2b0017b2a7665fcad6bf3ed67286a0c72cd4/html5rdf-1.2.1-py2.py3-none-any.whl", hash = "sha256:1f519121bc366af3e485310dc8041d2e86e5173c1a320fac3dc9d2604069b83e", upload-time = "2024-10-30T05:06:52.507Z" }, + { url = "https://files.pythonhosted.org/packages/7d/c9/f6e1e8567660bc5b0aba281f2b0017b2a7665fcad6bf3ed67286a0c72cd4/html5rdf-1.2.1-py2.py3-none-any.whl", hash = "sha256:1f519121bc366af3e485310dc8041d2e86e5173c1a320fac3dc9d2604069b83e", size = 109765, upload-time = "2024-10-30T05:06:52.507Z" }, ] [[package]] @@ -1859,52 +1856,52 @@ dependencies = [ { name = "certifi" }, { name = "h11" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", upload-time = "2025-04-24T22:06:22.219Z" } +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://pypi-proxy.dev.databricks.com/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", upload-time = "2025-04-24T22:06:20.566Z" }, + { 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.7.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", upload-time = "2025-10-10T03:55:08.559Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/e5/c07e0bcf4ec8db8164e9f6738c048b2e66aabf30e7506f440c4cc6953f60/httptools-0.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:11d01b0ff1fe02c4c32d60af61a4d613b74fad069e47e06e9067758c01e9ac78", upload-time = "2025-10-10T03:54:20.887Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7e/4f/35e3a63f863a659f92ffd92bef131f3e81cf849af26e6435b49bd9f6f751/httptools-0.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d86c1e5afdc479a6fdabf570be0d3eb791df0ae727e8dbc0259ed1249998d4", upload-time = "2025-10-10T03:54:22.455Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/71/b0a9193641d9e2471ac541d3b1b869538a5fb6419d52fd2669fa9c79e4b8/httptools-0.7.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c8c751014e13d88d2be5f5f14fc8b89612fcfa92a9cc480f2bc1598357a23a05", upload-time = "2025-10-10T03:54:23.753Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/eb/d9/2e34811397b76718750fea44658cb0205b84566e895192115252e008b152/httptools-0.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:654968cb6b6c77e37b832a9be3d3ecabb243bbe7a0b8f65fbc5b6b04c8fcabed", upload-time = "2025-10-10T03:54:25.313Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/01/3f/a04626ebeacc489866bb4d82362c0657b2262bef381d68310134be7f40bb/httptools-0.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b580968316348b474b020edf3988eecd5d6eec4634ee6561e72ae3a2a0e00a8a", upload-time = "2025-10-10T03:54:26.81Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a5/99/adcd4f66614db627b587627c8ad6f4c55f18881549bab10ecf180562e7b9/httptools-0.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d496e2f5245319da9d764296e86c5bb6fcf0cf7a8806d3d000717a889c8c0b7b", upload-time = "2025-10-10T03:54:28.174Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/72/ec8fc904a8fd30ba022dfa85f3bbc64c3c7cd75b669e24242c0658e22f3c/httptools-0.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cbf8317bfccf0fed3b5680c559d3459cccf1abe9039bfa159e62e391c7270568", upload-time = "2025-10-10T03:54:29.5Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", upload-time = "2025-10-10T03:54:31.002Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", upload-time = "2025-10-10T03:54:31.941Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", upload-time = "2025-10-10T03:54:33.176Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", upload-time = "2025-10-10T03:54:34.226Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", upload-time = "2025-10-10T03:54:35.942Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", upload-time = "2025-10-10T03:54:37.1Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/07/5b614f592868e07f5c94b1f301b5e14a21df4e8076215a3bccb830a687d8/httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb", upload-time = "2025-10-10T03:54:38.421Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", upload-time = "2025-10-10T03:54:39.274Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", upload-time = "2025-10-10T03:54:40.403Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", upload-time = "2025-10-10T03:54:41.347Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", upload-time = "2025-10-10T03:54:42.452Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", upload-time = "2025-10-10T03:54:43.937Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", upload-time = "2025-10-10T03:54:45.003Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/de/40a8f202b987d43afc4d54689600ff03ce65680ede2f31df348d7f368b8f/httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321", upload-time = "2025-10-10T03:54:45.923Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", upload-time = "2025-10-10T03:54:47.089Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", upload-time = "2025-10-10T03:54:48.052Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", upload-time = "2025-10-10T03:54:48.919Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", upload-time = "2025-10-10T03:54:49.993Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", upload-time = "2025-10-10T03:54:51.066Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", upload-time = "2025-10-10T03:54:52.196Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", upload-time = "2025-10-10T03:54:53.448Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", upload-time = "2025-10-10T03:54:54.321Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", upload-time = "2025-10-10T03:54:55.163Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", upload-time = "2025-10-10T03:54:56.056Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", upload-time = "2025-10-10T03:54:57.219Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", upload-time = "2025-10-10T03:54:58.219Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", upload-time = "2025-10-10T03:54:59.366Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", upload-time = "2025-10-10T03:55:00.389Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/b5/46/120a669232c7bdedb9d52d4aeae7e6c7dfe151e99dc70802e2fc7a5e1993/httptools-0.7.1.tar.gz", hash = "sha256:abd72556974f8e7c74a259655924a717a2365b236c882c3f6f8a45fe94703ac9", size = 258961, upload-time = "2025-10-10T03:55:08.559Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/e5/c07e0bcf4ec8db8164e9f6738c048b2e66aabf30e7506f440c4cc6953f60/httptools-0.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:11d01b0ff1fe02c4c32d60af61a4d613b74fad069e47e06e9067758c01e9ac78", size = 204531, upload-time = "2025-10-10T03:54:20.887Z" }, + { url = "https://files.pythonhosted.org/packages/7e/4f/35e3a63f863a659f92ffd92bef131f3e81cf849af26e6435b49bd9f6f751/httptools-0.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d86c1e5afdc479a6fdabf570be0d3eb791df0ae727e8dbc0259ed1249998d4", size = 109408, upload-time = "2025-10-10T03:54:22.455Z" }, + { url = "https://files.pythonhosted.org/packages/f5/71/b0a9193641d9e2471ac541d3b1b869538a5fb6419d52fd2669fa9c79e4b8/httptools-0.7.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c8c751014e13d88d2be5f5f14fc8b89612fcfa92a9cc480f2bc1598357a23a05", size = 440889, upload-time = "2025-10-10T03:54:23.753Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d9/2e34811397b76718750fea44658cb0205b84566e895192115252e008b152/httptools-0.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:654968cb6b6c77e37b832a9be3d3ecabb243bbe7a0b8f65fbc5b6b04c8fcabed", size = 440460, upload-time = "2025-10-10T03:54:25.313Z" }, + { url = "https://files.pythonhosted.org/packages/01/3f/a04626ebeacc489866bb4d82362c0657b2262bef381d68310134be7f40bb/httptools-0.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b580968316348b474b020edf3988eecd5d6eec4634ee6561e72ae3a2a0e00a8a", size = 425267, upload-time = "2025-10-10T03:54:26.81Z" }, + { url = "https://files.pythonhosted.org/packages/a5/99/adcd4f66614db627b587627c8ad6f4c55f18881549bab10ecf180562e7b9/httptools-0.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d496e2f5245319da9d764296e86c5bb6fcf0cf7a8806d3d000717a889c8c0b7b", size = 424429, upload-time = "2025-10-10T03:54:28.174Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/ec8fc904a8fd30ba022dfa85f3bbc64c3c7cd75b669e24242c0658e22f3c/httptools-0.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cbf8317bfccf0fed3b5680c559d3459cccf1abe9039bfa159e62e391c7270568", size = 86173, upload-time = "2025-10-10T03:54:29.5Z" }, + { url = "https://files.pythonhosted.org/packages/9c/08/17e07e8d89ab8f343c134616d72eebfe03798835058e2ab579dcc8353c06/httptools-0.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:474d3b7ab469fefcca3697a10d11a32ee2b9573250206ba1e50d5980910da657", size = 206521, upload-time = "2025-10-10T03:54:31.002Z" }, + { url = "https://files.pythonhosted.org/packages/aa/06/c9c1b41ff52f16aee526fd10fbda99fa4787938aa776858ddc4a1ea825ec/httptools-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3c3b7366bb6c7b96bd72d0dbe7f7d5eead261361f013be5f6d9590465ea1c70", size = 110375, upload-time = "2025-10-10T03:54:31.941Z" }, + { url = "https://files.pythonhosted.org/packages/cc/cc/10935db22fda0ee34c76f047590ca0a8bd9de531406a3ccb10a90e12ea21/httptools-0.7.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:379b479408b8747f47f3b253326183d7c009a3936518cdb70db58cffd369d9df", size = 456621, upload-time = "2025-10-10T03:54:33.176Z" }, + { url = "https://files.pythonhosted.org/packages/0e/84/875382b10d271b0c11aa5d414b44f92f8dd53e9b658aec338a79164fa548/httptools-0.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cad6b591a682dcc6cf1397c3900527f9affef1e55a06c4547264796bbd17cf5e", size = 454954, upload-time = "2025-10-10T03:54:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/30/e1/44f89b280f7e46c0b1b2ccee5737d46b3bb13136383958f20b580a821ca0/httptools-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eb844698d11433d2139bbeeb56499102143beb582bd6c194e3ba69c22f25c274", size = 440175, upload-time = "2025-10-10T03:54:35.942Z" }, + { url = "https://files.pythonhosted.org/packages/6f/7e/b9287763159e700e335028bc1824359dc736fa9b829dacedace91a39b37e/httptools-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f65744d7a8bdb4bda5e1fa23e4ba16832860606fcc09d674d56e425e991539ec", size = 440310, upload-time = "2025-10-10T03:54:37.1Z" }, + { url = "https://files.pythonhosted.org/packages/b3/07/5b614f592868e07f5c94b1f301b5e14a21df4e8076215a3bccb830a687d8/httptools-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:135fbe974b3718eada677229312e97f3b31f8a9c8ffa3ae6f565bf808d5b6bcb", size = 86875, upload-time = "2025-10-10T03:54:38.421Z" }, + { url = "https://files.pythonhosted.org/packages/53/7f/403e5d787dc4942316e515e949b0c8a013d84078a915910e9f391ba9b3ed/httptools-0.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:38e0c83a2ea9746ebbd643bdfb521b9aa4a91703e2cd705c20443405d2fd16a5", size = 206280, upload-time = "2025-10-10T03:54:39.274Z" }, + { url = "https://files.pythonhosted.org/packages/2a/0d/7f3fd28e2ce311ccc998c388dd1c53b18120fda3b70ebb022b135dc9839b/httptools-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f25bbaf1235e27704f1a7b86cd3304eabc04f569c828101d94a0e605ef7205a5", size = 110004, upload-time = "2025-10-10T03:54:40.403Z" }, + { url = "https://files.pythonhosted.org/packages/84/a6/b3965e1e146ef5762870bbe76117876ceba51a201e18cc31f5703e454596/httptools-0.7.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c15f37ef679ab9ecc06bfc4e6e8628c32a8e4b305459de7cf6785acd57e4d03", size = 517655, upload-time = "2025-10-10T03:54:41.347Z" }, + { url = "https://files.pythonhosted.org/packages/11/7d/71fee6f1844e6fa378f2eddde6c3e41ce3a1fb4b2d81118dd544e3441ec0/httptools-0.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fe6e96090df46b36ccfaf746f03034e5ab723162bc51b0a4cf58305324036f2", size = 511440, upload-time = "2025-10-10T03:54:42.452Z" }, + { url = "https://files.pythonhosted.org/packages/22/a5/079d216712a4f3ffa24af4a0381b108aa9c45b7a5cc6eb141f81726b1823/httptools-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f72fdbae2dbc6e68b8239defb48e6a5937b12218e6ffc2c7846cc37befa84362", size = 495186, upload-time = "2025-10-10T03:54:43.937Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/025ad7b65278745dee3bd0ebf9314934c4592560878308a6121f7f812084/httptools-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e99c7b90a29fd82fea9ef57943d501a16f3404d7b9ee81799d41639bdaae412c", size = 499192, upload-time = "2025-10-10T03:54:45.003Z" }, + { url = "https://files.pythonhosted.org/packages/6d/de/40a8f202b987d43afc4d54689600ff03ce65680ede2f31df348d7f368b8f/httptools-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3e14f530fefa7499334a79b0cf7e7cd2992870eb893526fb097d51b4f2d0f321", size = 86694, upload-time = "2025-10-10T03:54:45.923Z" }, + { url = "https://files.pythonhosted.org/packages/09/8f/c77b1fcbfd262d422f12da02feb0d218fa228d52485b77b953832105bb90/httptools-0.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6babce6cfa2a99545c60bfef8bee0cc0545413cb0018f617c8059a30ad985de3", size = 202889, upload-time = "2025-10-10T03:54:47.089Z" }, + { url = "https://files.pythonhosted.org/packages/0a/1a/22887f53602feaa066354867bc49a68fc295c2293433177ee90870a7d517/httptools-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:601b7628de7504077dd3dcb3791c6b8694bbd967148a6d1f01806509254fb1ca", size = 108180, upload-time = "2025-10-10T03:54:48.052Z" }, + { url = "https://files.pythonhosted.org/packages/32/6a/6aaa91937f0010d288d3d124ca2946d48d60c3a5ee7ca62afe870e3ea011/httptools-0.7.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:04c6c0e6c5fb0739c5b8a9eb046d298650a0ff38cf42537fc372b28dc7e4472c", size = 478596, upload-time = "2025-10-10T03:54:48.919Z" }, + { url = "https://files.pythonhosted.org/packages/6d/70/023d7ce117993107be88d2cbca566a7c1323ccbaf0af7eabf2064fe356f6/httptools-0.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69d4f9705c405ae3ee83d6a12283dc9feba8cc6aaec671b412917e644ab4fa66", size = 473268, upload-time = "2025-10-10T03:54:49.993Z" }, + { url = "https://files.pythonhosted.org/packages/32/4d/9dd616c38da088e3f436e9a616e1d0cc66544b8cdac405cc4e81c8679fc7/httptools-0.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:44c8f4347d4b31269c8a9205d8a5ee2df5322b09bbbd30f8f862185bb6b05346", size = 455517, upload-time = "2025-10-10T03:54:51.066Z" }, + { url = "https://files.pythonhosted.org/packages/1d/3a/a6c595c310b7df958e739aae88724e24f9246a514d909547778d776799be/httptools-0.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:465275d76db4d554918aba40bf1cbebe324670f3dfc979eaffaa5d108e2ed650", size = 458337, upload-time = "2025-10-10T03:54:52.196Z" }, + { url = "https://files.pythonhosted.org/packages/fd/82/88e8d6d2c51edc1cc391b6e044c6c435b6aebe97b1abc33db1b0b24cd582/httptools-0.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:322d00c2068d125bd570f7bf78b2d367dad02b919d8581d7476d8b75b294e3e6", size = 85743, upload-time = "2025-10-10T03:54:53.448Z" }, + { url = "https://files.pythonhosted.org/packages/34/50/9d095fcbb6de2d523e027a2f304d4551855c2f46e0b82befd718b8b20056/httptools-0.7.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:c08fe65728b8d70b6923ce31e3956f859d5e1e8548e6f22ec520a962c6757270", size = 203619, upload-time = "2025-10-10T03:54:54.321Z" }, + { url = "https://files.pythonhosted.org/packages/07/f0/89720dc5139ae54b03f861b5e2c55a37dba9a5da7d51e1e824a1f343627f/httptools-0.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:7aea2e3c3953521c3c51106ee11487a910d45586e351202474d45472db7d72d3", size = 108714, upload-time = "2025-10-10T03:54:55.163Z" }, + { url = "https://files.pythonhosted.org/packages/b3/cb/eea88506f191fb552c11787c23f9a405f4c7b0c5799bf73f2249cd4f5228/httptools-0.7.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0e68b8582f4ea9166be62926077a3334064d422cf08ab87d8b74664f8e9058e1", size = 472909, upload-time = "2025-10-10T03:54:56.056Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4a/a548bdfae6369c0d078bab5769f7b66f17f1bfaa6fa28f81d6be6959066b/httptools-0.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df091cf961a3be783d6aebae963cc9b71e00d57fa6f149025075217bc6a55a7b", size = 470831, upload-time = "2025-10-10T03:54:57.219Z" }, + { url = "https://files.pythonhosted.org/packages/4d/31/14df99e1c43bd132eec921c2e7e11cda7852f65619bc0fc5bdc2d0cb126c/httptools-0.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:f084813239e1eb403ddacd06a30de3d3e09a9b76e7894dcda2b22f8a726e9c60", size = 452631, upload-time = "2025-10-10T03:54:58.219Z" }, + { url = "https://files.pythonhosted.org/packages/22/d2/b7e131f7be8d854d48cb6d048113c30f9a46dca0c9a8b08fcb3fcd588cdc/httptools-0.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7347714368fb2b335e9063bc2b96f2f87a9ceffcd9758ac295f8bbcd3ffbc0ca", size = 452910, upload-time = "2025-10-10T03:54:59.366Z" }, + { url = "https://files.pythonhosted.org/packages/53/cf/878f3b91e4e6e011eff6d1fa9ca39f7eb17d19c9d7971b04873734112f30/httptools-0.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:cfabda2a5bb85aa2a904ce06d974a3f30fb36cc63d7feaddec05d2050acede96", size = 88205, upload-time = "2025-10-10T03:55:00.389Z" }, ] [[package]] @@ -1917,27 +1914,27 @@ dependencies = [ { name = "httpcore" }, { name = "idna" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", upload-time = "2024-12-06T15:37:23.222Z" } +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://pypi-proxy.dev.databricks.com/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", upload-time = "2024-12-06T15:37:21.509Z" }, + { 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 = "httpx-sse" version = "0.4.3" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/0f/4c/751061ffa58615a32c31b2d82e8482be8dd4a89154f003147acee90f2be9/httpx_sse-0.4.3.tar.gz", hash = "sha256:9b1ed0127459a66014aec3c56bebd93da3c1bc8bb6618c8082039a44889a755d", upload-time = "2025-10-10T21:48:22.271Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/4c/751061ffa58615a32c31b2d82e8482be8dd4a89154f003147acee90f2be9/httpx_sse-0.4.3.tar.gz", hash = "sha256:9b1ed0127459a66014aec3c56bebd93da3c1bc8bb6618c8082039a44889a755d", size = 15943, upload-time = "2025-10-10T21:48:22.271Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", upload-time = "2025-10-10T21:48:21.158Z" }, + { url = "https://files.pythonhosted.org/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", size = 8960, upload-time = "2025-10-10T21:48:21.158Z" }, ] [[package]] name = "huey" version = "2.6.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/fe/29/3428d52eb8e85025e264a291641a9f9d6407cc1e51d1b630f6ac5815999a/huey-2.6.0.tar.gz", hash = "sha256:8d11f8688999d65266af1425b831f6e3773e99415027177b8734b0ffd5e251f6", upload-time = "2026-01-06T03:01:02.055Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/29/3428d52eb8e85025e264a291641a9f9d6407cc1e51d1b630f6ac5815999a/huey-2.6.0.tar.gz", hash = "sha256:8d11f8688999d65266af1425b831f6e3773e99415027177b8734b0ffd5e251f6", size = 221068, upload-time = "2026-01-06T03:01:02.055Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/1a/34/fae9ac8f1c3a552fd3f7ff652b94c78d219dedc5fce0c0a4232457760a00/huey-2.6.0-py3-none-any.whl", hash = "sha256:1b9df9d370b49c6d5721ba8a01ac9a787cf86b3bdc584e4679de27b920395c3f", upload-time = "2026-01-06T03:01:00.808Z" }, + { url = "https://files.pythonhosted.org/packages/1a/34/fae9ac8f1c3a552fd3f7ff652b94c78d219dedc5fce0c0a4232457760a00/huey-2.6.0-py3-none-any.whl", hash = "sha256:1b9df9d370b49c6d5721ba8a01ac9a787cf86b3bdc584e4679de27b920395c3f", size = 76951, upload-time = "2026-01-06T03:01:00.808Z" }, ] [[package]] @@ -1955,9 +1952,9 @@ dependencies = [ { name = "typer" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/39/40/43109e943fd718b0ccd0cd61eb4f1c347df22bf81f5874c6f22adf44bcff/huggingface_hub-1.14.0.tar.gz", hash = "sha256:d6d2c9cd6be1d02ae9ec6672d5587d10a427f377db688e82528f426a041622c2", upload-time = "2026-05-06T14:14:34.278Z" } +sdist = { url = "https://files.pythonhosted.org/packages/39/40/43109e943fd718b0ccd0cd61eb4f1c347df22bf81f5874c6f22adf44bcff/huggingface_hub-1.14.0.tar.gz", hash = "sha256:d6d2c9cd6be1d02ae9ec6672d5587d10a427f377db688e82528f426a041622c2", size = 782365, upload-time = "2026-05-06T14:14:34.278Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/89/a5/33b49ba7bea7c41bb37f74ec0f8beea0831e052330196633fe2c77516ea6/huggingface_hub-1.14.0-py3-none-any.whl", hash = "sha256:efe075535c62e130b30e836b138e13785f6f043d1f0539e0a39aa411a99e90b8", upload-time = "2026-05-06T14:14:32.029Z" }, + { url = "https://files.pythonhosted.org/packages/89/a5/33b49ba7bea7c41bb37f74ec0f8beea0831e052330196633fe2c77516ea6/huggingface_hub-1.14.0-py3-none-any.whl", hash = "sha256:efe075535c62e130b30e836b138e13785f6f043d1f0539e0a39aa411a99e90b8", size = 661479, upload-time = "2026-05-06T14:14:32.029Z" }, ] [[package]] @@ -1968,27 +1965,27 @@ dependencies = [ { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "sortedcontainers" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/be/48/b6fcb59469f237a75592165d986fbfc57361279df5fe20b951fcc766ba2c/hypothesis-6.153.2.tar.gz", hash = "sha256:6f53e84b51c1f6c4173d6698880ddc2d05947ca649caa552afa26a01c2d964c1", upload-time = "2026-05-27T03:07:59.929Z" } +sdist = { url = "https://files.pythonhosted.org/packages/be/48/b6fcb59469f237a75592165d986fbfc57361279df5fe20b951fcc766ba2c/hypothesis-6.153.2.tar.gz", hash = "sha256:6f53e84b51c1f6c4173d6698880ddc2d05947ca649caa552afa26a01c2d964c1", size = 474531, upload-time = "2026-05-27T03:07:59.929Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/4c/173899cce4c79d17f6b9eceec262fa0900d32506ee5ce7f4034bb519de6a/hypothesis-6.153.2-py3-none-any.whl", hash = "sha256:db489369f89ea7aa724052f4725d3839f0f9d42fed1bb92d279a221a3585e215", upload-time = "2026-05-27T03:07:56.942Z" }, + { url = "https://files.pythonhosted.org/packages/a7/4c/173899cce4c79d17f6b9eceec262fa0900d32506ee5ce7f4034bb519de6a/hypothesis-6.153.2-py3-none-any.whl", hash = "sha256:db489369f89ea7aa724052f4725d3839f0f9d42fed1bb92d279a221a3585e215", size = 540840, upload-time = "2026-05-27T03:07:56.942Z" }, ] [[package]] name = "idna" version = "3.15" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", upload-time = "2026-05-12T22:45:57.011Z" } +sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", upload-time = "2026-05-12T22:45:55.733Z" }, + { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" }, ] [[package]] name = "imagesize" version = "2.0.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/6c/e6/7bf14eeb8f8b7251141944835abd42eb20a658d89084b7e1f3e5fe394090/imagesize-2.0.0.tar.gz", hash = "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3", upload-time = "2026-03-03T14:18:29.941Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6c/e6/7bf14eeb8f8b7251141944835abd42eb20a658d89084b7e1f3e5fe394090/imagesize-2.0.0.tar.gz", hash = "sha256:8e8358c4a05c304f1fccf7ff96f036e7243a189e9e42e90851993c558cfe9ee3", size = 1773045, upload-time = "2026-03-03T14:18:29.941Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl", hash = "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96", upload-time = "2026-03-03T14:18:27.892Z" }, + { url = "https://files.pythonhosted.org/packages/5f/53/fb7122b71361a0d121b669dcf3d31244ef75badbbb724af388948de543e2/imagesize-2.0.0-py2.py3-none-any.whl", hash = "sha256:5667c5bbb57ab3f1fa4bc366f4fbc971db3d5ed011fd2715fd8001f782718d96", size = 9441, upload-time = "2026-03-03T14:18:27.892Z" }, ] [[package]] @@ -1998,36 +1995,36 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "zipp" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", upload-time = "2025-12-21T10:00:19.278Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", upload-time = "2025-12-21T10:00:18.329Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, ] [[package]] name = "iniconfig" version = "2.3.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", upload-time = "2025-10-18T21:55:43.219Z" } +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://pypi-proxy.dev.databricks.com/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", upload-time = "2025-10-18T21:55:41.639Z" }, + { 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 = "isodate" version = "0.7.2" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", upload-time = "2024-10-08T23:04:11.5Z" } +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.5Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", upload-time = "2024-10-08T23:04:09.501Z" }, + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, ] [[package]] name = "itsdangerous" version = "2.2.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", upload-time = "2024-04-16T21:28:15.614Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410, upload-time = "2024-04-16T21:28:15.614Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", upload-time = "2024-04-16T21:28:14.499Z" }, + { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234, upload-time = "2024-04-16T21:28:14.499Z" }, ] [[package]] @@ -2037,9 +2034,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "more-itertools" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", upload-time = "2024-03-31T07:27:36.643Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", upload-time = "2024-03-31T07:27:34.792Z" }, + { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777, upload-time = "2024-03-31T07:27:34.792Z" }, ] [[package]] @@ -2049,9 +2046,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "backports-tarfile", marker = "python_full_version < '3.12'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", upload-time = "2026-03-20T22:13:33.922Z" } +sdist = { url = "https://files.pythonhosted.org/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", size = 16801, upload-time = "2026-03-20T22:13:33.922Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl", hash = "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", upload-time = "2026-03-20T22:13:32.808Z" }, + { url = "https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl", hash = "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", size = 7871, upload-time = "2026-03-20T22:13:32.808Z" }, ] [[package]] @@ -2061,18 +2058,18 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "more-itertools" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/36/cf/ea4ef2920830dea3f5ab2ea4da6fb67724e6dca80ee2553788c3607243d0/jaraco_functools-4.5.0.tar.gz", hash = "sha256:3bb5665ea4a020cf78a7040e89154c77edadb3ca74f366479669c5999aa70b03", upload-time = "2026-05-15T21:34:10.025Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/cf/ea4ef2920830dea3f5ab2ea4da6fb67724e6dca80ee2553788c3607243d0/jaraco_functools-4.5.0.tar.gz", hash = "sha256:3bb5665ea4a020cf78a7040e89154c77edadb3ca74f366479669c5999aa70b03", size = 20272, upload-time = "2026-05-15T21:34:10.025Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/96/9a/982e48afcffcd727a9144506720ffd4224b6b7e355c98641866f38b7c043/jaraco_functools-4.5.0-py3-none-any.whl", hash = "sha256:79ce39246eddbde4b3a03b77ea5f0f7878dc669b166a66cf3fa8e266aa3fa2f4", upload-time = "2026-05-15T21:34:08.595Z" }, + { url = "https://files.pythonhosted.org/packages/96/9a/982e48afcffcd727a9144506720ffd4224b6b7e355c98641866f38b7c043/jaraco_functools-4.5.0-py3-none-any.whl", hash = "sha256:79ce39246eddbde4b3a03b77ea5f0f7878dc669b166a66cf3fa8e266aa3fa2f4", size = 10594, upload-time = "2026-05-15T21:34:08.595Z" }, ] [[package]] name = "jeepney" version = "0.9.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", upload-time = "2025-02-27T18:51:01.684Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", upload-time = "2025-02-27T18:51:00.104Z" }, + { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] [[package]] @@ -2082,18 +2079,18 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", upload-time = "2025-03-05T20:05:02.478Z" } +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://pypi-proxy.dev.databricks.com/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", upload-time = "2025-03-05T20:05:00.369Z" }, + { 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 = "joblib" version = "1.5.3" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", upload-time = "2025-12-15T08:41:46.427Z" } +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://pypi-proxy.dev.databricks.com/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", upload-time = "2025-12-15T08:41:44.973Z" }, + { 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]] @@ -2103,18 +2100,18 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "cryptography" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/5d/ac/d4fd5b30f82900eac60d765f179f0ba005825ac462cc8ced6e13ec685ab3/joserfc-1.6.8.tar.gz", hash = "sha256:878620c553a6ebdd76ccdc356782fee3f735f21a356d079a546b42a4670ace5f", upload-time = "2026-05-27T03:22:37.819Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5d/ac/d4fd5b30f82900eac60d765f179f0ba005825ac462cc8ced6e13ec685ab3/joserfc-1.6.8.tar.gz", hash = "sha256:878620c553a6ebdd76ccdc356782fee3f735f21a356d079a546b42a4670ace5f", size = 232930, upload-time = "2026-05-27T03:22:37.819Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/98/8c/5cdce2cf3ce8155849baf9a5e2ce77e89dc87ec3bdb38259e5d85fbc45bd/joserfc-1.6.8-py3-none-any.whl", hash = "sha256:22fb31a69094a5e6f44632002a9df2c30c941fc6c8ce1b037e92c03de954cf9f", upload-time = "2026-05-27T03:22:35.796Z" }, + { url = "https://files.pythonhosted.org/packages/98/8c/5cdce2cf3ce8155849baf9a5e2ce77e89dc87ec3bdb38259e5d85fbc45bd/joserfc-1.6.8-py3-none-any.whl", hash = "sha256:22fb31a69094a5e6f44632002a9df2c30c941fc6c8ce1b037e92c03de954cf9f", size = 70927, upload-time = "2026-05-27T03:22:35.796Z" }, ] [[package]] name = "jsonref" version = "1.1.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/aa/0d/c1f3277e90ccdb50d33ed5ba1ec5b3f0a242ed8c1b1a85d3afeb68464dca/jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552", upload-time = "2023-01-16T16:10:04.455Z" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/0d/c1f3277e90ccdb50d33ed5ba1ec5b3f0a242ed8c1b1a85d3afeb68464dca/jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552", size = 8814, upload-time = "2023-01-16T16:10:04.455Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/ec/e1db9922bceb168197a558a2b8c03a7963f1afe93517ddd3cf99f202f996/jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9", upload-time = "2023-01-16T16:10:02.255Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ec/e1db9922bceb168197a558a2b8c03a7963f1afe93517ddd3cf99f202f996/jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9", size = 9425, upload-time = "2023-01-16T16:10:02.255Z" }, ] [[package]] @@ -2127,9 +2124,9 @@ dependencies = [ { name = "referencing" }, { name = "rpds-py" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", upload-time = "2026-01-07T13:41:07.246Z" } +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://pypi-proxy.dev.databricks.com/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", upload-time = "2026-01-07T13:41:05.306Z" }, + { 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]] @@ -2142,9 +2139,9 @@ dependencies = [ { name = "pyyaml" }, { name = "referencing" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/39/79/cd02a4df6d9270efdc7d3feefe6edd730b0820c39eeaa107a2faee8322d5/jsonschema_path-0.5.0.tar.gz", hash = "sha256:493b156ba895c97602655b620a8456caa2ce08c1aa389f5a7addec065e6e855c", upload-time = "2026-05-19T20:45:00.971Z" } +sdist = { url = "https://files.pythonhosted.org/packages/39/79/cd02a4df6d9270efdc7d3feefe6edd730b0820c39eeaa107a2faee8322d5/jsonschema_path-0.5.0.tar.gz", hash = "sha256:493b156ba895c97602655b620a8456caa2ce08c1aa389f5a7addec065e6e855c", size = 19597, upload-time = "2026-05-19T20:45:00.971Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/04/2c/9e69d73c4297508be9e3b64a970ea3971b3eb8db64ffc5802d40bd25981f/jsonschema_path-0.5.0-py3-none-any.whl", hash = "sha256:2790a070bc7abb08ea3dbe4d340ece4efadf639223001f020c7503229ba068e2", upload-time = "2026-05-19T20:44:59.225Z" }, + { url = "https://files.pythonhosted.org/packages/04/2c/9e69d73c4297508be9e3b64a970ea3971b3eb8db64ffc5802d40bd25981f/jsonschema_path-0.5.0-py3-none-any.whl", hash = "sha256:2790a070bc7abb08ea3dbe4d340ece4efadf639223001f020c7503229ba068e2", size = 24077, upload-time = "2026-05-19T20:44:59.225Z" }, ] [[package]] @@ -2154,9 +2151,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "referencing" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", upload-time = "2025-09-08T01:34:59.186Z" } +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://pypi-proxy.dev.databricks.com/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", upload-time = "2025-09-08T01:34:57.871Z" }, + { 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]] @@ -2172,202 +2169,202 @@ dependencies = [ { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, { name = "secretstorage", marker = "sys_platform == 'linux'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", upload-time = "2025-11-16T16:26:09.482Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", size = 63516, upload-time = "2025-11-16T16:26:09.482Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", upload-time = "2025-11-16T16:26:08.402Z" }, + { url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" }, ] [[package]] name = "kiwisolver" version = "1.4.9" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", upload-time = "2025-08-10T21:27:49.279Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c6/5d/8ce64e36d4e3aac5ca96996457dcf33e34e6051492399a3f1fec5657f30b/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b", upload-time = "2025-08-10T21:25:35.472Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/96/1e/22f63ec454874378175a5f435d6ea1363dd33fb2af832c6643e4ccea0dc8/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f", upload-time = "2025-08-10T21:25:36.73Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/41/4c/1925dcfff47a02d465121967b95151c82d11027d5ec5242771e580e731bd/kiwisolver-1.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf", upload-time = "2025-08-10T21:25:37.658Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/42/0f333164e6307a0687d1eb9ad256215aae2f4bd5d28f4653d6cd319a3ba3/kiwisolver-1.4.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9", upload-time = "2025-08-10T21:25:39.067Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/b6/2dccb977d651943995a90bfe3495c2ab2ba5cd77093d9f2318a20c9a6f59/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415", upload-time = "2025-08-10T21:25:40.489Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/2b/362ebd3eec46c850ccf2bfe3e30f2fc4c008750011f38a850f088c56a1c6/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b", upload-time = "2025-08-10T21:25:42.221Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/bb/f09a1e66dab8984773d13184a10a29fe67125337649d26bdef547024ed6b/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154", upload-time = "2025-08-10T21:25:43.801Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ea/01/11ecf892f201cafda0f68fa59212edaea93e96c37884b747c181303fccd1/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48", upload-time = "2025-08-10T21:25:45.045Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7f/5f/bfe11d5b934f500cc004314819ea92427e6e5462706a498c1d4fc052e08f/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220", upload-time = "2025-08-10T21:25:46.393Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/de/259f786bf71f1e03e73d87e2db1a9a3bcab64d7b4fd780167123161630ad/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586", upload-time = "2025-08-10T21:25:48.074Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1b/76/c989c278faf037c4d3421ec07a5c452cd3e09545d6dae7f87c15f54e4edf/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634", upload-time = "2025-08-10T21:25:49.442Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a2/55/c2898d84ca440852e560ca9f2a0d28e6e931ac0849b896d77231929900e7/kiwisolver-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611", upload-time = "2025-08-10T21:25:51.102Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e8/09/486d6ac523dd33b80b368247f238125d027964cfacb45c654841e88fb2ae/kiwisolver-1.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536", upload-time = "2025-08-10T21:25:52.063Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/ab/c80b0d5a9d8a1a65f4f815f2afff9798b12c3b9f31f1d304dd233dd920e2/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", upload-time = "2025-08-10T21:25:53.403Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", upload-time = "2025-08-10T21:25:54.79Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", upload-time = "2025-08-10T21:25:55.76Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", upload-time = "2025-08-10T21:25:56.861Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/67/1e/51b73c7347f9aabdc7215aa79e8b15299097dc2f8e67dee2b095faca9cb0/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", upload-time = "2025-08-10T21:25:58.246Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/21/aa/72a1c5d1e430294f2d32adb9542719cfb441b5da368d09d268c7757af46c/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", upload-time = "2025-08-10T21:25:59.857Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a3/af/db1509a9e79dbf4c260ce0cfa3903ea8945f6240e9e59d1e4deb731b1a40/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", upload-time = "2025-08-10T21:26:01.105Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/f2/3ea5ee5d52abacdd12013a94130436e19969fa183faa1e7c7fbc89e9a42f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", upload-time = "2025-08-10T21:26:02.675Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/9b/1efdd3013c2d9a2566aa6a337e9923a00590c516add9a1e89a768a3eb2fc/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", upload-time = "2025-08-10T21:26:04.009Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fb/e5/cfdc36109ae4e67361f9bc5b41323648cb24a01b9ade18784657e022e65f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", upload-time = "2025-08-10T21:26:05.317Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/62/86/b589e5e86c7610842213994cdea5add00960076bef4ae290c5fa68589cac/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", upload-time = "2025-08-10T21:26:06.686Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", upload-time = "2025-08-10T21:26:07.94Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/2d/16e0581daafd147bc11ac53f032a2b45eabac897f42a338d0a13c1e5c436/kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", upload-time = "2025-08-10T21:26:09.048Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", upload-time = "2025-08-10T21:26:10.034Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", upload-time = "2025-08-10T21:26:11.083Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", upload-time = "2025-08-10T21:26:12.058Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", upload-time = "2025-08-10T21:26:13.096Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", upload-time = "2025-08-10T21:26:14.457Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", upload-time = "2025-08-10T21:26:15.73Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", upload-time = "2025-08-10T21:26:17.045Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", upload-time = "2025-08-10T21:26:18.737Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", upload-time = "2025-08-10T21:26:20.11Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", upload-time = "2025-08-10T21:26:21.49Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", upload-time = "2025-08-10T21:26:22.812Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", upload-time = "2025-08-10T21:26:24.37Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", upload-time = "2025-08-10T21:26:25.732Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/31/c1/c2686cda909742ab66c7388e9a1a8521a59eb89f8bcfbee28fc980d07e24/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", upload-time = "2025-08-10T21:26:26.725Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", upload-time = "2025-08-10T21:26:27.733Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", upload-time = "2025-08-10T21:26:28.729Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", upload-time = "2025-08-10T21:26:29.798Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d9/28/aac26d4c882f14de59041636292bc838db8961373825df23b8eeb807e198/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", upload-time = "2025-08-10T21:26:31.401Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/ad/8bfc1c93d4cc565e5069162f610ba2f48ff39b7de4b5b8d93f69f30c4bed/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", upload-time = "2025-08-10T21:26:32.721Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/da/f1/6aca55ff798901d8ce403206d00e033191f63d82dd708a186e0ed2067e9c/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", upload-time = "2025-08-10T21:26:34.032Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/91/eed031876c595c81d90d0f6fc681ece250e14bf6998c3d7c419466b523b7/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", upload-time = "2025-08-10T21:26:35.824Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e9/ec/4d1925f2e49617b9cca9c34bfa11adefad49d00db038e692a559454dfb2e/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", upload-time = "2025-08-10T21:26:37.534Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/43/cb/450cd4499356f68802750c6ddc18647b8ea01ffa28f50d20598e0befe6e9/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", upload-time = "2025-08-10T21:26:39.191Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/71/67/fc76242bd99f885651128a5d4fa6083e5524694b7c88b489b1b55fdc491d/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", upload-time = "2025-08-10T21:26:40.828Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", upload-time = "2025-08-10T21:26:42.33Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/95/38/dce480814d25b99a391abbddadc78f7c117c6da34be68ca8b02d5848b424/kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", upload-time = "2025-08-10T21:26:43.889Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/37/7d218ce5d92dadc5ebdd9070d903e0c7cf7edfe03f179433ac4d13ce659c/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", upload-time = "2025-08-10T21:26:44.915Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/23/b0/e85a2b48233daef4b648fb657ebbb6f8367696a2d9548a00b4ee0eb67803/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", upload-time = "2025-08-10T21:26:45.934Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/44/98/f2425bc0113ad7de24da6bb4dae1343476e95e1d738be7c04d31a5d037fd/kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", upload-time = "2025-08-10T21:26:47.101Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/98/d8/594657886df9f34c4177cc353cc28ca7e6e5eb562d37ccc233bff43bbe2a/kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", upload-time = "2025-08-10T21:26:48.665Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5c/c6/38a115b7170f8b306fc929e166340c24958347308ea3012c2b44e7e295db/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", upload-time = "2025-08-10T21:26:50.335Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/3b/e04883dace81f24a568bcee6eb3001da4ba05114afa622ec9b6fafdc1f5e/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", upload-time = "2025-08-10T21:26:51.867Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/80/20ace48e33408947af49d7d15c341eaee69e4e0304aab4b7660e234d6288/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", upload-time = "2025-08-10T21:26:53.592Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/64/31/6ce4380a4cd1f515bdda976a1e90e547ccd47b67a1546d63884463c92ca9/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", upload-time = "2025-08-10T21:26:55.051Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fa/e9/3f3fcba3bcc7432c795b82646306e822f3fd74df0ee81f0fa067a1f95668/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", upload-time = "2025-08-10T21:26:56.421Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/99/43/7320c50e4133575c66e9f7dadead35ab22d7c012a3b09bb35647792b2a6d/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", upload-time = "2025-08-10T21:26:57.882Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/65/d6/17ae4a270d4a987ef8a385b906d2bdfc9fce502d6dc0d3aea865b47f548c/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", upload-time = "2025-08-10T21:26:59.237Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/8f/8f6f491d595a9e5912971f3f863d81baddccc8a4d0c3749d6a0dd9ffc9df/kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", upload-time = "2025-08-10T21:27:00.52Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6b/32/6cc0fbc9c54d06c2969faa9c1d29f5751a2e51809dd55c69055e62d9b426/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", upload-time = "2025-08-10T21:27:01.537Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", upload-time = "2025-08-10T21:27:03.335Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", upload-time = "2025-08-10T21:27:04.339Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", upload-time = "2025-08-10T21:27:05.437Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/bb/93fa64a81db304ac8a246f834d5094fae4b13baf53c839d6bb6e81177129/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", upload-time = "2025-08-10T21:27:07.063Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/70/e6/6df102916960fb8d05069d4bd92d6d9a8202d5a3e2444494e7cd50f65b7a/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", upload-time = "2025-08-10T21:27:08.452Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7c/47/e142aaa612f5343736b087864dbaebc53ea8831453fb47e7521fa8658f30/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", upload-time = "2025-08-10T21:27:10.125Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/54/89/d641a746194a0f4d1a3670fb900d0dbaa786fb98341056814bc3f058fa52/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", upload-time = "2025-08-10T21:27:11.484Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/6b/5ee1207198febdf16ac11f78c5ae40861b809cbe0e6d2a8d5b0b3044b199/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", upload-time = "2025-08-10T21:27:12.917Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fc/ff/b269eefd90f4ae14dcc74973d5a0f6d28d3b9bb1afd8c0340513afe6b39a/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", upload-time = "2025-08-10T21:27:14.353Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fc/d4/10303190bd4d30de547534601e259a4fbf014eed94aae3e5521129215086/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", upload-time = "2025-08-10T21:27:15.808Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", upload-time = "2025-08-10T21:27:17.436Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/10/6949958215b7a9a264299a7db195564e87900f709db9245e4ebdd3c70779/kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", upload-time = "2025-08-10T21:27:18.436Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ec/79/60e53067903d3bc5469b369fe0dfc6b3482e2133e85dae9daa9527535991/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", upload-time = "2025-08-10T21:27:19.465Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/25/d1/4843d3e8d46b072c12a38c97c57fab4608d36e13fe47d47ee96b4d61ba6f/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", upload-time = "2025-08-10T21:27:20.51Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8c/ae/29ffcbd239aea8b93108de1278271ae764dfc0d803a5693914975f200596/kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", upload-time = "2025-08-10T21:27:21.496Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a1/ae/d7ba902aa604152c2ceba5d352d7b62106bedbccc8e95c3934d94472bfa3/kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", upload-time = "2025-08-10T21:27:22.604Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/41/27c70d427eddb8bc7e4f16420a20fefc6f480312122a59a959fdfe0445ad/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", upload-time = "2025-08-10T21:27:24.036Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/41/42/b3799a12bafc76d962ad69083f8b43b12bf4fe78b097b12e105d75c9b8f1/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", upload-time = "2025-08-10T21:27:25.773Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/b5/a210ea073ea1cfaca1bb5c55a62307d8252f531beb364e18aa1e0888b5a0/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", upload-time = "2025-08-10T21:27:27.089Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/ce/a829eb8c033e977d7ea03ed32fb3c1781b4fa0433fbadfff29e39c676f32/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", upload-time = "2025-08-10T21:27:29.343Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/4b/b5e97eb142eb9cd0072dacfcdcd31b1c66dc7352b0f7c7255d339c0edf00/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", upload-time = "2025-08-10T21:27:30.754Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/be/8eb4cd53e1b85ba4edc3a9321666f12b83113a178845593307a3e7891f44/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", upload-time = "2025-08-10T21:27:32.803Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/99/dd/841e9a66c4715477ea0abc78da039832fbb09dac5c35c58dc4c41a407b8a/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", upload-time = "2025-08-10T21:27:34.23Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/28/4b2e5c47a0da96896fdfdb006340ade064afa1e63675d01ea5ac222b6d52/kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", upload-time = "2025-08-10T21:27:35.587Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/be/3578e8afd18c88cdf9cb4cffde75a96d2be38c5a903f1ed0ceec061bd09e/kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", upload-time = "2025-08-10T21:27:36.606Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a2/63/fde392691690f55b38d5dd7b3710f5353bf7a8e52de93a22968801ab8978/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527", upload-time = "2025-08-10T21:27:37.669Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/27/b1/6aad34edfdb7cced27f371866f211332bba215bfd918ad3322a58f480d8b/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771", upload-time = "2025-08-10T21:27:39.031Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9d/1a/23d855a702bb35a76faed5ae2ba3de57d323f48b1f6b17ee2176c4849463/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e", upload-time = "2025-08-10T21:27:40.129Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5a/5b/5239e3c2b8fb5afa1e8508f721bb77325f740ab6994d963e61b2b7abcc1e/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9", upload-time = "2025-08-10T21:27:41.181Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/1c/5d4d468fb16f8410e596ed0eac02d2c68752aa7dc92997fe9d60a7147665/kiwisolver-1.4.9-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb", upload-time = "2025-08-10T21:27:42.254Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a3/0f/36d89194b5a32c054ce93e586d4049b6c2c22887b0eb229c61c68afd3078/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", upload-time = "2025-08-10T21:27:43.287Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/52/ba/4ed75f59e4658fd21fe7dde1fee0ac397c678ec3befba3fe6482d987af87/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", upload-time = "2025-08-10T21:27:44.314Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/33/01/a8ea7c5ea32a9b45ceeaee051a04c8ed4320f5add3c51bfa20879b765b70/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", upload-time = "2025-08-10T21:27:45.369Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/da/e3/dbd2ecdce306f1d07a1aaf324817ee993aab7aee9db47ceac757deabafbe/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", upload-time = "2025-08-10T21:27:46.376Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", upload-time = "2025-08-10T21:27:48.236Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/5c/3c/85844f1b0feb11ee581ac23fe5fce65cd049a200c1446708cc1b7f922875/kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", size = 97564, upload-time = "2025-08-10T21:27:49.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/5d/8ce64e36d4e3aac5ca96996457dcf33e34e6051492399a3f1fec5657f30b/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b", size = 124159, upload-time = "2025-08-10T21:25:35.472Z" }, + { url = "https://files.pythonhosted.org/packages/96/1e/22f63ec454874378175a5f435d6ea1363dd33fb2af832c6643e4ccea0dc8/kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f", size = 66578, upload-time = "2025-08-10T21:25:36.73Z" }, + { url = "https://files.pythonhosted.org/packages/41/4c/1925dcfff47a02d465121967b95151c82d11027d5ec5242771e580e731bd/kiwisolver-1.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf", size = 65312, upload-time = "2025-08-10T21:25:37.658Z" }, + { url = "https://files.pythonhosted.org/packages/d4/42/0f333164e6307a0687d1eb9ad256215aae2f4bd5d28f4653d6cd319a3ba3/kiwisolver-1.4.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9", size = 1628458, upload-time = "2025-08-10T21:25:39.067Z" }, + { url = "https://files.pythonhosted.org/packages/86/b6/2dccb977d651943995a90bfe3495c2ab2ba5cd77093d9f2318a20c9a6f59/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415", size = 1225640, upload-time = "2025-08-10T21:25:40.489Z" }, + { url = "https://files.pythonhosted.org/packages/50/2b/362ebd3eec46c850ccf2bfe3e30f2fc4c008750011f38a850f088c56a1c6/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b", size = 1244074, upload-time = "2025-08-10T21:25:42.221Z" }, + { url = "https://files.pythonhosted.org/packages/6f/bb/f09a1e66dab8984773d13184a10a29fe67125337649d26bdef547024ed6b/kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154", size = 1293036, upload-time = "2025-08-10T21:25:43.801Z" }, + { url = "https://files.pythonhosted.org/packages/ea/01/11ecf892f201cafda0f68fa59212edaea93e96c37884b747c181303fccd1/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48", size = 2175310, upload-time = "2025-08-10T21:25:45.045Z" }, + { url = "https://files.pythonhosted.org/packages/7f/5f/bfe11d5b934f500cc004314819ea92427e6e5462706a498c1d4fc052e08f/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220", size = 2270943, upload-time = "2025-08-10T21:25:46.393Z" }, + { url = "https://files.pythonhosted.org/packages/3d/de/259f786bf71f1e03e73d87e2db1a9a3bcab64d7b4fd780167123161630ad/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586", size = 2440488, upload-time = "2025-08-10T21:25:48.074Z" }, + { url = "https://files.pythonhosted.org/packages/1b/76/c989c278faf037c4d3421ec07a5c452cd3e09545d6dae7f87c15f54e4edf/kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634", size = 2246787, upload-time = "2025-08-10T21:25:49.442Z" }, + { url = "https://files.pythonhosted.org/packages/a2/55/c2898d84ca440852e560ca9f2a0d28e6e931ac0849b896d77231929900e7/kiwisolver-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611", size = 73730, upload-time = "2025-08-10T21:25:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/e8/09/486d6ac523dd33b80b368247f238125d027964cfacb45c654841e88fb2ae/kiwisolver-1.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536", size = 65036, upload-time = "2025-08-10T21:25:52.063Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ab/c80b0d5a9d8a1a65f4f815f2afff9798b12c3b9f31f1d304dd233dd920e2/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", size = 124167, upload-time = "2025-08-10T21:25:53.403Z" }, + { url = "https://files.pythonhosted.org/packages/a0/c0/27fe1a68a39cf62472a300e2879ffc13c0538546c359b86f149cc19f6ac3/kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", size = 66579, upload-time = "2025-08-10T21:25:54.79Z" }, + { url = "https://files.pythonhosted.org/packages/31/a2/a12a503ac1fd4943c50f9822678e8015a790a13b5490354c68afb8489814/kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", size = 65309, upload-time = "2025-08-10T21:25:55.76Z" }, + { url = "https://files.pythonhosted.org/packages/66/e1/e533435c0be77c3f64040d68d7a657771194a63c279f55573188161e81ca/kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", size = 1435596, upload-time = "2025-08-10T21:25:56.861Z" }, + { url = "https://files.pythonhosted.org/packages/67/1e/51b73c7347f9aabdc7215aa79e8b15299097dc2f8e67dee2b095faca9cb0/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", size = 1246548, upload-time = "2025-08-10T21:25:58.246Z" }, + { url = "https://files.pythonhosted.org/packages/21/aa/72a1c5d1e430294f2d32adb9542719cfb441b5da368d09d268c7757af46c/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", size = 1263618, upload-time = "2025-08-10T21:25:59.857Z" }, + { url = "https://files.pythonhosted.org/packages/a3/af/db1509a9e79dbf4c260ce0cfa3903ea8945f6240e9e59d1e4deb731b1a40/kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", size = 1317437, upload-time = "2025-08-10T21:26:01.105Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f2/3ea5ee5d52abacdd12013a94130436e19969fa183faa1e7c7fbc89e9a42f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", size = 2195742, upload-time = "2025-08-10T21:26:02.675Z" }, + { url = "https://files.pythonhosted.org/packages/6f/9b/1efdd3013c2d9a2566aa6a337e9923a00590c516add9a1e89a768a3eb2fc/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", size = 2290810, upload-time = "2025-08-10T21:26:04.009Z" }, + { url = "https://files.pythonhosted.org/packages/fb/e5/cfdc36109ae4e67361f9bc5b41323648cb24a01b9ade18784657e022e65f/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", size = 2461579, upload-time = "2025-08-10T21:26:05.317Z" }, + { url = "https://files.pythonhosted.org/packages/62/86/b589e5e86c7610842213994cdea5add00960076bef4ae290c5fa68589cac/kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", size = 2268071, upload-time = "2025-08-10T21:26:06.686Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c6/f8df8509fd1eee6c622febe54384a96cfaf4d43bf2ccec7a0cc17e4715c9/kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", size = 73840, upload-time = "2025-08-10T21:26:07.94Z" }, + { url = "https://files.pythonhosted.org/packages/e2/2d/16e0581daafd147bc11ac53f032a2b45eabac897f42a338d0a13c1e5c436/kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", size = 65159, upload-time = "2025-08-10T21:26:09.048Z" }, + { url = "https://files.pythonhosted.org/packages/86/c9/13573a747838aeb1c76e3267620daa054f4152444d1f3d1a2324b78255b5/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", size = 123686, upload-time = "2025-08-10T21:26:10.034Z" }, + { url = "https://files.pythonhosted.org/packages/51/ea/2ecf727927f103ffd1739271ca19c424d0e65ea473fbaeea1c014aea93f6/kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", size = 66460, upload-time = "2025-08-10T21:26:11.083Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/51f5464373ce2aeb5194508298a508b6f21d3867f499556263c64c621914/kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", size = 64952, upload-time = "2025-08-10T21:26:12.058Z" }, + { url = "https://files.pythonhosted.org/packages/70/90/6d240beb0f24b74371762873e9b7f499f1e02166a2d9c5801f4dbf8fa12e/kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", size = 1474756, upload-time = "2025-08-10T21:26:13.096Z" }, + { url = "https://files.pythonhosted.org/packages/12/42/f36816eaf465220f683fb711efdd1bbf7a7005a2473d0e4ed421389bd26c/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", size = 1276404, upload-time = "2025-08-10T21:26:14.457Z" }, + { url = "https://files.pythonhosted.org/packages/2e/64/bc2de94800adc830c476dce44e9b40fd0809cddeef1fde9fcf0f73da301f/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", size = 1294410, upload-time = "2025-08-10T21:26:15.73Z" }, + { url = "https://files.pythonhosted.org/packages/5f/42/2dc82330a70aa8e55b6d395b11018045e58d0bb00834502bf11509f79091/kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", size = 1343631, upload-time = "2025-08-10T21:26:17.045Z" }, + { url = "https://files.pythonhosted.org/packages/22/fd/f4c67a6ed1aab149ec5a8a401c323cee7a1cbe364381bb6c9c0d564e0e20/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", size = 2224963, upload-time = "2025-08-10T21:26:18.737Z" }, + { url = "https://files.pythonhosted.org/packages/45/aa/76720bd4cb3713314677d9ec94dcc21ced3f1baf4830adde5bb9b2430a5f/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", size = 2321295, upload-time = "2025-08-10T21:26:20.11Z" }, + { url = "https://files.pythonhosted.org/packages/80/19/d3ec0d9ab711242f56ae0dc2fc5d70e298bb4a1f9dfab44c027668c673a1/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", size = 2487987, upload-time = "2025-08-10T21:26:21.49Z" }, + { url = "https://files.pythonhosted.org/packages/39/e9/61e4813b2c97e86b6fdbd4dd824bf72d28bcd8d4849b8084a357bc0dd64d/kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", size = 2291817, upload-time = "2025-08-10T21:26:22.812Z" }, + { url = "https://files.pythonhosted.org/packages/a0/41/85d82b0291db7504da3c2defe35c9a8a5c9803a730f297bd823d11d5fb77/kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", size = 73895, upload-time = "2025-08-10T21:26:24.37Z" }, + { url = "https://files.pythonhosted.org/packages/e2/92/5f3068cf15ee5cb624a0c7596e67e2a0bb2adee33f71c379054a491d07da/kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", size = 64992, upload-time = "2025-08-10T21:26:25.732Z" }, + { url = "https://files.pythonhosted.org/packages/31/c1/c2686cda909742ab66c7388e9a1a8521a59eb89f8bcfbee28fc980d07e24/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", size = 123681, upload-time = "2025-08-10T21:26:26.725Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f0/f44f50c9f5b1a1860261092e3bc91ecdc9acda848a8b8c6abfda4a24dd5c/kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", size = 66464, upload-time = "2025-08-10T21:26:27.733Z" }, + { url = "https://files.pythonhosted.org/packages/2d/7a/9d90a151f558e29c3936b8a47ac770235f436f2120aca41a6d5f3d62ae8d/kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", size = 64961, upload-time = "2025-08-10T21:26:28.729Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e9/f218a2cb3a9ffbe324ca29a9e399fa2d2866d7f348ec3a88df87fc248fc5/kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", size = 1474607, upload-time = "2025-08-10T21:26:29.798Z" }, + { url = "https://files.pythonhosted.org/packages/d9/28/aac26d4c882f14de59041636292bc838db8961373825df23b8eeb807e198/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", size = 1276546, upload-time = "2025-08-10T21:26:31.401Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ad/8bfc1c93d4cc565e5069162f610ba2f48ff39b7de4b5b8d93f69f30c4bed/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", size = 1294482, upload-time = "2025-08-10T21:26:32.721Z" }, + { url = "https://files.pythonhosted.org/packages/da/f1/6aca55ff798901d8ce403206d00e033191f63d82dd708a186e0ed2067e9c/kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", size = 1343720, upload-time = "2025-08-10T21:26:34.032Z" }, + { url = "https://files.pythonhosted.org/packages/d1/91/eed031876c595c81d90d0f6fc681ece250e14bf6998c3d7c419466b523b7/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", size = 2224907, upload-time = "2025-08-10T21:26:35.824Z" }, + { url = "https://files.pythonhosted.org/packages/e9/ec/4d1925f2e49617b9cca9c34bfa11adefad49d00db038e692a559454dfb2e/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", size = 2321334, upload-time = "2025-08-10T21:26:37.534Z" }, + { url = "https://files.pythonhosted.org/packages/43/cb/450cd4499356f68802750c6ddc18647b8ea01ffa28f50d20598e0befe6e9/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", size = 2488313, upload-time = "2025-08-10T21:26:39.191Z" }, + { url = "https://files.pythonhosted.org/packages/71/67/fc76242bd99f885651128a5d4fa6083e5524694b7c88b489b1b55fdc491d/kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", size = 2291970, upload-time = "2025-08-10T21:26:40.828Z" }, + { url = "https://files.pythonhosted.org/packages/75/bd/f1a5d894000941739f2ae1b65a32892349423ad49c2e6d0771d0bad3fae4/kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", size = 73894, upload-time = "2025-08-10T21:26:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/95/38/dce480814d25b99a391abbddadc78f7c117c6da34be68ca8b02d5848b424/kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", size = 64995, upload-time = "2025-08-10T21:26:43.889Z" }, + { url = "https://files.pythonhosted.org/packages/e2/37/7d218ce5d92dadc5ebdd9070d903e0c7cf7edfe03f179433ac4d13ce659c/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", size = 126510, upload-time = "2025-08-10T21:26:44.915Z" }, + { url = "https://files.pythonhosted.org/packages/23/b0/e85a2b48233daef4b648fb657ebbb6f8367696a2d9548a00b4ee0eb67803/kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", size = 67903, upload-time = "2025-08-10T21:26:45.934Z" }, + { url = "https://files.pythonhosted.org/packages/44/98/f2425bc0113ad7de24da6bb4dae1343476e95e1d738be7c04d31a5d037fd/kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", size = 66402, upload-time = "2025-08-10T21:26:47.101Z" }, + { url = "https://files.pythonhosted.org/packages/98/d8/594657886df9f34c4177cc353cc28ca7e6e5eb562d37ccc233bff43bbe2a/kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", size = 1582135, upload-time = "2025-08-10T21:26:48.665Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c6/38a115b7170f8b306fc929e166340c24958347308ea3012c2b44e7e295db/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", size = 1389409, upload-time = "2025-08-10T21:26:50.335Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3b/e04883dace81f24a568bcee6eb3001da4ba05114afa622ec9b6fafdc1f5e/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", size = 1401763, upload-time = "2025-08-10T21:26:51.867Z" }, + { url = "https://files.pythonhosted.org/packages/9f/80/20ace48e33408947af49d7d15c341eaee69e4e0304aab4b7660e234d6288/kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", size = 1453643, upload-time = "2025-08-10T21:26:53.592Z" }, + { url = "https://files.pythonhosted.org/packages/64/31/6ce4380a4cd1f515bdda976a1e90e547ccd47b67a1546d63884463c92ca9/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", size = 2330818, upload-time = "2025-08-10T21:26:55.051Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e9/3f3fcba3bcc7432c795b82646306e822f3fd74df0ee81f0fa067a1f95668/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", size = 2419963, upload-time = "2025-08-10T21:26:56.421Z" }, + { url = "https://files.pythonhosted.org/packages/99/43/7320c50e4133575c66e9f7dadead35ab22d7c012a3b09bb35647792b2a6d/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", size = 2594639, upload-time = "2025-08-10T21:26:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/65/d6/17ae4a270d4a987ef8a385b906d2bdfc9fce502d6dc0d3aea865b47f548c/kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", size = 2391741, upload-time = "2025-08-10T21:26:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8f/8f6f491d595a9e5912971f3f863d81baddccc8a4d0c3749d6a0dd9ffc9df/kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", size = 68646, upload-time = "2025-08-10T21:27:00.52Z" }, + { url = "https://files.pythonhosted.org/packages/6b/32/6cc0fbc9c54d06c2969faa9c1d29f5751a2e51809dd55c69055e62d9b426/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", size = 123806, upload-time = "2025-08-10T21:27:01.537Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dd/2bfb1d4a4823d92e8cbb420fe024b8d2167f72079b3bb941207c42570bdf/kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", size = 66605, upload-time = "2025-08-10T21:27:03.335Z" }, + { url = "https://files.pythonhosted.org/packages/f7/69/00aafdb4e4509c2ca6064646cba9cd4b37933898f426756adb2cb92ebbed/kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", size = 64925, upload-time = "2025-08-10T21:27:04.339Z" }, + { url = "https://files.pythonhosted.org/packages/43/dc/51acc6791aa14e5cb6d8a2e28cefb0dc2886d8862795449d021334c0df20/kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", size = 1472414, upload-time = "2025-08-10T21:27:05.437Z" }, + { url = "https://files.pythonhosted.org/packages/3d/bb/93fa64a81db304ac8a246f834d5094fae4b13baf53c839d6bb6e81177129/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", size = 1281272, upload-time = "2025-08-10T21:27:07.063Z" }, + { url = "https://files.pythonhosted.org/packages/70/e6/6df102916960fb8d05069d4bd92d6d9a8202d5a3e2444494e7cd50f65b7a/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", size = 1298578, upload-time = "2025-08-10T21:27:08.452Z" }, + { url = "https://files.pythonhosted.org/packages/7c/47/e142aaa612f5343736b087864dbaebc53ea8831453fb47e7521fa8658f30/kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", size = 1345607, upload-time = "2025-08-10T21:27:10.125Z" }, + { url = "https://files.pythonhosted.org/packages/54/89/d641a746194a0f4d1a3670fb900d0dbaa786fb98341056814bc3f058fa52/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", size = 2230150, upload-time = "2025-08-10T21:27:11.484Z" }, + { url = "https://files.pythonhosted.org/packages/aa/6b/5ee1207198febdf16ac11f78c5ae40861b809cbe0e6d2a8d5b0b3044b199/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", size = 2325979, upload-time = "2025-08-10T21:27:12.917Z" }, + { url = "https://files.pythonhosted.org/packages/fc/ff/b269eefd90f4ae14dcc74973d5a0f6d28d3b9bb1afd8c0340513afe6b39a/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", size = 2491456, upload-time = "2025-08-10T21:27:14.353Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d4/10303190bd4d30de547534601e259a4fbf014eed94aae3e5521129215086/kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", size = 2294621, upload-time = "2025-08-10T21:27:15.808Z" }, + { url = "https://files.pythonhosted.org/packages/28/e0/a9a90416fce5c0be25742729c2ea52105d62eda6c4be4d803c2a7be1fa50/kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", size = 75417, upload-time = "2025-08-10T21:27:17.436Z" }, + { url = "https://files.pythonhosted.org/packages/1f/10/6949958215b7a9a264299a7db195564e87900f709db9245e4ebdd3c70779/kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", size = 66582, upload-time = "2025-08-10T21:27:18.436Z" }, + { url = "https://files.pythonhosted.org/packages/ec/79/60e53067903d3bc5469b369fe0dfc6b3482e2133e85dae9daa9527535991/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", size = 126514, upload-time = "2025-08-10T21:27:19.465Z" }, + { url = "https://files.pythonhosted.org/packages/25/d1/4843d3e8d46b072c12a38c97c57fab4608d36e13fe47d47ee96b4d61ba6f/kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", size = 67905, upload-time = "2025-08-10T21:27:20.51Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ae/29ffcbd239aea8b93108de1278271ae764dfc0d803a5693914975f200596/kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", size = 66399, upload-time = "2025-08-10T21:27:21.496Z" }, + { url = "https://files.pythonhosted.org/packages/a1/ae/d7ba902aa604152c2ceba5d352d7b62106bedbccc8e95c3934d94472bfa3/kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", size = 1582197, upload-time = "2025-08-10T21:27:22.604Z" }, + { url = "https://files.pythonhosted.org/packages/f2/41/27c70d427eddb8bc7e4f16420a20fefc6f480312122a59a959fdfe0445ad/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", size = 1390125, upload-time = "2025-08-10T21:27:24.036Z" }, + { url = "https://files.pythonhosted.org/packages/41/42/b3799a12bafc76d962ad69083f8b43b12bf4fe78b097b12e105d75c9b8f1/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", size = 1402612, upload-time = "2025-08-10T21:27:25.773Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b5/a210ea073ea1cfaca1bb5c55a62307d8252f531beb364e18aa1e0888b5a0/kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", size = 1453990, upload-time = "2025-08-10T21:27:27.089Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ce/a829eb8c033e977d7ea03ed32fb3c1781b4fa0433fbadfff29e39c676f32/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", size = 2331601, upload-time = "2025-08-10T21:27:29.343Z" }, + { url = "https://files.pythonhosted.org/packages/e0/4b/b5e97eb142eb9cd0072dacfcdcd31b1c66dc7352b0f7c7255d339c0edf00/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", size = 2422041, upload-time = "2025-08-10T21:27:30.754Z" }, + { url = "https://files.pythonhosted.org/packages/40/be/8eb4cd53e1b85ba4edc3a9321666f12b83113a178845593307a3e7891f44/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", size = 2594897, upload-time = "2025-08-10T21:27:32.803Z" }, + { url = "https://files.pythonhosted.org/packages/99/dd/841e9a66c4715477ea0abc78da039832fbb09dac5c35c58dc4c41a407b8a/kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", size = 2391835, upload-time = "2025-08-10T21:27:34.23Z" }, + { url = "https://files.pythonhosted.org/packages/0c/28/4b2e5c47a0da96896fdfdb006340ade064afa1e63675d01ea5ac222b6d52/kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", size = 79988, upload-time = "2025-08-10T21:27:35.587Z" }, + { url = "https://files.pythonhosted.org/packages/80/be/3578e8afd18c88cdf9cb4cffde75a96d2be38c5a903f1ed0ceec061bd09e/kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", size = 70260, upload-time = "2025-08-10T21:27:36.606Z" }, + { url = "https://files.pythonhosted.org/packages/a2/63/fde392691690f55b38d5dd7b3710f5353bf7a8e52de93a22968801ab8978/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527", size = 60183, upload-time = "2025-08-10T21:27:37.669Z" }, + { url = "https://files.pythonhosted.org/packages/27/b1/6aad34edfdb7cced27f371866f211332bba215bfd918ad3322a58f480d8b/kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771", size = 58675, upload-time = "2025-08-10T21:27:39.031Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1a/23d855a702bb35a76faed5ae2ba3de57d323f48b1f6b17ee2176c4849463/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e", size = 80277, upload-time = "2025-08-10T21:27:40.129Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5b/5239e3c2b8fb5afa1e8508f721bb77325f740ab6994d963e61b2b7abcc1e/kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9", size = 77994, upload-time = "2025-08-10T21:27:41.181Z" }, + { url = "https://files.pythonhosted.org/packages/f9/1c/5d4d468fb16f8410e596ed0eac02d2c68752aa7dc92997fe9d60a7147665/kiwisolver-1.4.9-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb", size = 73744, upload-time = "2025-08-10T21:27:42.254Z" }, + { url = "https://files.pythonhosted.org/packages/a3/0f/36d89194b5a32c054ce93e586d4049b6c2c22887b0eb229c61c68afd3078/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", size = 60104, upload-time = "2025-08-10T21:27:43.287Z" }, + { url = "https://files.pythonhosted.org/packages/52/ba/4ed75f59e4658fd21fe7dde1fee0ac397c678ec3befba3fe6482d987af87/kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", size = 58592, upload-time = "2025-08-10T21:27:44.314Z" }, + { url = "https://files.pythonhosted.org/packages/33/01/a8ea7c5ea32a9b45ceeaee051a04c8ed4320f5add3c51bfa20879b765b70/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", size = 80281, upload-time = "2025-08-10T21:27:45.369Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/dbd2ecdce306f1d07a1aaf324817ee993aab7aee9db47ceac757deabafbe/kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", size = 78009, upload-time = "2025-08-10T21:27:46.376Z" }, + { url = "https://files.pythonhosted.org/packages/da/e9/0d4add7873a73e462aeb45c036a2dead2562b825aa46ba326727b3f31016/kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", size = 73929, upload-time = "2025-08-10T21:27:48.236Z" }, ] [[package]] name = "librt" version = "0.11.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/40/08/9e7f6b5d2b5bed6ad055cdd5925f192bb403a51280f86b56554d9d0699a2/librt-0.11.0.tar.gz", hash = "sha256:075dc3ef4458a278e0195cbf6ac9d38808d9b906c5a6c7f7f79c3888276a3fb1", upload-time = "2026-05-10T18:17:25.138Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/83/10/37fd9e9ba96cb0bd742dfb20fc3d082e54bdbec759d7300df927f360ef07/librt-0.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6e94ebfcfa2d5e9926d6c3b9aa4617ffc42a845b4321fb84021b872358c82a0f", upload-time = "2026-05-10T18:15:16.129Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/72/1b1466f358e4a0b728051f69bc27e67b432c6eaa2e05b88db49d3785ae0d/librt-0.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ae627397a2f351560440d872d6f7c8dbb4072e57868e7b2fc5b8b430fe489d45", upload-time = "2026-05-10T18:15:18.148Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ca/85/ed26dd2f6bc9a0baf48306433e579e8d354d70b2bcb78134ed950a5d0e1e/librt-0.11.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc329359321b67d24efdf4bc69012b0597001649544db662c001db5a0184794c", upload-time = "2026-05-10T18:15:19.569Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/fe/11891191c0e0a3fd617724e891f6e67a71a7658974a892b9a9a97fdb2977/librt-0.11.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:7e82e642ab0f7608ce2fe53d76ca2280a9ee33a1b06556142c7c6fe80a86fc33", upload-time = "2026-05-10T18:15:20.87Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/50/5ec949d7f9ce1a07af903aa3e13abb98b717923bdead6e719b2f824ccc07/librt-0.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88145c15c67731d54283d135b03244028c750cc9edc334a96a4f5950ebdb2884", upload-time = "2026-05-10T18:15:22.616Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ea/c4/177336c7524e34875a38bf668e88b193a6723a4eb4045d07f74df6e1506c/librt-0.11.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9d36a51b3d93320b686588e27123f4995804dbf1bce81df78c02fc3c6eea9280", upload-time = "2026-05-10T18:15:24.2Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/13/1f/da3112f7569eda3b49f9a2629bae1fe059812b6085df16c885f6454dff49/librt-0.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3ac06a2a8b246327f11e186a53a100a4d5c7ed52346367e5ec751d51586c", upload-time = "2026-05-10T18:15:26.226Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fa/94/03fec301522e172d105581431223be56b27594ff46440ebfbb658a3735d5/librt-0.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:461bbceede621f1ffb8839755f8663e886087ee7af16294cab7fb4d782c62eeb", upload-time = "2026-05-10T18:15:27.965Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/6e/339f6e5a7b413ce014f1917a756dae630fe59cc99f34153205b1cb540901/librt-0.11.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0cad8a4d6a8ff03c9b76f9414caccd78e7cfbc8a2e12fa334d8e1d9932753783", upload-time = "2026-05-10T18:15:29.614Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cd/43/acdd5ce317cb46e8253ca9bfbdb8b12e68a24d745949336a7f3d5fb79ba0/librt-0.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f37aa505b3cf60701562eddb32df74b12a9e380c207fd8b06dd157a943ac7ea0", upload-time = "2026-05-10T18:15:30.928Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/29/b5/7a25bb12e3172839f647f196b3e988318b7bb1ca7501732a225c4dce2ec0/librt-0.11.0-cp310-cp310-win32.whl", hash = "sha256:94663a21534637f0e787ec2a2a756022df6e5b7b2335a5cdd7d8e33d68a2af89", upload-time = "2026-05-10T18:15:32.551Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c6/0d/ebbcf4d77999c02c937b05d2b90ff4cd4dcc7e9a365ba132329ac1fe7a0f/librt-0.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:dec7db73758c2b54953fd8b7fe348c45188fe26b39ee18446196edd08453a5d4", upload-time = "2026-05-10T18:15:33.678Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/87/2bf31fe17587b29e3f93ec31421e2b1e1c3e349b8bf6c7c313dbad1d5340/librt-0.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:93d95bd45b7d58343d8b90d904450a545144eec19a002511163426f8ab1fae29", upload-time = "2026-05-10T18:15:34.795Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/08/5c5bf772920b7ebac6e32bc91a643e0ab3870199c0b542356d3baa83970a/librt-0.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ee278c769a713638cdacd4c0436d72156e75df3ebc0166ab2b9dc43acc386c9", upload-time = "2026-05-10T18:15:36.242Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/06/20/662a03d254e5b000d838e8b345d83303ddb768c080fd488e40634c0fa66b/librt-0.11.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f230cb1cbc9faaa616f9a678f530ebcf186e414b6bcbd88b960e4ba1b92428d5", upload-time = "2026-05-10T18:15:37.56Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/de/f3/aa81523e45184c6ec23dc7f63263362ec55f80a09d424c012359ecbe7e35/librt-0.11.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5d63c855d86938d9de93e265c9bd8c705b51ec494de5738340ee93767a686e4b", upload-time = "2026-05-10T18:15:39.182Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6b/6f/59c74b560ca8853834d5501d589c8a2519f4184f273a085ffd0f37a1cc47/librt-0.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:993f028be9e96a08d31df3479ac80d99be374d17f3b78e4796b3fd3c913d4e89", upload-time = "2026-05-10T18:15:40.634Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/7b/5aa4d2c9600a719401160bf7055417df0b2a47439b9d88286ce45e56b65f/librt-0.11.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:258d73a0aa66a055e65b2e4d1b8cdb23b9d132c5bb915d9547d804fcaed116cc", upload-time = "2026-05-10T18:15:41.934Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d6/31/9143803d7da6856a69153785768c4936864430eec0fd9461c3ea527d9922/librt-0.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0827efe7854718f04aaddf6496e96960a956e676fe1d0f04eb41511fd8ad06d5", upload-time = "2026-05-10T18:15:43.206Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2f/5a/bce08184488426bda4ccc2c4964ac048c8f68ae89bd7120082eef4233cfd/librt-0.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7753e57d6e12d019c0d8786f1c09c709f4c3fcc57c3887b24e36e6c06ec938b7", upload-time = "2026-05-10T18:15:44.761Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/8c/bb5e213d254b7505a0e658da199d8ab719086632ce09eef311ab27976523/librt-0.11.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:11bd19822431cc21af9f27374e7ae2e58103c7d98bda823536a6c47f6bb2bb3d", upload-time = "2026-05-10T18:15:46.308Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9d/fb/541cdad5b1ab1300398c74c4c9a497b88e5074c21b1244c8f49731d3a284/librt-0.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:22bdf239b219d3993761a148ffa134b19e52e9989c84f845d5d7b71d70a17412", upload-time = "2026-05-10T18:15:47.629Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8f/f2/464bb69295c320cb06bddb4f14a4ec67934ee14b2bffb12b19fb7ab287ba/librt-0.11.0-cp311-cp311-win32.whl", hash = "sha256:46c60b61e308eb535fbd6fa622b1ee1bb2815691c1ad9c98bf7b84952ec3bc8d", upload-time = "2026-05-10T18:15:49.157Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/e7/a17ee1788f9e4fbf548c19f4afa07c92089b9e24fef6cb2410863781ef4c/librt-0.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:902e546ff044f579ff1c953ff5fce97b636fe9e3943996b2177710c6ef076f73", upload-time = "2026-05-10T18:15:50.345Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cc/c7/6c766214f9f9903bcfcfbef97d807af8d8f5aa3502d247858ab17582d212/librt-0.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:65ac3bc20f78aa0ee5ae84baa68917f89fef4af63e941084dd019a0d0e749f0c", upload-time = "2026-05-10T18:15:52.068Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/d0/07c77e067f0838949b43bd89232c29d72efebb9d2801a9750184eb706b71/librt-0.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b87504f1690a23b9a2cca841191a04f83895d4fc2dd04df91d82b1a04ca2ad46", upload-time = "2026-05-10T18:15:53.227Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/24/8493538fa4f62f982686398a5b8f68008138a75086abdea19ade64bf4255/librt-0.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40071fc5fe0ce8daa6de616702314a01e1250711682b0523d6ab8d4525910cb3", upload-time = "2026-05-10T18:15:54.657Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ff/1e/f8bad050810d9171f34a1648ed910e56814c2ba61639f2bd53c6377ae24b/librt-0.11.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:137e79445c896a0ea7b265f52d23954e05b64222ee1af69e2cb34219067cbb67", upload-time = "2026-05-10T18:15:56.117Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/fe/3594ebfbaf03084ba4b120c9ba5c3183fd938a48725e9bbe6ff0a5159ad8/librt-0.11.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:cca6644054e78746d8d4ef238681f9c34ff8b584fe6b988ecebb8db3b15e622a", upload-time = "2026-05-10T18:15:57.544Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/da/5d1876984b3746c85dbd219dbfcb73c85f54ee263fd32e5b2a632ec14571/librt-0.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5b0eea49f5562861ee8d757a32ef7d559c1d35be2aaaa1ec28941d74c9ffc8a", upload-time = "2026-05-10T18:15:58.805Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/6e/55bdf5d5ca00c3e18430690bf2c953d8d3ffd3c337418173d33dec985dc9/librt-0.11.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0d1029d7e1ae1a7e647ed6fb5df8c4ce2dffefb7a9f5fd1376a4554d96dac09f", upload-time = "2026-05-10T18:16:00.2Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/07/10/f1f23a7c595ee90ece4d35c851e5d104b1311a887ed1b4ac4c35bbd13da8/librt-0.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bc3ce6b33c5828d9e80592011a5c584cb2ce86edbc4088405f70da47dc1d1b3b", upload-time = "2026-05-10T18:16:01.708Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b6/02/5720f5697a7f54b78b3aefbe20df3a48cedcff1276618c4aa481177942ed/librt-0.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:936c5995f3514a42111f20099397d8177c79b4d7e70961e396c6f5a0a3566766", upload-time = "2026-05-10T18:16:03.496Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/db/b4a47c6f91db4ff76348a0b3dd0cc65e090a078b765a810a62ff9434c3d3/librt-0.11.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9bc0ca6ad9381cbe8e4aa6e5726e4c80c78115a6e9723c599ed1d73e092bc49d", upload-time = "2026-05-10T18:16:05.173Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9e/58/9384b2f4eb1ed1d273d40948a7c5c4b2360213b402ef3be4641c06299f9c/librt-0.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:070aa8c26c0a74774317a72df8851facc7f0f012a5b406557ac56992d92e1ec8", upload-time = "2026-05-10T18:16:06.839Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/21/7b/5aa8848a7c6a9278c79375146da1812e695754ceec5f005e6043461a7315/librt-0.11.0-cp312-cp312-win32.whl", hash = "sha256:6bf14feb84b05ae945277395451998c89c54d0def4070eb5c08de544930b245a", upload-time = "2026-05-10T18:16:08.103Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/37/33/8a745436944947575b584231750a41417de1a38cf6a2e9251d1065651c09/librt-0.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:75672f0bc524ede266287d532d7923dbce94c7514ad07627bac3d0c6d92cc4d9", upload-time = "2026-05-10T18:16:09.174Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/59/67/a6739ac96e28b7855808bdb0370e250606104a859750d209e5a0716fe7ab/librt-0.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f10cf143e4a9bb0f4f5af568a00df94a2d69ef41c2579584454bb0fe5cc642c", upload-time = "2026-05-10T18:16:10.369Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/82/61/e59168d4d0bf2bf90f4f0caf7a001bfc60254c3af4586013b04dc3ef517b/librt-0.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:78dc31f7fdfe9c9d0eb0e8f42d139db230e826415bbcabd9f0e9faaaee909894", upload-time = "2026-05-10T18:16:11.771Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/61/fd/caa1d60b12f7dd79ccea23054e06eeaebe266a5f52c40a6b651069200ce5/librt-0.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fa475675db22290c3158e1d42326d0f5a65f04f44a0e68c3630a25b53560fb9c", upload-time = "2026-05-10T18:16:13.334Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b8/a9/dc744f5c2b4978d48db970be29f22716d3413d28b14ad99740817315cf2c/librt-0.11.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:621db29691044bdeda22e789e482e1b0f3a985d90e3426c9c6d17606416205ea", upload-time = "2026-05-10T18:16:14.729Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8f/21/7f8e97a1e4dae952a5a95948f6f8507a173bc1e669f54340bba6ca1ca31b/librt-0.11.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:a9010e2ed5b3a9e158c5fd966b3ab7e834bb3d3aacc8f66c91dd4b57a3799230", upload-time = "2026-05-10T18:16:16.321Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a6/6d/d8ee9c114bebf2c50e29ec2aa940826fccb62a645c3e4c18760987d0e16d/librt-0.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c39513d8b7477a2e1ed8c43fc21c524e8d5a0f8d4e8b7b074dbdbe7820a08e2", upload-time = "2026-05-10T18:16:17.647Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f0/43/0b5708af2bd30a46400e72ba6bdaa8f066f15fb9a688527e34220e8d6c06/librt-0.11.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7aef3cf1d5af86e770ab04bfd993dfc4ae8b8c17f66fb77dd4a7d50de7bbb1a3", upload-time = "2026-05-10T18:16:19.309Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4a/50/356187247d09013490481033183b3532b58acf8028bcb34b2b56a375c9b2/librt-0.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:557183ddc36babe46b27dd60facbd5adb4492181a5be887587d57cda6e092f21", upload-time = "2026-05-10T18:16:20.642Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/e7/c6ac4240899c7f3248079d5a9900debe0dadb3fdeaf856684c987105ba47/librt-0.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83d3e1f72bd42f6c5c0b7daec530c3f829bd02db42c70b8ddf0c2d90a2459930", upload-time = "2026-05-10T18:16:22.352Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/eb/b5/a81322dbeedeeaf9c1ee6f001734d28a09d8383ac9e6779bc24bbd0743c6/librt-0.11.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:4ce1f21fbe589bc1afd7872dece84fb0e1144f794a288e58a10d2c54a55c43be", upload-time = "2026-05-10T18:16:23.627Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ae/66/6e6323787d592b55204a42595ff1102da5115601b53a7e9ddebc889a6da5/librt-0.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b09f7044ea2b64c9da42fd3d335666518cfd1c6e8a182c95da73d0214b41e", upload-time = "2026-05-10T18:16:25.025Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/21/623f8ca230857102066d9ca8c6c1734995908c4d0d1bee7bb2ef0021cb33/librt-0.11.0-cp313-cp313-win32.whl", hash = "sha256:78fddc31cd4d3caa897ad5d31f856b1faadc9474021ad6cb182b9018793e254e", upload-time = "2026-05-10T18:16:26.649Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/1d/b4ebd44dd723f768469007515cb92251e0ae286c94c140f374801140fa74/librt-0.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ca8aa88751a775870b764e93bad5135385f563cb8dcee399abf034ea4d3cb47", upload-time = "2026-05-10T18:16:27.859Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3b/e4/b2f4ca7965ca373b491cdb4bc25cdb30c1649ca81a8782056a83850292a9/librt-0.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:96f044bb325fd9cf1a723015638c219e9143f0dfbc0ca54c565df2b7fc748b44", upload-time = "2026-05-10T18:16:29.066Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/29/eb/dbce197da4e227779e56b5735f2decc3eb36e55a1cdbf1bd65d6639d76c1/librt-0.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4a017a95e5837dc15a8c5661d60e05daa96b90908b1aa6b7acdf443cd25c8ebd", upload-time = "2026-05-10T18:16:30.674Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/76/a3/254bebd0c11c8ba684018efb8006ff22e466abce445215cca6c778e7d9de/librt-0.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b1ecbd9819deccc39b7542bf4d2a740d8a620694d39989e58661d3763458f8d4", upload-time = "2026-05-10T18:16:32.037Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/3f/f77d6122d21ac7bf6ae8a7dfced1bd2a7ac545d3273ebdcaf8042f6d619f/librt-0.11.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7da327dacd7be8f8ec36547373550744a3cc0e536d54665cd83f8bcd961200e8", upload-time = "2026-05-10T18:16:33.493Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ac/0a/2c996dadebaa7d9bbbd43ef2d4f3e66b6da545f838a41694ef6172cebec8/librt-0.11.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:0dc56b1f8d06e60db362cc3fdae206681817f86ce4725d34511473487f12a34b", upload-time = "2026-05-10T18:16:34.864Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/7e/f5d92af8486b8272c23b3e686b46ff72d89c8169585eb61eef01a2ac7147/librt-0.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05fb8fb2ab90e21c8d12ea240d744ad514da9baf381ebfa70d91d20d21713175", upload-time = "2026-05-10T18:16:36.705Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/af/1a/cb0734fe86398eb33193ab753b7326255c74cac5eb09e76b9b16536e7adb/librt-0.11.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cae74872be221df4374d10fec61f93ed1513b9546ea84f2c0bf73ab3e9bd0b03", upload-time = "2026-05-10T18:16:38.418Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/06/094820f91558b66e29943c0ec41c9914f460f48dd51fc503c3101e10842d/librt-0.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:32bcc918c0148eb7e3d57385125bac7e5f9e4359d05f07448b09f6f778c2f31c", upload-time = "2026-05-10T18:16:39.848Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/c2/00de9018871a282f530cacb457d5ec0428f6ac7e6fedde9aff7468d9fb04/librt-0.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f9743fc99135d5f78d2454435615f6dec0473ca507c26ce9d92b10b562a280d3", upload-time = "2026-05-10T18:16:41.471Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/51/9d/64631832348fd1834fb3a61b996434edddaaf25a31d03b0a76273159d2cf/librt-0.11.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5ba067f4aadae8fda802d91d2124c90c42195ff32d9161d3549e6d05cfe26f96", upload-time = "2026-05-10T18:16:43.15Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a5/ec/ae5525eb16edc827a044e7bb8777a455ff95d4bca9379e7e6bddd7383647/librt-0.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:de3bf945454d032f9e390b85c4072e0a0570bf825421c8be0e71209fa65e1abe", upload-time = "2026-05-10T18:16:44.408Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5a/09/adce371f27ca039411da9659f7430fcc2ba6cd0c7b3e4467a0f091be7fa9/librt-0.11.0-cp314-cp314-win32.whl", hash = "sha256:d2277a05f6dcb9fd13db9566aac4fabd68c3ea1ea46ee5567d4eef8efa495a2f", upload-time = "2026-05-10T18:16:46.039Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d6/ee/8ac720d98548f173c7ce2e632a7ca94673f74cacd5c8162a84af5b35958a/librt-0.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:ab73e8db5e3f564d812c1f5c3a175930a5f9bc96ccb5e3b22a34d7858b401cf7", upload-time = "2026-05-10T18:16:47.133Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/94/20/c900cf14efeb09b6bef2b2dff20779f73464b97fd58d1c6bccc379588ae3/librt-0.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:aea3caa317752e3a466fa8af45d91ee0ea8c7fdd96e42b0a8dd9b76a7931eba1", upload-time = "2026-05-10T18:16:48.597Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/71/944bfe4b64e12abffcd3c15e1cce07f72f3d55655083786285f4dedeb532/librt-0.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d1b36540d7aaf9b9101b3a6f376c8d8e9f7a9aec93ed05918f2c69d493ffef72", upload-time = "2026-05-10T18:16:49.839Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b6/10/99e64a5c86989357fda078c8143c533389585f6473b7439172dd8f3b3b2d/librt-0.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:efbb343ab2ce3540f4ecbe6315d677ed70f37cd9a72b1e58066c918ca83acbaa", upload-time = "2026-05-10T18:16:51.062Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/21/31/5072ad880946d83e5ea4147d6d018c78eefce85b77819b19bdd0ee229435/librt-0.11.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0dd688aab3f7914d3e6e5e3554978e0383312fb8e771d84be008a35b9ee548", upload-time = "2026-05-10T18:16:52.632Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5e/8d/70b5fb7cfbab60edbe7381614ab985da58e144fbf465c86d44c95f43cdca/librt-0.11.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f5fb36b8c6c63fdcbb1d526d94c0d1331610d43f4118cc1beb4efef4f3faacb2", upload-time = "2026-05-10T18:16:53.934Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fa/a3/ba3495a0b3edbd24a4cae0d1d3c64f39a9fc45d06e812101289b50c1a619/librt-0.11.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a9a237d13addb93715b6fee74023d5ee3469b53fce527626c0e088aa585805f", upload-time = "2026-05-10T18:16:55.589Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f7/db/36e25fb81f99937ff1b96612a1dc9fd66f039cb9cc3aee12c01fac31aab9/librt-0.11.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5ddd17bd87b2c56ddd60e546a7984a2e64c4e8eab92fb4cf3830a48ad5469d51", upload-time = "2026-05-10T18:16:56.975Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/33/0d/3f622b47f0b013eeb9cf4cc07ae9bfe378d832a4eec998b2b209fe84244d/librt-0.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd43992b4473d42f12ff9e68326079f0696d9d4e6000e8f39a0238d482ba6ee2", upload-time = "2026-05-10T18:16:58.374Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a9/02/71b90bc93039c46a2000651f6ad60122b114c8f54c4ad306e0e96f5b75ad/librt-0.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:f8e3e8056dd674e279741485e2e512d6e9a751c7455809d0114e6ebf8d781085", upload-time = "2026-05-10T18:16:59.676Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/04/04/418cb3f75621e2b761fb1ab0f017f4d70a1a72a6e7c74ee4f7e8d198c2f3/librt-0.11.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c1f708d8ae9c56cf38a903c44297243d2ec83fd82b396b977e0144a3e76217e3", upload-time = "2026-05-10T18:17:01.007Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cc/2c/5a2183ac58dd911f26b5d7e7d7d8f1d87fcecdddd99d6c12169a258ff62c/librt-0.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0add982e0e7b9fc14cf4b33789d5f13f66581889b88c2f58099f6ce8f92617bd", upload-time = "2026-05-10T18:17:02.682Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/15/1f/dc6771a52592a4451be6effa200cbfc9cec61e4393d3033d81a9d307961d/librt-0.11.0-cp314-cp314t-win32.whl", hash = "sha256:2b481d846ac894c4e8403c5fd0e87c5d11d6499e404b474602508a224ff531c8", upload-time = "2026-05-10T18:17:03.99Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/62/4a/7d1415567027286a75ba1093ec4aca11f073e0f559c530cf3e0a757ad55c/librt-0.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:28edb433edde181112a908c78907af28f964eabc15f4dd16c9d66c834302677c", upload-time = "2026-05-10T18:17:05.465Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ce/62/b40b382fa0c66fee1478073eb8db352a4a6beda4a1adccf1df911d8c289c/librt-0.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dee008f20b542e3cd162ba338a7f9ec0f6d23d395f66fe8aeeec3c9d067ea253", upload-time = "2026-05-10T18:17:06.809Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/40/08/9e7f6b5d2b5bed6ad055cdd5925f192bb403a51280f86b56554d9d0699a2/librt-0.11.0.tar.gz", hash = "sha256:075dc3ef4458a278e0195cbf6ac9d38808d9b906c5a6c7f7f79c3888276a3fb1", size = 200139, upload-time = "2026-05-10T18:17:25.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/10/37fd9e9ba96cb0bd742dfb20fc3d082e54bdbec759d7300df927f360ef07/librt-0.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6e94ebfcfa2d5e9926d6c3b9aa4617ffc42a845b4321fb84021b872358c82a0f", size = 141706, upload-time = "2026-05-10T18:15:16.129Z" }, + { url = "https://files.pythonhosted.org/packages/cf/72/1b1466f358e4a0b728051f69bc27e67b432c6eaa2e05b88db49d3785ae0d/librt-0.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ae627397a2f351560440d872d6f7c8dbb4072e57868e7b2fc5b8b430fe489d45", size = 142605, upload-time = "2026-05-10T18:15:18.148Z" }, + { url = "https://files.pythonhosted.org/packages/ca/85/ed26dd2f6bc9a0baf48306433e579e8d354d70b2bcb78134ed950a5d0e1e/librt-0.11.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc329359321b67d24efdf4bc69012b0597001649544db662c001db5a0184794c", size = 476555, upload-time = "2026-05-10T18:15:19.569Z" }, + { url = "https://files.pythonhosted.org/packages/66/fe/11891191c0e0a3fd617724e891f6e67a71a7658974a892b9a9a97fdb2977/librt-0.11.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:7e82e642ab0f7608ce2fe53d76ca2280a9ee33a1b06556142c7c6fe80a86fc33", size = 468434, upload-time = "2026-05-10T18:15:20.87Z" }, + { url = "https://files.pythonhosted.org/packages/6f/50/5ec949d7f9ce1a07af903aa3e13abb98b717923bdead6e719b2f824ccc07/librt-0.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88145c15c67731d54283d135b03244028c750cc9edc334a96a4f5950ebdb2884", size = 496918, upload-time = "2026-05-10T18:15:22.616Z" }, + { url = "https://files.pythonhosted.org/packages/ea/c4/177336c7524e34875a38bf668e88b193a6723a4eb4045d07f74df6e1506c/librt-0.11.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9d36a51b3d93320b686588e27123f4995804dbf1bce81df78c02fc3c6eea9280", size = 490334, upload-time = "2026-05-10T18:15:24.2Z" }, + { url = "https://files.pythonhosted.org/packages/13/1f/da3112f7569eda3b49f9a2629bae1fe059812b6085df16c885f6454dff49/librt-0.11.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d00f3ac06a2a8b246327f11e186a53a100a4d5c7ed52346367e5ec751d51586c", size = 511287, upload-time = "2026-05-10T18:15:26.226Z" }, + { url = "https://files.pythonhosted.org/packages/fa/94/03fec301522e172d105581431223be56b27594ff46440ebfbb658a3735d5/librt-0.11.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:461bbceede621f1ffb8839755f8663e886087ee7af16294cab7fb4d782c62eeb", size = 517202, upload-time = "2026-05-10T18:15:27.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/6e/339f6e5a7b413ce014f1917a756dae630fe59cc99f34153205b1cb540901/librt-0.11.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0cad8a4d6a8ff03c9b76f9414caccd78e7cfbc8a2e12fa334d8e1d9932753783", size = 497517, upload-time = "2026-05-10T18:15:29.614Z" }, + { url = "https://files.pythonhosted.org/packages/cd/43/acdd5ce317cb46e8253ca9bfbdb8b12e68a24d745949336a7f3d5fb79ba0/librt-0.11.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f37aa505b3cf60701562eddb32df74b12a9e380c207fd8b06dd157a943ac7ea0", size = 538878, upload-time = "2026-05-10T18:15:30.928Z" }, + { url = "https://files.pythonhosted.org/packages/29/b5/7a25bb12e3172839f647f196b3e988318b7bb1ca7501732a225c4dce2ec0/librt-0.11.0-cp310-cp310-win32.whl", hash = "sha256:94663a21534637f0e787ec2a2a756022df6e5b7b2335a5cdd7d8e33d68a2af89", size = 100070, upload-time = "2026-05-10T18:15:32.551Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0d/ebbcf4d77999c02c937b05d2b90ff4cd4dcc7e9a365ba132329ac1fe7a0f/librt-0.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:dec7db73758c2b54953fd8b7fe348c45188fe26b39ee18446196edd08453a5d4", size = 117918, upload-time = "2026-05-10T18:15:33.678Z" }, + { url = "https://files.pythonhosted.org/packages/fe/87/2bf31fe17587b29e3f93ec31421e2b1e1c3e349b8bf6c7c313dbad1d5340/librt-0.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:93d95bd45b7d58343d8b90d904450a545144eec19a002511163426f8ab1fae29", size = 141092, upload-time = "2026-05-10T18:15:34.795Z" }, + { url = "https://files.pythonhosted.org/packages/cf/08/5c5bf772920b7ebac6e32bc91a643e0ab3870199c0b542356d3baa83970a/librt-0.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ee278c769a713638cdacd4c0436d72156e75df3ebc0166ab2b9dc43acc386c9", size = 142035, upload-time = "2026-05-10T18:15:36.242Z" }, + { url = "https://files.pythonhosted.org/packages/06/20/662a03d254e5b000d838e8b345d83303ddb768c080fd488e40634c0fa66b/librt-0.11.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f230cb1cbc9faaa616f9a678f530ebcf186e414b6bcbd88b960e4ba1b92428d5", size = 475022, upload-time = "2026-05-10T18:15:37.56Z" }, + { url = "https://files.pythonhosted.org/packages/de/f3/aa81523e45184c6ec23dc7f63263362ec55f80a09d424c012359ecbe7e35/librt-0.11.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:5d63c855d86938d9de93e265c9bd8c705b51ec494de5738340ee93767a686e4b", size = 467273, upload-time = "2026-05-10T18:15:39.182Z" }, + { url = "https://files.pythonhosted.org/packages/6b/6f/59c74b560ca8853834d5501d589c8a2519f4184f273a085ffd0f37a1cc47/librt-0.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:993f028be9e96a08d31df3479ac80d99be374d17f3b78e4796b3fd3c913d4e89", size = 497083, upload-time = "2026-05-10T18:15:40.634Z" }, + { url = "https://files.pythonhosted.org/packages/fe/7b/5aa4d2c9600a719401160bf7055417df0b2a47439b9d88286ce45e56b65f/librt-0.11.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:258d73a0aa66a055e65b2e4d1b8cdb23b9d132c5bb915d9547d804fcaed116cc", size = 489139, upload-time = "2026-05-10T18:15:41.934Z" }, + { url = "https://files.pythonhosted.org/packages/d6/31/9143803d7da6856a69153785768c4936864430eec0fd9461c3ea527d9922/librt-0.11.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0827efe7854718f04aaddf6496e96960a956e676fe1d0f04eb41511fd8ad06d5", size = 508442, upload-time = "2026-05-10T18:15:43.206Z" }, + { url = "https://files.pythonhosted.org/packages/2f/5a/bce08184488426bda4ccc2c4964ac048c8f68ae89bd7120082eef4233cfd/librt-0.11.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7753e57d6e12d019c0d8786f1c09c709f4c3fcc57c3887b24e36e6c06ec938b7", size = 514230, upload-time = "2026-05-10T18:15:44.761Z" }, + { url = "https://files.pythonhosted.org/packages/89/8c/bb5e213d254b7505a0e658da199d8ab719086632ce09eef311ab27976523/librt-0.11.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:11bd19822431cc21af9f27374e7ae2e58103c7d98bda823536a6c47f6bb2bb3d", size = 494231, upload-time = "2026-05-10T18:15:46.308Z" }, + { url = "https://files.pythonhosted.org/packages/9d/fb/541cdad5b1ab1300398c74c4c9a497b88e5074c21b1244c8f49731d3a284/librt-0.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:22bdf239b219d3993761a148ffa134b19e52e9989c84f845d5d7b71d70a17412", size = 537585, upload-time = "2026-05-10T18:15:47.629Z" }, + { url = "https://files.pythonhosted.org/packages/8f/f2/464bb69295c320cb06bddb4f14a4ec67934ee14b2bffb12b19fb7ab287ba/librt-0.11.0-cp311-cp311-win32.whl", hash = "sha256:46c60b61e308eb535fbd6fa622b1ee1bb2815691c1ad9c98bf7b84952ec3bc8d", size = 100509, upload-time = "2026-05-10T18:15:49.157Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e7/a17ee1788f9e4fbf548c19f4afa07c92089b9e24fef6cb2410863781ef4c/librt-0.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:902e546ff044f579ff1c953ff5fce97b636fe9e3943996b2177710c6ef076f73", size = 118628, upload-time = "2026-05-10T18:15:50.345Z" }, + { url = "https://files.pythonhosted.org/packages/cc/c7/6c766214f9f9903bcfcfbef97d807af8d8f5aa3502d247858ab17582d212/librt-0.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:65ac3bc20f78aa0ee5ae84baa68917f89fef4af63e941084dd019a0d0e749f0c", size = 103122, upload-time = "2026-05-10T18:15:52.068Z" }, + { url = "https://files.pythonhosted.org/packages/8b/d0/07c77e067f0838949b43bd89232c29d72efebb9d2801a9750184eb706b71/librt-0.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b87504f1690a23b9a2cca841191a04f83895d4fc2dd04df91d82b1a04ca2ad46", size = 144147, upload-time = "2026-05-10T18:15:53.227Z" }, + { url = "https://files.pythonhosted.org/packages/7a/24/8493538fa4f62f982686398a5b8f68008138a75086abdea19ade64bf4255/librt-0.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40071fc5fe0ce8daa6de616702314a01e1250711682b0523d6ab8d4525910cb3", size = 143614, upload-time = "2026-05-10T18:15:54.657Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1e/f8bad050810d9171f34a1648ed910e56814c2ba61639f2bd53c6377ae24b/librt-0.11.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:137e79445c896a0ea7b265f52d23954e05b64222ee1af69e2cb34219067cbb67", size = 485538, upload-time = "2026-05-10T18:15:56.117Z" }, + { url = "https://files.pythonhosted.org/packages/c0/fe/3594ebfbaf03084ba4b120c9ba5c3183fd938a48725e9bbe6ff0a5159ad8/librt-0.11.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:cca6644054e78746d8d4ef238681f9c34ff8b584fe6b988ecebb8db3b15e622a", size = 479623, upload-time = "2026-05-10T18:15:57.544Z" }, + { url = "https://files.pythonhosted.org/packages/b0/da/5d1876984b3746c85dbd219dbfcb73c85f54ee263fd32e5b2a632ec14571/librt-0.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d5b0eea49f5562861ee8d757a32ef7d559c1d35be2aaaa1ec28941d74c9ffc8a", size = 513082, upload-time = "2026-05-10T18:15:58.805Z" }, + { url = "https://files.pythonhosted.org/packages/19/6e/55bdf5d5ca00c3e18430690bf2c953d8d3ffd3c337418173d33dec985dc9/librt-0.11.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0d1029d7e1ae1a7e647ed6fb5df8c4ce2dffefb7a9f5fd1376a4554d96dac09f", size = 508105, upload-time = "2026-05-10T18:16:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/07/10/f1f23a7c595ee90ece4d35c851e5d104b1311a887ed1b4ac4c35bbd13da8/librt-0.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bc3ce6b33c5828d9e80592011a5c584cb2ce86edbc4088405f70da47dc1d1b3b", size = 522268, upload-time = "2026-05-10T18:16:01.708Z" }, + { url = "https://files.pythonhosted.org/packages/b6/02/5720f5697a7f54b78b3aefbe20df3a48cedcff1276618c4aa481177942ed/librt-0.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:936c5995f3514a42111f20099397d8177c79b4d7e70961e396c6f5a0a3566766", size = 527348, upload-time = "2026-05-10T18:16:03.496Z" }, + { url = "https://files.pythonhosted.org/packages/50/db/b4a47c6f91db4ff76348a0b3dd0cc65e090a078b765a810a62ff9434c3d3/librt-0.11.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9bc0ca6ad9381cbe8e4aa6e5726e4c80c78115a6e9723c599ed1d73e092bc49d", size = 516294, upload-time = "2026-05-10T18:16:05.173Z" }, + { url = "https://files.pythonhosted.org/packages/9e/58/9384b2f4eb1ed1d273d40948a7c5c4b2360213b402ef3be4641c06299f9c/librt-0.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:070aa8c26c0a74774317a72df8851facc7f0f012a5b406557ac56992d92e1ec8", size = 553608, upload-time = "2026-05-10T18:16:06.839Z" }, + { url = "https://files.pythonhosted.org/packages/21/7b/5aa8848a7c6a9278c79375146da1812e695754ceec5f005e6043461a7315/librt-0.11.0-cp312-cp312-win32.whl", hash = "sha256:6bf14feb84b05ae945277395451998c89c54d0def4070eb5c08de544930b245a", size = 101879, upload-time = "2026-05-10T18:16:08.103Z" }, + { url = "https://files.pythonhosted.org/packages/37/33/8a745436944947575b584231750a41417de1a38cf6a2e9251d1065651c09/librt-0.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:75672f0bc524ede266287d532d7923dbce94c7514ad07627bac3d0c6d92cc4d9", size = 119831, upload-time = "2026-05-10T18:16:09.174Z" }, + { url = "https://files.pythonhosted.org/packages/59/67/a6739ac96e28b7855808bdb0370e250606104a859750d209e5a0716fe7ab/librt-0.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:2f10cf143e4a9bb0f4f5af568a00df94a2d69ef41c2579584454bb0fe5cc642c", size = 103470, upload-time = "2026-05-10T18:16:10.369Z" }, + { url = "https://files.pythonhosted.org/packages/82/61/e59168d4d0bf2bf90f4f0caf7a001bfc60254c3af4586013b04dc3ef517b/librt-0.11.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:78dc31f7fdfe9c9d0eb0e8f42d139db230e826415bbcabd9f0e9faaaee909894", size = 144119, upload-time = "2026-05-10T18:16:11.771Z" }, + { url = "https://files.pythonhosted.org/packages/61/fd/caa1d60b12f7dd79ccea23054e06eeaebe266a5f52c40a6b651069200ce5/librt-0.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fa475675db22290c3158e1d42326d0f5a65f04f44a0e68c3630a25b53560fb9c", size = 143565, upload-time = "2026-05-10T18:16:13.334Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a9/dc744f5c2b4978d48db970be29f22716d3413d28b14ad99740817315cf2c/librt-0.11.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:621db29691044bdeda22e789e482e1b0f3a985d90e3426c9c6d17606416205ea", size = 485395, upload-time = "2026-05-10T18:16:14.729Z" }, + { url = "https://files.pythonhosted.org/packages/8f/21/7f8e97a1e4dae952a5a95948f6f8507a173bc1e669f54340bba6ca1ca31b/librt-0.11.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:a9010e2ed5b3a9e158c5fd966b3ab7e834bb3d3aacc8f66c91dd4b57a3799230", size = 479383, upload-time = "2026-05-10T18:16:16.321Z" }, + { url = "https://files.pythonhosted.org/packages/a6/6d/d8ee9c114bebf2c50e29ec2aa940826fccb62a645c3e4c18760987d0e16d/librt-0.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7c39513d8b7477a2e1ed8c43fc21c524e8d5a0f8d4e8b7b074dbdbe7820a08e2", size = 513010, upload-time = "2026-05-10T18:16:17.647Z" }, + { url = "https://files.pythonhosted.org/packages/f0/43/0b5708af2bd30a46400e72ba6bdaa8f066f15fb9a688527e34220e8d6c06/librt-0.11.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7aef3cf1d5af86e770ab04bfd993dfc4ae8b8c17f66fb77dd4a7d50de7bbb1a3", size = 508433, upload-time = "2026-05-10T18:16:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/4a/50/356187247d09013490481033183b3532b58acf8028bcb34b2b56a375c9b2/librt-0.11.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:557183ddc36babe46b27dd60facbd5adb4492181a5be887587d57cda6e092f21", size = 522595, upload-time = "2026-05-10T18:16:20.642Z" }, + { url = "https://files.pythonhosted.org/packages/40/e7/c6ac4240899c7f3248079d5a9900debe0dadb3fdeaf856684c987105ba47/librt-0.11.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:83d3e1f72bd42f6c5c0b7daec530c3f829bd02db42c70b8ddf0c2d90a2459930", size = 527255, upload-time = "2026-05-10T18:16:22.352Z" }, + { url = "https://files.pythonhosted.org/packages/eb/b5/a81322dbeedeeaf9c1ee6f001734d28a09d8383ac9e6779bc24bbd0743c6/librt-0.11.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:4ce1f21fbe589bc1afd7872dece84fb0e1144f794a288e58a10d2c54a55c43be", size = 516847, upload-time = "2026-05-10T18:16:23.627Z" }, + { url = "https://files.pythonhosted.org/packages/ae/66/6e6323787d592b55204a42595ff1102da5115601b53a7e9ddebc889a6da5/librt-0.11.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b09f7044ea2b64c9da42fd3d335666518cfd1c6e8a182c95da73d0214b41e", size = 553920, upload-time = "2026-05-10T18:16:25.025Z" }, + { url = "https://files.pythonhosted.org/packages/9c/21/623f8ca230857102066d9ca8c6c1734995908c4d0d1bee7bb2ef0021cb33/librt-0.11.0-cp313-cp313-win32.whl", hash = "sha256:78fddc31cd4d3caa897ad5d31f856b1faadc9474021ad6cb182b9018793e254e", size = 101898, upload-time = "2026-05-10T18:16:26.649Z" }, + { url = "https://files.pythonhosted.org/packages/b3/1d/b4ebd44dd723f768469007515cb92251e0ae286c94c140f374801140fa74/librt-0.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ca8aa88751a775870b764e93bad5135385f563cb8dcee399abf034ea4d3cb47", size = 119812, upload-time = "2026-05-10T18:16:27.859Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e4/b2f4ca7965ca373b491cdb4bc25cdb30c1649ca81a8782056a83850292a9/librt-0.11.0-cp313-cp313-win_arm64.whl", hash = "sha256:96f044bb325fd9cf1a723015638c219e9143f0dfbc0ca54c565df2b7fc748b44", size = 103448, upload-time = "2026-05-10T18:16:29.066Z" }, + { url = "https://files.pythonhosted.org/packages/29/eb/dbce197da4e227779e56b5735f2decc3eb36e55a1cdbf1bd65d6639d76c1/librt-0.11.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4a017a95e5837dc15a8c5661d60e05daa96b90908b1aa6b7acdf443cd25c8ebd", size = 143345, upload-time = "2026-05-10T18:16:30.674Z" }, + { url = "https://files.pythonhosted.org/packages/76/a3/254bebd0c11c8ba684018efb8006ff22e466abce445215cca6c778e7d9de/librt-0.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b1ecbd9819deccc39b7542bf4d2a740d8a620694d39989e58661d3763458f8d4", size = 143131, upload-time = "2026-05-10T18:16:32.037Z" }, + { url = "https://files.pythonhosted.org/packages/f1/3f/f77d6122d21ac7bf6ae8a7dfced1bd2a7ac545d3273ebdcaf8042f6d619f/librt-0.11.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7da327dacd7be8f8ec36547373550744a3cc0e536d54665cd83f8bcd961200e8", size = 477024, upload-time = "2026-05-10T18:16:33.493Z" }, + { url = "https://files.pythonhosted.org/packages/ac/0a/2c996dadebaa7d9bbbd43ef2d4f3e66b6da545f838a41694ef6172cebec8/librt-0.11.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:0dc56b1f8d06e60db362cc3fdae206681817f86ce4725d34511473487f12a34b", size = 474221, upload-time = "2026-05-10T18:16:34.864Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7e/f5d92af8486b8272c23b3e686b46ff72d89c8169585eb61eef01a2ac7147/librt-0.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05fb8fb2ab90e21c8d12ea240d744ad514da9baf381ebfa70d91d20d21713175", size = 505174, upload-time = "2026-05-10T18:16:36.705Z" }, + { url = "https://files.pythonhosted.org/packages/af/1a/cb0734fe86398eb33193ab753b7326255c74cac5eb09e76b9b16536e7adb/librt-0.11.0-cp314-cp314-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cae74872be221df4374d10fec61f93ed1513b9546ea84f2c0bf73ab3e9bd0b03", size = 497216, upload-time = "2026-05-10T18:16:38.418Z" }, + { url = "https://files.pythonhosted.org/packages/18/06/094820f91558b66e29943c0ec41c9914f460f48dd51fc503c3101e10842d/librt-0.11.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:32bcc918c0148eb7e3d57385125bac7e5f9e4359d05f07448b09f6f778c2f31c", size = 513921, upload-time = "2026-05-10T18:16:39.848Z" }, + { url = "https://files.pythonhosted.org/packages/0b/c2/00de9018871a282f530cacb457d5ec0428f6ac7e6fedde9aff7468d9fb04/librt-0.11.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f9743fc99135d5f78d2454435615f6dec0473ca507c26ce9d92b10b562a280d3", size = 520850, upload-time = "2026-05-10T18:16:41.471Z" }, + { url = "https://files.pythonhosted.org/packages/51/9d/64631832348fd1834fb3a61b996434edddaaf25a31d03b0a76273159d2cf/librt-0.11.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5ba067f4aadae8fda802d91d2124c90c42195ff32d9161d3549e6d05cfe26f96", size = 504237, upload-time = "2026-05-10T18:16:43.15Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ec/ae5525eb16edc827a044e7bb8777a455ff95d4bca9379e7e6bddd7383647/librt-0.11.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:de3bf945454d032f9e390b85c4072e0a0570bf825421c8be0e71209fa65e1abe", size = 546261, upload-time = "2026-05-10T18:16:44.408Z" }, + { url = "https://files.pythonhosted.org/packages/5a/09/adce371f27ca039411da9659f7430fcc2ba6cd0c7b3e4467a0f091be7fa9/librt-0.11.0-cp314-cp314-win32.whl", hash = "sha256:d2277a05f6dcb9fd13db9566aac4fabd68c3ea1ea46ee5567d4eef8efa495a2f", size = 96965, upload-time = "2026-05-10T18:16:46.039Z" }, + { url = "https://files.pythonhosted.org/packages/d6/ee/8ac720d98548f173c7ce2e632a7ca94673f74cacd5c8162a84af5b35958a/librt-0.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:ab73e8db5e3f564d812c1f5c3a175930a5f9bc96ccb5e3b22a34d7858b401cf7", size = 115151, upload-time = "2026-05-10T18:16:47.133Z" }, + { url = "https://files.pythonhosted.org/packages/94/20/c900cf14efeb09b6bef2b2dff20779f73464b97fd58d1c6bccc379588ae3/librt-0.11.0-cp314-cp314-win_arm64.whl", hash = "sha256:aea3caa317752e3a466fa8af45d91ee0ea8c7fdd96e42b0a8dd9b76a7931eba1", size = 98850, upload-time = "2026-05-10T18:16:48.597Z" }, + { url = "https://files.pythonhosted.org/packages/0c/71/944bfe4b64e12abffcd3c15e1cce07f72f3d55655083786285f4dedeb532/librt-0.11.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d1b36540d7aaf9b9101b3a6f376c8d8e9f7a9aec93ed05918f2c69d493ffef72", size = 151138, upload-time = "2026-05-10T18:16:49.839Z" }, + { url = "https://files.pythonhosted.org/packages/b6/10/99e64a5c86989357fda078c8143c533389585f6473b7439172dd8f3b3b2d/librt-0.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:efbb343ab2ce3540f4ecbe6315d677ed70f37cd9a72b1e58066c918ca83acbaa", size = 151976, upload-time = "2026-05-10T18:16:51.062Z" }, + { url = "https://files.pythonhosted.org/packages/21/31/5072ad880946d83e5ea4147d6d018c78eefce85b77819b19bdd0ee229435/librt-0.11.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0dd688aab3f7914d3e6e5e3554978e0383312fb8e771d84be008a35b9ee548", size = 557927, upload-time = "2026-05-10T18:16:52.632Z" }, + { url = "https://files.pythonhosted.org/packages/5e/8d/70b5fb7cfbab60edbe7381614ab985da58e144fbf465c86d44c95f43cdca/librt-0.11.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.manylinux_2_28_i686.whl", hash = "sha256:f5fb36b8c6c63fdcbb1d526d94c0d1331610d43f4118cc1beb4efef4f3faacb2", size = 539698, upload-time = "2026-05-10T18:16:53.934Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a3/ba3495a0b3edbd24a4cae0d1d3c64f39a9fc45d06e812101289b50c1a619/librt-0.11.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a9a237d13addb93715b6fee74023d5ee3469b53fce527626c0e088aa585805f", size = 577162, upload-time = "2026-05-10T18:16:55.589Z" }, + { url = "https://files.pythonhosted.org/packages/f7/db/36e25fb81f99937ff1b96612a1dc9fd66f039cb9cc3aee12c01fac31aab9/librt-0.11.0-cp314-cp314t-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5ddd17bd87b2c56ddd60e546a7984a2e64c4e8eab92fb4cf3830a48ad5469d51", size = 566494, upload-time = "2026-05-10T18:16:56.975Z" }, + { url = "https://files.pythonhosted.org/packages/33/0d/3f622b47f0b013eeb9cf4cc07ae9bfe378d832a4eec998b2b209fe84244d/librt-0.11.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bd43992b4473d42f12ff9e68326079f0696d9d4e6000e8f39a0238d482ba6ee2", size = 596858, upload-time = "2026-05-10T18:16:58.374Z" }, + { url = "https://files.pythonhosted.org/packages/a9/02/71b90bc93039c46a2000651f6ad60122b114c8f54c4ad306e0e96f5b75ad/librt-0.11.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:f8e3e8056dd674e279741485e2e512d6e9a751c7455809d0114e6ebf8d781085", size = 590318, upload-time = "2026-05-10T18:16:59.676Z" }, + { url = "https://files.pythonhosted.org/packages/04/04/418cb3f75621e2b761fb1ab0f017f4d70a1a72a6e7c74ee4f7e8d198c2f3/librt-0.11.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:c1f708d8ae9c56cf38a903c44297243d2ec83fd82b396b977e0144a3e76217e3", size = 575115, upload-time = "2026-05-10T18:17:01.007Z" }, + { url = "https://files.pythonhosted.org/packages/cc/2c/5a2183ac58dd911f26b5d7e7d7d8f1d87fcecdddd99d6c12169a258ff62c/librt-0.11.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0add982e0e7b9fc14cf4b33789d5f13f66581889b88c2f58099f6ce8f92617bd", size = 617918, upload-time = "2026-05-10T18:17:02.682Z" }, + { url = "https://files.pythonhosted.org/packages/15/1f/dc6771a52592a4451be6effa200cbfc9cec61e4393d3033d81a9d307961d/librt-0.11.0-cp314-cp314t-win32.whl", hash = "sha256:2b481d846ac894c4e8403c5fd0e87c5d11d6499e404b474602508a224ff531c8", size = 103562, upload-time = "2026-05-10T18:17:03.99Z" }, + { url = "https://files.pythonhosted.org/packages/62/4a/7d1415567027286a75ba1093ec4aca11f073e0f559c530cf3e0a757ad55c/librt-0.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:28edb433edde181112a908c78907af28f964eabc15f4dd16c9d66c834302677c", size = 124327, upload-time = "2026-05-10T18:17:05.465Z" }, + { url = "https://files.pythonhosted.org/packages/ce/62/b40b382fa0c66fee1478073eb8db352a4a6beda4a1adccf1df911d8c289c/librt-0.11.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dee008f20b542e3cd162ba338a7f9ec0f6d23d395f66fe8aeeec3c9d067ea253", size = 102572, upload-time = "2026-05-10T18:17:06.809Z" }, ] [[package]] @@ -2377,65 +2374,65 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "boolean-py" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", upload-time = "2025-07-22T11:13:32.17Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/71/d89bb0e71b1415453980fd32315f2a037aad9f7f70f695c7cec7035feb13/license_expression-30.4.4.tar.gz", hash = "sha256:73448f0aacd8d0808895bdc4b2c8e01a8d67646e4188f887375398c761f340fd", size = 186402, upload-time = "2025-07-22T11:13:32.17Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", upload-time = "2025-07-22T11:13:31.217Z" }, + { url = "https://files.pythonhosted.org/packages/af/40/791891d4c0c4dab4c5e187c17261cedc26285fd41541577f900470a45a4d/license_expression-30.4.4-py3-none-any.whl", hash = "sha256:421788fdcadb41f049d2dc934ce666626265aeccefddd25e162a26f23bcbf8a4", size = 120615, upload-time = "2025-07-22T11:13:31.217Z" }, ] [[package]] name = "lz4" version = "4.4.5" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/57/51/f1b86d93029f418033dddf9b9f79c8d2641e7454080478ee2aab5123173e/lz4-4.4.5.tar.gz", hash = "sha256:5f0b9e53c1e82e88c10d7c180069363980136b9d7a8306c4dca4f760d60c39f0", upload-time = "2025-11-03T13:02:36.061Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/7b/45/2466d73d79e3940cad4b26761f356f19fd33f4409c96f100e01a5c566909/lz4-4.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d221fa421b389ab2345640a508db57da36947a437dfe31aeddb8d5c7b646c22d", upload-time = "2025-11-03T13:01:24.965Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/72/12/7da96077a7e8918a5a57a25f1254edaf76aefb457666fcc1066deeecd609/lz4-4.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7dc1e1e2dbd872f8fae529acd5e4839efd0b141eaa8ae7ce835a9fe80fbad89f", upload-time = "2025-11-03T13:01:26.922Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b8/0e/0fb54f84fd1890d4af5bc0a3c1fa69678451c1a6bd40de26ec0561bb4ec5/lz4-4.4.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e928ec2d84dc8d13285b4a9288fd6246c5cde4f5f935b479f50d986911f085e3", upload-time = "2025-11-03T13:01:28.396Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/15/45/8ce01cc2715a19c9e72b0e423262072c17d581a8da56e0bd4550f3d76a79/lz4-4.4.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daffa4807ef54b927451208f5f85750c545a4abbff03d740835fc444cd97f758", upload-time = "2025-11-03T13:01:29.906Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/34/7be9b09015e18510a09b8d76c304d505a7cbc66b775ec0b8f61442316818/lz4-4.4.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2a2b7504d2dffed3fd19d4085fe1cc30cf221263fd01030819bdd8d2bb101cf1", upload-time = "2025-11-03T13:01:31.054Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/94/52cc3ec0d41e8d68c985ec3b2d33631f281d8b748fb44955bc0384c2627b/lz4-4.4.5-cp310-cp310-win32.whl", hash = "sha256:0846e6e78f374156ccf21c631de80967e03cc3c01c373c665789dc0c5431e7fc", upload-time = "2025-11-03T13:01:32.643Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ca/35/c3c0bdc409f551404355aeeabc8da343577d0e53592368062e371a3620e1/lz4-4.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:7c4e7c44b6a31de77d4dc9772b7d2561937c9588a734681f70ec547cfbc51ecd", upload-time = "2025-11-03T13:01:33.813Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1d/02/4d88de2f1e97f9d05fd3d278fe412b08969bc94ff34942f5a3f09318144a/lz4-4.4.5-cp310-cp310-win_arm64.whl", hash = "sha256:15551280f5656d2206b9b43262799c89b25a25460416ec554075a8dc568e4397", upload-time = "2025-11-03T13:01:35.081Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/93/5b/6edcd23319d9e28b1bedf32768c3d1fd56eed8223960a2c47dacd2cec2af/lz4-4.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d6da84a26b3aa5da13a62e4b89ab36a396e9327de8cd48b436a3467077f8ccd4", upload-time = "2025-11-03T13:01:36.644Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/34/36/5f9b772e85b3d5769367a79973b8030afad0d6b724444083bad09becd66f/lz4-4.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:61d0ee03e6c616f4a8b69987d03d514e8896c8b1b7cc7598ad029e5c6aedfd43", upload-time = "2025-11-03T13:01:37.928Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/04/f4/f66da5647c0d72592081a37c8775feacc3d14d2625bbdaabd6307c274565/lz4-4.4.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:33dd86cea8375d8e5dd001e41f321d0a4b1eb7985f39be1b6a4f466cd480b8a7", upload-time = "2025-11-03T13:01:39.341Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/85/fc/5df0f17467cdda0cad464a9197a447027879197761b55faad7ca29c29a04/lz4-4.4.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:609a69c68e7cfcfa9d894dc06be13f2e00761485b62df4e2472f1b66f7b405fb", upload-time = "2025-11-03T13:01:40.816Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/25/3b/b55cb577aa148ed4e383e9700c36f70b651cd434e1c07568f0a86c9d5fbb/lz4-4.4.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:75419bb1a559af00250b8f1360d508444e80ed4b26d9d40ec5b09fe7875cb989", upload-time = "2025-11-03T13:01:42.118Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fb/31/e97e8c74c59ea479598e5c55cbe0b1334f03ee74ca97726e872944ed42df/lz4-4.4.5-cp311-cp311-win32.whl", hash = "sha256:12233624f1bc2cebc414f9efb3113a03e89acce3ab6f72035577bc61b270d24d", upload-time = "2025-11-03T13:01:43.282Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/47/715865a6c7071f417bef9b57c8644f29cb7a55b77742bd5d93a609274e7e/lz4-4.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:8a842ead8ca7c0ee2f396ca5d878c4c40439a527ebad2b996b0444f0074ed004", upload-time = "2025-11-03T13:01:44.167Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/14/e7/ac120c2ca8caec5c945e6356ada2aa5cfabd83a01e3170f264a5c42c8231/lz4-4.4.5-cp311-cp311-win_arm64.whl", hash = "sha256:83bc23ef65b6ae44f3287c38cbf82c269e2e96a26e560aa551735883388dcc4b", upload-time = "2025-11-03T13:01:45.016Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1b/ac/016e4f6de37d806f7cc8f13add0a46c9a7cfc41a5ddc2bc831d7954cf1ce/lz4-4.4.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:df5aa4cead2044bab83e0ebae56e0944cc7fcc1505c7787e9e1057d6d549897e", upload-time = "2025-11-03T13:01:45.895Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8d/df/0fadac6e5bd31b6f34a1a8dbd4db6a7606e70715387c27368586455b7fc9/lz4-4.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d0bf51e7745484d2092b3a51ae6eb58c3bd3ce0300cf2b2c14f76c536d5697a", upload-time = "2025-11-03T13:01:47.205Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/17/34e36cc49bb16ca73fb57fbd4c5eaa61760c6b64bce91fcb4e0f4a97f852/lz4-4.4.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7b62f94b523c251cf32aa4ab555f14d39bd1a9df385b72443fd76d7c7fb051f5", upload-time = "2025-11-03T13:01:48.667Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/90/1c/b1d8e3741e9fc89ed3b5f7ef5f22586c07ed6bb04e8343c2e98f0fa7ff04/lz4-4.4.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c3ea562c3af274264444819ae9b14dbbf1ab070aff214a05e97db6896c7597e", upload-time = "2025-11-03T13:01:50.159Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/55/d9/e3867222474f6c1b76e89f3bd914595af69f55bf2c1866e984c548afdc15/lz4-4.4.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24092635f47538b392c4eaeff14c7270d2c8e806bf4be2a6446a378591c5e69e", upload-time = "2025-11-03T13:01:51.273Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/e7/d667d337367686311c38b580d1ca3d5a23a6617e129f26becd4f5dc458df/lz4-4.4.5-cp312-cp312-win32.whl", hash = "sha256:214e37cfe270948ea7eb777229e211c601a3e0875541c1035ab408fbceaddf50", upload-time = "2025-11-03T13:01:52.605Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a5/0b/a54cd7406995ab097fceb907c7eb13a6ddd49e0b231e448f1a81a50af65c/lz4-4.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:713a777de88a73425cf08eb11f742cd2c98628e79a8673d6a52e3c5f0c116f33", upload-time = "2025-11-03T13:01:53.477Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6a/7e/dc28a952e4bfa32ca16fa2eb026e7a6ce5d1411fcd5986cd08c74ec187b9/lz4-4.4.5-cp312-cp312-win_arm64.whl", hash = "sha256:a88cbb729cc333334ccfb52f070463c21560fca63afcf636a9f160a55fac3301", upload-time = "2025-11-03T13:01:54.419Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2f/46/08fd8ef19b782f301d56a9ccfd7dafec5fd4fc1a9f017cf22a1accb585d7/lz4-4.4.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6bb05416444fafea170b07181bc70640975ecc2a8c92b3b658c554119519716c", upload-time = "2025-11-03T13:01:56.595Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8f/3f/ea3334e59de30871d773963997ecdba96c4584c5f8007fd83cfc8f1ee935/lz4-4.4.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b424df1076e40d4e884cfcc4c77d815368b7fb9ebcd7e634f937725cd9a8a72a", upload-time = "2025-11-03T13:01:57.721Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/41/7b/7b3a2a0feb998969f4793c650bb16eff5b06e80d1f7bff867feb332f2af2/lz4-4.4.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:216ca0c6c90719731c64f41cfbd6f27a736d7e50a10b70fad2a9c9b262ec923d", upload-time = "2025-11-03T13:02:00.375Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/d1/f1d259352227bb1c185288dd694121ea303e43404aa77560b879c90e7073/lz4-4.4.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:533298d208b58b651662dd972f52d807d48915176e5b032fb4f8c3b6f5fe535c", upload-time = "2025-11-03T13:02:01.649Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/fb/ba9256c48266a09012ed1d9b0253b9aa4fe9cdff094f8febf5b26a4aa2a2/lz4-4.4.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:451039b609b9a88a934800b5fc6ee401c89ad9c175abf2f4d9f8b2e4ef1afc64", upload-time = "2025-11-03T13:02:03.35Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a5/6d/dee32a9430c8b0e01bbb4537573cabd00555827f1a0a42d4e24ca803935c/lz4-4.4.5-cp313-cp313-win32.whl", hash = "sha256:a5f197ffa6fc0e93207b0af71b302e0a2f6f29982e5de0fbda61606dd3a55832", upload-time = "2025-11-03T13:02:04.406Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/e0/f06028aea741bbecb2a7e9648f4643235279a770c7ffaf70bd4860c73661/lz4-4.4.5-cp313-cp313-win_amd64.whl", hash = "sha256:da68497f78953017deb20edff0dba95641cc86e7423dfadf7c0264e1ac60dc22", upload-time = "2025-11-03T13:02:05.886Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/61/72/5bef44afb303e56078676b9f2486f13173a3c1e7f17eaac1793538174817/lz4-4.4.5-cp313-cp313-win_arm64.whl", hash = "sha256:c1cfa663468a189dab510ab231aad030970593f997746d7a324d40104db0d0a9", upload-time = "2025-11-03T13:02:06.77Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/55/6a5c2952971af73f15ed4ebfdd69774b454bd0dc905b289082ca8664fba1/lz4-4.4.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:67531da3b62f49c939e09d56492baf397175ff39926d0bd5bd2d191ac2bff95f", upload-time = "2025-11-03T13:02:08.117Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4e/d7/fd62cbdbdccc35341e83aabdb3f6d5c19be2687d0a4eaf6457ddf53bba64/lz4-4.4.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a1acbbba9edbcbb982bc2cac5e7108f0f553aebac1040fbec67a011a45afa1ba", upload-time = "2025-11-03T13:02:09.152Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/69/225ffadaacb4b0e0eb5fd263541edd938f16cd21fe1eae3cd6d5b6a259dc/lz4-4.4.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a482eecc0b7829c89b498fda883dbd50e98153a116de612ee7c111c8bcf82d1d", upload-time = "2025-11-03T13:02:10.272Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c6/9e/2ce59ba4a21ea5dc43460cba6f34584e187328019abc0e66698f2b66c881/lz4-4.4.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e099ddfaa88f59dd8d36c8a3c66bd982b4984edf127eb18e30bb49bdba68ce67", upload-time = "2025-11-03T13:02:12.091Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/4f/4d946bd1624ec229b386a3bc8e7a85fa9a963d67d0a62043f0af0978d3da/lz4-4.4.5-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2af2897333b421360fdcce895c6f6281dc3fab018d19d341cf64d043fc8d90d", upload-time = "2025-11-03T13:02:13.683Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/02/a2/d429ba4720a9064722698b4b754fb93e42e625f1318b8fe834086c7c783b/lz4-4.4.5-cp313-cp313t-win32.whl", hash = "sha256:66c5de72bf4988e1b284ebdd6524c4bead2c507a2d7f172201572bac6f593901", upload-time = "2025-11-03T13:02:14.743Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/85/7ba10c9b97c06af6c8f7032ec942ff127558863df52d866019ce9d2425cf/lz4-4.4.5-cp313-cp313t-win_amd64.whl", hash = "sha256:cdd4bdcbaf35056086d910d219106f6a04e1ab0daa40ec0eeef1626c27d0fddb", upload-time = "2025-11-03T13:02:15.978Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/4d/a175459fb29f909e13e57c8f475181ad8085d8d7869bd8ad99033e3ee5fa/lz4-4.4.5-cp313-cp313t-win_arm64.whl", hash = "sha256:28ccaeb7c5222454cd5f60fcd152564205bcb801bd80e125949d2dfbadc76bbd", upload-time = "2025-11-03T13:02:17.313Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/63/9c/70bdbdb9f54053a308b200b4678afd13efd0eafb6ddcbb7f00077213c2e5/lz4-4.4.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c216b6d5275fc060c6280936bb3bb0e0be6126afb08abccde27eed23dead135f", upload-time = "2025-11-03T13:02:18.263Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b6/cb/bfead8f437741ce51e14b3c7d404e3a1f6b409c440bad9b8f3945d4c40a7/lz4-4.4.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c8e71b14938082ebaf78144f3b3917ac715f72d14c076f384a4c062df96f9df6", upload-time = "2025-11-03T13:02:19.286Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e7/18/b192b2ce465dfbeabc4fc957ece7a1d34aded0d95a588862f1c8a86ac448/lz4-4.4.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9b5e6abca8df9f9bdc5c3085f33ff32cdc86ed04c65e0355506d46a5ac19b6e9", upload-time = "2025-11-03T13:02:20.829Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/67/79/a4e91872ab60f5e89bfad3e996ea7dc74a30f27253faf95865771225ccba/lz4-4.4.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b84a42da86e8ad8537aabef062e7f661f4a877d1c74d65606c49d835d36d668", upload-time = "2025-11-03T13:02:22.013Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/01/d52c7b11eaa286d49dae619c0eec4aabc0bf3cda7a7467eb77c62c4471f3/lz4-4.4.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bba042ec5a61fa77c7e380351a61cb768277801240249841defd2ff0a10742f", upload-time = "2025-11-03T13:02:23.208Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f7/da/137ddeea14c2cb86864838277b2607d09f8253f152156a07f84e11768a28/lz4-4.4.5-cp314-cp314-win32.whl", hash = "sha256:bd85d118316b53ed73956435bee1997bd06cc66dd2fa74073e3b1322bd520a67", upload-time = "2025-11-03T13:02:24.301Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/2c/8332080fd293f8337779a440b3a143f85e374311705d243439a3349b81ad/lz4-4.4.5-cp314-cp314-win_amd64.whl", hash = "sha256:92159782a4502858a21e0079d77cdcaade23e8a5d252ddf46b0652604300d7be", upload-time = "2025-11-03T13:02:25.187Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ca/28/2635a8141c9a4f4bc23f5135a92bbcf48d928d8ca094088c962df1879d64/lz4-4.4.5-cp314-cp314-win_arm64.whl", hash = "sha256:d994b87abaa7a88ceb7a37c90f547b8284ff9da694e6afcfaa8568d739faf3f7", upload-time = "2025-11-03T13:02:26.133Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/57/51/f1b86d93029f418033dddf9b9f79c8d2641e7454080478ee2aab5123173e/lz4-4.4.5.tar.gz", hash = "sha256:5f0b9e53c1e82e88c10d7c180069363980136b9d7a8306c4dca4f760d60c39f0", size = 172886, upload-time = "2025-11-03T13:02:36.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/45/2466d73d79e3940cad4b26761f356f19fd33f4409c96f100e01a5c566909/lz4-4.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d221fa421b389ab2345640a508db57da36947a437dfe31aeddb8d5c7b646c22d", size = 207396, upload-time = "2025-11-03T13:01:24.965Z" }, + { url = "https://files.pythonhosted.org/packages/72/12/7da96077a7e8918a5a57a25f1254edaf76aefb457666fcc1066deeecd609/lz4-4.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7dc1e1e2dbd872f8fae529acd5e4839efd0b141eaa8ae7ce835a9fe80fbad89f", size = 207154, upload-time = "2025-11-03T13:01:26.922Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0e/0fb54f84fd1890d4af5bc0a3c1fa69678451c1a6bd40de26ec0561bb4ec5/lz4-4.4.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e928ec2d84dc8d13285b4a9288fd6246c5cde4f5f935b479f50d986911f085e3", size = 1291053, upload-time = "2025-11-03T13:01:28.396Z" }, + { url = "https://files.pythonhosted.org/packages/15/45/8ce01cc2715a19c9e72b0e423262072c17d581a8da56e0bd4550f3d76a79/lz4-4.4.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daffa4807ef54b927451208f5f85750c545a4abbff03d740835fc444cd97f758", size = 1278586, upload-time = "2025-11-03T13:01:29.906Z" }, + { url = "https://files.pythonhosted.org/packages/6d/34/7be9b09015e18510a09b8d76c304d505a7cbc66b775ec0b8f61442316818/lz4-4.4.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2a2b7504d2dffed3fd19d4085fe1cc30cf221263fd01030819bdd8d2bb101cf1", size = 1367315, upload-time = "2025-11-03T13:01:31.054Z" }, + { url = "https://files.pythonhosted.org/packages/2a/94/52cc3ec0d41e8d68c985ec3b2d33631f281d8b748fb44955bc0384c2627b/lz4-4.4.5-cp310-cp310-win32.whl", hash = "sha256:0846e6e78f374156ccf21c631de80967e03cc3c01c373c665789dc0c5431e7fc", size = 88173, upload-time = "2025-11-03T13:01:32.643Z" }, + { url = "https://files.pythonhosted.org/packages/ca/35/c3c0bdc409f551404355aeeabc8da343577d0e53592368062e371a3620e1/lz4-4.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:7c4e7c44b6a31de77d4dc9772b7d2561937c9588a734681f70ec547cfbc51ecd", size = 99492, upload-time = "2025-11-03T13:01:33.813Z" }, + { url = "https://files.pythonhosted.org/packages/1d/02/4d88de2f1e97f9d05fd3d278fe412b08969bc94ff34942f5a3f09318144a/lz4-4.4.5-cp310-cp310-win_arm64.whl", hash = "sha256:15551280f5656d2206b9b43262799c89b25a25460416ec554075a8dc568e4397", size = 91280, upload-time = "2025-11-03T13:01:35.081Z" }, + { url = "https://files.pythonhosted.org/packages/93/5b/6edcd23319d9e28b1bedf32768c3d1fd56eed8223960a2c47dacd2cec2af/lz4-4.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d6da84a26b3aa5da13a62e4b89ab36a396e9327de8cd48b436a3467077f8ccd4", size = 207391, upload-time = "2025-11-03T13:01:36.644Z" }, + { url = "https://files.pythonhosted.org/packages/34/36/5f9b772e85b3d5769367a79973b8030afad0d6b724444083bad09becd66f/lz4-4.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:61d0ee03e6c616f4a8b69987d03d514e8896c8b1b7cc7598ad029e5c6aedfd43", size = 207146, upload-time = "2025-11-03T13:01:37.928Z" }, + { url = "https://files.pythonhosted.org/packages/04/f4/f66da5647c0d72592081a37c8775feacc3d14d2625bbdaabd6307c274565/lz4-4.4.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:33dd86cea8375d8e5dd001e41f321d0a4b1eb7985f39be1b6a4f466cd480b8a7", size = 1292623, upload-time = "2025-11-03T13:01:39.341Z" }, + { url = "https://files.pythonhosted.org/packages/85/fc/5df0f17467cdda0cad464a9197a447027879197761b55faad7ca29c29a04/lz4-4.4.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:609a69c68e7cfcfa9d894dc06be13f2e00761485b62df4e2472f1b66f7b405fb", size = 1279982, upload-time = "2025-11-03T13:01:40.816Z" }, + { url = "https://files.pythonhosted.org/packages/25/3b/b55cb577aa148ed4e383e9700c36f70b651cd434e1c07568f0a86c9d5fbb/lz4-4.4.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:75419bb1a559af00250b8f1360d508444e80ed4b26d9d40ec5b09fe7875cb989", size = 1368674, upload-time = "2025-11-03T13:01:42.118Z" }, + { url = "https://files.pythonhosted.org/packages/fb/31/e97e8c74c59ea479598e5c55cbe0b1334f03ee74ca97726e872944ed42df/lz4-4.4.5-cp311-cp311-win32.whl", hash = "sha256:12233624f1bc2cebc414f9efb3113a03e89acce3ab6f72035577bc61b270d24d", size = 88168, upload-time = "2025-11-03T13:01:43.282Z" }, + { url = "https://files.pythonhosted.org/packages/18/47/715865a6c7071f417bef9b57c8644f29cb7a55b77742bd5d93a609274e7e/lz4-4.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:8a842ead8ca7c0ee2f396ca5d878c4c40439a527ebad2b996b0444f0074ed004", size = 99491, upload-time = "2025-11-03T13:01:44.167Z" }, + { url = "https://files.pythonhosted.org/packages/14/e7/ac120c2ca8caec5c945e6356ada2aa5cfabd83a01e3170f264a5c42c8231/lz4-4.4.5-cp311-cp311-win_arm64.whl", hash = "sha256:83bc23ef65b6ae44f3287c38cbf82c269e2e96a26e560aa551735883388dcc4b", size = 91271, upload-time = "2025-11-03T13:01:45.016Z" }, + { url = "https://files.pythonhosted.org/packages/1b/ac/016e4f6de37d806f7cc8f13add0a46c9a7cfc41a5ddc2bc831d7954cf1ce/lz4-4.4.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:df5aa4cead2044bab83e0ebae56e0944cc7fcc1505c7787e9e1057d6d549897e", size = 207163, upload-time = "2025-11-03T13:01:45.895Z" }, + { url = "https://files.pythonhosted.org/packages/8d/df/0fadac6e5bd31b6f34a1a8dbd4db6a7606e70715387c27368586455b7fc9/lz4-4.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d0bf51e7745484d2092b3a51ae6eb58c3bd3ce0300cf2b2c14f76c536d5697a", size = 207150, upload-time = "2025-11-03T13:01:47.205Z" }, + { url = "https://files.pythonhosted.org/packages/b7/17/34e36cc49bb16ca73fb57fbd4c5eaa61760c6b64bce91fcb4e0f4a97f852/lz4-4.4.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7b62f94b523c251cf32aa4ab555f14d39bd1a9df385b72443fd76d7c7fb051f5", size = 1292045, upload-time = "2025-11-03T13:01:48.667Z" }, + { url = "https://files.pythonhosted.org/packages/90/1c/b1d8e3741e9fc89ed3b5f7ef5f22586c07ed6bb04e8343c2e98f0fa7ff04/lz4-4.4.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c3ea562c3af274264444819ae9b14dbbf1ab070aff214a05e97db6896c7597e", size = 1279546, upload-time = "2025-11-03T13:01:50.159Z" }, + { url = "https://files.pythonhosted.org/packages/55/d9/e3867222474f6c1b76e89f3bd914595af69f55bf2c1866e984c548afdc15/lz4-4.4.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24092635f47538b392c4eaeff14c7270d2c8e806bf4be2a6446a378591c5e69e", size = 1368249, upload-time = "2025-11-03T13:01:51.273Z" }, + { url = "https://files.pythonhosted.org/packages/b2/e7/d667d337367686311c38b580d1ca3d5a23a6617e129f26becd4f5dc458df/lz4-4.4.5-cp312-cp312-win32.whl", hash = "sha256:214e37cfe270948ea7eb777229e211c601a3e0875541c1035ab408fbceaddf50", size = 88189, upload-time = "2025-11-03T13:01:52.605Z" }, + { url = "https://files.pythonhosted.org/packages/a5/0b/a54cd7406995ab097fceb907c7eb13a6ddd49e0b231e448f1a81a50af65c/lz4-4.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:713a777de88a73425cf08eb11f742cd2c98628e79a8673d6a52e3c5f0c116f33", size = 99497, upload-time = "2025-11-03T13:01:53.477Z" }, + { url = "https://files.pythonhosted.org/packages/6a/7e/dc28a952e4bfa32ca16fa2eb026e7a6ce5d1411fcd5986cd08c74ec187b9/lz4-4.4.5-cp312-cp312-win_arm64.whl", hash = "sha256:a88cbb729cc333334ccfb52f070463c21560fca63afcf636a9f160a55fac3301", size = 91279, upload-time = "2025-11-03T13:01:54.419Z" }, + { url = "https://files.pythonhosted.org/packages/2f/46/08fd8ef19b782f301d56a9ccfd7dafec5fd4fc1a9f017cf22a1accb585d7/lz4-4.4.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6bb05416444fafea170b07181bc70640975ecc2a8c92b3b658c554119519716c", size = 207171, upload-time = "2025-11-03T13:01:56.595Z" }, + { url = "https://files.pythonhosted.org/packages/8f/3f/ea3334e59de30871d773963997ecdba96c4584c5f8007fd83cfc8f1ee935/lz4-4.4.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b424df1076e40d4e884cfcc4c77d815368b7fb9ebcd7e634f937725cd9a8a72a", size = 207163, upload-time = "2025-11-03T13:01:57.721Z" }, + { url = "https://files.pythonhosted.org/packages/41/7b/7b3a2a0feb998969f4793c650bb16eff5b06e80d1f7bff867feb332f2af2/lz4-4.4.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:216ca0c6c90719731c64f41cfbd6f27a736d7e50a10b70fad2a9c9b262ec923d", size = 1292136, upload-time = "2025-11-03T13:02:00.375Z" }, + { url = "https://files.pythonhosted.org/packages/89/d1/f1d259352227bb1c185288dd694121ea303e43404aa77560b879c90e7073/lz4-4.4.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:533298d208b58b651662dd972f52d807d48915176e5b032fb4f8c3b6f5fe535c", size = 1279639, upload-time = "2025-11-03T13:02:01.649Z" }, + { url = "https://files.pythonhosted.org/packages/d2/fb/ba9256c48266a09012ed1d9b0253b9aa4fe9cdff094f8febf5b26a4aa2a2/lz4-4.4.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:451039b609b9a88a934800b5fc6ee401c89ad9c175abf2f4d9f8b2e4ef1afc64", size = 1368257, upload-time = "2025-11-03T13:02:03.35Z" }, + { url = "https://files.pythonhosted.org/packages/a5/6d/dee32a9430c8b0e01bbb4537573cabd00555827f1a0a42d4e24ca803935c/lz4-4.4.5-cp313-cp313-win32.whl", hash = "sha256:a5f197ffa6fc0e93207b0af71b302e0a2f6f29982e5de0fbda61606dd3a55832", size = 88191, upload-time = "2025-11-03T13:02:04.406Z" }, + { url = "https://files.pythonhosted.org/packages/18/e0/f06028aea741bbecb2a7e9648f4643235279a770c7ffaf70bd4860c73661/lz4-4.4.5-cp313-cp313-win_amd64.whl", hash = "sha256:da68497f78953017deb20edff0dba95641cc86e7423dfadf7c0264e1ac60dc22", size = 99502, upload-time = "2025-11-03T13:02:05.886Z" }, + { url = "https://files.pythonhosted.org/packages/61/72/5bef44afb303e56078676b9f2486f13173a3c1e7f17eaac1793538174817/lz4-4.4.5-cp313-cp313-win_arm64.whl", hash = "sha256:c1cfa663468a189dab510ab231aad030970593f997746d7a324d40104db0d0a9", size = 91285, upload-time = "2025-11-03T13:02:06.77Z" }, + { url = "https://files.pythonhosted.org/packages/49/55/6a5c2952971af73f15ed4ebfdd69774b454bd0dc905b289082ca8664fba1/lz4-4.4.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:67531da3b62f49c939e09d56492baf397175ff39926d0bd5bd2d191ac2bff95f", size = 207348, upload-time = "2025-11-03T13:02:08.117Z" }, + { url = "https://files.pythonhosted.org/packages/4e/d7/fd62cbdbdccc35341e83aabdb3f6d5c19be2687d0a4eaf6457ddf53bba64/lz4-4.4.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a1acbbba9edbcbb982bc2cac5e7108f0f553aebac1040fbec67a011a45afa1ba", size = 207340, upload-time = "2025-11-03T13:02:09.152Z" }, + { url = "https://files.pythonhosted.org/packages/77/69/225ffadaacb4b0e0eb5fd263541edd938f16cd21fe1eae3cd6d5b6a259dc/lz4-4.4.5-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a482eecc0b7829c89b498fda883dbd50e98153a116de612ee7c111c8bcf82d1d", size = 1293398, upload-time = "2025-11-03T13:02:10.272Z" }, + { url = "https://files.pythonhosted.org/packages/c6/9e/2ce59ba4a21ea5dc43460cba6f34584e187328019abc0e66698f2b66c881/lz4-4.4.5-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e099ddfaa88f59dd8d36c8a3c66bd982b4984edf127eb18e30bb49bdba68ce67", size = 1281209, upload-time = "2025-11-03T13:02:12.091Z" }, + { url = "https://files.pythonhosted.org/packages/80/4f/4d946bd1624ec229b386a3bc8e7a85fa9a963d67d0a62043f0af0978d3da/lz4-4.4.5-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2af2897333b421360fdcce895c6f6281dc3fab018d19d341cf64d043fc8d90d", size = 1369406, upload-time = "2025-11-03T13:02:13.683Z" }, + { url = "https://files.pythonhosted.org/packages/02/a2/d429ba4720a9064722698b4b754fb93e42e625f1318b8fe834086c7c783b/lz4-4.4.5-cp313-cp313t-win32.whl", hash = "sha256:66c5de72bf4988e1b284ebdd6524c4bead2c507a2d7f172201572bac6f593901", size = 88325, upload-time = "2025-11-03T13:02:14.743Z" }, + { url = "https://files.pythonhosted.org/packages/4b/85/7ba10c9b97c06af6c8f7032ec942ff127558863df52d866019ce9d2425cf/lz4-4.4.5-cp313-cp313t-win_amd64.whl", hash = "sha256:cdd4bdcbaf35056086d910d219106f6a04e1ab0daa40ec0eeef1626c27d0fddb", size = 99643, upload-time = "2025-11-03T13:02:15.978Z" }, + { url = "https://files.pythonhosted.org/packages/77/4d/a175459fb29f909e13e57c8f475181ad8085d8d7869bd8ad99033e3ee5fa/lz4-4.4.5-cp313-cp313t-win_arm64.whl", hash = "sha256:28ccaeb7c5222454cd5f60fcd152564205bcb801bd80e125949d2dfbadc76bbd", size = 91504, upload-time = "2025-11-03T13:02:17.313Z" }, + { url = "https://files.pythonhosted.org/packages/63/9c/70bdbdb9f54053a308b200b4678afd13efd0eafb6ddcbb7f00077213c2e5/lz4-4.4.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c216b6d5275fc060c6280936bb3bb0e0be6126afb08abccde27eed23dead135f", size = 207586, upload-time = "2025-11-03T13:02:18.263Z" }, + { url = "https://files.pythonhosted.org/packages/b6/cb/bfead8f437741ce51e14b3c7d404e3a1f6b409c440bad9b8f3945d4c40a7/lz4-4.4.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c8e71b14938082ebaf78144f3b3917ac715f72d14c076f384a4c062df96f9df6", size = 207161, upload-time = "2025-11-03T13:02:19.286Z" }, + { url = "https://files.pythonhosted.org/packages/e7/18/b192b2ce465dfbeabc4fc957ece7a1d34aded0d95a588862f1c8a86ac448/lz4-4.4.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9b5e6abca8df9f9bdc5c3085f33ff32cdc86ed04c65e0355506d46a5ac19b6e9", size = 1292415, upload-time = "2025-11-03T13:02:20.829Z" }, + { url = "https://files.pythonhosted.org/packages/67/79/a4e91872ab60f5e89bfad3e996ea7dc74a30f27253faf95865771225ccba/lz4-4.4.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b84a42da86e8ad8537aabef062e7f661f4a877d1c74d65606c49d835d36d668", size = 1279920, upload-time = "2025-11-03T13:02:22.013Z" }, + { url = "https://files.pythonhosted.org/packages/f1/01/d52c7b11eaa286d49dae619c0eec4aabc0bf3cda7a7467eb77c62c4471f3/lz4-4.4.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bba042ec5a61fa77c7e380351a61cb768277801240249841defd2ff0a10742f", size = 1368661, upload-time = "2025-11-03T13:02:23.208Z" }, + { url = "https://files.pythonhosted.org/packages/f7/da/137ddeea14c2cb86864838277b2607d09f8253f152156a07f84e11768a28/lz4-4.4.5-cp314-cp314-win32.whl", hash = "sha256:bd85d118316b53ed73956435bee1997bd06cc66dd2fa74073e3b1322bd520a67", size = 90139, upload-time = "2025-11-03T13:02:24.301Z" }, + { url = "https://files.pythonhosted.org/packages/18/2c/8332080fd293f8337779a440b3a143f85e374311705d243439a3349b81ad/lz4-4.4.5-cp314-cp314-win_amd64.whl", hash = "sha256:92159782a4502858a21e0079d77cdcaade23e8a5d252ddf46b0652604300d7be", size = 101497, upload-time = "2025-11-03T13:02:25.187Z" }, + { url = "https://files.pythonhosted.org/packages/ca/28/2635a8141c9a4f4bc23f5135a92bbcf48d928d8ca094088c962df1879d64/lz4-4.4.5-cp314-cp314-win_arm64.whl", hash = "sha256:d994b87abaa7a88ceb7a37c90f547b8284ff9da694e6afcfaa8568d739faf3f7", size = 93812, upload-time = "2025-11-03T13:02:26.133Z" }, ] [[package]] @@ -2445,9 +2442,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/00/62/791b31e69ae182791ec67f04850f2f062716bbd205483d63a215f3e062d3/mako-1.3.12.tar.gz", hash = "sha256:9f778e93289bd410bb35daadeb4fc66d95a746f0b75777b942088b7fd7af550a", upload-time = "2026-04-28T19:01:08.512Z" } +sdist = { url = "https://files.pythonhosted.org/packages/00/62/791b31e69ae182791ec67f04850f2f062716bbd205483d63a215f3e062d3/mako-1.3.12.tar.gz", hash = "sha256:9f778e93289bd410bb35daadeb4fc66d95a746f0b75777b942088b7fd7af550a", size = 400219, upload-time = "2026-04-28T19:01:08.512Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/b1/a0ec7a5a9db730a08daef1fdfb8090435b82465abbf758a596f0ea88727e/mako-1.3.12-py3-none-any.whl", hash = "sha256:8f61569480282dbf557145ce441e4ba888be453c30989f879f0d652e39f53ea9", upload-time = "2026-04-28T19:01:10.393Z" }, + { url = "https://files.pythonhosted.org/packages/bc/b1/a0ec7a5a9db730a08daef1fdfb8090435b82465abbf758a596f0ea88727e/mako-1.3.12-py3-none-any.whl", hash = "sha256:8f61569480282dbf557145ce441e4ba888be453c30989f879f0d652e39f53ea9", size = 78521, upload-time = "2026-04-28T19:01:10.393Z" }, ] [[package]] @@ -2460,9 +2457,9 @@ resolution-markers = [ dependencies = [ { name = "mdurl", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", upload-time = "2023-06-03T06:41:14.443Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", upload-time = "2023-06-03T06:41:11.019Z" }, + { url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" }, ] [[package]] @@ -2479,94 +2476,94 @@ resolution-markers = [ dependencies = [ { name = "mdurl", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", upload-time = "2025-08-11T12:57:52.854Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", upload-time = "2025-08-11T12:57:51.923Z" }, + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] [[package]] name = "markupsafe" version = "3.0.3" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", upload-time = "2025-09-27T18:37:40.426Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", upload-time = "2025-09-27T18:36:05.558Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", upload-time = "2025-09-27T18:36:07.165Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", upload-time = "2025-09-27T18:36:08.005Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-09-27T18:36:08.881Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", upload-time = "2025-09-27T18:36:10.131Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", upload-time = "2025-09-27T18:36:11.324Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", upload-time = "2025-09-27T18:36:12.573Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", upload-time = "2025-09-27T18:36:13.504Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", upload-time = "2025-09-27T18:36:14.779Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", upload-time = "2025-09-27T18:36:16.125Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", upload-time = "2025-09-27T18:36:17.311Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", upload-time = "2025-09-27T18:36:18.185Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", upload-time = "2025-09-27T18:36:19.444Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", upload-time = "2025-09-27T18:36:20.768Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-09-27T18:36:22.249Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", upload-time = "2025-09-27T18:36:23.535Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", upload-time = "2025-09-27T18:36:24.823Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", upload-time = "2025-09-27T18:36:25.95Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", upload-time = "2025-09-27T18:36:27.109Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", upload-time = "2025-09-27T18:36:28.045Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", upload-time = "2025-09-27T18:36:29.025Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", upload-time = "2025-09-27T18:36:29.954Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", upload-time = "2025-09-27T18:36:30.854Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", upload-time = "2025-09-27T18:36:31.971Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", upload-time = "2025-09-27T18:36:32.813Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-09-27T18:36:33.86Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", upload-time = "2025-09-27T18:36:35.099Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", upload-time = "2025-09-27T18:36:36.001Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", upload-time = "2025-09-27T18:36:36.906Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", upload-time = "2025-09-27T18:36:37.868Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", upload-time = "2025-09-27T18:36:38.761Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", upload-time = "2025-09-27T18:36:39.701Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", upload-time = "2025-09-27T18:36:40.689Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", upload-time = "2025-09-27T18:36:41.777Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", upload-time = "2025-09-27T18:36:43.257Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", upload-time = "2025-09-27T18:36:44.508Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", upload-time = "2025-09-27T18:36:45.385Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", upload-time = "2025-09-27T18:36:46.916Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", upload-time = "2025-09-27T18:36:47.884Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", upload-time = "2025-09-27T18:36:48.82Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", upload-time = "2025-09-27T18:36:49.797Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", upload-time = "2025-09-27T18:36:51.584Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", upload-time = "2025-09-27T18:36:52.537Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", upload-time = "2025-09-27T18:36:53.513Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", upload-time = "2025-09-27T18:36:54.819Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", upload-time = "2025-09-27T18:36:55.714Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", upload-time = "2025-09-27T18:36:56.908Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", upload-time = "2025-09-27T18:36:57.913Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", upload-time = "2025-09-27T18:36:58.833Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", upload-time = "2025-09-27T18:36:59.739Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", upload-time = "2025-09-27T18:37:00.719Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", upload-time = "2025-09-27T18:37:01.673Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", upload-time = "2025-09-27T18:37:02.639Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", upload-time = "2025-09-27T18:37:03.582Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", upload-time = "2025-09-27T18:37:04.929Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", upload-time = "2025-09-27T18:37:06.342Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", upload-time = "2025-09-27T18:37:07.213Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", upload-time = "2025-09-27T18:37:09.572Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", upload-time = "2025-09-27T18:37:10.58Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", upload-time = "2025-09-27T18:37:11.547Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", upload-time = "2025-09-27T18:37:12.48Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", upload-time = "2025-09-27T18:37:13.485Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", upload-time = "2025-09-27T18:37:14.408Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", upload-time = "2025-09-27T18:37:15.36Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", upload-time = "2025-09-27T18:37:16.496Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", upload-time = "2025-09-27T18:37:17.476Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", upload-time = "2025-09-27T18:37:18.453Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", upload-time = "2025-09-27T18:37:19.332Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", upload-time = "2025-09-27T18:37:20.245Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", upload-time = "2025-09-27T18:37:21.177Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", upload-time = "2025-09-27T18:37:22.167Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", upload-time = "2025-09-27T18:37:23.296Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", upload-time = "2025-09-27T18:37:24.237Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", upload-time = "2025-09-27T18:37:25.271Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", upload-time = "2025-09-27T18:37:26.285Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", upload-time = "2025-09-27T18:37:27.316Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", upload-time = "2025-09-27T18:37:28.327Z" }, +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" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, ] [[package]] @@ -2586,71 +2583,71 @@ dependencies = [ { name = "pyparsing" }, { name = "python-dateutil" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", upload-time = "2025-12-10T22:56:51.155Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/58/be/a30bd917018ad220c400169fba298f2bb7003c8ccbc0c3e24ae2aacad1e8/matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7", upload-time = "2025-12-10T22:55:02.313Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/27/ca01e043c4841078e82cf6e80a6993dfecd315c3d79f5f3153afbb8e1ec6/matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656", upload-time = "2025-12-10T22:55:04.997Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cb/aa/7ab67f2b729ae6a91bcf9dcac0affb95fb8c56f7fd2b2af894ae0b0cf6fa/matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df", upload-time = "2025-12-10T22:55:07.47Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/ae/2d5817b0acee3c49b7e7ccfbf5b273f284957cc8e270adf36375db353190/matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17", upload-time = "2025-12-10T22:55:10.566Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c9/5b/8e66653e9f7c39cb2e5cab25fce4810daffa2bff02cbf5f3077cea9e942c/matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933", upload-time = "2025-12-10T22:55:12.362Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/e2/fd0bbadf837f81edb0d208ba8f8cb552874c3b16e27cb91a31977d90875d/matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a", upload-time = "2025-12-10T22:55:14.436Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160", upload-time = "2025-12-10T22:55:16.175Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78", upload-time = "2025-12-10T22:55:17.712Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4", upload-time = "2025-12-10T22:55:20.8Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5a/f4/b8347351da9a5b3f41e26cf547252d861f685c6867d179a7c9d60ad50189/matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2", upload-time = "2025-12-10T22:55:23.258Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9e/c0/c7b914e297efe0bc36917bf216b2acb91044b91e930e878ae12981e461e5/matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6", upload-time = "2025-12-10T22:55:25.217Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9", upload-time = "2025-12-10T22:55:27.162Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/dd/a0b6588f102beab33ca6f5218b31725216577b2a24172f327eaf6417d5c9/matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2", upload-time = "2025-12-10T22:55:29.185Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", upload-time = "2025-12-10T22:55:30.709Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", upload-time = "2025-12-10T22:55:33.265Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", upload-time = "2025-12-10T22:55:34.922Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", upload-time = "2025-12-10T22:55:36.789Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", upload-time = "2025-12-10T22:55:38.715Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", upload-time = "2025-12-10T22:55:41.103Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", upload-time = "2025-12-10T22:55:42.684Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6", upload-time = "2025-12-10T22:55:44.648Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1", upload-time = "2025-12-10T22:55:46.252Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486", upload-time = "2025-12-10T22:55:47.864Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/01/be/cd478f4b66f48256f42927d0acbcd63a26a893136456cd079c0cc24fbabf/matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce", upload-time = "2025-12-10T22:55:50.048Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/7c/8dc289776eae5109e268c4fb92baf870678dc048a25d4ac903683b86d5bf/matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6", upload-time = "2025-12-10T22:55:52.21Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149", upload-time = "2025-12-10T22:55:54.253Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/52/8d8a8730e968185514680c2a6625943f70269509c3dcfc0dcf7d75928cb8/matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645", upload-time = "2025-12-10T22:55:56.268Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/27/51fe26e1062f298af5ef66343d8ef460e090a27fea73036c76c35821df04/matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077", upload-time = "2025-12-10T22:55:57.856Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2c/1e/4de865bc591ac8e3062e835f42dd7fe7a93168d519557837f0e37513f629/matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22", upload-time = "2025-12-10T22:55:59.371Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c6/cb/2f7b6e75fb4dce87ef91f60cac4f6e34f4c145ab036a22318ec837971300/matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39", upload-time = "2025-12-10T22:56:01.032Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/46/b3/bd9c57d6ba670a37ab31fb87ec3e8691b947134b201f881665b28cc039ff/matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565", upload-time = "2025-12-10T22:56:02.95Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/3d/8b94a481456dfc9dfe6e39e93b5ab376e50998cddfd23f4ae3b431708f16/matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a", upload-time = "2025-12-10T22:56:05.411Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bd/cd/bc06149fe5585ba800b189a6a654a75f1f127e8aab02fd2be10df7fa500c/matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958", upload-time = "2025-12-10T22:56:07.551Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e3/de/b22cf255abec916562cc04eef457c13e58a1990048de0c0c3604d082355e/matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5", upload-time = "2025-12-10T22:56:09.178Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f", upload-time = "2025-12-10T22:56:10.885Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b", upload-time = "2025-12-10T22:56:12.377Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/6f/009d129ae70b75e88cbe7e503a12a4c0670e08ed748a902c2568909e9eb5/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d", upload-time = "2025-12-10T22:56:14.432Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008", upload-time = "2025-12-10T22:56:16.29Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/f3/3abf75f38605772cf48a9daf5821cd4f563472f38b4b828c6fba6fa6d06e/matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c", upload-time = "2025-12-10T22:56:18.155Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11", upload-time = "2025-12-10T22:56:20.366Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/69/ce/b006495c19ccc0a137b48083168a37bd056392dee02f87dba0472f2797fe/matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8", upload-time = "2025-12-10T22:56:22.239Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/68/d9/b31116a3a855bd313c6fcdb7226926d59b041f26061c6c5b1be66a08c826/matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50", upload-time = "2025-12-10T22:56:24.218Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1e/90/6effe8103f0272685767ba5f094f453784057072f49b393e3ea178fe70a5/matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908", upload-time = "2025-12-10T22:56:26.787Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d7/65/a73188711bea603615fc0baecca1061429ac16940e2385433cc778a9d8e7/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a", upload-time = "2025-12-10T22:56:28.953Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f4/3d/b5c5d5d5be8ce63292567f0e2c43dde9953d3ed86ac2de0a72e93c8f07a1/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1", upload-time = "2025-12-10T22:56:31.455Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4d/4b/e7beb6bbd49f6bae727a12b270a2654d13c397576d25bd6786e47033300f/matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c", upload-time = "2025-12-10T22:56:33.85Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7c/e6/76f2813d31f032e65f6f797e3f2f6e4aab95b65015924b1c51370395c28a/matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b", upload-time = "2025-12-10T22:56:36.107Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/49/d651878698a0b67f23aa28e17f45a6d6dd3d3f933fa29087fa4ce5947b5a/matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f", upload-time = "2025-12-10T22:56:38.008Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/43/31d59500bb950b0d188e149a2e552040528c13d6e3d6e84d0cccac593dcd/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8", upload-time = "2025-12-10T22:56:39.529Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/2c/615c09984f3c5f907f51c886538ad785cf72e0e11a3225de2c0f9442aecc/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7", upload-time = "2025-12-10T22:56:41.758Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/91/e1/2757277a1c56041e1fc104b51a0f7b9a4afc8eb737865d63cababe30bc61/matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3", upload-time = "2025-12-10T22:56:43.415Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/04/30/3afaa31c757f34b7725ab9d2ba8b48b5e89c2019c003e7d0ead143aabc5a/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1", upload-time = "2025-12-10T22:56:45.584Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/48/2f/6334aec331f57485a642a7c8be03cb286f29111ae71c46c38b363230063c/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a", upload-time = "2025-12-10T22:56:47.339Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/e4/6d6f14b2a759c622f191b2d67e9075a3f56aaccb3be4bb9bb6890030d0a0/matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2", upload-time = "2025-12-10T22:56:48.954Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/8a/76/d3c6e3a13fe484ebe7718d14e269c9569c4eb0020a968a327acb3b9a8fe6/matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3", size = 34806269, upload-time = "2025-12-10T22:56:51.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/be/a30bd917018ad220c400169fba298f2bb7003c8ccbc0c3e24ae2aacad1e8/matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7", size = 8239828, upload-time = "2025-12-10T22:55:02.313Z" }, + { url = "https://files.pythonhosted.org/packages/58/27/ca01e043c4841078e82cf6e80a6993dfecd315c3d79f5f3153afbb8e1ec6/matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656", size = 8128050, upload-time = "2025-12-10T22:55:04.997Z" }, + { url = "https://files.pythonhosted.org/packages/cb/aa/7ab67f2b729ae6a91bcf9dcac0affb95fb8c56f7fd2b2af894ae0b0cf6fa/matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df", size = 8700452, upload-time = "2025-12-10T22:55:07.47Z" }, + { url = "https://files.pythonhosted.org/packages/73/ae/2d5817b0acee3c49b7e7ccfbf5b273f284957cc8e270adf36375db353190/matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17", size = 9534928, upload-time = "2025-12-10T22:55:10.566Z" }, + { url = "https://files.pythonhosted.org/packages/c9/5b/8e66653e9f7c39cb2e5cab25fce4810daffa2bff02cbf5f3077cea9e942c/matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933", size = 9586377, upload-time = "2025-12-10T22:55:12.362Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e2/fd0bbadf837f81edb0d208ba8f8cb552874c3b16e27cb91a31977d90875d/matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a", size = 8128127, upload-time = "2025-12-10T22:55:14.436Z" }, + { url = "https://files.pythonhosted.org/packages/f8/86/de7e3a1cdcfc941483af70609edc06b83e7c8a0e0dc9ac325200a3f4d220/matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160", size = 8251215, upload-time = "2025-12-10T22:55:16.175Z" }, + { url = "https://files.pythonhosted.org/packages/fd/14/baad3222f424b19ce6ad243c71de1ad9ec6b2e4eb1e458a48fdc6d120401/matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78", size = 8139625, upload-time = "2025-12-10T22:55:17.712Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a0/7024215e95d456de5883e6732e708d8187d9753a21d32f8ddb3befc0c445/matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4", size = 8712614, upload-time = "2025-12-10T22:55:20.8Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f4/b8347351da9a5b3f41e26cf547252d861f685c6867d179a7c9d60ad50189/matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2", size = 9540997, upload-time = "2025-12-10T22:55:23.258Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c0/c7b914e297efe0bc36917bf216b2acb91044b91e930e878ae12981e461e5/matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6", size = 9596825, upload-time = "2025-12-10T22:55:25.217Z" }, + { url = "https://files.pythonhosted.org/packages/6f/d3/a4bbc01c237ab710a1f22b4da72f4ff6d77eb4c7735ea9811a94ae239067/matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9", size = 8135090, upload-time = "2025-12-10T22:55:27.162Z" }, + { url = "https://files.pythonhosted.org/packages/89/dd/a0b6588f102beab33ca6f5218b31725216577b2a24172f327eaf6417d5c9/matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2", size = 8012377, upload-time = "2025-12-10T22:55:29.185Z" }, + { url = "https://files.pythonhosted.org/packages/9e/67/f997cdcbb514012eb0d10cd2b4b332667997fb5ebe26b8d41d04962fa0e6/matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a", size = 8260453, upload-time = "2025-12-10T22:55:30.709Z" }, + { url = "https://files.pythonhosted.org/packages/7e/65/07d5f5c7f7c994f12c768708bd2e17a4f01a2b0f44a1c9eccad872433e2e/matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58", size = 8148321, upload-time = "2025-12-10T22:55:33.265Z" }, + { url = "https://files.pythonhosted.org/packages/3e/f3/c5195b1ae57ef85339fd7285dfb603b22c8b4e79114bae5f4f0fcf688677/matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04", size = 8716944, upload-time = "2025-12-10T22:55:34.922Z" }, + { url = "https://files.pythonhosted.org/packages/00/f9/7638f5cc82ec8a7aa005de48622eecc3ed7c9854b96ba15bd76b7fd27574/matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f", size = 9550099, upload-time = "2025-12-10T22:55:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/57/61/78cd5920d35b29fd2a0fe894de8adf672ff52939d2e9b43cb83cd5ce1bc7/matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466", size = 9613040, upload-time = "2025-12-10T22:55:38.715Z" }, + { url = "https://files.pythonhosted.org/packages/30/4e/c10f171b6e2f44d9e3a2b96efa38b1677439d79c99357600a62cc1e9594e/matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf", size = 8142717, upload-time = "2025-12-10T22:55:41.103Z" }, + { url = "https://files.pythonhosted.org/packages/f1/76/934db220026b5fef85f45d51a738b91dea7d70207581063cd9bd8fafcf74/matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b", size = 8012751, upload-time = "2025-12-10T22:55:42.684Z" }, + { url = "https://files.pythonhosted.org/packages/3d/b9/15fd5541ef4f5b9a17eefd379356cf12175fe577424e7b1d80676516031a/matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6", size = 8261076, upload-time = "2025-12-10T22:55:44.648Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a0/2ba3473c1b66b9c74dc7107c67e9008cb1782edbe896d4c899d39ae9cf78/matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1", size = 8148794, upload-time = "2025-12-10T22:55:46.252Z" }, + { url = "https://files.pythonhosted.org/packages/75/97/a471f1c3eb1fd6f6c24a31a5858f443891d5127e63a7788678d14e249aea/matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486", size = 8718474, upload-time = "2025-12-10T22:55:47.864Z" }, + { url = "https://files.pythonhosted.org/packages/01/be/cd478f4b66f48256f42927d0acbcd63a26a893136456cd079c0cc24fbabf/matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce", size = 9549637, upload-time = "2025-12-10T22:55:50.048Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7c/8dc289776eae5109e268c4fb92baf870678dc048a25d4ac903683b86d5bf/matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6", size = 9613678, upload-time = "2025-12-10T22:55:52.21Z" }, + { url = "https://files.pythonhosted.org/packages/64/40/37612487cc8a437d4dd261b32ca21fe2d79510fe74af74e1f42becb1bdb8/matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149", size = 8142686, upload-time = "2025-12-10T22:55:54.253Z" }, + { url = "https://files.pythonhosted.org/packages/66/52/8d8a8730e968185514680c2a6625943f70269509c3dcfc0dcf7d75928cb8/matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645", size = 8012917, upload-time = "2025-12-10T22:55:56.268Z" }, + { url = "https://files.pythonhosted.org/packages/b5/27/51fe26e1062f298af5ef66343d8ef460e090a27fea73036c76c35821df04/matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077", size = 8305679, upload-time = "2025-12-10T22:55:57.856Z" }, + { url = "https://files.pythonhosted.org/packages/2c/1e/4de865bc591ac8e3062e835f42dd7fe7a93168d519557837f0e37513f629/matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22", size = 8198336, upload-time = "2025-12-10T22:55:59.371Z" }, + { url = "https://files.pythonhosted.org/packages/c6/cb/2f7b6e75fb4dce87ef91f60cac4f6e34f4c145ab036a22318ec837971300/matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39", size = 8731653, upload-time = "2025-12-10T22:56:01.032Z" }, + { url = "https://files.pythonhosted.org/packages/46/b3/bd9c57d6ba670a37ab31fb87ec3e8691b947134b201f881665b28cc039ff/matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565", size = 9561356, upload-time = "2025-12-10T22:56:02.95Z" }, + { url = "https://files.pythonhosted.org/packages/c0/3d/8b94a481456dfc9dfe6e39e93b5ab376e50998cddfd23f4ae3b431708f16/matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a", size = 9614000, upload-time = "2025-12-10T22:56:05.411Z" }, + { url = "https://files.pythonhosted.org/packages/bd/cd/bc06149fe5585ba800b189a6a654a75f1f127e8aab02fd2be10df7fa500c/matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958", size = 8220043, upload-time = "2025-12-10T22:56:07.551Z" }, + { url = "https://files.pythonhosted.org/packages/e3/de/b22cf255abec916562cc04eef457c13e58a1990048de0c0c3604d082355e/matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5", size = 8062075, upload-time = "2025-12-10T22:56:09.178Z" }, + { url = "https://files.pythonhosted.org/packages/3c/43/9c0ff7a2f11615e516c3b058e1e6e8f9614ddeca53faca06da267c48345d/matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f", size = 8262481, upload-time = "2025-12-10T22:56:10.885Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ca/e8ae28649fcdf039fda5ef554b40a95f50592a3c47e6f7270c9561c12b07/matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b", size = 8151473, upload-time = "2025-12-10T22:56:12.377Z" }, + { url = "https://files.pythonhosted.org/packages/f1/6f/009d129ae70b75e88cbe7e503a12a4c0670e08ed748a902c2568909e9eb5/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d", size = 9553896, upload-time = "2025-12-10T22:56:14.432Z" }, + { url = "https://files.pythonhosted.org/packages/f5/26/4221a741eb97967bc1fd5e4c52b9aa5a91b2f4ec05b59f6def4d820f9df9/matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008", size = 9824193, upload-time = "2025-12-10T22:56:16.29Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/3abf75f38605772cf48a9daf5821cd4f563472f38b4b828c6fba6fa6d06e/matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c", size = 9615444, upload-time = "2025-12-10T22:56:18.155Z" }, + { url = "https://files.pythonhosted.org/packages/93/a5/de89ac80f10b8dc615807ee1133cd99ac74082581196d4d9590bea10690d/matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11", size = 8272719, upload-time = "2025-12-10T22:56:20.366Z" }, + { url = "https://files.pythonhosted.org/packages/69/ce/b006495c19ccc0a137b48083168a37bd056392dee02f87dba0472f2797fe/matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8", size = 8144205, upload-time = "2025-12-10T22:56:22.239Z" }, + { url = "https://files.pythonhosted.org/packages/68/d9/b31116a3a855bd313c6fcdb7226926d59b041f26061c6c5b1be66a08c826/matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50", size = 8305785, upload-time = "2025-12-10T22:56:24.218Z" }, + { url = "https://files.pythonhosted.org/packages/1e/90/6effe8103f0272685767ba5f094f453784057072f49b393e3ea178fe70a5/matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908", size = 8198361, upload-time = "2025-12-10T22:56:26.787Z" }, + { url = "https://files.pythonhosted.org/packages/d7/65/a73188711bea603615fc0baecca1061429ac16940e2385433cc778a9d8e7/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a", size = 9561357, upload-time = "2025-12-10T22:56:28.953Z" }, + { url = "https://files.pythonhosted.org/packages/f4/3d/b5c5d5d5be8ce63292567f0e2c43dde9953d3ed86ac2de0a72e93c8f07a1/matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1", size = 9823610, upload-time = "2025-12-10T22:56:31.455Z" }, + { url = "https://files.pythonhosted.org/packages/4d/4b/e7beb6bbd49f6bae727a12b270a2654d13c397576d25bd6786e47033300f/matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c", size = 9614011, upload-time = "2025-12-10T22:56:33.85Z" }, + { url = "https://files.pythonhosted.org/packages/7c/e6/76f2813d31f032e65f6f797e3f2f6e4aab95b65015924b1c51370395c28a/matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b", size = 8362801, upload-time = "2025-12-10T22:56:36.107Z" }, + { url = "https://files.pythonhosted.org/packages/5d/49/d651878698a0b67f23aa28e17f45a6d6dd3d3f933fa29087fa4ce5947b5a/matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f", size = 8192560, upload-time = "2025-12-10T22:56:38.008Z" }, + { url = "https://files.pythonhosted.org/packages/f5/43/31d59500bb950b0d188e149a2e552040528c13d6e3d6e84d0cccac593dcd/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8", size = 8237252, upload-time = "2025-12-10T22:56:39.529Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2c/615c09984f3c5f907f51c886538ad785cf72e0e11a3225de2c0f9442aecc/matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7", size = 8124693, upload-time = "2025-12-10T22:56:41.758Z" }, + { url = "https://files.pythonhosted.org/packages/91/e1/2757277a1c56041e1fc104b51a0f7b9a4afc8eb737865d63cababe30bc61/matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3", size = 8702205, upload-time = "2025-12-10T22:56:43.415Z" }, + { url = "https://files.pythonhosted.org/packages/04/30/3afaa31c757f34b7725ab9d2ba8b48b5e89c2019c003e7d0ead143aabc5a/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1", size = 8249198, upload-time = "2025-12-10T22:56:45.584Z" }, + { url = "https://files.pythonhosted.org/packages/48/2f/6334aec331f57485a642a7c8be03cb286f29111ae71c46c38b363230063c/matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a", size = 8136817, upload-time = "2025-12-10T22:56:47.339Z" }, + { url = "https://files.pythonhosted.org/packages/73/e4/6d6f14b2a759c622f191b2d67e9075a3f56aaccb3be4bb9bb6890030d0a0/matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2", size = 8713867, upload-time = "2025-12-10T22:56:48.954Z" }, ] [[package]] name = "mccabe" version = "0.7.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", upload-time = "2022-01-24T01:14:51.113Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658, upload-time = "2022-01-24T01:14:51.113Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", upload-time = "2022-01-24T01:14:49.62Z" }, + { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350, upload-time = "2022-01-24T01:14:49.62Z" }, ] [[package]] @@ -2673,9 +2670,9 @@ dependencies = [ { name = "typing-inspection" }, { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/38/83/d1efe7c2980d8a3afa476f4e3d42d53dd54c0ab94c27bee5d755b45c8b73/mcp-1.27.1.tar.gz", hash = "sha256:0f47e1820f8f8f941466b39749eb1d1839a04caddca2bc60e9d46e8a99914924", upload-time = "2026-05-08T16:50:12.601Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/83/d1efe7c2980d8a3afa476f4e3d42d53dd54c0ab94c27bee5d755b45c8b73/mcp-1.27.1.tar.gz", hash = "sha256:0f47e1820f8f8f941466b39749eb1d1839a04caddca2bc60e9d46e8a99914924", size = 608458, upload-time = "2026-05-08T16:50:12.601Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/73/42d9596facebdb533b7f0b86c1b0364ef350d1f8ba78b1052e8a58b48b65/mcp-1.27.1-py3-none-any.whl", hash = "sha256:1af3c4203b329430fde7a87b4fcb6392a041f5cb851fd68fc674016ab4e7c06f", upload-time = "2026-05-08T16:50:10.547Z" }, + { url = "https://files.pythonhosted.org/packages/fd/73/42d9596facebdb533b7f0b86c1b0364ef350d1f8ba78b1052e8a58b48b65/mcp-1.27.1-py3-none-any.whl", hash = "sha256:1af3c4203b329430fde7a87b4fcb6392a041f5cb851fd68fc674016ab4e7c06f", size = 216260, upload-time = "2026-05-08T16:50:10.547Z" }, ] [[package]] @@ -2686,23 +2683,23 @@ dependencies = [ { name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version < '3.11'" }, { name = "markdown-it-py", version = "4.0.0", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", upload-time = "2025-08-11T07:25:49.083Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/fd/a756d36c0bfba5f6e39a1cdbdbfdd448dc02692467d83816dff4592a1ebc/mdit_py_plugins-0.5.0.tar.gz", hash = "sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6", size = 44655, upload-time = "2025-08-11T07:25:49.083Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", upload-time = "2025-08-11T07:25:47.597Z" }, + { url = "https://files.pythonhosted.org/packages/fb/86/dd6e5db36df29e76c7a7699123569a4a18c1623ce68d826ed96c62643cae/mdit_py_plugins-0.5.0-py3-none-any.whl", hash = "sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f", size = 57205, upload-time = "2025-08-11T07:25:47.597Z" }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", upload-time = "2022-08-14T12:40:10.846Z" } +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://pypi-proxy.dev.databricks.com/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", upload-time = "2022-08-14T12:40:09.779Z" }, + { 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 = "mlflow" -version = "3.13.0" +version = "3.11.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "aiohttp" }, @@ -2729,14 +2726,14 @@ dependencies = [ { name = "sqlalchemy" }, { name = "waitress", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/8e/69/d71afc475fa7e7b22bb27392247d2a3015c9da202dea44f150a54be4bd67/mlflow-3.13.0.tar.gz", hash = "sha256:a95198d592a8a15fad3db7f56b228acc9422c09f0daa7c6c976a9996ab73c3e2", upload-time = "2026-06-01T05:55:09.555Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e9/34/e328c073cd32c186fb242a957e5bade82433c06bc45b7d1695bf4d02f166/mlflow-3.11.1.tar.gz", hash = "sha256:84e54c4be91b5b2a19039a2673fe688b1d7307ceddacc08af51f8df05b19ee56", size = 9797469, upload-time = "2026-04-07T14:26:58.463Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/07/1f/d44140128356f2f5db37f9fb4d9da31123d839d49f3fe00a079cd35bfe20/mlflow-3.13.0-py3-none-any.whl", hash = "sha256:7ca9cb2f623f300dabadaf5e985c85af77c5db3d7c36f56769d22c101b132f6c", upload-time = "2026-06-01T05:55:06.86Z" }, + { url = "https://files.pythonhosted.org/packages/2a/62/96826c340354638dfedcbdbcd35d67754566bd45f6592300e0c215c80e30/mlflow-3.11.1-py3-none-any.whl", hash = "sha256:8f6bf1238ac04f97664c229dd480380c5c254a78bdb3c0e433e3a0397508b1af", size = 10479141, upload-time = "2026-04-07T14:26:55.709Z" }, ] [[package]] name = "mlflow-skinny" -version = "3.13.0" +version = "3.11.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "cachetools" }, @@ -2756,18 +2753,17 @@ dependencies = [ { name = "pyyaml" }, { name = "requests" }, { name = "sqlparse" }, - { name = "starlette" }, { name = "typing-extensions" }, { name = "uvicorn" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/72/13/840db21a4f46ebe6ba9837a38bc93d748e23b6b61986799c8040cd4bf728/mlflow_skinny-3.13.0.tar.gz", hash = "sha256:d2273bfa21f776359f7d6ab2267967e3a6732a5fb00996ad433d0e777dfa3b71", upload-time = "2026-06-01T05:54:54.175Z" } +sdist = { url = "https://files.pythonhosted.org/packages/40/77/fe2027ddad9e52ed1ac360fbc262169e6366f6678632e350cbd0d901bb9b/mlflow_skinny-3.11.1.tar.gz", hash = "sha256:86ce63491349f6713afc8a4ef0bf77a8314d0e79e03753cb150d6c860a0b0475", size = 2642799, upload-time = "2026-04-07T14:26:43.818Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/fd/f2739de1b6a09da981927aa90db87340cbe4b3cf6cd175fd5e6e4366208e/mlflow_skinny-3.13.0-py3-none-any.whl", hash = "sha256:ced3d9a580564fae093d14732df8531fb180574f6483d4c642b6083879eb86fc", upload-time = "2026-06-01T05:54:52.166Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a7/e61ec397b34dc3c9e91572f45e41617f429d5c524d38a4e1aa2316ee1b5e/mlflow_skinny-3.11.1-py3-none-any.whl", hash = "sha256:82ffd5f6980320b4ac19f741e7a754faa1d01707e632b002ea68e04fd25a0535", size = 3171551, upload-time = "2026-04-07T14:26:41.762Z" }, ] [[package]] name = "mlflow-tracing" -version = "3.13.0" +version = "3.11.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "cachetools" }, @@ -2779,88 +2775,88 @@ dependencies = [ { name = "protobuf" }, { name = "pydantic" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/ec/b0/5912313e895e6ce02f1f67110164d147593d1b5379a4767a30a5b9e730c5/mlflow_tracing-3.13.0.tar.gz", hash = "sha256:42c435b0fdcab00f1865cab4a52f7a85a2a08d68a959f36bcf90a1c9fe65db0a", upload-time = "2026-06-01T05:54:44.906Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/77/73af163432f3c66e2d213045250972e504a6683c76f63dd1abfba441a16a/mlflow_tracing-3.11.1.tar.gz", hash = "sha256:cb63cee16385d081467ec5bee4807fe1af59ddfdf04be4c79e7a7813b1002193", size = 1314550, upload-time = "2026-04-07T14:26:32.785Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/94/fd/2c53ebc2f7fbb34ed4a3913a71ff53962e6be35fa02f7cee1f52c77388cd/mlflow_tracing-3.13.0-py3-none-any.whl", hash = "sha256:2f8187ce2b1af7419be71d2d8ab5fec53d207d4b8d703cd15e5db64939098d72", upload-time = "2026-06-01T05:54:42.911Z" }, + { url = "https://files.pythonhosted.org/packages/62/ab/d980c84e7df4224ab8db2457afbe135b430f371ca081a37cf89f8ef18ca1/mlflow_tracing-3.11.1-py3-none-any.whl", hash = "sha256:fa82df64dacf8293b714ae666440fe7c1902c6470c024df389bb91e9de3106d9", size = 1575790, upload-time = "2026-04-07T14:26:30.804Z" }, ] [[package]] name = "more-itertools" version = "11.1.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/de/1d/f4da6f02cdffe04d6362210b807146a26044c88d839208aec273bb0d9184/more_itertools-11.1.0.tar.gz", hash = "sha256:48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d", upload-time = "2026-05-22T14:14:29.909Z" } +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://pypi-proxy.dev.databricks.com/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl", hash = "sha256:4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192", upload-time = "2026-05-22T14:14:28.824Z" }, + { 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 = "mpmath" version = "1.3.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", upload-time = "2023-03-07T16:47:11.061Z" } +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://pypi-proxy.dev.databricks.com/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", upload-time = "2023-03-07T16:47:09.197Z" }, + { 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.1.2" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", upload-time = "2025-10-08T09:15:56.596Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/a2/3b68a9e769db68668b25c6108444a35f9bd163bb848c0650d516761a59c0/msgpack-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0051fffef5a37ca2cd16978ae4f0aef92f164df86823871b5162812bebecd8e2", upload-time = "2025-10-08T09:14:38.722Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5b/e1/2b720cc341325c00be44e1ed59e7cfeae2678329fbf5aa68f5bda57fe728/msgpack-1.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a605409040f2da88676e9c9e5853b3449ba8011973616189ea5ee55ddbc5bc87", upload-time = "2025-10-08T09:14:40.082Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/71/e5/c2241de64bfceac456b140737812a2ab310b10538a7b34a1d393b748e095/msgpack-1.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b696e83c9f1532b4af884045ba7f3aa741a63b2bc22617293a2c6a7c645f251", upload-time = "2025-10-08T09:14:41.151Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/09/2a06956383c0fdebaef5aa9246e2356776f12ea6f2a44bd1368abf0e46c4/msgpack-1.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:365c0bbe981a27d8932da71af63ef86acc59ed5c01ad929e09a0b88c6294e28a", upload-time = "2025-10-08T09:14:42.821Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0e/74/2957703f0e1ef20637d6aead4fbb314330c26f39aa046b348c7edcf6ca6b/msgpack-1.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41d1a5d875680166d3ac5c38573896453bbbea7092936d2e107214daf43b1d4f", upload-time = "2025-10-08T09:14:44.38Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a5/09/3bfc12aa90f77b37322fc33e7a8a7c29ba7c8edeadfa27664451801b9860/msgpack-1.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354e81bcdebaab427c3df4281187edc765d5d76bfb3a7c125af9da7a27e8458f", upload-time = "2025-10-08T09:14:45.56Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/4f/05fcebd3b4977cb3d840f7ef6b77c51f8582086de5e642f3fefee35c86fc/msgpack-1.1.2-cp310-cp310-win32.whl", hash = "sha256:e64c8d2f5e5d5fda7b842f55dec6133260ea8f53c4257d64494c534f306bf7a9", upload-time = "2025-10-08T09:14:47.334Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d0/3e/b4547e3a34210956382eed1c85935fff7e0f9b98be3106b3745d7dec9c5e/msgpack-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:db6192777d943bdaaafb6ba66d44bf65aa0e9c5616fa1d2da9bb08828c6b39aa", upload-time = "2025-10-08T09:14:48.665Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c", upload-time = "2025-10-08T09:14:49.967Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0", upload-time = "2025-10-08T09:14:50.958Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/71/46/b817349db6886d79e57a966346cf0902a426375aadc1e8e7a86a75e22f19/msgpack-1.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61c8aa3bd513d87c72ed0b37b53dd5c5a0f58f2ff9f26e1555d3bd7948fb7296", upload-time = "2025-10-08T09:14:51.997Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:454e29e186285d2ebe65be34629fa0e8605202c60fbc7c4c650ccd41870896ef", upload-time = "2025-10-08T09:14:53.477Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/25/98/6a19f030b3d2ea906696cedd1eb251708e50a5891d0978b012cb6107234c/msgpack-1.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7bc8813f88417599564fafa59fd6f95be417179f76b40325b500b3c98409757c", upload-time = "2025-10-08T09:14:54.648Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/cd/9098fcb6adb32187a70b7ecaabf6339da50553351558f37600e53a4a2a23/msgpack-1.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bafca952dc13907bdfdedfc6a5f579bf4f292bdd506fadb38389afa3ac5b208e", upload-time = "2025-10-08T09:14:56.328Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e6/ae/270cecbcf36c1dc85ec086b33a51a4d7d08fc4f404bdbc15b582255d05ff/msgpack-1.1.2-cp311-cp311-win32.whl", hash = "sha256:602b6740e95ffc55bfb078172d279de3773d7b7db1f703b2f1323566b878b90e", upload-time = "2025-10-08T09:14:57.882Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68", upload-time = "2025-10-08T09:14:59.177Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/4d/7c4e2b3d9b1106cd0aa6cb56cc57c6267f59fa8bfab7d91df5adc802c847/msgpack-1.1.2-cp311-cp311-win_arm64.whl", hash = "sha256:86f8136dfa5c116365a8a651a7d7484b65b13339731dd6faebb9a0242151c406", upload-time = "2025-10-08T09:15:00.48Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ad/bd/8b0d01c756203fbab65d265859749860682ccd2a59594609aeec3a144efa/msgpack-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:70a0dff9d1f8da25179ffcf880e10cf1aad55fdb63cd59c9a49a1b82290062aa", upload-time = "2025-10-08T09:15:01.472Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/34/68/ba4f155f793a74c1483d4bdef136e1023f7bcba557f0db4ef3db3c665cf1/msgpack-1.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446abdd8b94b55c800ac34b102dffd2f6aa0ce643c55dfc017ad89347db3dbdb", upload-time = "2025-10-08T09:15:03.764Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/60/a064b0345fc36c4c3d2c743c82d9100c40388d77f0b48b2f04d6041dbec1/msgpack-1.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63eea553c69ab05b6747901b97d620bb2a690633c77f23feb0c6a947a8a7b8f", upload-time = "2025-10-08T09:15:05.136Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/65/92/a5100f7185a800a5d29f8d14041f61475b9de465ffcc0f3b9fba606e4505/msgpack-1.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:372839311ccf6bdaf39b00b61288e0557916c3729529b301c52c2d88842add42", upload-time = "2025-10-08T09:15:06.837Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/87/ffe21d1bf7d9991354ad93949286f643b2bb6ddbeab66373922b44c3b8cc/msgpack-1.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2929af52106ca73fcb28576218476ffbb531a036c2adbcf54a3664de124303e9", upload-time = "2025-10-08T09:15:08.179Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ff/41/8543ed2b8604f7c0d89ce066f42007faac1eaa7d79a81555f206a5cdb889/msgpack-1.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be52a8fc79e45b0364210eef5234a7cf8d330836d0a64dfbb878efa903d84620", upload-time = "2025-10-08T09:15:09.83Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/41/0d/2ddfaa8b7e1cee6c490d46cb0a39742b19e2481600a7a0e96537e9c22f43/msgpack-1.1.2-cp312-cp312-win32.whl", hash = "sha256:1fff3d825d7859ac888b0fbda39a42d59193543920eda9d9bea44d958a878029", upload-time = "2025-10-08T09:15:11.11Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8c/ec/d431eb7941fb55a31dd6ca3404d41fbb52d99172df2e7707754488390910/msgpack-1.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1de460f0403172cff81169a30b9a92b260cb809c4cb7e2fc79ae8d0510c78b6b", upload-time = "2025-10-08T09:15:12.554Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c5/31/5b1a1f70eb0e87d1678e9624908f86317787b536060641d6798e3cf70ace/msgpack-1.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:be5980f3ee0e6bd44f3a9e9dea01054f175b50c3e6cdb692bc9424c0bbb8bf69", upload-time = "2025-10-08T09:15:13.589Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf", upload-time = "2025-10-08T09:15:14.552Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7", upload-time = "2025-10-08T09:15:15.543Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/68/93180dce57f684a61a88a45ed13047558ded2be46f03acb8dec6d7c513af/msgpack-1.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fdf7d83102bf09e7ce3357de96c59b627395352a4024f6e2458501f158bf999", upload-time = "2025-10-08T09:15:16.567Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e", upload-time = "2025-10-08T09:15:17.825Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/38/f8/4398c46863b093252fe67368b44edc6c13b17f4e6b0e4929dbf0bdb13f23/msgpack-1.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fffee09044073e69f2bad787071aeec727183e7580443dfeb8556cbf1978d162", upload-time = "2025-10-08T09:15:19.003Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/28/ce/698c1eff75626e4124b4d78e21cca0b4cc90043afb80a507626ea354ab52/msgpack-1.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5928604de9b032bc17f5099496417f113c45bc6bc21b5c6920caf34b3c428794", upload-time = "2025-10-08T09:15:20.183Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/67/32/f3cd1667028424fa7001d82e10ee35386eea1408b93d399b09fb0aa7875f/msgpack-1.1.2-cp313-cp313-win32.whl", hash = "sha256:a7787d353595c7c7e145e2331abf8b7ff1e6673a6b974ded96e6d4ec09f00c8c", upload-time = "2025-10-08T09:15:21.416Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9", upload-time = "2025-10-08T09:15:22.431Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/db/0314e4e2db56ebcf450f277904ffd84a7988b9e5da8d0d61ab2d057df2b6/msgpack-1.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:e69b39f8c0aa5ec24b57737ebee40be647035158f14ed4b40e6f150077e21a84", upload-time = "2025-10-08T09:15:23.402Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00", upload-time = "2025-10-08T09:15:24.408Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939", upload-time = "2025-10-08T09:15:25.812Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8e/a9/3536e385167b88c2cc8f4424c49e28d49a6fc35206d4a8060f136e71f94c/msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e", upload-time = "2025-10-08T09:15:27.22Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931", upload-time = "2025-10-08T09:15:28.4Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3b/ef/2b92e286366500a09a67e03496ee8b8ba00562797a52f3c117aa2b29514b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014", upload-time = "2025-10-08T09:15:29.764Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/78/90/e0ea7990abea5764e4655b8177aa7c63cdfa89945b6e7641055800f6c16b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2", upload-time = "2025-10-08T09:15:31.022Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/72/4e/9390aed5db983a2310818cd7d3ec0aecad45e1f7007e0cda79c79507bb0d/msgpack-1.1.2-cp314-cp314-win32.whl", hash = "sha256:80a0ff7d4abf5fecb995fcf235d4064b9a9a8a40a3ab80999e6ac1e30b702717", upload-time = "2025-10-08T09:15:32.265Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b", upload-time = "2025-10-08T09:15:33.219Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6a/b0/9d9f667ab48b16ad4115c1935d94023b82b3198064cb84a123e97f7466c1/msgpack-1.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:59415c6076b1e30e563eb732e23b994a61c159cec44deaf584e5cc1dd662f2af", upload-time = "2025-10-08T09:15:34.225Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/16/67/93f80545eb1792b61a217fa7f06d5e5cb9e0055bed867f43e2b8e012e137/msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a", upload-time = "2025-10-08T09:15:35.61Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/87/1c/33c8a24959cf193966ef11a6f6a2995a65eb066bd681fd085afd519a57ce/msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b", upload-time = "2025-10-08T09:15:36.619Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fc/6b/62e85ff7193663fbea5c0254ef32f0c77134b4059f8da89b958beb7696f3/msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245", upload-time = "2025-10-08T09:15:37.647Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c1/47/5c74ecb4cc277cf09f64e913947871682ffa82b3b93c8dad68083112f412/msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90", upload-time = "2025-10-08T09:15:38.794Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/a4/e98ccdb56dc4e98c929a3f150de1799831c0a800583cde9fa022fa90602d/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20", upload-time = "2025-10-08T09:15:40.238Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/da/28/6951f7fb67bc0a4e184a6b38ab71a92d9ba58080b27a77d3e2fb0be5998f/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27", upload-time = "2025-10-08T09:15:41.505Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f0/03/42106dcded51f0a0b5284d3ce30a671e7bd3f7318d122b2ead66ad289fed/msgpack-1.1.2-cp314-cp314t-win32.whl", hash = "sha256:1d1418482b1ee984625d88aa9585db570180c286d942da463533b238b98b812b", upload-time = "2025-10-08T09:15:42.954Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/15/86/d0071e94987f8db59d4eeb386ddc64d0bb9b10820a8d82bcd3e53eeb2da6/msgpack-1.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5a46bf7e831d09470ad92dff02b8b1ac92175ca36b087f904a0519857c6be3ff", upload-time = "2025-10-08T09:15:43.954Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/81/f2/08ace4142eb281c12701fc3b93a10795e4d4dc7f753911d836675050f886/msgpack-1.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d99ef64f349d5ec3293688e91486c5fdb925ed03807f64d98d205d2713c60b46", upload-time = "2025-10-08T09:15:44.959Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/4d/f2/bfb55a6236ed8725a96b0aa3acbd0ec17588e6a2c3b62a93eb513ed8783f/msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e", size = 173581, upload-time = "2025-10-08T09:15:56.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/a2/3b68a9e769db68668b25c6108444a35f9bd163bb848c0650d516761a59c0/msgpack-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0051fffef5a37ca2cd16978ae4f0aef92f164df86823871b5162812bebecd8e2", size = 81318, upload-time = "2025-10-08T09:14:38.722Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e1/2b720cc341325c00be44e1ed59e7cfeae2678329fbf5aa68f5bda57fe728/msgpack-1.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a605409040f2da88676e9c9e5853b3449ba8011973616189ea5ee55ddbc5bc87", size = 83786, upload-time = "2025-10-08T09:14:40.082Z" }, + { url = "https://files.pythonhosted.org/packages/71/e5/c2241de64bfceac456b140737812a2ab310b10538a7b34a1d393b748e095/msgpack-1.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b696e83c9f1532b4af884045ba7f3aa741a63b2bc22617293a2c6a7c645f251", size = 398240, upload-time = "2025-10-08T09:14:41.151Z" }, + { url = "https://files.pythonhosted.org/packages/b7/09/2a06956383c0fdebaef5aa9246e2356776f12ea6f2a44bd1368abf0e46c4/msgpack-1.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:365c0bbe981a27d8932da71af63ef86acc59ed5c01ad929e09a0b88c6294e28a", size = 406070, upload-time = "2025-10-08T09:14:42.821Z" }, + { url = "https://files.pythonhosted.org/packages/0e/74/2957703f0e1ef20637d6aead4fbb314330c26f39aa046b348c7edcf6ca6b/msgpack-1.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41d1a5d875680166d3ac5c38573896453bbbea7092936d2e107214daf43b1d4f", size = 393403, upload-time = "2025-10-08T09:14:44.38Z" }, + { url = "https://files.pythonhosted.org/packages/a5/09/3bfc12aa90f77b37322fc33e7a8a7c29ba7c8edeadfa27664451801b9860/msgpack-1.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354e81bcdebaab427c3df4281187edc765d5d76bfb3a7c125af9da7a27e8458f", size = 398947, upload-time = "2025-10-08T09:14:45.56Z" }, + { url = "https://files.pythonhosted.org/packages/4b/4f/05fcebd3b4977cb3d840f7ef6b77c51f8582086de5e642f3fefee35c86fc/msgpack-1.1.2-cp310-cp310-win32.whl", hash = "sha256:e64c8d2f5e5d5fda7b842f55dec6133260ea8f53c4257d64494c534f306bf7a9", size = 64769, upload-time = "2025-10-08T09:14:47.334Z" }, + { url = "https://files.pythonhosted.org/packages/d0/3e/b4547e3a34210956382eed1c85935fff7e0f9b98be3106b3745d7dec9c5e/msgpack-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:db6192777d943bdaaafb6ba66d44bf65aa0e9c5616fa1d2da9bb08828c6b39aa", size = 71293, upload-time = "2025-10-08T09:14:48.665Z" }, + { url = "https://files.pythonhosted.org/packages/2c/97/560d11202bcd537abca693fd85d81cebe2107ba17301de42b01ac1677b69/msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c", size = 82271, upload-time = "2025-10-08T09:14:49.967Z" }, + { url = "https://files.pythonhosted.org/packages/83/04/28a41024ccbd67467380b6fb440ae916c1e4f25e2cd4c63abe6835ac566e/msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0", size = 84914, upload-time = "2025-10-08T09:14:50.958Z" }, + { url = "https://files.pythonhosted.org/packages/71/46/b817349db6886d79e57a966346cf0902a426375aadc1e8e7a86a75e22f19/msgpack-1.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61c8aa3bd513d87c72ed0b37b53dd5c5a0f58f2ff9f26e1555d3bd7948fb7296", size = 416962, upload-time = "2025-10-08T09:14:51.997Z" }, + { url = "https://files.pythonhosted.org/packages/da/e0/6cc2e852837cd6086fe7d8406af4294e66827a60a4cf60b86575a4a65ca8/msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:454e29e186285d2ebe65be34629fa0e8605202c60fbc7c4c650ccd41870896ef", size = 426183, upload-time = "2025-10-08T09:14:53.477Z" }, + { url = "https://files.pythonhosted.org/packages/25/98/6a19f030b3d2ea906696cedd1eb251708e50a5891d0978b012cb6107234c/msgpack-1.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7bc8813f88417599564fafa59fd6f95be417179f76b40325b500b3c98409757c", size = 411454, upload-time = "2025-10-08T09:14:54.648Z" }, + { url = "https://files.pythonhosted.org/packages/b7/cd/9098fcb6adb32187a70b7ecaabf6339da50553351558f37600e53a4a2a23/msgpack-1.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bafca952dc13907bdfdedfc6a5f579bf4f292bdd506fadb38389afa3ac5b208e", size = 422341, upload-time = "2025-10-08T09:14:56.328Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ae/270cecbcf36c1dc85ec086b33a51a4d7d08fc4f404bdbc15b582255d05ff/msgpack-1.1.2-cp311-cp311-win32.whl", hash = "sha256:602b6740e95ffc55bfb078172d279de3773d7b7db1f703b2f1323566b878b90e", size = 64747, upload-time = "2025-10-08T09:14:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/2a/79/309d0e637f6f37e83c711f547308b91af02b72d2326ddd860b966080ef29/msgpack-1.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68", size = 71633, upload-time = "2025-10-08T09:14:59.177Z" }, + { url = "https://files.pythonhosted.org/packages/73/4d/7c4e2b3d9b1106cd0aa6cb56cc57c6267f59fa8bfab7d91df5adc802c847/msgpack-1.1.2-cp311-cp311-win_arm64.whl", hash = "sha256:86f8136dfa5c116365a8a651a7d7484b65b13339731dd6faebb9a0242151c406", size = 64755, upload-time = "2025-10-08T09:15:00.48Z" }, + { url = "https://files.pythonhosted.org/packages/ad/bd/8b0d01c756203fbab65d265859749860682ccd2a59594609aeec3a144efa/msgpack-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:70a0dff9d1f8da25179ffcf880e10cf1aad55fdb63cd59c9a49a1b82290062aa", size = 81939, upload-time = "2025-10-08T09:15:01.472Z" }, + { url = "https://files.pythonhosted.org/packages/34/68/ba4f155f793a74c1483d4bdef136e1023f7bcba557f0db4ef3db3c665cf1/msgpack-1.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446abdd8b94b55c800ac34b102dffd2f6aa0ce643c55dfc017ad89347db3dbdb", size = 85064, upload-time = "2025-10-08T09:15:03.764Z" }, + { url = "https://files.pythonhosted.org/packages/f2/60/a064b0345fc36c4c3d2c743c82d9100c40388d77f0b48b2f04d6041dbec1/msgpack-1.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63eea553c69ab05b6747901b97d620bb2a690633c77f23feb0c6a947a8a7b8f", size = 417131, upload-time = "2025-10-08T09:15:05.136Z" }, + { url = "https://files.pythonhosted.org/packages/65/92/a5100f7185a800a5d29f8d14041f61475b9de465ffcc0f3b9fba606e4505/msgpack-1.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:372839311ccf6bdaf39b00b61288e0557916c3729529b301c52c2d88842add42", size = 427556, upload-time = "2025-10-08T09:15:06.837Z" }, + { url = "https://files.pythonhosted.org/packages/f5/87/ffe21d1bf7d9991354ad93949286f643b2bb6ddbeab66373922b44c3b8cc/msgpack-1.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2929af52106ca73fcb28576218476ffbb531a036c2adbcf54a3664de124303e9", size = 404920, upload-time = "2025-10-08T09:15:08.179Z" }, + { url = "https://files.pythonhosted.org/packages/ff/41/8543ed2b8604f7c0d89ce066f42007faac1eaa7d79a81555f206a5cdb889/msgpack-1.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be52a8fc79e45b0364210eef5234a7cf8d330836d0a64dfbb878efa903d84620", size = 415013, upload-time = "2025-10-08T09:15:09.83Z" }, + { url = "https://files.pythonhosted.org/packages/41/0d/2ddfaa8b7e1cee6c490d46cb0a39742b19e2481600a7a0e96537e9c22f43/msgpack-1.1.2-cp312-cp312-win32.whl", hash = "sha256:1fff3d825d7859ac888b0fbda39a42d59193543920eda9d9bea44d958a878029", size = 65096, upload-time = "2025-10-08T09:15:11.11Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ec/d431eb7941fb55a31dd6ca3404d41fbb52d99172df2e7707754488390910/msgpack-1.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1de460f0403172cff81169a30b9a92b260cb809c4cb7e2fc79ae8d0510c78b6b", size = 72708, upload-time = "2025-10-08T09:15:12.554Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/5b1a1f70eb0e87d1678e9624908f86317787b536060641d6798e3cf70ace/msgpack-1.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:be5980f3ee0e6bd44f3a9e9dea01054f175b50c3e6cdb692bc9424c0bbb8bf69", size = 64119, upload-time = "2025-10-08T09:15:13.589Z" }, + { url = "https://files.pythonhosted.org/packages/6b/31/b46518ecc604d7edf3a4f94cb3bf021fc62aa301f0cb849936968164ef23/msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf", size = 81212, upload-time = "2025-10-08T09:15:14.552Z" }, + { url = "https://files.pythonhosted.org/packages/92/dc/c385f38f2c2433333345a82926c6bfa5ecfff3ef787201614317b58dd8be/msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7", size = 84315, upload-time = "2025-10-08T09:15:15.543Z" }, + { url = "https://files.pythonhosted.org/packages/d3/68/93180dce57f684a61a88a45ed13047558ded2be46f03acb8dec6d7c513af/msgpack-1.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fdf7d83102bf09e7ce3357de96c59b627395352a4024f6e2458501f158bf999", size = 412721, upload-time = "2025-10-08T09:15:16.567Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ba/459f18c16f2b3fc1a1ca871f72f07d70c07bf768ad0a507a698b8052ac58/msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e", size = 424657, upload-time = "2025-10-08T09:15:17.825Z" }, + { url = "https://files.pythonhosted.org/packages/38/f8/4398c46863b093252fe67368b44edc6c13b17f4e6b0e4929dbf0bdb13f23/msgpack-1.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fffee09044073e69f2bad787071aeec727183e7580443dfeb8556cbf1978d162", size = 402668, upload-time = "2025-10-08T09:15:19.003Z" }, + { url = "https://files.pythonhosted.org/packages/28/ce/698c1eff75626e4124b4d78e21cca0b4cc90043afb80a507626ea354ab52/msgpack-1.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5928604de9b032bc17f5099496417f113c45bc6bc21b5c6920caf34b3c428794", size = 419040, upload-time = "2025-10-08T09:15:20.183Z" }, + { url = "https://files.pythonhosted.org/packages/67/32/f3cd1667028424fa7001d82e10ee35386eea1408b93d399b09fb0aa7875f/msgpack-1.1.2-cp313-cp313-win32.whl", hash = "sha256:a7787d353595c7c7e145e2331abf8b7ff1e6673a6b974ded96e6d4ec09f00c8c", size = 65037, upload-time = "2025-10-08T09:15:21.416Z" }, + { url = "https://files.pythonhosted.org/packages/74/07/1ed8277f8653c40ebc65985180b007879f6a836c525b3885dcc6448ae6cb/msgpack-1.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9", size = 72631, upload-time = "2025-10-08T09:15:22.431Z" }, + { url = "https://files.pythonhosted.org/packages/e5/db/0314e4e2db56ebcf450f277904ffd84a7988b9e5da8d0d61ab2d057df2b6/msgpack-1.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:e69b39f8c0aa5ec24b57737ebee40be647035158f14ed4b40e6f150077e21a84", size = 64118, upload-time = "2025-10-08T09:15:23.402Z" }, + { url = "https://files.pythonhosted.org/packages/22/71/201105712d0a2ff07b7873ed3c220292fb2ea5120603c00c4b634bcdafb3/msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00", size = 81127, upload-time = "2025-10-08T09:15:24.408Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9f/38ff9e57a2eade7bf9dfee5eae17f39fc0e998658050279cbb14d97d36d9/msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939", size = 84981, upload-time = "2025-10-08T09:15:25.812Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a9/3536e385167b88c2cc8f4424c49e28d49a6fc35206d4a8060f136e71f94c/msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e", size = 411885, upload-time = "2025-10-08T09:15:27.22Z" }, + { url = "https://files.pythonhosted.org/packages/2f/40/dc34d1a8d5f1e51fc64640b62b191684da52ca469da9cd74e84936ffa4a6/msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931", size = 419658, upload-time = "2025-10-08T09:15:28.4Z" }, + { url = "https://files.pythonhosted.org/packages/3b/ef/2b92e286366500a09a67e03496ee8b8ba00562797a52f3c117aa2b29514b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014", size = 403290, upload-time = "2025-10-08T09:15:29.764Z" }, + { url = "https://files.pythonhosted.org/packages/78/90/e0ea7990abea5764e4655b8177aa7c63cdfa89945b6e7641055800f6c16b/msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2", size = 415234, upload-time = "2025-10-08T09:15:31.022Z" }, + { url = "https://files.pythonhosted.org/packages/72/4e/9390aed5db983a2310818cd7d3ec0aecad45e1f7007e0cda79c79507bb0d/msgpack-1.1.2-cp314-cp314-win32.whl", hash = "sha256:80a0ff7d4abf5fecb995fcf235d4064b9a9a8a40a3ab80999e6ac1e30b702717", size = 66391, upload-time = "2025-10-08T09:15:32.265Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f1/abd09c2ae91228c5f3998dbd7f41353def9eac64253de3c8105efa2082f7/msgpack-1.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b", size = 73787, upload-time = "2025-10-08T09:15:33.219Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b0/9d9f667ab48b16ad4115c1935d94023b82b3198064cb84a123e97f7466c1/msgpack-1.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:59415c6076b1e30e563eb732e23b994a61c159cec44deaf584e5cc1dd662f2af", size = 66453, upload-time = "2025-10-08T09:15:34.225Z" }, + { url = "https://files.pythonhosted.org/packages/16/67/93f80545eb1792b61a217fa7f06d5e5cb9e0055bed867f43e2b8e012e137/msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a", size = 85264, upload-time = "2025-10-08T09:15:35.61Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/33c8a24959cf193966ef11a6f6a2995a65eb066bd681fd085afd519a57ce/msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b", size = 89076, upload-time = "2025-10-08T09:15:36.619Z" }, + { url = "https://files.pythonhosted.org/packages/fc/6b/62e85ff7193663fbea5c0254ef32f0c77134b4059f8da89b958beb7696f3/msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245", size = 435242, upload-time = "2025-10-08T09:15:37.647Z" }, + { url = "https://files.pythonhosted.org/packages/c1/47/5c74ecb4cc277cf09f64e913947871682ffa82b3b93c8dad68083112f412/msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90", size = 432509, upload-time = "2025-10-08T09:15:38.794Z" }, + { url = "https://files.pythonhosted.org/packages/24/a4/e98ccdb56dc4e98c929a3f150de1799831c0a800583cde9fa022fa90602d/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20", size = 415957, upload-time = "2025-10-08T09:15:40.238Z" }, + { url = "https://files.pythonhosted.org/packages/da/28/6951f7fb67bc0a4e184a6b38ab71a92d9ba58080b27a77d3e2fb0be5998f/msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27", size = 422910, upload-time = "2025-10-08T09:15:41.505Z" }, + { url = "https://files.pythonhosted.org/packages/f0/03/42106dcded51f0a0b5284d3ce30a671e7bd3f7318d122b2ead66ad289fed/msgpack-1.1.2-cp314-cp314t-win32.whl", hash = "sha256:1d1418482b1ee984625d88aa9585db570180c286d942da463533b238b98b812b", size = 75197, upload-time = "2025-10-08T09:15:42.954Z" }, + { url = "https://files.pythonhosted.org/packages/15/86/d0071e94987f8db59d4eeb386ddc64d0bb9b10820a8d82bcd3e53eeb2da6/msgpack-1.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5a46bf7e831d09470ad92dff02b8b1ac92175ca36b087f904a0519857c6be3ff", size = 85772, upload-time = "2025-10-08T09:15:43.954Z" }, + { url = "https://files.pythonhosted.org/packages/81/f2/08ace4142eb281c12701fc3b93a10795e4d4dc7f753911d836675050f886/msgpack-1.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d99ef64f349d5ec3293688e91486c5fdb925ed03807f64d98d205d2713c60b46", size = 70868, upload-time = "2025-10-08T09:15:44.959Z" }, ] [[package]] @@ -2870,135 +2866,135 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", upload-time = "2026-01-26T02:46:45.979Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/84/0b/19348d4c98980c4851d2f943f8ebafdece2ae7ef737adcfa5994ce8e5f10/multidict-6.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c93c3db7ea657dd4637d57e74ab73de31bccefe144d3d4ce370052035bc85fb5", upload-time = "2026-01-26T02:42:59.784Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ef/04/9de3f8077852e3d438215c81e9b691244532d2e05b4270e89ce67b7d103c/multidict-6.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:974e72a2474600827abaeda71af0c53d9ebbc3c2eb7da37b37d7829ae31232d8", upload-time = "2026-01-26T02:43:01.674Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/31/5c/08c7f7fe311f32e83f7621cd3f99d805f45519cd06fafb247628b861da7d/multidict-6.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdea2e7b2456cfb6694fb113066fd0ec7ea4d67e3a35e1f4cbeea0b448bf5872", upload-time = "2026-01-26T02:43:03.169Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/7f/0e3b1390ae772f27501199996b94b52ceeb64fe6f9120a32c6c3f6b781be/multidict-6.7.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17207077e29342fdc2c9a82e4b306f1127bf1ea91f8b71e02d4798a70bb99991", upload-time = "2026-01-26T02:43:04.733Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dd/f4/8719f4f167586af317b69dd3e90f913416c91ca610cac79a45c53f590312/multidict-6.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4f49cb5661344764e4c7c7973e92a47a59b8fc19b6523649ec9dc4960e58a03", upload-time = "2026-01-26T02:43:06.695Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/47/ab/7c36164cce64a6ad19c6d9a85377b7178ecf3b89f8fd589c73381a5eedfd/multidict-6.7.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a9fc4caa29e2e6ae408d1c450ac8bf19892c5fca83ee634ecd88a53332c59981", upload-time = "2026-01-26T02:43:08.472Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/79/a25add6fb38035b5337bc5734f296d9afc99163403bbcf56d4170f97eb62/multidict-6.7.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c5f0c21549ab432b57dcc82130f388d84ad8179824cc3f223d5e7cfbfd4143f6", upload-time = "2026-01-26T02:43:10.127Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4a/7b/64a87cf98e12f756fc8bd444b001232ffff2be37288f018ad0d3f0aae931/multidict-6.7.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7dfb78d966b2c906ae1d28ccf6e6712a3cd04407ee5088cd276fe8cb42186190", upload-time = "2026-01-26T02:43:11.731Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-01-26T02:43:13.063Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/65/11492d6a0e259783720f3bc1d9ea55579a76f1407e31ed44045c99542004/multidict-6.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dd96c01a9dcd4889dcfcf9eb5544ca0c77603f239e3ffab0524ec17aea9a93ee", upload-time = "2026-01-26T02:43:14.843Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/a7/7ee591302af64e7c196fb63fe856c788993c1372df765102bd0448e7e165/multidict-6.7.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:067343c68cd6612d375710f895337b3a98a033c94f14b9a99eff902f205424e2", upload-time = "2026-01-26T02:43:16.025Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/99/c109962d58756c35fd9992fed7f2355303846ea2ff054bb5f5e9d6b888de/multidict-6.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5884a04f4ff56c6120f6ccf703bdeb8b5079d808ba604d4d53aec0d55dc33568", upload-time = "2026-01-26T02:43:17.84Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/5f/1973e7c771c86e93dcfe1c9cc55a5481b610f6614acfc28c0d326fe6bfad/multidict-6.7.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8affcf1c98b82bc901702eb73b6947a1bfa170823c153fe8a47b5f5f02e48e40", upload-time = "2026-01-26T02:43:19.06Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/a5/f170fc2268c3243853580203378cd522446b2df632061e0a5409817854c7/multidict-6.7.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d17522c37d03e85c8098ec8431636309b2682cf12e58f4dbc76121fb50e4962", upload-time = "2026-01-26T02:43:20.286Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/de/01/73856fab6d125e5bc652c3986b90e8699a95e84b48d72f39ade6c0e74a8c/multidict-6.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24c0cf81544ca5e17cfcb6e482e7a82cd475925242b308b890c9452a074d4505", upload-time = "2026-01-26T02:43:21.508Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e7/46/f1220bd9944d8aa40d8ccff100eeeee19b505b857b6f603d6078cb5315b0/multidict-6.7.1-cp310-cp310-win32.whl", hash = "sha256:d82dd730a95e6643802f4454b8fdecdf08667881a9c5670db85bc5a56693f122", upload-time = "2026-01-26T02:43:22.703Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/68/00/9b38e272a770303692fc406c36e1a4c740f401522d5787691eb38a8925a8/multidict-6.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cf37cbe5ced48d417ba045aca1b21bafca67489452debcde94778a576666a1df", upload-time = "2026-01-26T02:43:23.77Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/64/65/d8d42490c02ee07b6bbe00f7190d70bb4738b3cce7629aaf9f213ef730dd/multidict-6.7.1-cp310-cp310-win_arm64.whl", hash = "sha256:59bc83d3f66b41dac1e7460aac1d196edc70c9ba3094965c467715a70ecb46db", upload-time = "2026-01-26T02:43:24.882Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ce/f1/a90635c4f88fb913fbf4ce660b83b7445b7a02615bda034b2f8eb38fd597/multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d", upload-time = "2026-01-26T02:43:26.485Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e", upload-time = "2026-01-26T02:43:27.607Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855", upload-time = "2026-01-26T02:43:28.661Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/d2/0a36c8473f0cbaeadd5db6c8b72d15bbceeec275807772bfcd059bef487d/multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3", upload-time = "2026-01-26T02:43:31.165Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/16/8c65be997fd7dd311b7d39c7b6e71a0cb449bad093761481eccbbe4b42a2/multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e", upload-time = "2026-01-26T02:43:32.581Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/01/fb/4dbd7e848d2799c6a026ec88ad39cf2b8416aa167fcc903baa55ecaa045c/multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a", upload-time = "2026-01-26T02:43:34.417Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b6/8a/4a3a6341eac3830f6053062f8fbc9a9e54407c80755b3f05bc427295c2d0/multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8", upload-time = "2026-01-26T02:43:35.741Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f7/a2/dd575a69c1aa206e12d27d0770cdf9b92434b48a9ef0cd0d1afdecaa93c4/multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0", upload-time = "2026-01-26T02:43:36.976Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-01-26T02:43:38.258Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5a/a4/23466059dc3854763423d0ad6c0f3683a379d97673b1b89ec33826e46728/multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49", upload-time = "2026-01-26T02:43:40.034Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/67/51dd754a3524d685958001e8fa20a0f5f90a6a856e0a9dcabff69be3dbb7/multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71", upload-time = "2026-01-26T02:43:41.752Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/64/3f/036dfc8c174934d4b55d86ff4f978e558b0e585cef70cfc1ad01adc6bf18/multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3", upload-time = "2026-01-26T02:43:43.042Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/20/6214d3c105928ebc353a1c644a6ef1408bc5794fcb4f170bb524a3c16311/multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c", upload-time = "2026-01-26T02:43:44.371Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b1/e2/c653bc4ae1be70a0f836b82172d643fcf1dade042ba2676ab08ec08bff0f/multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0", upload-time = "2026-01-26T02:43:45.745Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c8/11/a854b4154cd3bd8b1fd375e8a8ca9d73be37610c361543d56f764109509b/multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa", upload-time = "2026-01-26T02:43:47.054Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/13/bf/9676c0392309b5fdae322333d22a829715b570edb9baa8016a517b55b558/multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a", upload-time = "2026-01-26T02:43:48.753Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b", upload-time = "2026-01-26T02:43:49.921Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ac/ad/9dd5305253fa00cd3c7555dbef69d5bf4133debc53b87ab8d6a44d411665/multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6", upload-time = "2026-01-26T02:43:51.635Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", upload-time = "2026-01-26T02:43:52.754Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", upload-time = "2026-01-26T02:43:53.893Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", upload-time = "2026-01-26T02:43:55.041Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", upload-time = "2026-01-26T02:43:56.198Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", upload-time = "2026-01-26T02:43:57.499Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", upload-time = "2026-01-26T02:43:58.755Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", upload-time = "2026-01-26T02:44:00.216Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", upload-time = "2026-01-26T02:44:02.202Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-01-26T02:44:03.56Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", upload-time = "2026-01-26T02:44:04.845Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", upload-time = "2026-01-26T02:44:06.133Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", upload-time = "2026-01-26T02:44:07.518Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", upload-time = "2026-01-26T02:44:09.382Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", upload-time = "2026-01-26T02:44:10.73Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", upload-time = "2026-01-26T02:44:12.042Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", upload-time = "2026-01-26T02:44:14.245Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", upload-time = "2026-01-26T02:44:15.371Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", upload-time = "2026-01-26T02:44:16.852Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", upload-time = "2026-01-26T02:44:18.509Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", upload-time = "2026-01-26T02:44:19.745Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", upload-time = "2026-01-26T02:44:21.571Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", upload-time = "2026-01-26T02:44:22.803Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", upload-time = "2026-01-26T02:44:24.306Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", upload-time = "2026-01-26T02:44:25.772Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", upload-time = "2026-01-26T02:44:27.648Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", upload-time = "2026-01-26T02:44:29.588Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", upload-time = "2026-01-26T02:44:30.902Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", upload-time = "2026-01-26T02:44:32.31Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", upload-time = "2026-01-26T02:44:33.734Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", upload-time = "2026-01-26T02:44:35.222Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", upload-time = "2026-01-26T02:44:36.604Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", upload-time = "2026-01-26T02:44:38.008Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", upload-time = "2026-01-26T02:44:39.386Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", upload-time = "2026-01-26T02:44:41.318Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", upload-time = "2026-01-26T02:44:42.488Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", upload-time = "2026-01-26T02:44:43.664Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", upload-time = "2026-01-26T02:44:44.894Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", upload-time = "2026-01-26T02:44:46.106Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", upload-time = "2026-01-26T02:44:47.278Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", upload-time = "2026-01-26T02:44:48.604Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", upload-time = "2026-01-26T02:44:50.544Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", upload-time = "2026-01-26T02:44:51.951Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", upload-time = "2026-01-26T02:44:53.902Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", upload-time = "2026-01-26T02:44:55.316Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", upload-time = "2026-01-26T02:44:56.783Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", upload-time = "2026-01-26T02:44:58.195Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", upload-time = "2026-01-26T02:44:59.57Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", upload-time = "2026-01-26T02:45:01.054Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", upload-time = "2026-01-26T02:45:02.484Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", upload-time = "2026-01-26T02:45:03.862Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", upload-time = "2026-01-26T02:45:05.296Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", upload-time = "2026-01-26T02:45:06.754Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", upload-time = "2026-01-26T02:45:08.044Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", upload-time = "2026-01-26T02:45:09.349Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", upload-time = "2026-01-26T02:45:10.651Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", upload-time = "2026-01-26T02:45:11.938Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", upload-time = "2026-01-26T02:45:14.346Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", upload-time = "2026-01-26T02:45:15.712Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", upload-time = "2026-01-26T02:45:17.293Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", upload-time = "2026-01-26T02:45:19.356Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", upload-time = "2026-01-26T02:45:20.834Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", upload-time = "2026-01-26T02:45:22.818Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", upload-time = "2026-01-26T02:45:24.368Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", upload-time = "2026-01-26T02:45:25.982Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", upload-time = "2026-01-26T02:45:27.487Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", upload-time = "2026-01-26T02:45:28.991Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", upload-time = "2026-01-26T02:45:30.503Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", upload-time = "2026-01-26T02:45:32.603Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", upload-time = "2026-01-26T02:45:34.043Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", upload-time = "2026-01-26T02:45:36.278Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", upload-time = "2026-01-26T02:45:37.546Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", upload-time = "2026-01-26T02:45:38.889Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", upload-time = "2026-01-26T02:45:40.254Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", upload-time = "2026-01-26T02:45:41.635Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", upload-time = "2026-01-26T02:45:42.99Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", upload-time = "2026-01-26T02:45:44.376Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", upload-time = "2026-01-26T02:45:47.167Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", upload-time = "2026-01-26T02:45:48.698Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", upload-time = "2026-01-26T02:45:50.164Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", upload-time = "2026-01-26T02:45:51.779Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", upload-time = "2026-01-26T02:45:53.27Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", upload-time = "2026-01-26T02:45:54.919Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", upload-time = "2026-01-26T02:45:56.981Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", upload-time = "2026-01-26T02:45:58.698Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", upload-time = "2026-01-26T02:46:00.862Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", upload-time = "2026-01-26T02:46:02.824Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", upload-time = "2026-01-26T02:46:05.898Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", upload-time = "2026-01-26T02:46:07.468Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", upload-time = "2026-01-26T02:46:08.809Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", upload-time = "2026-01-26T02:46:11.146Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", upload-time = "2026-01-26T02:46:44.004Z" }, +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/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" }, + { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116, upload-time = "2026-01-26T02:44:19.745Z" }, + { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" }, + { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368, upload-time = "2026-01-26T02:44:22.803Z" }, + { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" }, + { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" }, + { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" }, + { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" }, + { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" }, + { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" }, + { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742, upload-time = "2026-01-26T02:44:35.222Z" }, + { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" }, + { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" }, + { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" }, + { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695, upload-time = "2026-01-26T02:44:41.318Z" }, + { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884, upload-time = "2026-01-26T02:44:42.488Z" }, + { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122, upload-time = "2026-01-26T02:44:43.664Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" }, + { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460, upload-time = "2026-01-26T02:44:46.106Z" }, + { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" }, + { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582, upload-time = "2026-01-26T02:44:48.604Z" }, + { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" }, + { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" }, + { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" }, + { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" }, + { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" }, + { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" }, + { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554, upload-time = "2026-01-26T02:45:01.054Z" }, + { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" }, + { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" }, + { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" }, + { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770, upload-time = "2026-01-26T02:45:06.754Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109, upload-time = "2026-01-26T02:45:08.044Z" }, + { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573, upload-time = "2026-01-26T02:45:09.349Z" }, + { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190, upload-time = "2026-01-26T02:45:10.651Z" }, + { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486, upload-time = "2026-01-26T02:45:11.938Z" }, + { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219, upload-time = "2026-01-26T02:45:14.346Z" }, + { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132, upload-time = "2026-01-26T02:45:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420, upload-time = "2026-01-26T02:45:17.293Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510, upload-time = "2026-01-26T02:45:19.356Z" }, + { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094, upload-time = "2026-01-26T02:45:20.834Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786, upload-time = "2026-01-26T02:45:22.818Z" }, + { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483, upload-time = "2026-01-26T02:45:24.368Z" }, + { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403, upload-time = "2026-01-26T02:45:25.982Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315, upload-time = "2026-01-26T02:45:27.487Z" }, + { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528, upload-time = "2026-01-26T02:45:28.991Z" }, + { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784, upload-time = "2026-01-26T02:45:30.503Z" }, + { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980, upload-time = "2026-01-26T02:45:32.603Z" }, + { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602, upload-time = "2026-01-26T02:45:34.043Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930, upload-time = "2026-01-26T02:45:36.278Z" }, + { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074, upload-time = "2026-01-26T02:45:37.546Z" }, + { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471, upload-time = "2026-01-26T02:45:38.889Z" }, + { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401, upload-time = "2026-01-26T02:45:40.254Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143, upload-time = "2026-01-26T02:45:41.635Z" }, + { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507, upload-time = "2026-01-26T02:45:42.99Z" }, + { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358, upload-time = "2026-01-26T02:45:44.376Z" }, + { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884, upload-time = "2026-01-26T02:45:47.167Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878, upload-time = "2026-01-26T02:45:48.698Z" }, + { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542, upload-time = "2026-01-26T02:45:50.164Z" }, + { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403, upload-time = "2026-01-26T02:45:51.779Z" }, + { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889, upload-time = "2026-01-26T02:45:53.27Z" }, + { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982, upload-time = "2026-01-26T02:45:54.919Z" }, + { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415, upload-time = "2026-01-26T02:45:56.981Z" }, + { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337, upload-time = "2026-01-26T02:45:58.698Z" }, + { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788, upload-time = "2026-01-26T02:46:00.862Z" }, + { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842, upload-time = "2026-01-26T02:46:02.824Z" }, + { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237, upload-time = "2026-01-26T02:46:05.898Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008, upload-time = "2026-01-26T02:46:07.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542, upload-time = "2026-01-26T02:46:08.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719, upload-time = "2026-01-26T02:46:11.146Z" }, + { 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]] @@ -3013,60 +3009,60 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/82/15/cca9d88503549ed6fedeaa1d448cdddd542ee8a490232d732e278036fbf2/mypy-2.1.0.tar.gz", hash = "sha256:81e76ad12c2d804512e9b13240d1588316531bfba07558286078bfbce9613633", upload-time = "2026-05-11T18:37:36.237Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/a4/71/d351dca3e9b30da2328ee9d445c88b8388072808ebfbc49eb69d30b67749/mypy-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:11a6beb180257a805961aea9ec591bbd0bd17f1e18d35b8456d57aee5bedfedc", upload-time = "2026-05-11T18:36:23.605Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2f/45/7d51594b644c17c0bcf74ed8cd5fc33b324276d708e8506f220b70dab9d9/mypy-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ef78c1d306bbf9a8a12f526c44902c9c28dffd6c52c52bf6a72641ce18d3849", upload-time = "2026-05-11T18:37:22.752Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/65/01/455c31b170e9468265074840bf18863a8482a24103fdaabe4e199392aa5f/mypy-2.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c209a90853081ff01d01ee895cafe10f7db1474e0d95beaeef0f6c1db9119bbd", upload-time = "2026-05-11T18:35:09.292Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/41/5a/93093f0b29a9e982deafde698f740a2eb2e05886e79ccf0594c7fd5413a3/mypy-2.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47cebf61abde7c088a4e27718a8b13a81655686b2e9c251f5c0915a802248166", upload-time = "2026-05-11T18:31:57.678Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7f/2f/a196f5331d96170ad3d28f144d2aba690d4b2911381f68d51e489c7ab82a/mypy-2.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d57a90ae5e872138a425ec328edbc9b235d1934c4377881a33ec05b341acc9a8", upload-time = "2026-05-11T18:33:00.101Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/54/de/94d321cc12da9f71341ac0c270efbed5c725750c7b4c334d957de9a087d9/mypy-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:aea7f7a8a55b459c34275fc468ada6ca7c173a5e43a68f5dbe588a563d8a06b8", upload-time = "2026-05-11T18:33:18.848Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e1/62/0c27ca55219a7c764a7fb88c7bb2b7b2f9780ade8bbf16bc8ed8400eef6b/mypy-2.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:c989640253f0d76843e9c6c1bbf4bd48c5e85ada61bde4beb37cb3eca035685e", upload-time = "2026-05-11T18:31:25.554Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/a1/639f3024794a2a15899cb90707fe02e044c4412794c39c5769fd3df2e2ef/mypy-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a683016b16fe2f572dc04c72be7ee0504ac1605a265d0200f5cea695fb788f41", upload-time = "2026-05-11T18:33:27.973Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3b/08/9a585dea4325f20d8b80dc78623fa50d1fd2173b710f6237afd6ba6ab39b/mypy-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a293c534adb55271fef24a26da04b855540a8c13cc07bc5917b9fd2c394f2ca", upload-time = "2026-05-11T18:32:16.107Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/81/dc/7c42cc9c6cb01e8eb09961f1f738741d3e9c7e9d5c5b30ec69222625cd5f/mypy-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7406f4d048e71e576f5356d317e5b0a9e666dfd966bd99f9d14ca06e1a341538", upload-time = "2026-05-11T18:32:39.256Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/fa/285946c33bce716e082c11dfeee9ee196eaf1f5042efb3581a31f9f205e4/mypy-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0210d626fc8b31ccc90233754c7bc90e1f43205e85d96387f7db1285b55c398", upload-time = "2026-05-11T18:34:49.765Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2b/83/82397f48af6c27e295d57979ded8490c9829040152cf7571b2f026aeb9a0/mypy-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3712c20deed54e814eaaa825603bada8ea1c390670a397c95b98405347acc563", upload-time = "2026-05-11T18:34:05.855Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/68/b02dec39057b88eb03dc0aa854732e26e8361f34f9d0e20c7614967d1eba/mypy-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fcaa0e479066e31f7cceb6a3bea39cb22b2ff51a6b2f24f193d19179ba17c389", upload-time = "2026-05-11T18:35:36.494Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/a8/ea3dcbef31f99b634f2ee23bb0321cbc8c1b388b76a861eb849f13c347dc/mypy-2.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:0b1a5260c95aa443083f9ed3592662941951bca3d4ca224a5dc517c38b7cf666", upload-time = "2026-05-11T18:37:14.139Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/95/b1/55861beb5c339b44f9a2ba92df9e2cb1eeb4ae1eee674cdf7772c797778b/mypy-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:244358bf1c0da7722230bce60683d52e8e9fd030554926f15b747a84efb5b3af", upload-time = "2026-05-11T18:37:31.784Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/b3/b7f770114b7d0ac92d0f76e8d93c2780844a70488a90e91821927850da86/mypy-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ec7c57657493c7a75534df2751c8ae2cda383c16ecc55d2106c54476b1b16f6", upload-time = "2026-05-11T18:34:23.063Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b6/f3/8ae2037967e2126689a0c11d99e2b707134a565191e92c60ca2572aec60a/mypy-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8161b6ff4392410023224f0969d17db93e1e154bc3e4ba62598e720723ae211", upload-time = "2026-05-11T18:31:48.151Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a0/32/615eb5911859e43d054941b0d0a7d06cfa2870eba86529cf385b052b111c/mypy-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf03e12003084a67395184d3eb8cbd6a489dc3655b5664b28c210a9e2403ab0b", upload-time = "2026-05-11T18:37:06.898Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/03/4eafbfff8bfab1b87082741eae6e6a624028c984e6708b73bce2a8570c9d/mypy-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:20509760fd791c51579d573153407d226385ec1f8bcce55d730b354f3336bc22", upload-time = "2026-05-11T18:31:18.07Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/99/ee/919661478e5891a3c96e549c036e467e64563ab85995b10c53c8358e16a3/mypy-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:6753d0c1fdd6b1a23b9e4f283ce80b2153b724adcb2653b20b85a8a28ac6436b", upload-time = "2026-05-11T18:34:31.23Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/0a/6a12b9782ca0831a553192f351679f4548abc9d19a7cc93bb7feb02084c7/mypy-2.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:98ebb6589bb3b6d0c6f0c459d53ca55b8091fbc13d277c4041c885392e8195e8", upload-time = "2026-05-11T18:36:48.199Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6e/dd/c7191469c777f07689c032a8f7326e393ea34c92d6d76eb7ce5ba57ea66d/mypy-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35aac3bb114e03888f535d5eb51b8bafbb3266586b599da1940f9b1be3ec5bd5", upload-time = "2026-05-11T18:31:38.929Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/55/8c/aed55408879043d72bb9135f4d0d19a02b886dd569631e113e3d2706cb8d/mypy-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8de55a8c861f2a49331f807be98d90caeceeef520bde13d43a160207f8af613e", upload-time = "2026-05-11T18:36:04.636Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3a/8e/f371a824b1f1fa8ea6e3dbb8703d232977d572be2329554a3bc4d960302f/mypy-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fdf2941a07434af755837d9880f7d7d25f1dacb1af9dcd4b9b66f2220a3024e", upload-time = "2026-05-11T18:35:55.742Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/94/21/f54be870d6dd53a82c674407e0f8eed7174b05ec78d42e5abd7b42e84fd5/mypy-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e195b817c13f02352a9c124301f9f30f078405444679b6753c1b96b6eed37285", upload-time = "2026-05-11T18:33:10.281Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/17/99/bf21748626a40ce59fd29a39386ab46afec88b7bd2f0fa6c3a97c995523f/mypy-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5431d42af987ebd92ba2f71d45c85ed41d8e6ca9f5fd209a69f68f707d2469e5", upload-time = "2026-05-11T18:32:07.205Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d6/d7/9e90d2cf47100bea550ed2bc7b0d4de3a62181d84d5e37da0003e8462637/mypy-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:767fe8c66dc3e01e19e1737d4c38ebefead16125e1b8e58ad421903b376f5c65", upload-time = "2026-05-11T18:33:56.477Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ec/46/e5c449e858798e35ffc90946282a27c62a77be743fe17480e4977374eb91/mypy-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:ecfe70d43775ab99562ab128ce49854a362044c9f894961f68f898c23cb7429d", upload-time = "2026-05-11T18:32:30.049Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/ca/b279a672e874aedd5498ae25f722dacc8aa86bbffb939b3f97cbb1cf6686/mypy-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7354c5a7f69d9345c3d6e69921d57088eea3ddeeb6b20d34c1b3855b02c36ec2", upload-time = "2026-05-11T18:35:45.984Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/27/e6/3efe56c631d959b9b4454e208b0ac4b7f4f58b404c89f8bec7b49efdfc21/mypy-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:49890d4f76ac9e06ec117f9e09f3174da70a620a0c300953d8595c926e80947f", upload-time = "2026-05-11T18:36:57.188Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/84/7f/8107ea87a44fd1f1b59882442f033c9c3488c127201b1d1d15f1cbd6022e/mypy-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:761be68e023ef5d94678772396a8af1220030f80837a3afd8d0aef3b419666f4", upload-time = "2026-05-11T18:35:18.361Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/51/4d/b6d34db183133b83761b9199a82d31557cdbb70a380d8c3b3438e11882a3/mypy-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c90345fc182dc363b891350457ec69c35140858538f38b4540845afcc32b1aef", upload-time = "2026-05-11T18:34:59.618Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ff/d7/f08360c691d758acb02f45022c34d98b92892f4ea756644e1000d4b9f3d8/mypy-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b84802e7b5a6daf1f5e15bc9fcd7ddae77be13981ffab037f1c67bb84d67d135", upload-time = "2026-05-11T18:36:41.081Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/67/1b/09460a13719530a19bce27bd3bc8449e83569dd2ba7faf51c9c3c30c0b61/mypy-2.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:022c771234936ceac541ebaf836fe9e2abeb3f5e09aff21588fe543ff006fe21", upload-time = "2026-05-11T18:34:13.526Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/62/75dbf0f82f7b6680340efc614af29dd0b3c17b8a4f1cd09b8bd2fd6bc814/mypy-2.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:498207db725cec88829a6a5c2fc771205fd043719ef98bc49aba8fb9fc4e6d57", upload-time = "2026-05-11T18:32:23.491Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/66/caca04ed7d972fb6eb6dd1ccd6df1de5c38fae8c5b3dc1c4e8e0d85ee6b9/mypy-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d5e5cad0efeba72b93cd17490cc0d69c5ac9ca132994fe3fb0314808aeeb83e", upload-time = "2026-05-11T18:35:28.64Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ed/52/2d90cbe49d014b13ed7ff337930c30bad35893fe38a1e4641e756bb62191/mypy-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ff715050c127d724fd260a2e666e7747fdd83511c0c47d449d98238970aef780", upload-time = "2026-05-11T18:36:14.208Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ac/37/d98f4a14e081b238992d0ed96b6d39c7cc0148c9699eb71eaa68629665ea/mypy-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:82208da9e09414d520e912d3e462d454854bed0810b71540bb016dcbca7308fd", upload-time = "2026-05-11T18:33:48.249Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a3/c2/15c46613b24a84fad2aea1248bf9619b99c2767ae9071fe224c179a0b7d4/mypy-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e79ebc1b904b84f0310dff7469655a9c36c7a68bddb37bdd42b67a332df61d08", upload-time = "2026-05-11T18:32:50.296Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5c/90/9c16a57f482c76d25f6379762b56bbf65c711d8158cf271fb2802cfb0640/mypy-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e583edc957cfb0deb142079162ae826f58449b116c1d442f2d91c69d9fced081", upload-time = "2026-05-11T18:33:38.182Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0f/4c/215a4eeb63cacc5f17f516691ea7285d11e249802b942476bff15922a314/mypy-2.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b33b6cd332695bba180d55e717a79d3038e479a2c49cc5eb3d53603409b9a5d7", upload-time = "2026-05-11T18:34:39.945Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/50/1043e1db5f455ffe4c9ab22747cd8ca2bc492b1e4f4e21b130a44ee2b217/mypy-2.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:4f910fe825376a7b66ef7ca8c98e5a149e8cd64c19ae71d84047a74ee060d4e6", upload-time = "2026-05-11T18:36:31.444Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0d/2a/13ca1f292f6db1b98ff495ef3467736b331621c5917cad984b7043e7348d/mypy-2.1.0-py3-none-any.whl", hash = "sha256:a663814603a5c563fb87a4f96fb473eeb30d1f5a4885afcf44f9db000a366289", upload-time = "2026-05-11T18:31:29.246Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/82/15/cca9d88503549ed6fedeaa1d448cdddd542ee8a490232d732e278036fbf2/mypy-2.1.0.tar.gz", hash = "sha256:81e76ad12c2d804512e9b13240d1588316531bfba07558286078bfbce9613633", size = 3898359, upload-time = "2026-05-11T18:37:36.237Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/71/d351dca3e9b30da2328ee9d445c88b8388072808ebfbc49eb69d30b67749/mypy-2.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:11a6beb180257a805961aea9ec591bbd0bd17f1e18d35b8456d57aee5bedfedc", size = 14778792, upload-time = "2026-05-11T18:36:23.605Z" }, + { url = "https://files.pythonhosted.org/packages/2f/45/7d51594b644c17c0bcf74ed8cd5fc33b324276d708e8506f220b70dab9d9/mypy-2.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ef78c1d306bbf9a8a12f526c44902c9c28dffd6c52c52bf6a72641ce18d3849", size = 13645739, upload-time = "2026-05-11T18:37:22.752Z" }, + { url = "https://files.pythonhosted.org/packages/65/01/455c31b170e9468265074840bf18863a8482a24103fdaabe4e199392aa5f/mypy-2.1.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c209a90853081ff01d01ee895cafe10f7db1474e0d95beaeef0f6c1db9119bbd", size = 14074199, upload-time = "2026-05-11T18:35:09.292Z" }, + { url = "https://files.pythonhosted.org/packages/41/5a/93093f0b29a9e982deafde698f740a2eb2e05886e79ccf0594c7fd5413a3/mypy-2.1.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47cebf61abde7c088a4e27718a8b13a81655686b2e9c251f5c0915a802248166", size = 14953128, upload-time = "2026-05-11T18:31:57.678Z" }, + { url = "https://files.pythonhosted.org/packages/7f/2f/a196f5331d96170ad3d28f144d2aba690d4b2911381f68d51e489c7ab82a/mypy-2.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d57a90ae5e872138a425ec328edbc9b235d1934c4377881a33ec05b341acc9a8", size = 15249378, upload-time = "2026-05-11T18:33:00.101Z" }, + { url = "https://files.pythonhosted.org/packages/54/de/94d321cc12da9f71341ac0c270efbed5c725750c7b4c334d957de9a087d9/mypy-2.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:aea7f7a8a55b459c34275fc468ada6ca7c173a5e43a68f5dbe588a563d8a06b8", size = 11060994, upload-time = "2026-05-11T18:33:18.848Z" }, + { url = "https://files.pythonhosted.org/packages/e1/62/0c27ca55219a7c764a7fb88c7bb2b7b2f9780ade8bbf16bc8ed8400eef6b/mypy-2.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:c989640253f0d76843e9c6c1bbf4bd48c5e85ada61bde4beb37cb3eca035685e", size = 9976743, upload-time = "2026-05-11T18:31:25.554Z" }, + { url = "https://files.pythonhosted.org/packages/0a/a1/639f3024794a2a15899cb90707fe02e044c4412794c39c5769fd3df2e2ef/mypy-2.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a683016b16fe2f572dc04c72be7ee0504ac1605a265d0200f5cea695fb788f41", size = 14691685, upload-time = "2026-05-11T18:33:27.973Z" }, + { url = "https://files.pythonhosted.org/packages/3b/08/9a585dea4325f20d8b80dc78623fa50d1fd2173b710f6237afd6ba6ab39b/mypy-2.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a293c534adb55271fef24a26da04b855540a8c13cc07bc5917b9fd2c394f2ca", size = 13555165, upload-time = "2026-05-11T18:32:16.107Z" }, + { url = "https://files.pythonhosted.org/packages/81/dc/7c42cc9c6cb01e8eb09961f1f738741d3e9c7e9d5c5b30ec69222625cd5f/mypy-2.1.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7406f4d048e71e576f5356d317e5b0a9e666dfd966bd99f9d14ca06e1a341538", size = 13994376, upload-time = "2026-05-11T18:32:39.256Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fa/285946c33bce716e082c11dfeee9ee196eaf1f5042efb3581a31f9f205e4/mypy-2.1.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0210d626fc8b31ccc90233754c7bc90e1f43205e85d96387f7db1285b55c398", size = 14864618, upload-time = "2026-05-11T18:34:49.765Z" }, + { url = "https://files.pythonhosted.org/packages/2b/83/82397f48af6c27e295d57979ded8490c9829040152cf7571b2f026aeb9a0/mypy-2.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3712c20deed54e814eaaa825603bada8ea1c390670a397c95b98405347acc563", size = 15102063, upload-time = "2026-05-11T18:34:05.855Z" }, + { url = "https://files.pythonhosted.org/packages/40/68/b02dec39057b88eb03dc0aa854732e26e8361f34f9d0e20c7614967d1eba/mypy-2.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fcaa0e479066e31f7cceb6a3bea39cb22b2ff51a6b2f24f193d19179ba17c389", size = 11060564, upload-time = "2026-05-11T18:35:36.494Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a8/ea3dcbef31f99b634f2ee23bb0321cbc8c1b388b76a861eb849f13c347dc/mypy-2.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:0b1a5260c95aa443083f9ed3592662941951bca3d4ca224a5dc517c38b7cf666", size = 9966983, upload-time = "2026-05-11T18:37:14.139Z" }, + { url = "https://files.pythonhosted.org/packages/95/b1/55861beb5c339b44f9a2ba92df9e2cb1eeb4ae1eee674cdf7772c797778b/mypy-2.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:244358bf1c0da7722230bce60683d52e8e9fd030554926f15b747a84efb5b3af", size = 14874381, upload-time = "2026-05-11T18:37:31.784Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b3/b7f770114b7d0ac92d0f76e8d93c2780844a70488a90e91821927850da86/mypy-2.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4ec7c57657493c7a75534df2751c8ae2cda383c16ecc55d2106c54476b1b16f6", size = 13665501, upload-time = "2026-05-11T18:34:23.063Z" }, + { url = "https://files.pythonhosted.org/packages/b6/f3/8ae2037967e2126689a0c11d99e2b707134a565191e92c60ca2572aec60a/mypy-2.1.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8161b6ff4392410023224f0969d17db93e1e154bc3e4ba62598e720723ae211", size = 14045750, upload-time = "2026-05-11T18:31:48.151Z" }, + { url = "https://files.pythonhosted.org/packages/a0/32/615eb5911859e43d054941b0d0a7d06cfa2870eba86529cf385b052b111c/mypy-2.1.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf03e12003084a67395184d3eb8cbd6a489dc3655b5664b28c210a9e2403ab0b", size = 15061630, upload-time = "2026-05-11T18:37:06.898Z" }, + { url = "https://files.pythonhosted.org/packages/d4/03/4eafbfff8bfab1b87082741eae6e6a624028c984e6708b73bce2a8570c9d/mypy-2.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:20509760fd791c51579d573153407d226385ec1f8bcce55d730b354f3336bc22", size = 15288831, upload-time = "2026-05-11T18:31:18.07Z" }, + { url = "https://files.pythonhosted.org/packages/99/ee/919661478e5891a3c96e549c036e467e64563ab85995b10c53c8358e16a3/mypy-2.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:6753d0c1fdd6b1a23b9e4f283ce80b2153b724adcb2653b20b85a8a28ac6436b", size = 11135228, upload-time = "2026-05-11T18:34:31.23Z" }, + { url = "https://files.pythonhosted.org/packages/24/0a/6a12b9782ca0831a553192f351679f4548abc9d19a7cc93bb7feb02084c7/mypy-2.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:98ebb6589bb3b6d0c6f0c459d53ca55b8091fbc13d277c4041c885392e8195e8", size = 10040684, upload-time = "2026-05-11T18:36:48.199Z" }, + { url = "https://files.pythonhosted.org/packages/6e/dd/c7191469c777f07689c032a8f7326e393ea34c92d6d76eb7ce5ba57ea66d/mypy-2.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35aac3bb114e03888f535d5eb51b8bafbb3266586b599da1940f9b1be3ec5bd5", size = 14852174, upload-time = "2026-05-11T18:31:38.929Z" }, + { url = "https://files.pythonhosted.org/packages/55/8c/aed55408879043d72bb9135f4d0d19a02b886dd569631e113e3d2706cb8d/mypy-2.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8de55a8c861f2a49331f807be98d90caeceeef520bde13d43a160207f8af613e", size = 13651542, upload-time = "2026-05-11T18:36:04.636Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8e/f371a824b1f1fa8ea6e3dbb8703d232977d572be2329554a3bc4d960302f/mypy-2.1.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5fdf2941a07434af755837d9880f7d7d25f1dacb1af9dcd4b9b66f2220a3024e", size = 14033929, upload-time = "2026-05-11T18:35:55.742Z" }, + { url = "https://files.pythonhosted.org/packages/94/21/f54be870d6dd53a82c674407e0f8eed7174b05ec78d42e5abd7b42e84fd5/mypy-2.1.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e195b817c13f02352a9c124301f9f30f078405444679b6753c1b96b6eed37285", size = 15039200, upload-time = "2026-05-11T18:33:10.281Z" }, + { url = "https://files.pythonhosted.org/packages/17/99/bf21748626a40ce59fd29a39386ab46afec88b7bd2f0fa6c3a97c995523f/mypy-2.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5431d42af987ebd92ba2f71d45c85ed41d8e6ca9f5fd209a69f68f707d2469e5", size = 15272690, upload-time = "2026-05-11T18:32:07.205Z" }, + { url = "https://files.pythonhosted.org/packages/d6/d7/9e90d2cf47100bea550ed2bc7b0d4de3a62181d84d5e37da0003e8462637/mypy-2.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:767fe8c66dc3e01e19e1737d4c38ebefead16125e1b8e58ad421903b376f5c65", size = 11147435, upload-time = "2026-05-11T18:33:56.477Z" }, + { url = "https://files.pythonhosted.org/packages/ec/46/e5c449e858798e35ffc90946282a27c62a77be743fe17480e4977374eb91/mypy-2.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:ecfe70d43775ab99562ab128ce49854a362044c9f894961f68f898c23cb7429d", size = 10035052, upload-time = "2026-05-11T18:32:30.049Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ca/b279a672e874aedd5498ae25f722dacc8aa86bbffb939b3f97cbb1cf6686/mypy-2.1.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:7354c5a7f69d9345c3d6e69921d57088eea3ddeeb6b20d34c1b3855b02c36ec2", size = 14848422, upload-time = "2026-05-11T18:35:45.984Z" }, + { url = "https://files.pythonhosted.org/packages/27/e6/3efe56c631d959b9b4454e208b0ac4b7f4f58b404c89f8bec7b49efdfc21/mypy-2.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:49890d4f76ac9e06ec117f9e09f3174da70a620a0c300953d8595c926e80947f", size = 13677374, upload-time = "2026-05-11T18:36:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/84/7f/8107ea87a44fd1f1b59882442f033c9c3488c127201b1d1d15f1cbd6022e/mypy-2.1.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:761be68e023ef5d94678772396a8af1220030f80837a3afd8d0aef3b419666f4", size = 14055743, upload-time = "2026-05-11T18:35:18.361Z" }, + { url = "https://files.pythonhosted.org/packages/51/4d/b6d34db183133b83761b9199a82d31557cdbb70a380d8c3b3438e11882a3/mypy-2.1.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c90345fc182dc363b891350457ec69c35140858538f38b4540845afcc32b1aef", size = 15020937, upload-time = "2026-05-11T18:34:59.618Z" }, + { url = "https://files.pythonhosted.org/packages/ff/d7/f08360c691d758acb02f45022c34d98b92892f4ea756644e1000d4b9f3d8/mypy-2.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b84802e7b5a6daf1f5e15bc9fcd7ddae77be13981ffab037f1c67bb84d67d135", size = 15253371, upload-time = "2026-05-11T18:36:41.081Z" }, + { url = "https://files.pythonhosted.org/packages/67/1b/09460a13719530a19bce27bd3bc8449e83569dd2ba7faf51c9c3c30c0b61/mypy-2.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:022c771234936ceac541ebaf836fe9e2abeb3f5e09aff21588fe543ff006fe21", size = 11326429, upload-time = "2026-05-11T18:34:13.526Z" }, + { url = "https://files.pythonhosted.org/packages/40/62/75dbf0f82f7b6680340efc614af29dd0b3c17b8a4f1cd09b8bd2fd6bc814/mypy-2.1.0-cp314-cp314-win_arm64.whl", hash = "sha256:498207db725cec88829a6a5c2fc771205fd043719ef98bc49aba8fb9fc4e6d57", size = 10218799, upload-time = "2026-05-11T18:32:23.491Z" }, + { url = "https://files.pythonhosted.org/packages/b2/66/caca04ed7d972fb6eb6dd1ccd6df1de5c38fae8c5b3dc1c4e8e0d85ee6b9/mypy-2.1.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7d5e5cad0efeba72b93cd17490cc0d69c5ac9ca132994fe3fb0314808aeeb83e", size = 15923458, upload-time = "2026-05-11T18:35:28.64Z" }, + { url = "https://files.pythonhosted.org/packages/ed/52/2d90cbe49d014b13ed7ff337930c30bad35893fe38a1e4641e756bb62191/mypy-2.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ff715050c127d724fd260a2e666e7747fdd83511c0c47d449d98238970aef780", size = 14757697, upload-time = "2026-05-11T18:36:14.208Z" }, + { url = "https://files.pythonhosted.org/packages/ac/37/d98f4a14e081b238992d0ed96b6d39c7cc0148c9699eb71eaa68629665ea/mypy-2.1.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:82208da9e09414d520e912d3e462d454854bed0810b71540bb016dcbca7308fd", size = 15405638, upload-time = "2026-05-11T18:33:48.249Z" }, + { url = "https://files.pythonhosted.org/packages/a3/c2/15c46613b24a84fad2aea1248bf9619b99c2767ae9071fe224c179a0b7d4/mypy-2.1.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e79ebc1b904b84f0310dff7469655a9c36c7a68bddb37bdd42b67a332df61d08", size = 16215852, upload-time = "2026-05-11T18:32:50.296Z" }, + { url = "https://files.pythonhosted.org/packages/5c/90/9c16a57f482c76d25f6379762b56bbf65c711d8158cf271fb2802cfb0640/mypy-2.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e583edc957cfb0deb142079162ae826f58449b116c1d442f2d91c69d9fced081", size = 16452695, upload-time = "2026-05-11T18:33:38.182Z" }, + { url = "https://files.pythonhosted.org/packages/0f/4c/215a4eeb63cacc5f17f516691ea7285d11e249802b942476bff15922a314/mypy-2.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b33b6cd332695bba180d55e717a79d3038e479a2c49cc5eb3d53603409b9a5d7", size = 12866622, upload-time = "2026-05-11T18:34:39.945Z" }, + { url = "https://files.pythonhosted.org/packages/4b/50/1043e1db5f455ffe4c9ab22747cd8ca2bc492b1e4f4e21b130a44ee2b217/mypy-2.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:4f910fe825376a7b66ef7ca8c98e5a149e8cd64c19ae71d84047a74ee060d4e6", size = 10610798, upload-time = "2026-05-11T18:36:31.444Z" }, + { url = "https://files.pythonhosted.org/packages/0d/2a/13ca1f292f6db1b98ff495ef3467736b331621c5917cad984b7043e7348d/mypy-2.1.0-py3-none-any.whl", hash = "sha256:a663814603a5c563fb87a4f96fb473eeb30d1f5a4885afcf44f9db000a366289", size = 2693302, upload-time = "2026-05-11T18:31:29.246Z" }, ] [[package]] name = "mypy-extensions" version = "1.1.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", upload-time = "2025-04-22T14:54:24.164Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", upload-time = "2025-04-22T14:54:22.983Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] [[package]] @@ -3084,9 +3080,9 @@ dependencies = [ { name = "pyyaml", marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", upload-time = "2025-02-12T10:53:03.833Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/a5/9626ba4f73555b3735ad86247a8077d4603aa8628537687c839ab08bfe44/myst_parser-4.0.1.tar.gz", hash = "sha256:5cfea715e4f3574138aecbf7d54132296bfd72bb614d31168f48c477a830a7c4", size = 93985, upload-time = "2025-02-12T10:53:03.833Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", upload-time = "2025-02-12T10:53:02.078Z" }, + { url = "https://files.pythonhosted.org/packages/5f/df/76d0321c3797b54b60fef9ec3bd6f4cfd124b9e422182156a1dd418722cf/myst_parser-4.0.1-py3-none-any.whl", hash = "sha256:9134e88959ec3b5780aedf8a99680ea242869d012e8821db3126d427edc9c95d", size = 84579, upload-time = "2025-02-12T10:53:02.078Z" }, ] [[package]] @@ -3109,9 +3105,9 @@ dependencies = [ { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version == '3.11.*'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version >= '3.12'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/33/fa/7b45eef11b7971f0beb29d27b7bfe0d747d063aa29e170d9edd004733c8a/myst_parser-5.0.0.tar.gz", hash = "sha256:f6f231452c56e8baa662cc352c548158f6a16fcbd6e3800fc594978002b94f3a", upload-time = "2026-01-15T09:08:18.036Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/fa/7b45eef11b7971f0beb29d27b7bfe0d747d063aa29e170d9edd004733c8a/myst_parser-5.0.0.tar.gz", hash = "sha256:f6f231452c56e8baa662cc352c548158f6a16fcbd6e3800fc594978002b94f3a", size = 98535, upload-time = "2026-01-15T09:08:18.036Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl", hash = "sha256:ab31e516024918296e169139072b81592336f2fef55b8986aa31c9f04b5f7211", upload-time = "2026-01-15T09:08:16.788Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ac/686789b9145413f1a61878c407210e41bfdb097976864e0913078b24098c/myst_parser-5.0.0-py3-none-any.whl", hash = "sha256:ab31e516024918296e169139072b81592336f2fef55b8986aa31c9f04b5f7211", size = 84533, upload-time = "2026-01-15T09:08:16.788Z" }, ] [[package]] @@ -3121,9 +3117,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } resolution-markers = [ "python_full_version < '3.11'", ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", upload-time = "2024-10-21T12:39:38.695Z" } +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://pypi-proxy.dev.databricks.com/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", upload-time = "2024-10-21T12:39:36.247Z" }, + { 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]] @@ -3137,9 +3133,9 @@ resolution-markers = [ "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", upload-time = "2025-12-08T17:02:39.908Z" } +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://pypi-proxy.dev.databricks.com/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", upload-time = "2025-12-08T17:02:38.159Z" }, + { 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]] @@ -3152,9 +3148,9 @@ dependencies = [ { name = "regex" }, { name = "tqdm" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/74/a1/b3b4adf15585a5bc4c357adde150c01ebeeb642173ded4d871e89468767c/nltk-3.9.4.tar.gz", hash = "sha256:ed03bc098a40481310320808b2db712d95d13ca65b27372f8a403949c8b523d0", upload-time = "2026-03-24T06:13:40.641Z" } +sdist = { url = "https://files.pythonhosted.org/packages/74/a1/b3b4adf15585a5bc4c357adde150c01ebeeb642173ded4d871e89468767c/nltk-3.9.4.tar.gz", hash = "sha256:ed03bc098a40481310320808b2db712d95d13ca65b27372f8a403949c8b523d0", size = 2946864, upload-time = "2026-03-24T06:13:40.641Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/9d/91/04e965f8e717ba0ab4bdca5c112deeab11c9e750d94c4d4602f050295d39/nltk-3.9.4-py3-none-any.whl", hash = "sha256:f2fa301c3a12718ce4a0e9305c5675299da5ad9e26068218b69d692fda84828f", upload-time = "2026-03-24T06:13:38.47Z" }, + { url = "https://files.pythonhosted.org/packages/9d/91/04e965f8e717ba0ab4bdca5c112deeab11c9e750d94c4d4602f050295d39/nltk-3.9.4-py3-none-any.whl", hash = "sha256:f2fa301c3a12718ce4a0e9305c5675299da5ad9e26068218b69d692fda84828f", size = 1552087, upload-time = "2026-03-24T06:13:38.47Z" }, ] [[package]] @@ -3164,62 +3160,62 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } resolution-markers = [ "python_full_version < '3.11'", ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", upload-time = "2025-05-17T22:38:04.611Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", upload-time = "2025-05-17T21:27:58.555Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", upload-time = "2025-05-17T21:28:21.406Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", upload-time = "2025-05-17T21:28:30.931Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", upload-time = "2025-05-17T21:28:41.613Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", upload-time = "2025-05-17T21:29:02.78Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", upload-time = "2025-05-17T21:29:27.675Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", upload-time = "2025-05-17T21:29:51.102Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", upload-time = "2025-05-17T21:30:18.703Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", upload-time = "2025-05-17T21:30:29.788Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", upload-time = "2025-05-17T21:30:48.994Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", upload-time = "2025-05-17T21:31:19.36Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", upload-time = "2025-05-17T21:31:41.087Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", upload-time = "2025-05-17T21:31:50.072Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", upload-time = "2025-05-17T21:32:01.712Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", upload-time = "2025-05-17T21:32:23.332Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", upload-time = "2025-05-17T21:32:47.991Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", upload-time = "2025-05-17T21:33:11.728Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", upload-time = "2025-05-17T21:33:39.139Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", upload-time = "2025-05-17T21:33:50.273Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", upload-time = "2025-05-17T21:34:09.135Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", upload-time = "2025-05-17T21:34:39.648Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", upload-time = "2025-05-17T21:35:01.241Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", upload-time = "2025-05-17T21:35:10.622Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", upload-time = "2025-05-17T21:35:21.414Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", upload-time = "2025-05-17T21:35:42.174Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", upload-time = "2025-05-17T21:36:06.711Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", upload-time = "2025-05-17T21:36:29.965Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", upload-time = "2025-05-17T21:36:56.883Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", upload-time = "2025-05-17T21:37:07.368Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", upload-time = "2025-05-17T21:37:26.213Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", upload-time = "2025-05-17T21:37:56.699Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", upload-time = "2025-05-17T21:38:18.291Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", upload-time = "2025-05-17T21:38:27.319Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", upload-time = "2025-05-17T21:38:38.141Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", upload-time = "2025-05-17T21:38:58.433Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", upload-time = "2025-05-17T21:39:22.638Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", upload-time = "2025-05-17T21:39:45.865Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", upload-time = "2025-05-17T21:40:13.331Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", upload-time = "2025-05-17T21:43:46.099Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", upload-time = "2025-05-17T21:44:05.145Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", upload-time = "2025-05-17T21:40:44Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", upload-time = "2025-05-17T21:41:05.695Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", upload-time = "2025-05-17T21:41:15.903Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", upload-time = "2025-05-17T21:41:27.321Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", upload-time = "2025-05-17T21:41:49.738Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", upload-time = "2025-05-17T21:42:14.046Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", upload-time = "2025-05-17T21:42:37.464Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", upload-time = "2025-05-17T21:43:05.189Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", upload-time = "2025-05-17T21:43:16.254Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", upload-time = "2025-05-17T21:43:35.479Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", upload-time = "2025-05-17T21:44:35.948Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", upload-time = "2025-05-17T21:44:47.446Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", upload-time = "2025-05-17T21:45:11.871Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", upload-time = "2025-05-17T21:45:31.426Z" }, +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/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, + { 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]] @@ -3233,79 +3229,79 @@ resolution-markers = [ "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/a4/7a/6a3d14e205d292b738db449d0de649b373a59edb0d0b4493821d0a3e8718/numpy-2.4.0.tar.gz", hash = "sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934", upload-time = "2025-12-20T16:18:19.023Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/26/7e/7bae7cbcc2f8132271967aa03e03954fc1e48aa1f3bf32b29ca95fbef352/numpy-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e", upload-time = "2025-12-20T16:15:43.434Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0f/27/6c13f5b46776d6246ec884ac5817452672156a506d08a1f2abb39961930a/numpy-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db", upload-time = "2025-12-20T16:15:45.701Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/14/1c/83b4998d4860d15283241d9e5215f28b40ac31f497c04b12fa7f428ff370/numpy-2.4.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b", upload-time = "2025-12-20T16:15:47.943Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/54/08/cbce72c835d937795571b0464b52069f869c9e78b0c076d416c5269d2718/numpy-2.4.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7", upload-time = "2025-12-20T16:15:49.795Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ff/be/2e647961cd8c980591d75cdcd9e8f647d69fbe05e2a25613dc0a2ea5fb1a/numpy-2.4.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548", upload-time = "2025-12-20T16:15:51.615Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a2/fb/e1652fb8b6fd91ce6ed429143fe2e01ce714711e03e5b762615e7b36172c/numpy-2.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346", upload-time = "2025-12-20T16:15:54.129Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/62/23/d841207e63c4322842f7cd042ae981cffe715c73376dcad8235fb31debf1/numpy-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25", upload-time = "2025-12-20T16:15:56.147Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/a0/6a842c8421ebfdec0a230e65f61e0dabda6edbef443d999d79b87c273965/numpy-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a", upload-time = "2025-12-20T16:15:58.524Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/d1/c79e0046641186f2134dde05e6181825b911f8bdcef31b19ddd16e232847/numpy-2.4.0-cp311-cp311-win32.whl", hash = "sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53", upload-time = "2025-12-20T16:16:00.938Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fc/f0/74965001d231f28184d6305b8cdc1b6fcd4bf23033f6cb039cfe76c9fca7/numpy-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479", upload-time = "2025-12-20T16:16:02.484Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/65/32/55408d0f46dfebce38017f5bd931affa7256ad6beac1a92a012e1fbc67a7/numpy-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6", upload-time = "2025-12-20T16:16:04.77Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/ff/f6400ffec95de41c74b8e73df32e3fff1830633193a7b1e409be7fb1bb8c/numpy-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037", upload-time = "2025-12-20T16:16:06.709Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/28/6c23e97450035072e8d830a3c411bf1abd1f42c611ff9d29e3d8f55c6252/numpy-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83", upload-time = "2025-12-20T16:16:08.758Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/af/acbef97b630ab1bb45e6a7d01d1452e4251aa88ce680ac36e56c272120ec/numpy-2.4.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344", upload-time = "2025-12-20T16:16:10.902Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c1/c8/4e0d436b66b826f2e53330adaa6311f5cac9871a5b5c31ad773b27f25a74/numpy-2.4.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6", upload-time = "2025-12-20T16:16:12.607Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ef/27/e1f5d144ab54eac34875e79037011d511ac57b21b220063310cb96c80fbc/numpy-2.4.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb", upload-time = "2025-12-20T16:16:14.257Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/67/64/4cb909dd5ab09a9a5d086eff9586e69e827b88a5585517386879474f4cf7/numpy-2.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63", upload-time = "2025-12-20T16:16:17.32Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9d/9c/8efe24577523ec6809261859737cf117b0eb6fdb655abdfdc81b2e468ce4/numpy-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95", upload-time = "2025-12-20T16:16:19.524Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/61/f0/1687441ece7b47a62e45a1f82015352c240765c707928edd8aef875d5951/numpy-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6", upload-time = "2025-12-20T16:16:22.866Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/6f/f868765d44e6fc466467ed810ba9d8d6db1add7d4a748abfa2a4c99a3194/numpy-2.4.0-cp312-cp312-win32.whl", hash = "sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c", upload-time = "2025-12-20T16:16:25.06Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/b5/94c1e79fcbab38d1ca15e13777477b2914dd2d559b410f96949d6637b085/numpy-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98", upload-time = "2025-12-20T16:16:26.979Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/70/09/c39dadf0b13bb0768cd29d6a3aaff1fb7c6905ac40e9aaeca26b1c086e06/numpy-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667", upload-time = "2025-12-20T16:16:29.417Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/0d/853fd96372eda07c824d24adf02e8bc92bb3731b43a9b2a39161c3667cc4/numpy-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea", upload-time = "2025-12-20T16:16:31.421Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e3/37/cc636f1f2a9f585434e20a3e6e63422f70bfe4f7f6698e941db52ea1ac9a/numpy-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d", upload-time = "2025-12-20T16:16:33.491Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ed/69/0b78f37ca3690969beee54103ce5f6021709134e8020767e93ba691a72f1/numpy-2.4.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee", upload-time = "2025-12-20T16:16:35.636Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1d/2a/08569f8252abf590294dbb09a430543ec8f8cc710383abfb3e75cc73aeda/numpy-2.4.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e", upload-time = "2025-12-20T16:16:37.276Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/93/e9/a949885a4e177493d61519377952186b6cbfdf1d6002764c664ba28349b5/numpy-2.4.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2", upload-time = "2025-12-20T16:16:38.953Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/99/98/9d4ad53b0e9ef901c2ef1d550d2136f5ac42d3fd2988390a6def32e23e48/numpy-2.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a", upload-time = "2025-12-20T16:16:41.503Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/28/de/5f3711a38341d6e8dd619f6353251a0cdd07f3d6d101a8fd46f4ef87f895/numpy-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681", upload-time = "2025-12-20T16:16:44.552Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/5b/2a3753dc43916501b4183532e7ace862e13211042bceafa253afb5c71272/numpy-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475", upload-time = "2025-12-20T16:16:47.174Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2c/c5/a18bcdd07a941db3076ef489d036ab16d2bfc2eae0cf27e5a26e29189434/numpy-2.4.0-cp313-cp313-win32.whl", hash = "sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344", upload-time = "2025-12-20T16:16:49.554Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4f/f1/719010ff8061da6e8a26e1980cf090412d4f5f8060b31f0c45d77dd67a01/numpy-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d", upload-time = "2025-12-20T16:16:51.227Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/5a/b3d259083ed8b4d335270c76966cb6cf14a5d1b69e1a608994ac57a659e6/numpy-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d", upload-time = "2025-12-20T16:16:53.313Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/31/01/95edcffd1bb6c0633df4e808130545c4f07383ab629ac7e316fb44fff677/numpy-2.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6", upload-time = "2025-12-20T16:16:55.496Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/59/ea/5644b8baa92cc1c7163b4b4458c8679852733fa74ca49c942cfa82ded4e0/numpy-2.4.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5", upload-time = "2025-12-20T16:16:57.468Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/26/4e/e10938106d70bc21319bd6a86ae726da37edc802ce35a3a71ecdf1fdfe7f/numpy-2.4.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3", upload-time = "2025-12-20T16:16:59.379Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/8d/a8828e3eaf5c0b4ab116924df82f24ce3416fa38d0674d8f708ddc6c8aac/numpy-2.4.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d", upload-time = "2025-12-20T16:17:01.768Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/68/a1/17d97609d87d4520aa5ae2dcfb32305654550ac6a35effb946d303e594ce/numpy-2.4.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3", upload-time = "2025-12-20T16:17:04.235Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/32/0f13c1b2d22bea1118356b8b963195446f3af124ed7a5adfa8fdecb1b6ca/numpy-2.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa", upload-time = "2025-12-20T16:17:06.856Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ae/23/48f21e3d309fbc137c068a1475358cbd3a901b3987dcfc97a029ab3068e2/numpy-2.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c", upload-time = "2025-12-20T16:17:09.392Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ac/52/41f3d71296a3dcaa4f456aaa3c6fc8e745b43d0552b6bde56571bb4b4a0f/numpy-2.4.0-cp313-cp313t-win32.whl", hash = "sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93", upload-time = "2025-12-20T16:17:11.437Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/35/ff/46fbfe60ab0710d2a2b16995f708750307d30eccbb4c38371ea9e986866e/numpy-2.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4", upload-time = "2025-12-20T16:17:13.182Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a3/e3/9189ab319c01d2ed556c932ccf55064c5d75bb5850d1df7a482ce0badead/numpy-2.4.0-cp313-cp313t-win_arm64.whl", hash = "sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c", upload-time = "2025-12-20T16:17:15.211Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ab/ed/52eac27de39d5e5a6c9aadabe672bc06f55e24a3d9010cd1183948055d76/numpy-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b", upload-time = "2025-12-20T16:17:17.671Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/c0/990ce1b7fcd4e09aeaa574e2a0a839589e4b08b2ca68070f1acb1fea6736/numpy-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e", upload-time = "2025-12-20T16:17:20.216Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/37/7c/8c5e389c6ae8f5fd2277a988600d79e9625db3fff011a2d87ac80b881a4c/numpy-2.4.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e", upload-time = "2025-12-20T16:17:22.47Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e6/94/ca5b3bd6a8a70a5eec9a0b8dd7f980c1eff4b8a54970a9a7fef248ef564f/numpy-2.4.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51", upload-time = "2025-12-20T16:17:24.001Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/79/43/993eb7bb5be6761dde2b3a3a594d689cec83398e3f58f4758010f3b85727/numpy-2.4.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce", upload-time = "2025-12-20T16:17:25.822Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/75/d4c43b61de473912496317a854dac54f1efec3eeb158438da6884b70bb90/numpy-2.4.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f", upload-time = "2025-12-20T16:17:28.308Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b8/0a/b54615b47ee8736a6461a4bb6749128dd3435c5a759d5663f11f0e9af4ac/numpy-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded", upload-time = "2025-12-20T16:17:30.993Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/98/ce/ea207769aacad6246525ec6c6bbd66a2bf56c72443dc10e2f90feed29290/numpy-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059", upload-time = "2025-12-20T16:17:33.327Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/17/ef/ec409437aa962ea372ed601c519a2b141701683ff028f894b7466f0ab42b/numpy-2.4.0-cp314-cp314-win32.whl", hash = "sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db", upload-time = "2025-12-20T16:17:35.729Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/4a/5cb94c787a3ed1ac65e1271b968686521169a7b3ec0b6544bb3ca32960b0/numpy-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e", upload-time = "2025-12-20T16:17:37.599Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/48/a0/04b89db963af9de1104975e2544f30de89adbf75b9e75f7dd2599be12c79/numpy-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63", upload-time = "2025-12-20T16:17:39.649Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/53/e5/d74b5ccf6712c06c7a545025a6a71bfa03bdc7e0568b405b0d655232fd92/numpy-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df", upload-time = "2025-12-20T16:17:41.714Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/08/3ca9cc2ddf54dfee7ae9a6479c071092a228c68aef08252aa08dac2af002/numpy-2.4.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9", upload-time = "2025-12-20T16:17:44.145Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/87/74/0bb63a68394c0c1e52670cfff2e309afa41edbe11b3327d9af29e4383f34/numpy-2.4.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9", upload-time = "2025-12-20T16:17:46.203Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/06/8f/9264d9bdbcf8236af2823623fe2f3981d740fc3461e2787e231d97c38c28/numpy-2.4.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471", upload-time = "2025-12-20T16:17:48.017Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8c/d9/f9a69ae564bbc7236a35aa883319364ef5fd41f72aa320cc1cbe66148fe2/numpy-2.4.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544", upload-time = "2025-12-20T16:17:50.409Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/34/c7/39241501408dde7f885d241a98caba5421061a2c6d2b2197ac5e3aa842d8/numpy-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c", upload-time = "2025-12-20T16:17:52.661Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7c/95/cae7effd90e065a95e59fe710eeee05d7328ed169776dfdd9f789e032125/numpy-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac", upload-time = "2025-12-20T16:17:54.947Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/96/df/3c6c279accd2bfb968a76298e5b276310bd55d243df4fa8ac5816d79347d/numpy-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f", upload-time = "2025-12-20T16:17:57.249Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/92/8d/f23033cce252e7a75cae853d17f582e86534c46404dea1c8ee094a9d6d84/numpy-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4", upload-time = "2025-12-20T16:17:58.963Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a4/4f/1f8475907d1a7c4ef9020edf7f39ea2422ec896849245f00688e4b268a71/numpy-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8", upload-time = "2025-12-20T16:18:01.078Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/ef/088e7c7342f300aaf3ee5f2c821c4b9996a1bef2aaf6a49cc8ab4883758e/numpy-2.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6", upload-time = "2025-12-20T16:18:03.41Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ff/ce/a53017b5443b4b84517182d463fc7bcc2adb4faa8b20813f8e5f5aeb5faa/numpy-2.4.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4", upload-time = "2025-12-20T16:18:05.594Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/58/5ff91b161f2ec650c88a626c3905d938c89aaadabd0431e6d9c1330c83e2/numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba", upload-time = "2025-12-20T16:18:08.031Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1d/4e/f1a084106df8c2df8132fc437e56987308e0524836aa7733721c8429d4fe/numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d", upload-time = "2025-12-20T16:18:09.836Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/63/09/3d8aeb809c0332c3f642da812ac2e3d74fc9252b3021f8c30c82e99e3f3d/numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf", upload-time = "2025-12-20T16:18:12.105Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/7f/68f0fc43a2cbdc6bb239160c754d87c922f60fbaa0fa3cd3d312b8a7f5ee/numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98", upload-time = "2025-12-20T16:18:14.433Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/11/73/edeacba3167b1ca66d51b1a5a14697c2c40098b5ffa01811c67b1785a5ab/numpy-2.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b", upload-time = "2025-12-20T16:18:16.524Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a4/7a/6a3d14e205d292b738db449d0de649b373a59edb0d0b4493821d0a3e8718/numpy-2.4.0.tar.gz", hash = "sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934", size = 20685720, upload-time = "2025-12-20T16:18:19.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/26/7e/7bae7cbcc2f8132271967aa03e03954fc1e48aa1f3bf32b29ca95fbef352/numpy-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e", size = 16940166, upload-time = "2025-12-20T16:15:43.434Z" }, + { url = "https://files.pythonhosted.org/packages/0f/27/6c13f5b46776d6246ec884ac5817452672156a506d08a1f2abb39961930a/numpy-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db", size = 12641781, upload-time = "2025-12-20T16:15:45.701Z" }, + { url = "https://files.pythonhosted.org/packages/14/1c/83b4998d4860d15283241d9e5215f28b40ac31f497c04b12fa7f428ff370/numpy-2.4.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b", size = 5470247, upload-time = "2025-12-20T16:15:47.943Z" }, + { url = "https://files.pythonhosted.org/packages/54/08/cbce72c835d937795571b0464b52069f869c9e78b0c076d416c5269d2718/numpy-2.4.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7", size = 6799807, upload-time = "2025-12-20T16:15:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/ff/be/2e647961cd8c980591d75cdcd9e8f647d69fbe05e2a25613dc0a2ea5fb1a/numpy-2.4.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548", size = 14701992, upload-time = "2025-12-20T16:15:51.615Z" }, + { url = "https://files.pythonhosted.org/packages/a2/fb/e1652fb8b6fd91ce6ed429143fe2e01ce714711e03e5b762615e7b36172c/numpy-2.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346", size = 16646871, upload-time = "2025-12-20T16:15:54.129Z" }, + { url = "https://files.pythonhosted.org/packages/62/23/d841207e63c4322842f7cd042ae981cffe715c73376dcad8235fb31debf1/numpy-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25", size = 16487190, upload-time = "2025-12-20T16:15:56.147Z" }, + { url = "https://files.pythonhosted.org/packages/bc/a0/6a842c8421ebfdec0a230e65f61e0dabda6edbef443d999d79b87c273965/numpy-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a", size = 18580762, upload-time = "2025-12-20T16:15:58.524Z" }, + { url = "https://files.pythonhosted.org/packages/0a/d1/c79e0046641186f2134dde05e6181825b911f8bdcef31b19ddd16e232847/numpy-2.4.0-cp311-cp311-win32.whl", hash = "sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53", size = 6233359, upload-time = "2025-12-20T16:16:00.938Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f0/74965001d231f28184d6305b8cdc1b6fcd4bf23033f6cb039cfe76c9fca7/numpy-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479", size = 12601132, upload-time = "2025-12-20T16:16:02.484Z" }, + { url = "https://files.pythonhosted.org/packages/65/32/55408d0f46dfebce38017f5bd931affa7256ad6beac1a92a012e1fbc67a7/numpy-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6", size = 10573977, upload-time = "2025-12-20T16:16:04.77Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ff/f6400ffec95de41c74b8e73df32e3fff1830633193a7b1e409be7fb1bb8c/numpy-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037", size = 16653117, upload-time = "2025-12-20T16:16:06.709Z" }, + { url = "https://files.pythonhosted.org/packages/fd/28/6c23e97450035072e8d830a3c411bf1abd1f42c611ff9d29e3d8f55c6252/numpy-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83", size = 12369711, upload-time = "2025-12-20T16:16:08.758Z" }, + { url = "https://files.pythonhosted.org/packages/bc/af/acbef97b630ab1bb45e6a7d01d1452e4251aa88ce680ac36e56c272120ec/numpy-2.4.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344", size = 5198355, upload-time = "2025-12-20T16:16:10.902Z" }, + { url = "https://files.pythonhosted.org/packages/c1/c8/4e0d436b66b826f2e53330adaa6311f5cac9871a5b5c31ad773b27f25a74/numpy-2.4.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6", size = 6545298, upload-time = "2025-12-20T16:16:12.607Z" }, + { url = "https://files.pythonhosted.org/packages/ef/27/e1f5d144ab54eac34875e79037011d511ac57b21b220063310cb96c80fbc/numpy-2.4.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb", size = 14398387, upload-time = "2025-12-20T16:16:14.257Z" }, + { url = "https://files.pythonhosted.org/packages/67/64/4cb909dd5ab09a9a5d086eff9586e69e827b88a5585517386879474f4cf7/numpy-2.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63", size = 16363091, upload-time = "2025-12-20T16:16:17.32Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9c/8efe24577523ec6809261859737cf117b0eb6fdb655abdfdc81b2e468ce4/numpy-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95", size = 16176394, upload-time = "2025-12-20T16:16:19.524Z" }, + { url = "https://files.pythonhosted.org/packages/61/f0/1687441ece7b47a62e45a1f82015352c240765c707928edd8aef875d5951/numpy-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6", size = 18287378, upload-time = "2025-12-20T16:16:22.866Z" }, + { url = "https://files.pythonhosted.org/packages/d3/6f/f868765d44e6fc466467ed810ba9d8d6db1add7d4a748abfa2a4c99a3194/numpy-2.4.0-cp312-cp312-win32.whl", hash = "sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c", size = 5955432, upload-time = "2025-12-20T16:16:25.06Z" }, + { url = "https://files.pythonhosted.org/packages/d4/b5/94c1e79fcbab38d1ca15e13777477b2914dd2d559b410f96949d6637b085/numpy-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98", size = 12306201, upload-time = "2025-12-20T16:16:26.979Z" }, + { url = "https://files.pythonhosted.org/packages/70/09/c39dadf0b13bb0768cd29d6a3aaff1fb7c6905ac40e9aaeca26b1c086e06/numpy-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667", size = 10308234, upload-time = "2025-12-20T16:16:29.417Z" }, + { url = "https://files.pythonhosted.org/packages/a7/0d/853fd96372eda07c824d24adf02e8bc92bb3731b43a9b2a39161c3667cc4/numpy-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea", size = 16649088, upload-time = "2025-12-20T16:16:31.421Z" }, + { url = "https://files.pythonhosted.org/packages/e3/37/cc636f1f2a9f585434e20a3e6e63422f70bfe4f7f6698e941db52ea1ac9a/numpy-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d", size = 12364065, upload-time = "2025-12-20T16:16:33.491Z" }, + { url = "https://files.pythonhosted.org/packages/ed/69/0b78f37ca3690969beee54103ce5f6021709134e8020767e93ba691a72f1/numpy-2.4.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee", size = 5192640, upload-time = "2025-12-20T16:16:35.636Z" }, + { url = "https://files.pythonhosted.org/packages/1d/2a/08569f8252abf590294dbb09a430543ec8f8cc710383abfb3e75cc73aeda/numpy-2.4.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e", size = 6541556, upload-time = "2025-12-20T16:16:37.276Z" }, + { url = "https://files.pythonhosted.org/packages/93/e9/a949885a4e177493d61519377952186b6cbfdf1d6002764c664ba28349b5/numpy-2.4.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2", size = 14396562, upload-time = "2025-12-20T16:16:38.953Z" }, + { url = "https://files.pythonhosted.org/packages/99/98/9d4ad53b0e9ef901c2ef1d550d2136f5ac42d3fd2988390a6def32e23e48/numpy-2.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a", size = 16351719, upload-time = "2025-12-20T16:16:41.503Z" }, + { url = "https://files.pythonhosted.org/packages/28/de/5f3711a38341d6e8dd619f6353251a0cdd07f3d6d101a8fd46f4ef87f895/numpy-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681", size = 16176053, upload-time = "2025-12-20T16:16:44.552Z" }, + { url = "https://files.pythonhosted.org/packages/2a/5b/2a3753dc43916501b4183532e7ace862e13211042bceafa253afb5c71272/numpy-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475", size = 18277859, upload-time = "2025-12-20T16:16:47.174Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c5/a18bcdd07a941db3076ef489d036ab16d2bfc2eae0cf27e5a26e29189434/numpy-2.4.0-cp313-cp313-win32.whl", hash = "sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344", size = 5953849, upload-time = "2025-12-20T16:16:49.554Z" }, + { url = "https://files.pythonhosted.org/packages/4f/f1/719010ff8061da6e8a26e1980cf090412d4f5f8060b31f0c45d77dd67a01/numpy-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d", size = 12302840, upload-time = "2025-12-20T16:16:51.227Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5a/b3d259083ed8b4d335270c76966cb6cf14a5d1b69e1a608994ac57a659e6/numpy-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d", size = 10308509, upload-time = "2025-12-20T16:16:53.313Z" }, + { url = "https://files.pythonhosted.org/packages/31/01/95edcffd1bb6c0633df4e808130545c4f07383ab629ac7e316fb44fff677/numpy-2.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6", size = 12491815, upload-time = "2025-12-20T16:16:55.496Z" }, + { url = "https://files.pythonhosted.org/packages/59/ea/5644b8baa92cc1c7163b4b4458c8679852733fa74ca49c942cfa82ded4e0/numpy-2.4.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5", size = 5320321, upload-time = "2025-12-20T16:16:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/26/4e/e10938106d70bc21319bd6a86ae726da37edc802ce35a3a71ecdf1fdfe7f/numpy-2.4.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3", size = 6641635, upload-time = "2025-12-20T16:16:59.379Z" }, + { url = "https://files.pythonhosted.org/packages/b3/8d/a8828e3eaf5c0b4ab116924df82f24ce3416fa38d0674d8f708ddc6c8aac/numpy-2.4.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d", size = 14456053, upload-time = "2025-12-20T16:17:01.768Z" }, + { url = "https://files.pythonhosted.org/packages/68/a1/17d97609d87d4520aa5ae2dcfb32305654550ac6a35effb946d303e594ce/numpy-2.4.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3", size = 16401702, upload-time = "2025-12-20T16:17:04.235Z" }, + { url = "https://files.pythonhosted.org/packages/18/32/0f13c1b2d22bea1118356b8b963195446f3af124ed7a5adfa8fdecb1b6ca/numpy-2.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa", size = 16242493, upload-time = "2025-12-20T16:17:06.856Z" }, + { url = "https://files.pythonhosted.org/packages/ae/23/48f21e3d309fbc137c068a1475358cbd3a901b3987dcfc97a029ab3068e2/numpy-2.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c", size = 18324222, upload-time = "2025-12-20T16:17:09.392Z" }, + { url = "https://files.pythonhosted.org/packages/ac/52/41f3d71296a3dcaa4f456aaa3c6fc8e745b43d0552b6bde56571bb4b4a0f/numpy-2.4.0-cp313-cp313t-win32.whl", hash = "sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93", size = 6076216, upload-time = "2025-12-20T16:17:11.437Z" }, + { url = "https://files.pythonhosted.org/packages/35/ff/46fbfe60ab0710d2a2b16995f708750307d30eccbb4c38371ea9e986866e/numpy-2.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4", size = 12444263, upload-time = "2025-12-20T16:17:13.182Z" }, + { url = "https://files.pythonhosted.org/packages/a3/e3/9189ab319c01d2ed556c932ccf55064c5d75bb5850d1df7a482ce0badead/numpy-2.4.0-cp313-cp313t-win_arm64.whl", hash = "sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c", size = 10378265, upload-time = "2025-12-20T16:17:15.211Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ed/52eac27de39d5e5a6c9aadabe672bc06f55e24a3d9010cd1183948055d76/numpy-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b", size = 16647476, upload-time = "2025-12-20T16:17:17.671Z" }, + { url = "https://files.pythonhosted.org/packages/77/c0/990ce1b7fcd4e09aeaa574e2a0a839589e4b08b2ca68070f1acb1fea6736/numpy-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e", size = 12374563, upload-time = "2025-12-20T16:17:20.216Z" }, + { url = "https://files.pythonhosted.org/packages/37/7c/8c5e389c6ae8f5fd2277a988600d79e9625db3fff011a2d87ac80b881a4c/numpy-2.4.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e", size = 5203107, upload-time = "2025-12-20T16:17:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/e6/94/ca5b3bd6a8a70a5eec9a0b8dd7f980c1eff4b8a54970a9a7fef248ef564f/numpy-2.4.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51", size = 6538067, upload-time = "2025-12-20T16:17:24.001Z" }, + { url = "https://files.pythonhosted.org/packages/79/43/993eb7bb5be6761dde2b3a3a594d689cec83398e3f58f4758010f3b85727/numpy-2.4.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce", size = 14411926, upload-time = "2025-12-20T16:17:25.822Z" }, + { url = "https://files.pythonhosted.org/packages/03/75/d4c43b61de473912496317a854dac54f1efec3eeb158438da6884b70bb90/numpy-2.4.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f", size = 16354295, upload-time = "2025-12-20T16:17:28.308Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0a/b54615b47ee8736a6461a4bb6749128dd3435c5a759d5663f11f0e9af4ac/numpy-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded", size = 16190242, upload-time = "2025-12-20T16:17:30.993Z" }, + { url = "https://files.pythonhosted.org/packages/98/ce/ea207769aacad6246525ec6c6bbd66a2bf56c72443dc10e2f90feed29290/numpy-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059", size = 18280875, upload-time = "2025-12-20T16:17:33.327Z" }, + { url = "https://files.pythonhosted.org/packages/17/ef/ec409437aa962ea372ed601c519a2b141701683ff028f894b7466f0ab42b/numpy-2.4.0-cp314-cp314-win32.whl", hash = "sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db", size = 6002530, upload-time = "2025-12-20T16:17:35.729Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4a/5cb94c787a3ed1ac65e1271b968686521169a7b3ec0b6544bb3ca32960b0/numpy-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e", size = 12435890, upload-time = "2025-12-20T16:17:37.599Z" }, + { url = "https://files.pythonhosted.org/packages/48/a0/04b89db963af9de1104975e2544f30de89adbf75b9e75f7dd2599be12c79/numpy-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63", size = 10591892, upload-time = "2025-12-20T16:17:39.649Z" }, + { url = "https://files.pythonhosted.org/packages/53/e5/d74b5ccf6712c06c7a545025a6a71bfa03bdc7e0568b405b0d655232fd92/numpy-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df", size = 12494312, upload-time = "2025-12-20T16:17:41.714Z" }, + { url = "https://files.pythonhosted.org/packages/c2/08/3ca9cc2ddf54dfee7ae9a6479c071092a228c68aef08252aa08dac2af002/numpy-2.4.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9", size = 5322862, upload-time = "2025-12-20T16:17:44.145Z" }, + { url = "https://files.pythonhosted.org/packages/87/74/0bb63a68394c0c1e52670cfff2e309afa41edbe11b3327d9af29e4383f34/numpy-2.4.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9", size = 6644986, upload-time = "2025-12-20T16:17:46.203Z" }, + { url = "https://files.pythonhosted.org/packages/06/8f/9264d9bdbcf8236af2823623fe2f3981d740fc3461e2787e231d97c38c28/numpy-2.4.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471", size = 14457958, upload-time = "2025-12-20T16:17:48.017Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d9/f9a69ae564bbc7236a35aa883319364ef5fd41f72aa320cc1cbe66148fe2/numpy-2.4.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544", size = 16398394, upload-time = "2025-12-20T16:17:50.409Z" }, + { url = "https://files.pythonhosted.org/packages/34/c7/39241501408dde7f885d241a98caba5421061a2c6d2b2197ac5e3aa842d8/numpy-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c", size = 16241044, upload-time = "2025-12-20T16:17:52.661Z" }, + { url = "https://files.pythonhosted.org/packages/7c/95/cae7effd90e065a95e59fe710eeee05d7328ed169776dfdd9f789e032125/numpy-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac", size = 18321772, upload-time = "2025-12-20T16:17:54.947Z" }, + { url = "https://files.pythonhosted.org/packages/96/df/3c6c279accd2bfb968a76298e5b276310bd55d243df4fa8ac5816d79347d/numpy-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f", size = 6148320, upload-time = "2025-12-20T16:17:57.249Z" }, + { url = "https://files.pythonhosted.org/packages/92/8d/f23033cce252e7a75cae853d17f582e86534c46404dea1c8ee094a9d6d84/numpy-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4", size = 12623460, upload-time = "2025-12-20T16:17:58.963Z" }, + { url = "https://files.pythonhosted.org/packages/a4/4f/1f8475907d1a7c4ef9020edf7f39ea2422ec896849245f00688e4b268a71/numpy-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8", size = 10661799, upload-time = "2025-12-20T16:18:01.078Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ef/088e7c7342f300aaf3ee5f2c821c4b9996a1bef2aaf6a49cc8ab4883758e/numpy-2.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6", size = 16819003, upload-time = "2025-12-20T16:18:03.41Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ce/a53017b5443b4b84517182d463fc7bcc2adb4faa8b20813f8e5f5aeb5faa/numpy-2.4.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4", size = 12567105, upload-time = "2025-12-20T16:18:05.594Z" }, + { url = "https://files.pythonhosted.org/packages/77/58/5ff91b161f2ec650c88a626c3905d938c89aaadabd0431e6d9c1330c83e2/numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba", size = 5395590, upload-time = "2025-12-20T16:18:08.031Z" }, + { url = "https://files.pythonhosted.org/packages/1d/4e/f1a084106df8c2df8132fc437e56987308e0524836aa7733721c8429d4fe/numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d", size = 6709947, upload-time = "2025-12-20T16:18:09.836Z" }, + { url = "https://files.pythonhosted.org/packages/63/09/3d8aeb809c0332c3f642da812ac2e3d74fc9252b3021f8c30c82e99e3f3d/numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf", size = 14535119, upload-time = "2025-12-20T16:18:12.105Z" }, + { url = "https://files.pythonhosted.org/packages/fd/7f/68f0fc43a2cbdc6bb239160c754d87c922f60fbaa0fa3cd3d312b8a7f5ee/numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98", size = 16475815, upload-time = "2025-12-20T16:18:14.433Z" }, + { url = "https://files.pythonhosted.org/packages/11/73/edeacba3167b1ca66d51b1a5a14697c2c40098b5ffa01811c67b1785a5ab/numpy-2.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b", size = 12489376, upload-time = "2025-12-20T16:18:16.524Z" }, ] [[package]] @@ -3313,8 +3309,8 @@ name = "nvidia-cublas" version = "13.1.0.3" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/e1/a5/fce49e2ae977e0ccc084e5adafceb4f0ac0c8333cb6863501618a7277f67/nvidia_cublas-13.1.0.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c86fc7f7ae36d7528288c5d88098edcb7b02c633d262e7ddbb86b0ad91be5df2", upload-time = "2025-10-09T08:59:04.818Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e7/44/423ac00af4dd95a5aeb27207e2c0d9b7118702149bf4704c3ddb55bb7429/nvidia_cublas-13.1.0.3-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:ee8722c1f0145ab246bccb9e452153b5e0515fd094c3678df50b2a0888b8b171", upload-time = "2025-10-09T08:59:32.536Z" }, + { url = "https://files.pythonhosted.org/packages/e1/a5/fce49e2ae977e0ccc084e5adafceb4f0ac0c8333cb6863501618a7277f67/nvidia_cublas-13.1.0.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c86fc7f7ae36d7528288c5d88098edcb7b02c633d262e7ddbb86b0ad91be5df2", size = 542851226, upload-time = "2025-10-09T08:59:04.818Z" }, + { url = "https://files.pythonhosted.org/packages/e7/44/423ac00af4dd95a5aeb27207e2c0d9b7118702149bf4704c3ddb55bb7429/nvidia_cublas-13.1.0.3-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:ee8722c1f0145ab246bccb9e452153b5e0515fd094c3678df50b2a0888b8b171", size = 423133236, upload-time = "2025-10-09T08:59:32.536Z" }, ] [[package]] @@ -3322,8 +3318,8 @@ name = "nvidia-cuda-cupti" version = "13.0.85" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/2a/80353b103fc20ce05ef51e928daed4b6015db4aaa9162ed0997090fe2250/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_aarch64.whl", hash = "sha256:796bd679890ee55fb14a94629b698b6db54bcfd833d391d5e94017dd9d7d3151", upload-time = "2025-09-04T08:26:42.012Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/33/6d/737d164b4837a9bbd202f5ae3078975f0525a55730fe871d8ed4e3b952b0/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_x86_64.whl", hash = "sha256:4eb01c08e859bf924d222250d2e8f8b8ff6d3db4721288cf35d14252a4d933c8", upload-time = "2025-09-04T08:26:51.312Z" }, + { url = "https://files.pythonhosted.org/packages/2a/2a/80353b103fc20ce05ef51e928daed4b6015db4aaa9162ed0997090fe2250/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_aarch64.whl", hash = "sha256:796bd679890ee55fb14a94629b698b6db54bcfd833d391d5e94017dd9d7d3151", size = 10310827, upload-time = "2025-09-04T08:26:42.012Z" }, + { url = "https://files.pythonhosted.org/packages/33/6d/737d164b4837a9bbd202f5ae3078975f0525a55730fe871d8ed4e3b952b0/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_x86_64.whl", hash = "sha256:4eb01c08e859bf924d222250d2e8f8b8ff6d3db4721288cf35d14252a4d933c8", size = 10715597, upload-time = "2025-09-04T08:26:51.312Z" }, ] [[package]] @@ -3331,8 +3327,8 @@ name = "nvidia-cuda-nvrtc" version = "13.0.88" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c3/68/483a78f5e8f31b08fb1bb671559968c0ca3a065ac7acabfc7cee55214fd6/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:ad9b6d2ead2435f11cbb6868809d2adeeee302e9bb94bcf0539c7a40d80e8575", upload-time = "2025-09-04T08:28:44.204Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/dc/6bb80850e0b7edd6588d560758f17e0550893a1feaf436807d64d2da040f/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d27f20a0ca67a4bb34268a5e951033496c5b74870b868bacd046b1b8e0c3267b", upload-time = "2025-09-04T08:28:20.239Z" }, + { url = "https://files.pythonhosted.org/packages/c3/68/483a78f5e8f31b08fb1bb671559968c0ca3a065ac7acabfc7cee55214fd6/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:ad9b6d2ead2435f11cbb6868809d2adeeee302e9bb94bcf0539c7a40d80e8575", size = 90215200, upload-time = "2025-09-04T08:28:44.204Z" }, + { url = "https://files.pythonhosted.org/packages/b7/dc/6bb80850e0b7edd6588d560758f17e0550893a1feaf436807d64d2da040f/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d27f20a0ca67a4bb34268a5e951033496c5b74870b868bacd046b1b8e0c3267b", size = 43015449, upload-time = "2025-09-04T08:28:20.239Z" }, ] [[package]] @@ -3340,8 +3336,8 @@ name = "nvidia-cuda-runtime" version = "13.0.96" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/87/4f/17d7b9b8e285199c58ce28e31b5c5bbaa4d8271af06a89b6405258245de2/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef9bcbe90493a2b9d810e43d249adb3d02e98dd30200d86607d8d02687c43f55", upload-time = "2025-10-09T08:55:15.78Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2e/24/d1558f3b68b1d26e706813b1d10aa1d785e4698c425af8db8edc3dced472/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f82250d7782aa23b6cfe765ecc7db554bd3c2870c43f3d1821f1d18aebf0548", upload-time = "2025-10-09T08:55:36.117Z" }, + { url = "https://files.pythonhosted.org/packages/87/4f/17d7b9b8e285199c58ce28e31b5c5bbaa4d8271af06a89b6405258245de2/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef9bcbe90493a2b9d810e43d249adb3d02e98dd30200d86607d8d02687c43f55", size = 2261060, upload-time = "2025-10-09T08:55:15.78Z" }, + { url = "https://files.pythonhosted.org/packages/2e/24/d1558f3b68b1d26e706813b1d10aa1d785e4698c425af8db8edc3dced472/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f82250d7782aa23b6cfe765ecc7db554bd3c2870c43f3d1821f1d18aebf0548", size = 2243632, upload-time = "2025-10-09T08:55:36.117Z" }, ] [[package]] @@ -3352,8 +3348,8 @@ dependencies = [ { name = "nvidia-cublas" }, ] wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/84/26025437c1e6b61a707442184fa0c03d083b661adf3a3eecfd6d21677740/nvidia_cudnn_cu13-9.19.0.56-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:6ed29ffaee1176c612daf442e4dd6cfeb6a0caa43ddcbeb59da94953030b1be4", upload-time = "2026-02-03T20:40:53.805Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a3/22/0b4b932655d17a6da1b92fa92ab12844b053bb2ac2475e179ba6f043da1e/nvidia_cudnn_cu13-9.19.0.56-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:d20e1734305e9d68889a96e3f35094d733ff1f83932ebe462753973e53a572bf", upload-time = "2026-02-03T20:44:52.837Z" }, + { url = "https://files.pythonhosted.org/packages/f1/84/26025437c1e6b61a707442184fa0c03d083b661adf3a3eecfd6d21677740/nvidia_cudnn_cu13-9.19.0.56-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:6ed29ffaee1176c612daf442e4dd6cfeb6a0caa43ddcbeb59da94953030b1be4", size = 433781201, upload-time = "2026-02-03T20:40:53.805Z" }, + { url = "https://files.pythonhosted.org/packages/a3/22/0b4b932655d17a6da1b92fa92ab12844b053bb2ac2475e179ba6f043da1e/nvidia_cudnn_cu13-9.19.0.56-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:d20e1734305e9d68889a96e3f35094d733ff1f83932ebe462753973e53a572bf", size = 366066321, upload-time = "2026-02-03T20:44:52.837Z" }, ] [[package]] @@ -3364,8 +3360,8 @@ dependencies = [ { name = "nvidia-nvjitlink" }, ] wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/ae/f417a75c0259e85c1d2f83ca4e960289a5f814ed0cea74d18c353d3e989d/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2708c852ef8cd89d1d2068bdbece0aa188813a0c934db3779b9b1faa8442e5f5", upload-time = "2025-09-04T08:31:38.196Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a8/2f/7b57e29836ea8714f81e9898409196f47d772d5ddedddf1592eadb8ab743/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c44f692dce8fd5ffd3e3df134b6cdb9c2f72d99cf40b62c32dde45eea9ddad3", upload-time = "2025-09-04T08:31:56.044Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ae/f417a75c0259e85c1d2f83ca4e960289a5f814ed0cea74d18c353d3e989d/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2708c852ef8cd89d1d2068bdbece0aa188813a0c934db3779b9b1faa8442e5f5", size = 214053554, upload-time = "2025-09-04T08:31:38.196Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2f/7b57e29836ea8714f81e9898409196f47d772d5ddedddf1592eadb8ab743/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c44f692dce8fd5ffd3e3df134b6cdb9c2f72d99cf40b62c32dde45eea9ddad3", size = 214085489, upload-time = "2025-09-04T08:31:56.044Z" }, ] [[package]] @@ -3373,8 +3369,8 @@ name = "nvidia-cufile" version = "1.15.1.6" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/3f/70/4f193de89a48b71714e74602ee14d04e4019ad36a5a9f20c425776e72cd6/nvidia_cufile-1.15.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08a3ecefae5a01c7f5117351c64f17c7c62efa5fffdbe24fc7d298da19cd0b44", upload-time = "2025-09-04T08:32:22.779Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ab/73/cc4a14c9813a8a0d509417cf5f4bdaba76e924d58beb9864f5a7baceefbf/nvidia_cufile-1.15.1.6-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:bdc0deedc61f548bddf7733bdc216456c2fdb101d020e1ab4b88d232d5e2f6d1", upload-time = "2025-09-04T08:32:14.119Z" }, + { url = "https://files.pythonhosted.org/packages/3f/70/4f193de89a48b71714e74602ee14d04e4019ad36a5a9f20c425776e72cd6/nvidia_cufile-1.15.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08a3ecefae5a01c7f5117351c64f17c7c62efa5fffdbe24fc7d298da19cd0b44", size = 1223672, upload-time = "2025-09-04T08:32:22.779Z" }, + { url = "https://files.pythonhosted.org/packages/ab/73/cc4a14c9813a8a0d509417cf5f4bdaba76e924d58beb9864f5a7baceefbf/nvidia_cufile-1.15.1.6-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:bdc0deedc61f548bddf7733bdc216456c2fdb101d020e1ab4b88d232d5e2f6d1", size = 1136992, upload-time = "2025-09-04T08:32:14.119Z" }, ] [[package]] @@ -3382,8 +3378,8 @@ name = "nvidia-curand" version = "10.4.0.35" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/1e/72/7c2ae24fb6b63a32e6ae5d241cc65263ea18d08802aaae087d9f013335a2/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:133df5a7509c3e292aaa2b477afd0194f06ce4ea24d714d616ff36439cee349a", upload-time = "2025-08-04T10:21:41.128Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a5/9f/be0a41ca4a4917abf5cb9ae0daff1a6060cc5de950aec0396de9f3b52bc5/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:1aee33a5da6e1db083fe2b90082def8915f30f3248d5896bcec36a579d941bfc", upload-time = "2025-08-04T10:22:03.992Z" }, + { url = "https://files.pythonhosted.org/packages/1e/72/7c2ae24fb6b63a32e6ae5d241cc65263ea18d08802aaae087d9f013335a2/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:133df5a7509c3e292aaa2b477afd0194f06ce4ea24d714d616ff36439cee349a", size = 61962106, upload-time = "2025-08-04T10:21:41.128Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9f/be0a41ca4a4917abf5cb9ae0daff1a6060cc5de950aec0396de9f3b52bc5/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:1aee33a5da6e1db083fe2b90082def8915f30f3248d5896bcec36a579d941bfc", size = 59544258, upload-time = "2025-08-04T10:22:03.992Z" }, ] [[package]] @@ -3396,8 +3392,8 @@ dependencies = [ { name = "nvidia-nvjitlink" }, ] wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c8/c3/b30c9e935fc01e3da443ec0116ed1b2a009bb867f5324d3f2d7e533e776b/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:02c2457eaa9e39de20f880f4bd8820e6a1cfb9f9a34f820eb12a155aa5bc92d2", upload-time = "2025-09-04T08:33:04.222Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/67/cba3777620cdacb99102da4042883709c41c709f4b6323c10781a9c3aa34/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0a759da5dea5c0ea10fd307de75cdeb59e7ea4fcb8add0924859b944babf1112", upload-time = "2025-09-04T08:33:22.767Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c3/b30c9e935fc01e3da443ec0116ed1b2a009bb867f5324d3f2d7e533e776b/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:02c2457eaa9e39de20f880f4bd8820e6a1cfb9f9a34f820eb12a155aa5bc92d2", size = 223467760, upload-time = "2025-09-04T08:33:04.222Z" }, + { url = "https://files.pythonhosted.org/packages/5f/67/cba3777620cdacb99102da4042883709c41c709f4b6323c10781a9c3aa34/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0a759da5dea5c0ea10fd307de75cdeb59e7ea4fcb8add0924859b944babf1112", size = 200941980, upload-time = "2025-09-04T08:33:22.767Z" }, ] [[package]] @@ -3408,8 +3404,8 @@ dependencies = [ { name = "nvidia-nvjitlink" }, ] wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/94/5c26f33738ae35276672f12615a64bd008ed5be6d1ebcb23579285d960a9/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:80bcc4662f23f1054ee334a15c72b8940402975e0eab63178fc7e670aa59472c", upload-time = "2025-09-04T08:33:42.864Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fa/18/623c77619c31d62efd55302939756966f3ecc8d724a14dab2b75f1508850/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b3c89c88d01ee0e477cb7f82ef60a11a4bcd57b6b87c33f789350b59759360b", upload-time = "2025-09-04T08:33:58.029Z" }, + { url = "https://files.pythonhosted.org/packages/f8/94/5c26f33738ae35276672f12615a64bd008ed5be6d1ebcb23579285d960a9/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:80bcc4662f23f1054ee334a15c72b8940402975e0eab63178fc7e670aa59472c", size = 162155568, upload-time = "2025-09-04T08:33:42.864Z" }, + { url = "https://files.pythonhosted.org/packages/fa/18/623c77619c31d62efd55302939756966f3ecc8d724a14dab2b75f1508850/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b3c89c88d01ee0e477cb7f82ef60a11a4bcd57b6b87c33f789350b59759360b", size = 145942937, upload-time = "2025-09-04T08:33:58.029Z" }, ] [[package]] @@ -3417,8 +3413,8 @@ name = "nvidia-cusparselt-cu13" version = "0.8.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/46/10/8dcd1175260706a2fc92a16a52e306b71d4c1ea0b0cc4a9484183399818a/nvidia_cusparselt_cu13-0.8.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:400c6ed1cf6780fc6efedd64ec9f1345871767e6a1a0a552a1ea0578117ea77c", upload-time = "2025-08-13T19:22:40.982Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/53/43b0d71f4e702fa9733f8b4571fdca50a8813f1e450b656c239beff12315/nvidia_cusparselt_cu13-0.8.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:25e30a8a7323935d4ad0340b95a0b69926eee755767e8e0b1cf8dd85b197d3fd", upload-time = "2025-08-13T19:23:41.967Z" }, + { url = "https://files.pythonhosted.org/packages/46/10/8dcd1175260706a2fc92a16a52e306b71d4c1ea0b0cc4a9484183399818a/nvidia_cusparselt_cu13-0.8.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:400c6ed1cf6780fc6efedd64ec9f1345871767e6a1a0a552a1ea0578117ea77c", size = 220791277, upload-time = "2025-08-13T19:22:40.982Z" }, + { url = "https://files.pythonhosted.org/packages/fd/53/43b0d71f4e702fa9733f8b4571fdca50a8813f1e450b656c239beff12315/nvidia_cusparselt_cu13-0.8.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:25e30a8a7323935d4ad0340b95a0b69926eee755767e8e0b1cf8dd85b197d3fd", size = 169884119, upload-time = "2025-08-13T19:23:41.967Z" }, ] [[package]] @@ -3426,8 +3422,8 @@ name = "nvidia-nccl-cu13" version = "2.28.9" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/39/55/1920646a2e43ffd4fc958536b276197ed740e9e0c54105b4bb3521591fc7/nvidia_nccl_cu13-2.28.9-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:01c873ba1626b54caa12272ed228dc5b2781545e0ae8ba3f432a8ef1c6d78643", upload-time = "2025-11-18T05:49:03.45Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/b4/878fefaad5b2bcc6fcf8d474a25e3e3774bc5133e4b58adff4d0bca238bc/nvidia_nccl_cu13-2.28.9-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:e4553a30f34195f3fa1da02a6da3d6337d28f2003943aa0a3d247bbc25fefc42", upload-time = "2025-11-18T05:49:17.677Z" }, + { url = "https://files.pythonhosted.org/packages/39/55/1920646a2e43ffd4fc958536b276197ed740e9e0c54105b4bb3521591fc7/nvidia_nccl_cu13-2.28.9-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:01c873ba1626b54caa12272ed228dc5b2781545e0ae8ba3f432a8ef1c6d78643", size = 196561677, upload-time = "2025-11-18T05:49:03.45Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b4/878fefaad5b2bcc6fcf8d474a25e3e3774bc5133e4b58adff4d0bca238bc/nvidia_nccl_cu13-2.28.9-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:e4553a30f34195f3fa1da02a6da3d6337d28f2003943aa0a3d247bbc25fefc42", size = 196493177, upload-time = "2025-11-18T05:49:17.677Z" }, ] [[package]] @@ -3435,8 +3431,8 @@ name = "nvidia-nvjitlink" version = "13.0.88" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/56/7a/123e033aaff487c77107195fa5a2b8686795ca537935a24efae476c41f05/nvidia_nvjitlink-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:13a74f429e23b921c1109976abefacc69835f2f433ebd323d3946e11d804e47b", upload-time = "2025-09-04T08:35:43.553Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ab/2c/93c5250e64df4f894f1cbb397c6fd71f79813f9fd79d7cd61de3f97b3c2d/nvidia_nvjitlink-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e931536ccc7d467a98ba1d8b89ff7fa7f1fa3b13f2b0069118cd7f47bff07d0c", upload-time = "2025-09-04T08:35:20.008Z" }, + { url = "https://files.pythonhosted.org/packages/56/7a/123e033aaff487c77107195fa5a2b8686795ca537935a24efae476c41f05/nvidia_nvjitlink-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:13a74f429e23b921c1109976abefacc69835f2f433ebd323d3946e11d804e47b", size = 40713933, upload-time = "2025-09-04T08:35:43.553Z" }, + { url = "https://files.pythonhosted.org/packages/ab/2c/93c5250e64df4f894f1cbb397c6fd71f79813f9fd79d7cd61de3f97b3c2d/nvidia_nvjitlink-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e931536ccc7d467a98ba1d8b89ff7fa7f1fa3b13f2b0069118cd7f47bff07d0c", size = 38768748, upload-time = "2025-09-04T08:35:20.008Z" }, ] [[package]] @@ -3444,8 +3440,8 @@ name = "nvidia-nvshmem-cu13" version = "3.4.5" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/dc/0f/05cc9c720236dcd2db9c1ab97fff629e96821be2e63103569da0c9b72f19/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dc2a197f38e5d0376ad52cd1a2a3617d3cdc150fd5966f4aee9bcebb1d68fe9", upload-time = "2025-09-06T00:32:20.022Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3c/35/a9bf80a609e74e3b000fef598933235c908fcefcef9026042b8e6dfde2a9/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:290f0a2ee94c9f3687a02502f3b9299a9f9fe826e6d0287ee18482e78d495b80", upload-time = "2025-09-06T00:32:41.564Z" }, + { url = "https://files.pythonhosted.org/packages/dc/0f/05cc9c720236dcd2db9c1ab97fff629e96821be2e63103569da0c9b72f19/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dc2a197f38e5d0376ad52cd1a2a3617d3cdc150fd5966f4aee9bcebb1d68fe9", size = 60215947, upload-time = "2025-09-06T00:32:20.022Z" }, + { url = "https://files.pythonhosted.org/packages/3c/35/a9bf80a609e74e3b000fef598933235c908fcefcef9026042b8e6dfde2a9/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:290f0a2ee94c9f3687a02502f3b9299a9f9fe826e6d0287ee18482e78d495b80", size = 60412546, upload-time = "2025-09-06T00:32:41.564Z" }, ] [[package]] @@ -3453,22 +3449,22 @@ name = "nvidia-nvtx" version = "13.0.85" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/f3/d86c845465a2723ad7e1e5c36dcd75ddb82898b3f53be47ebd429fb2fa5d/nvidia_nvtx-13.0.85-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4936d1d6780fbe68db454f5e72a42ff64d1fd6397df9f363ae786930fd5c1cd4", upload-time = "2025-09-04T08:29:01.761Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a8/64/3708a90d1ebe202ffdeb7185f878a3c84d15c2b2c31858da2ce0583e2def/nvidia_nvtx-13.0.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb7780edb6b14107373c835bf8b72e7a178bac7367e23da7acb108f973f157a6", upload-time = "2025-09-04T08:28:53.627Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f3/d86c845465a2723ad7e1e5c36dcd75ddb82898b3f53be47ebd429fb2fa5d/nvidia_nvtx-13.0.85-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4936d1d6780fbe68db454f5e72a42ff64d1fd6397df9f363ae786930fd5c1cd4", size = 148047, upload-time = "2025-09-04T08:29:01.761Z" }, + { url = "https://files.pythonhosted.org/packages/a8/64/3708a90d1ebe202ffdeb7185f878a3c84d15c2b2c31858da2ce0583e2def/nvidia_nvtx-13.0.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb7780edb6b14107373c835bf8b72e7a178bac7367e23da7acb108f973f157a6", size = 148878, upload-time = "2025-09-04T08:28:53.627Z" }, ] [[package]] name = "oauthlib" version = "3.3.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", upload-time = "2025-06-19T22:48:08.269Z" } +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://pypi-proxy.dev.databricks.com/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", upload-time = "2025-06-19T22:48:06.508Z" }, + { 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 = "ontobricks" -version = "0.6.0" +version = "0.5.0" source = { editable = "." } dependencies = [ { name = "aiofiles" }, @@ -3546,9 +3542,9 @@ requires-dist = [ { name = "fastapi", specifier = ">=0.129.0" }, { name = "itsdangerous", specifier = ">=2.1.0" }, { name = "jinja2", specifier = ">=3.1.0" }, - { name = "mlflow", specifier = ">=3.13.0" }, + { name = "mlflow", specifier = ">=3.11.1" }, { name = "networkx", specifier = ">=3.0" }, - { name = "nltk", marker = "extra == 'pitfalls'", specifier = ">=3.9.4" }, + { name = "nltk", marker = "extra == 'pitfalls'", specifier = ">=3.8.0" }, { name = "owlrl", specifier = ">=7.0.0" }, { name = "psycopg", extras = ["binary"], marker = "extra == 'lakebase'", specifier = ">=3.2.0" }, { name = "psycopg-pool", marker = "extra == 'lakebase'", specifier = ">=3.2.0" }, @@ -3557,13 +3553,13 @@ requires-dist = [ { name = "pydantic-settings", specifier = ">=2.1.0" }, { name = "pyshacl", specifier = ">=0.26.0" }, { name = "python-dotenv", specifier = ">=1.2.2" }, - { name = "python-multipart", specifier = ">=0.0.30" }, + { name = "python-multipart", specifier = ">=0.0.27" }, { name = "rdflib", specifier = ">=7.6.0" }, { name = "requests", specifier = ">=2.33.0" }, { name = "scikit-learn", marker = "extra == 'pitfalls'", specifier = ">=1.3.0" }, { name = "scipy", marker = "extra == 'pitfalls'", specifier = ">=1.11.0" }, { name = "sentence-transformers", marker = "extra == 'pitfalls'", specifier = ">=3.0.0" }, - { name = "starlette", specifier = ">=1.3.0" }, + { name = "starlette", specifier = ">=1.0.1" }, { name = "strawberry-graphql", extras = ["fastapi"], specifier = ">=0.315.7" }, { name = "uvicorn", extras = ["standard"], specifier = ">=0.27.0" }, ] @@ -3601,9 +3597,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "pydantic" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/02/2e/58d83848dd1a79cb92ed8e63f6ba901ca282c5f09d04af9423ec26c56fd7/openapi_pydantic-0.5.1.tar.gz", hash = "sha256:ff6835af6bde7a459fb93eb93bb92b8749b754fc6e51b2f1590a19dc3005ee0d", upload-time = "2025-01-08T19:29:27.083Z" } +sdist = { url = "https://files.pythonhosted.org/packages/02/2e/58d83848dd1a79cb92ed8e63f6ba901ca282c5f09d04af9423ec26c56fd7/openapi_pydantic-0.5.1.tar.gz", hash = "sha256:ff6835af6bde7a459fb93eb93bb92b8749b754fc6e51b2f1590a19dc3005ee0d", size = 60892, upload-time = "2025-01-08T19:29:27.083Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/12/cf/03675d8bd8ecbf4445504d8071adab19f5f993676795708e36402ab38263/openapi_pydantic-0.5.1-py3-none-any.whl", hash = "sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146", upload-time = "2025-01-08T19:29:25.275Z" }, + { url = "https://files.pythonhosted.org/packages/12/cf/03675d8bd8ecbf4445504d8071adab19f5f993676795708e36402ab38263/openapi_pydantic-0.5.1-py3-none-any.whl", hash = "sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146", size = 96381, upload-time = "2025-01-08T19:29:25.275Z" }, ] [[package]] @@ -3613,9 +3609,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "et-xmlfile" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", upload-time = "2024-06-28T14:03:44.161Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/f9/88d94a75de065ea32619465d2f77b29a0469500e99012523b91cc4141cd1/openpyxl-3.1.5.tar.gz", hash = "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050", size = 186464, upload-time = "2024-06-28T14:03:44.161Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", upload-time = "2024-06-28T14:03:41.161Z" }, + { url = "https://files.pythonhosted.org/packages/c0/da/977ded879c29cbd04de313843e76868e6e13408a94ed6b987245dc7c8506/openpyxl-3.1.5-py2.py3-none-any.whl", hash = "sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2", size = 250910, upload-time = "2024-06-28T14:03:41.161Z" }, ] [[package]] @@ -3626,9 +3622,9 @@ dependencies = [ { name = "importlib-metadata" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/97/b9/3161be15bb8e3ad01be8be5a968a9237c3027c5be504362ff800fca3e442/opentelemetry_api-1.39.1.tar.gz", hash = "sha256:fbde8c80e1b937a2c61f20347e91c0c18a1940cecf012d62e65a7caf08967c9c", upload-time = "2025-12-11T13:32:39.182Z" } +sdist = { url = "https://files.pythonhosted.org/packages/97/b9/3161be15bb8e3ad01be8be5a968a9237c3027c5be504362ff800fca3e442/opentelemetry_api-1.39.1.tar.gz", hash = "sha256:fbde8c80e1b937a2c61f20347e91c0c18a1940cecf012d62e65a7caf08967c9c", size = 65767, upload-time = "2025-12-11T13:32:39.182Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/df/d3f1ddf4bb4cb50ed9b1139cc7b1c54c34a1e7ce8fd1b9a37c0d1551a6bd/opentelemetry_api-1.39.1-py3-none-any.whl", hash = "sha256:2edd8463432a7f8443edce90972169b195e7d6a05500cd29e6d13898187c9950", upload-time = "2025-12-11T13:32:17.304Z" }, + { url = "https://files.pythonhosted.org/packages/cf/df/d3f1ddf4bb4cb50ed9b1139cc7b1c54c34a1e7ce8fd1b9a37c0d1551a6bd/opentelemetry_api-1.39.1-py3-none-any.whl", hash = "sha256:2edd8463432a7f8443edce90972169b195e7d6a05500cd29e6d13898187c9950", size = 66356, upload-time = "2025-12-11T13:32:17.304Z" }, ] [[package]] @@ -3638,9 +3634,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "protobuf" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/49/1d/f25d76d8260c156c40c97c9ed4511ec0f9ce353f8108ca6e7561f82a06b2/opentelemetry_proto-1.39.1.tar.gz", hash = "sha256:6c8e05144fc0d3ed4d22c2289c6b126e03bcd0e6a7da0f16cedd2e1c2772e2c8", upload-time = "2025-12-11T13:32:48.681Z" } +sdist = { url = "https://files.pythonhosted.org/packages/49/1d/f25d76d8260c156c40c97c9ed4511ec0f9ce353f8108ca6e7561f82a06b2/opentelemetry_proto-1.39.1.tar.gz", hash = "sha256:6c8e05144fc0d3ed4d22c2289c6b126e03bcd0e6a7da0f16cedd2e1c2772e2c8", size = 46152, upload-time = "2025-12-11T13:32:48.681Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/51/95/b40c96a7b5203005a0b03d8ce8cd212ff23f1793d5ba289c87a097571b18/opentelemetry_proto-1.39.1-py3-none-any.whl", hash = "sha256:22cdc78efd3b3765d09e68bfbd010d4fc254c9818afd0b6b423387d9dee46007", upload-time = "2025-12-11T13:32:33.866Z" }, + { url = "https://files.pythonhosted.org/packages/51/95/b40c96a7b5203005a0b03d8ce8cd212ff23f1793d5ba289c87a097571b18/opentelemetry_proto-1.39.1-py3-none-any.whl", hash = "sha256:22cdc78efd3b3765d09e68bfbd010d4fc254c9818afd0b6b423387d9dee46007", size = 72535, upload-time = "2025-12-11T13:32:33.866Z" }, ] [[package]] @@ -3652,9 +3648,9 @@ dependencies = [ { name = "opentelemetry-semantic-conventions" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/eb/fb/c76080c9ba07e1e8235d24cdcc4d125ef7aa3edf23eb4e497c2e50889adc/opentelemetry_sdk-1.39.1.tar.gz", hash = "sha256:cf4d4563caf7bff906c9f7967e2be22d0d6b349b908be0d90fb21c8e9c995cc6", upload-time = "2025-12-11T13:32:49.369Z" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/fb/c76080c9ba07e1e8235d24cdcc4d125ef7aa3edf23eb4e497c2e50889adc/opentelemetry_sdk-1.39.1.tar.gz", hash = "sha256:cf4d4563caf7bff906c9f7967e2be22d0d6b349b908be0d90fb21c8e9c995cc6", size = 171460, upload-time = "2025-12-11T13:32:49.369Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/7c/98/e91cf858f203d86f4eccdf763dcf01cf03f1dae80c3750f7e635bfa206b6/opentelemetry_sdk-1.39.1-py3-none-any.whl", hash = "sha256:4d5482c478513ecb0a5d938dcc61394e647066e0cc2676bee9f3af3f3f45f01c", upload-time = "2025-12-11T13:32:35.069Z" }, + { url = "https://files.pythonhosted.org/packages/7c/98/e91cf858f203d86f4eccdf763dcf01cf03f1dae80c3750f7e635bfa206b6/opentelemetry_sdk-1.39.1-py3-none-any.whl", hash = "sha256:4d5482c478513ecb0a5d938dcc61394e647066e0cc2676bee9f3af3f3f45f01c", size = 132565, upload-time = "2025-12-11T13:32:35.069Z" }, ] [[package]] @@ -3665,9 +3661,9 @@ dependencies = [ { name = "opentelemetry-api" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/91/df/553f93ed38bf22f4b999d9be9c185adb558982214f33eae539d3b5cd0858/opentelemetry_semantic_conventions-0.60b1.tar.gz", hash = "sha256:87c228b5a0669b748c76d76df6c364c369c28f1c465e50f661e39737e84bc953", upload-time = "2025-12-11T13:32:50.487Z" } +sdist = { url = "https://files.pythonhosted.org/packages/91/df/553f93ed38bf22f4b999d9be9c185adb558982214f33eae539d3b5cd0858/opentelemetry_semantic_conventions-0.60b1.tar.gz", hash = "sha256:87c228b5a0669b748c76d76df6c364c369c28f1c465e50f661e39737e84bc953", size = 137935, upload-time = "2025-12-11T13:32:50.487Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/5e/5958555e09635d09b75de3c4f8b9cae7335ca545d77392ffe7331534c402/opentelemetry_semantic_conventions-0.60b1-py3-none-any.whl", hash = "sha256:9fa8c8b0c110da289809292b0591220d3a7b53c1526a23021e977d68597893fb", upload-time = "2025-12-11T13:32:36.955Z" }, + { url = "https://files.pythonhosted.org/packages/7a/5e/5958555e09635d09b75de3c4f8b9cae7335ca545d77392ffe7331534c402/opentelemetry_semantic_conventions-0.60b1-py3-none-any.whl", hash = "sha256:9fa8c8b0c110da289809292b0591220d3a7b53c1526a23021e977d68597893fb", size = 219982, upload-time = "2025-12-11T13:32:36.955Z" }, ] [[package]] @@ -3677,27 +3673,27 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "rdflib" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/d1/fc/ce12482d096d65fff01af58f555a6f25e9dbf416fad5d99f91eaab0e11ca/owlrl-7.1.4.tar.gz", hash = "sha256:60bd4067e346b9111f0a2924565afe97ac6595b98b2bbe953928b5113971daf7", upload-time = "2025-07-29T00:17:27.608Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d1/fc/ce12482d096d65fff01af58f555a6f25e9dbf416fad5d99f91eaab0e11ca/owlrl-7.1.4.tar.gz", hash = "sha256:60bd4067e346b9111f0a2924565afe97ac6595b98b2bbe953928b5113971daf7", size = 44420, upload-time = "2025-07-29T00:17:27.608Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/de/78/f857ff1a7207e967dc5e8414bbcc15e0aa5cf45f693b1d2ebe2afb3eb1ce/owlrl-7.1.4-py3-none-any.whl", hash = "sha256:e78b46020169783345636da93a467d318f18700c483184dd15e885850cf64775", upload-time = "2025-07-29T00:17:26.229Z" }, + { url = "https://files.pythonhosted.org/packages/de/78/f857ff1a7207e967dc5e8414bbcc15e0aa5cf45f693b1d2ebe2afb3eb1ce/owlrl-7.1.4-py3-none-any.whl", hash = "sha256:e78b46020169783345636da93a467d318f18700c483184dd15e885850cf64775", size = 51981, upload-time = "2025-07-29T00:17:26.229Z" }, ] [[package]] name = "packageurl-python" version = "0.17.6" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/f5/d6/3b5a4e3cfaef7a53869a26ceb034d1ff5e5c27c814ce77260a96d50ab7bb/packageurl_python-0.17.6.tar.gz", hash = "sha256:1252ce3a102372ca6f86eb968e16f9014c4ba511c5c37d95a7f023e2ca6e5c25", upload-time = "2025-11-24T15:20:17.998Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/d6/3b5a4e3cfaef7a53869a26ceb034d1ff5e5c27c814ce77260a96d50ab7bb/packageurl_python-0.17.6.tar.gz", hash = "sha256:1252ce3a102372ca6f86eb968e16f9014c4ba511c5c37d95a7f023e2ca6e5c25", size = 50618, upload-time = "2025-11-24T15:20:17.998Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/b1/2f/c7277b7615a93f51b5fbc1eacfc1b75e8103370e786fd8ce2abf6e5c04ab/packageurl_python-0.17.6-py3-none-any.whl", hash = "sha256:31a85c2717bc41dd818f3c62908685ff9eebcb68588213745b14a6ee9e7df7c9", upload-time = "2025-11-24T15:20:16.962Z" }, + { url = "https://files.pythonhosted.org/packages/b1/2f/c7277b7615a93f51b5fbc1eacfc1b75e8103370e786fd8ce2abf6e5c04ab/packageurl_python-0.17.6-py3-none-any.whl", hash = "sha256:31a85c2717bc41dd818f3c62908685ff9eebcb68588213745b14a6ee9e7df7c9", size = 36776, upload-time = "2025-11-24T15:20:16.962Z" }, ] [[package]] name = "packaging" version = "25.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", upload-time = "2025-04-19T11:48:59.673Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", upload-time = "2025-04-19T11:48:57.875Z" }, + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] [[package]] @@ -3711,180 +3707,180 @@ dependencies = [ { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", upload-time = "2025-09-29T23:34:51.853Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/f7/f425a00df4fcc22b292c6895c6831c0c8ae1d9fac1e024d16f98a9ce8749/pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", upload-time = "2025-09-29T23:16:53.287Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/13/4f/66d99628ff8ce7857aca52fed8f0066ce209f96be2fede6cef9f84e8d04f/pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", upload-time = "2025-09-29T23:17:04.522Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1d/03/3fc4a529a7710f890a239cc496fc6d50ad4a0995657dccc1d64695adb9f4/pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", upload-time = "2025-09-29T23:17:18.444Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/a8/4dac1f8f8235e5d25b9955d02ff6f29396191d4e665d71122c3722ca83c5/pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", upload-time = "2025-09-29T23:17:35.846Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/91/82cc5169b6b25440a7fc0ef3a694582418d875c8e3ebf796a6d6470aa578/pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", upload-time = "2025-09-29T23:17:49.341Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/10/ae/89b3283800ab58f7af2952704078555fa60c807fff764395bb57ea0b0dbd/pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", upload-time = "2025-09-29T23:18:03.722Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/85/72/530900610650f54a35a19476eca5104f38555afccda1aa11a92ee14cb21d/pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", upload-time = "2025-09-29T23:18:18.505Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", upload-time = "2025-09-29T23:18:30.065Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", upload-time = "2025-09-29T23:38:56.071Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", upload-time = "2025-09-29T23:18:41.627Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", upload-time = "2025-09-29T23:18:56.834Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", upload-time = "2025-09-29T23:19:09.247Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", upload-time = "2025-09-29T23:19:25.342Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", upload-time = "2025-09-29T23:19:38.296Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", upload-time = "2025-09-29T23:19:48.856Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", upload-time = "2025-09-29T23:39:08.659Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", upload-time = "2025-09-29T23:19:59.765Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", upload-time = "2025-09-29T23:20:14.098Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", upload-time = "2025-09-29T23:20:26.76Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", upload-time = "2025-09-29T23:20:41.344Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", upload-time = "2025-09-29T23:20:54.139Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", upload-time = "2025-09-29T23:21:05.024Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", upload-time = "2025-09-29T23:21:15.979Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", upload-time = "2025-09-29T23:21:27.165Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", upload-time = "2025-09-29T23:21:40.532Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", upload-time = "2025-09-29T23:21:55.77Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", upload-time = "2025-09-29T23:22:10.109Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", upload-time = "2025-09-29T23:25:04.889Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", upload-time = "2025-09-29T23:22:24.343Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", upload-time = "2025-09-29T23:22:37.762Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", upload-time = "2025-09-29T23:22:51.688Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", upload-time = "2025-09-29T23:23:05.042Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", upload-time = "2025-09-29T23:23:28.57Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", upload-time = "2025-09-29T23:24:24.876Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", upload-time = "2025-09-29T23:25:52.486Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", upload-time = "2025-09-29T23:26:33.204Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", upload-time = "2025-09-29T23:27:15.384Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", upload-time = "2025-09-29T23:27:51.625Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", upload-time = "2025-09-29T23:28:21.289Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", upload-time = "2025-09-29T23:28:58.261Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", upload-time = "2025-09-29T23:32:27.484Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", upload-time = "2025-09-29T23:29:31.47Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", upload-time = "2025-09-29T23:29:54.591Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", upload-time = "2025-09-29T23:30:21.003Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", upload-time = "2025-09-29T23:30:43.391Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", upload-time = "2025-09-29T23:31:10.009Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", upload-time = "2025-09-29T23:31:59.173Z" }, +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" }, + { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, + { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, + { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, + { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, + { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, + { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, + { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, + { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, + { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, + { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, + { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, + { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, + { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, + { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, + { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, + { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, ] [[package]] name = "pathable" version = "0.6.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/66/f3/5a20387de9bcd0607871bfc2198ee0e15836da7baa4592ccd7f24c27c986/pathable-0.6.0.tar.gz", hash = "sha256:6404b8b82aef5ff0fd478934137128b99b12212ba35afdde5525ca4f8388ea58", upload-time = "2026-05-19T18:15:11.911Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/f3/5a20387de9bcd0607871bfc2198ee0e15836da7baa4592ccd7f24c27c986/pathable-0.6.0.tar.gz", hash = "sha256:6404b8b82aef5ff0fd478934137128b99b12212ba35afdde5525ca4f8388ea58", size = 18970, upload-time = "2026-05-19T18:15:11.911Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/a2/e8/6d75ffd9784bce2e93d1ae4415649427e39a53bb172d4672b2b59c6f0a7b/pathable-0.6.0-py3-none-any.whl", hash = "sha256:82c4ca6c98c502ad12e0d4e9779b6210afee93c38990988c8c5d1b49bdcdf566", upload-time = "2026-05-19T18:15:10.728Z" }, + { url = "https://files.pythonhosted.org/packages/a2/e8/6d75ffd9784bce2e93d1ae4415649427e39a53bb172d4672b2b59c6f0a7b/pathable-0.6.0-py3-none-any.whl", hash = "sha256:82c4ca6c98c502ad12e0d4e9779b6210afee93c38990988c8c5d1b49bdcdf566", size = 18983, upload-time = "2026-05-19T18:15:10.728Z" }, ] [[package]] name = "pathspec" version = "1.0.4" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", upload-time = "2026-01-27T03:59:46.938Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", upload-time = "2026-01-27T03:59:45.137Z" }, + { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, ] [[package]] name = "pillow" version = "12.2.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", upload-time = "2026-04-01T14:46:17.687Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/3a/aa/d0b28e1c811cd4d5f5c2bfe2e022292bd255ae5744a3b9ac7d6c8f72dd75/pillow-12.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a4e8f36e677d3336f35089648c8955c51c6d386a13cf6ee9c189c5f5bd713a9f", upload-time = "2026-04-01T14:42:15.402Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/27/8e/1d5b39b8ae2bd7650d0c7b6abb9602d16043ead9ebbfef4bc4047454da2a/pillow-12.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e589959f10d9824d39b350472b92f0ce3b443c0a3442ebf41c40cb8361c5b97", upload-time = "2026-04-01T14:42:18.234Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f0/c5/dcb7a6ca6b7d3be41a76958e90018d56c8462166b3ef223150360850c8da/pillow-12.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a52edc8bfff4429aaabdf4d9ee0daadbbf8562364f940937b941f87a4290f5ff", upload-time = "2026-04-01T14:42:20.608Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ea/f1/aa1bb13b2f4eba914e9637893c73f2af8e48d7d4023b9d3750d4c5eb2d0c/pillow-12.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:975385f4776fafde056abb318f612ef6285b10a1f12b8570f3647ad0d74b48ec", upload-time = "2026-04-01T14:42:23.095Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a1/2a/8c79d6a53169937784604a8ae8d77e45888c41537f7f6f65ed1f407fe66d/pillow-12.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd9c0c7a0c681a347b3194c500cb1e6ca9cab053ea4d82a5cf45b6b754560136", upload-time = "2026-04-01T14:42:25.82Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/42/bbcb6051030e1e421d103ce7a8ecadf837aa2f39b8f82ef1a8d37c3d4ebc/pillow-12.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88d387ff40b3ff7c274947ed3125dedf5262ec6919d83946753b5f3d7c67ea4c", upload-time = "2026-04-01T14:42:28.68Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3f/e1/c2a7d6dd8cfa6b231227da096fd2d58754bab3603b9d73bf609d3c18b64f/pillow-12.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:51c4167c34b0d8ba05b547a3bb23578d0ba17b80a5593f93bd8ecb123dd336a3", upload-time = "2026-04-01T14:42:31.579Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/41/7c8617da5d32e1d2f026e509484fdb6f3ad7efaef1749a0c1928adbb099e/pillow-12.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34c0d99ecccea270c04882cb3b86e7b57296079c9a4aff88cb3b33563d95afaa", upload-time = "2026-04-01T14:42:34.615Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2d/de/a777627e19fd6d62f84070ee1521adde5eeda4855b5cf60fe0b149118bca/pillow-12.2.0-cp310-cp310-win32.whl", hash = "sha256:b85f66ae9eb53e860a873b858b789217ba505e5e405a24b85c0464822fe88032", upload-time = "2026-04-01T14:42:37.19Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e7/34/fc4cb5204896465842767b96d250c08410f01f2f28afc43b257de842eed5/pillow-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:673aa32138f3e7531ccdbca7b3901dba9b70940a19ccecc6a37c77d5fdeb05b5", upload-time = "2026-04-01T14:42:39.62Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2d/a0/32852d36bc7709f14dc3f64f929a275e958ad8c19a6deba9610d458e28b3/pillow-12.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:3e080565d8d7c671db5802eedfb438e5565ffa40115216eabb8cd52d0ecce024", upload-time = "2026-04-01T14:42:42.063Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab", upload-time = "2026-04-01T14:42:44.255Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65", upload-time = "2026-04-01T14:42:46.452Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/21/e3fbdf54408a973c7f7f89a23b2cb97a7ef30c61ab4142af31eee6aebc88/pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7", upload-time = "2026-04-01T14:42:49.228Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/f1/00b7278c7dd52b17ad4329153748f87b6756ec195ff786c2bdf12518337d/pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e", upload-time = "2026-04-01T14:42:51.735Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ad/cf/220a5994ef1b10e70e85748b75649d77d506499352be135a4989c957b701/pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705", upload-time = "2026-04-01T14:42:54.343Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176", upload-time = "2026-04-01T14:42:56.954Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6b/3d/45132c57d5fb4b5744567c3817026480ac7fc3ce5d4c47902bc0e7f6f853/pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b", upload-time = "2026-04-01T14:42:59.847Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7d/2e/9df2fc1e82097b1df3dce58dc43286aa01068e918c07574711fcc53e6fb4/pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909", upload-time = "2026-04-01T14:43:02.664Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bd/2e/2941e42858ebb67e50ae741473de81c2984e6eff7b397017623c676e2e8d/pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808", upload-time = "2026-04-01T14:43:05.274Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60", upload-time = "2026-04-01T14:43:08.557Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/88/549194b5d6f1f494b485e493edc6693c0a16f4ada488e5bd974ed1f42fad/pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe", upload-time = "2026-04-01T14:43:10.743Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", upload-time = "2026-04-01T14:43:13.246Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", upload-time = "2026-04-01T14:43:15.584Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", upload-time = "2026-04-01T14:43:18.268Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", upload-time = "2026-04-01T14:43:20.716Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", upload-time = "2026-04-01T14:43:23.443Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", upload-time = "2026-04-01T14:43:26.758Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", upload-time = "2026-04-01T14:43:29.56Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", upload-time = "2026-04-01T14:43:32.091Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", upload-time = "2026-04-01T14:43:34.601Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", upload-time = "2026-04-01T14:43:37.213Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", upload-time = "2026-04-01T14:43:39.421Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", upload-time = "2026-04-01T14:43:41.506Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", upload-time = "2026-04-01T14:43:43.773Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", upload-time = "2026-04-01T14:43:45.87Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", upload-time = "2026-04-01T14:43:48.438Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", upload-time = "2026-04-01T14:43:51.292Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", upload-time = "2026-04-01T14:43:54.242Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", upload-time = "2026-04-01T14:43:57.335Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", upload-time = "2026-04-01T14:43:59.864Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", upload-time = "2026-04-01T14:44:02.74Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", upload-time = "2026-04-01T14:44:05.381Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", upload-time = "2026-04-01T14:44:08.39Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", upload-time = "2026-04-01T14:44:11.197Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", upload-time = "2026-04-01T14:44:13.947Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", upload-time = "2026-04-01T14:44:16.312Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", upload-time = "2026-04-01T14:44:18.89Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", upload-time = "2026-04-01T14:44:21.115Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", upload-time = "2026-04-01T14:44:23.663Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", upload-time = "2026-04-01T14:44:26.772Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", upload-time = "2026-04-01T14:44:29.615Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", upload-time = "2026-04-01T14:44:32.773Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", upload-time = "2026-04-01T14:44:35.252Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", upload-time = "2026-04-01T14:44:37.875Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", upload-time = "2026-04-01T14:44:40.336Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", upload-time = "2026-04-01T14:44:43.251Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", upload-time = "2026-04-01T14:44:45.996Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", upload-time = "2026-04-01T14:44:48.48Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", upload-time = "2026-04-01T14:44:51.353Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", upload-time = "2026-04-01T14:44:53.588Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", upload-time = "2026-04-01T14:44:56.039Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", upload-time = "2026-04-01T14:44:58.663Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", upload-time = "2026-04-01T14:45:01.5Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", upload-time = "2026-04-01T14:45:04.5Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", upload-time = "2026-04-01T14:45:07.117Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", upload-time = "2026-04-01T14:45:09.763Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", upload-time = "2026-04-01T14:45:12.378Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", upload-time = "2026-04-01T14:45:15.122Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", upload-time = "2026-04-01T14:45:17.797Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", upload-time = "2026-04-01T14:45:20.529Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", upload-time = "2026-04-01T14:45:23.162Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", upload-time = "2026-04-01T14:45:25.637Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", upload-time = "2026-04-01T14:45:28.355Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", upload-time = "2026-04-01T14:45:30.924Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", upload-time = "2026-04-01T14:45:33.908Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", upload-time = "2026-04-01T14:45:36.623Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", upload-time = "2026-04-01T14:45:39.258Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", upload-time = "2026-04-01T14:45:41.879Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", upload-time = "2026-04-01T14:45:44.705Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", upload-time = "2026-04-01T14:45:47.568Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", upload-time = "2026-04-01T14:45:50.032Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", upload-time = "2026-04-01T14:45:52.529Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4e/b7/2437044fb910f499610356d1352e3423753c98e34f915252aafecc64889f/pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f", upload-time = "2026-04-01T14:45:55.538Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f6/f4/8316e31de11b780f4ac08ef3654a75555e624a98db1056ecb2122d008d5a/pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d", upload-time = "2026-04-01T14:45:58.093Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/37/664fca7201f8bb2aa1d20e2c3d5564a62e6ae5111741966c8319ca802361/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f", upload-time = "2026-04-01T14:46:01.141Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/62/5b0ed78fce87346be7a5cfcfaaad91f6a1f98c26f86bdbafa2066c647ef6/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e", upload-time = "2026-04-01T14:46:03.874Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c3/28/ec0fc38107fc32536908034e990c47914c57cd7c5a3ece4d8d8f7ffd7e27/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0", upload-time = "2026-04-01T14:46:06.33Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5e/8b/51b0eddcfa2180d60e41f06bd6d0a62202b20b59c68f5a132e615b75aecf/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1", upload-time = "2026-04-01T14:46:08.83Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/60/5382c03e1970de634027cee8e1b7d39776b778b81812aaf45b694dfe9e28/pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e", upload-time = "2026-04-01T14:46:11.734Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/aa/d0b28e1c811cd4d5f5c2bfe2e022292bd255ae5744a3b9ac7d6c8f72dd75/pillow-12.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a4e8f36e677d3336f35089648c8955c51c6d386a13cf6ee9c189c5f5bd713a9f", size = 5354355, upload-time = "2026-04-01T14:42:15.402Z" }, + { url = "https://files.pythonhosted.org/packages/27/8e/1d5b39b8ae2bd7650d0c7b6abb9602d16043ead9ebbfef4bc4047454da2a/pillow-12.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e589959f10d9824d39b350472b92f0ce3b443c0a3442ebf41c40cb8361c5b97", size = 4695871, upload-time = "2026-04-01T14:42:18.234Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c5/dcb7a6ca6b7d3be41a76958e90018d56c8462166b3ef223150360850c8da/pillow-12.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a52edc8bfff4429aaabdf4d9ee0daadbbf8562364f940937b941f87a4290f5ff", size = 6269734, upload-time = "2026-04-01T14:42:20.608Z" }, + { url = "https://files.pythonhosted.org/packages/ea/f1/aa1bb13b2f4eba914e9637893c73f2af8e48d7d4023b9d3750d4c5eb2d0c/pillow-12.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:975385f4776fafde056abb318f612ef6285b10a1f12b8570f3647ad0d74b48ec", size = 8076080, upload-time = "2026-04-01T14:42:23.095Z" }, + { url = "https://files.pythonhosted.org/packages/a1/2a/8c79d6a53169937784604a8ae8d77e45888c41537f7f6f65ed1f407fe66d/pillow-12.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd9c0c7a0c681a347b3194c500cb1e6ca9cab053ea4d82a5cf45b6b754560136", size = 6382236, upload-time = "2026-04-01T14:42:25.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/42/bbcb6051030e1e421d103ce7a8ecadf837aa2f39b8f82ef1a8d37c3d4ebc/pillow-12.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88d387ff40b3ff7c274947ed3125dedf5262ec6919d83946753b5f3d7c67ea4c", size = 7070220, upload-time = "2026-04-01T14:42:28.68Z" }, + { url = "https://files.pythonhosted.org/packages/3f/e1/c2a7d6dd8cfa6b231227da096fd2d58754bab3603b9d73bf609d3c18b64f/pillow-12.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:51c4167c34b0d8ba05b547a3bb23578d0ba17b80a5593f93bd8ecb123dd336a3", size = 6493124, upload-time = "2026-04-01T14:42:31.579Z" }, + { url = "https://files.pythonhosted.org/packages/5f/41/7c8617da5d32e1d2f026e509484fdb6f3ad7efaef1749a0c1928adbb099e/pillow-12.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34c0d99ecccea270c04882cb3b86e7b57296079c9a4aff88cb3b33563d95afaa", size = 7194324, upload-time = "2026-04-01T14:42:34.615Z" }, + { url = "https://files.pythonhosted.org/packages/2d/de/a777627e19fd6d62f84070ee1521adde5eeda4855b5cf60fe0b149118bca/pillow-12.2.0-cp310-cp310-win32.whl", hash = "sha256:b85f66ae9eb53e860a873b858b789217ba505e5e405a24b85c0464822fe88032", size = 6376363, upload-time = "2026-04-01T14:42:37.19Z" }, + { url = "https://files.pythonhosted.org/packages/e7/34/fc4cb5204896465842767b96d250c08410f01f2f28afc43b257de842eed5/pillow-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:673aa32138f3e7531ccdbca7b3901dba9b70940a19ccecc6a37c77d5fdeb05b5", size = 7083523, upload-time = "2026-04-01T14:42:39.62Z" }, + { url = "https://files.pythonhosted.org/packages/2d/a0/32852d36bc7709f14dc3f64f929a275e958ad8c19a6deba9610d458e28b3/pillow-12.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:3e080565d8d7c671db5802eedfb438e5565ffa40115216eabb8cd52d0ecce024", size = 2463318, upload-time = "2026-04-01T14:42:42.063Z" }, + { url = "https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab", size = 5354347, upload-time = "2026-04-01T14:42:44.255Z" }, + { url = "https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65", size = 4695873, upload-time = "2026-04-01T14:42:46.452Z" }, + { url = "https://files.pythonhosted.org/packages/df/21/e3fbdf54408a973c7f7f89a23b2cb97a7ef30c61ab4142af31eee6aebc88/pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7", size = 6280168, upload-time = "2026-04-01T14:42:49.228Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f1/00b7278c7dd52b17ad4329153748f87b6756ec195ff786c2bdf12518337d/pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e", size = 8088188, upload-time = "2026-04-01T14:42:51.735Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/220a5994ef1b10e70e85748b75649d77d506499352be135a4989c957b701/pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705", size = 6394401, upload-time = "2026-04-01T14:42:54.343Z" }, + { url = "https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176", size = 7079655, upload-time = "2026-04-01T14:42:56.954Z" }, + { url = "https://files.pythonhosted.org/packages/6b/3d/45132c57d5fb4b5744567c3817026480ac7fc3ce5d4c47902bc0e7f6f853/pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b", size = 6503105, upload-time = "2026-04-01T14:42:59.847Z" }, + { url = "https://files.pythonhosted.org/packages/7d/2e/9df2fc1e82097b1df3dce58dc43286aa01068e918c07574711fcc53e6fb4/pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909", size = 7203402, upload-time = "2026-04-01T14:43:02.664Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2e/2941e42858ebb67e50ae741473de81c2984e6eff7b397017623c676e2e8d/pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808", size = 6378149, upload-time = "2026-04-01T14:43:05.274Z" }, + { url = "https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60", size = 7082626, upload-time = "2026-04-01T14:43:08.557Z" }, + { url = "https://files.pythonhosted.org/packages/c2/88/549194b5d6f1f494b485e493edc6693c0a16f4ada488e5bd974ed1f42fad/pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe", size = 2463531, upload-time = "2026-04-01T14:43:10.743Z" }, + { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, + { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, + { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, + { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, + { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, + { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, + { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, + { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, + { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" }, + { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" }, + { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" }, + { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" }, + { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" }, + { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" }, + { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" }, + { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" }, + { url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" }, + { url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" }, + { url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" }, + { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" }, + { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" }, + { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" }, + { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" }, + { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" }, + { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" }, + { url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" }, + { url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" }, + { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" }, + { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" }, + { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" }, + { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" }, + { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" }, + { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" }, + { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" }, + { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" }, + { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" }, + { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" }, + { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" }, + { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" }, + { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" }, + { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" }, + { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" }, + { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" }, + { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" }, + { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" }, + { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" }, + { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" }, + { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b7/2437044fb910f499610356d1352e3423753c98e34f915252aafecc64889f/pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f", size = 5273969, upload-time = "2026-04-01T14:45:55.538Z" }, + { url = "https://files.pythonhosted.org/packages/f6/f4/8316e31de11b780f4ac08ef3654a75555e624a98db1056ecb2122d008d5a/pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d", size = 4659674, upload-time = "2026-04-01T14:45:58.093Z" }, + { url = "https://files.pythonhosted.org/packages/d4/37/664fca7201f8bb2aa1d20e2c3d5564a62e6ae5111741966c8319ca802361/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f", size = 5288479, upload-time = "2026-04-01T14:46:01.141Z" }, + { url = "https://files.pythonhosted.org/packages/49/62/5b0ed78fce87346be7a5cfcfaaad91f6a1f98c26f86bdbafa2066c647ef6/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e", size = 7032230, upload-time = "2026-04-01T14:46:03.874Z" }, + { url = "https://files.pythonhosted.org/packages/c3/28/ec0fc38107fc32536908034e990c47914c57cd7c5a3ece4d8d8f7ffd7e27/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0", size = 5355404, upload-time = "2026-04-01T14:46:06.33Z" }, + { url = "https://files.pythonhosted.org/packages/5e/8b/51b0eddcfa2180d60e41f06bd6d0a62202b20b59c68f5a132e615b75aecf/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1", size = 6002215, upload-time = "2026-04-01T14:46:08.83Z" }, + { url = "https://files.pythonhosted.org/packages/bc/60/5382c03e1970de634027cee8e1b7d39776b778b81812aaf45b694dfe9e28/pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e", size = 7080946, upload-time = "2026-04-01T14:46:11.734Z" }, ] [[package]] name = "pip" version = "26.1.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b6/48/cb9b7a682f6fe01a4221e1728941dd4ac3cd9090a17db3779d6ff490b602/pip-26.1.1.tar.gz", hash = "sha256:d36762751d156a4ee895de8af39aa0abeeeb577f93a2eca6ab62467bbf0f8a78", upload-time = "2026-05-04T19:02:21.248Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b6/48/cb9b7a682f6fe01a4221e1728941dd4ac3cd9090a17db3779d6ff490b602/pip-26.1.1.tar.gz", hash = "sha256:d36762751d156a4ee895de8af39aa0abeeeb577f93a2eca6ab62467bbf0f8a78", size = 1840400, upload-time = "2026-05-04T19:02:21.248Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/3a/eb/fea4d1d51c49832120f7f285d07306db3960f423a2612c6057caf3e8196f/pip-26.1.1-py3-none-any.whl", hash = "sha256:99cb1c2899893b075ff56e4ed0af55669a955b49ad7fb8d8603ecdaf4ed653fb", upload-time = "2026-05-04T19:02:18.9Z" }, + { url = "https://files.pythonhosted.org/packages/3a/eb/fea4d1d51c49832120f7f285d07306db3960f423a2612c6057caf3e8196f/pip-26.1.1-py3-none-any.whl", hash = "sha256:99cb1c2899893b075ff56e4ed0af55669a955b49ad7fb8d8603ecdaf4ed653fb", size = 1812777, upload-time = "2026-05-04T19:02:18.9Z" }, ] [[package]] @@ -3894,9 +3890,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "pip" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b9/f1/ee85f8c7e82bccf90a3c7aad22863cc6e20057860a1361083cd2adacb92e/pip_api-0.0.34.tar.gz", hash = "sha256:9b75e958f14c5a2614bae415f2adf7eeb54d50a2cfbe7e24fd4826471bac3625", upload-time = "2024-07-09T20:32:30.641Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/f1/ee85f8c7e82bccf90a3c7aad22863cc6e20057860a1361083cd2adacb92e/pip_api-0.0.34.tar.gz", hash = "sha256:9b75e958f14c5a2614bae415f2adf7eeb54d50a2cfbe7e24fd4826471bac3625", size = 123017, upload-time = "2024-07-09T20:32:30.641Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/91/f7/ebf5003e1065fd00b4cbef53bf0a65c3d3e1b599b676d5383ccb7a8b88ba/pip_api-0.0.34-py3-none-any.whl", hash = "sha256:8b2d7d7c37f2447373aa2cf8b1f60a2f2b27a84e1e9e0294a3f6ef10eb3ba6bb", upload-time = "2024-07-09T20:32:29.099Z" }, + { url = "https://files.pythonhosted.org/packages/91/f7/ebf5003e1065fd00b4cbef53bf0a65c3d3e1b599b676d5383ccb7a8b88ba/pip_api-0.0.34-py3-none-any.whl", hash = "sha256:8b2d7d7c37f2447373aa2cf8b1f60a2f2b27a84e1e9e0294a3f6ef10eb3ba6bb", size = 120369, upload-time = "2024-07-09T20:32:29.099Z" }, ] [[package]] @@ -3915,9 +3911,9 @@ dependencies = [ { name = "tomli" }, { name = "tomli-w" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/bd/89/0e999b413facab81c33d118f3ac3739fd02c0622ccf7c4e82e37cebd8447/pip_audit-2.10.0.tar.gz", hash = "sha256:427ea5bf61d1d06b98b1ae29b7feacc00288a2eced52c9c58ceed5253ef6c2a4", upload-time = "2025-12-01T23:42:40.612Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bd/89/0e999b413facab81c33d118f3ac3739fd02c0622ccf7c4e82e37cebd8447/pip_audit-2.10.0.tar.gz", hash = "sha256:427ea5bf61d1d06b98b1ae29b7feacc00288a2eced52c9c58ceed5253ef6c2a4", size = 53776, upload-time = "2025-12-01T23:42:40.612Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/be/f3/4888f895c02afa085630a3a3329d1b18b998874642ad4c530e9a4d7851fe/pip_audit-2.10.0-py3-none-any.whl", hash = "sha256:16e02093872fac97580303f0848fa3ad64f7ecf600736ea7835a2b24de49613f", upload-time = "2025-12-01T23:42:39.193Z" }, + { url = "https://files.pythonhosted.org/packages/be/f3/4888f895c02afa085630a3a3329d1b18b998874642ad4c530e9a4d7851fe/pip_audit-2.10.0-py3-none-any.whl", hash = "sha256:16e02093872fac97580303f0848fa3ad64f7ecf600736ea7835a2b24de49613f", size = 61518, upload-time = "2025-12-01T23:42:39.193Z" }, ] [[package]] @@ -3928,18 +3924,18 @@ dependencies = [ { name = "packaging" }, { name = "pyparsing" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/5e/2a/63b574101850e7f7b306ddbdb02cb294380d37948140eecd468fae392b54/pip-requirements-parser-32.0.1.tar.gz", hash = "sha256:b4fa3a7a0be38243123cf9d1f3518da10c51bdb165a2b2985566247f9155a7d3", upload-time = "2022-12-21T15:25:22.732Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/2a/63b574101850e7f7b306ddbdb02cb294380d37948140eecd468fae392b54/pip-requirements-parser-32.0.1.tar.gz", hash = "sha256:b4fa3a7a0be38243123cf9d1f3518da10c51bdb165a2b2985566247f9155a7d3", size = 209359, upload-time = "2022-12-21T15:25:22.732Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/54/d0/d04f1d1e064ac901439699ee097f58688caadea42498ec9c4b4ad2ef84ab/pip_requirements_parser-32.0.1-py3-none-any.whl", hash = "sha256:4659bc2a667783e7a15d190f6fccf8b2486685b6dba4c19c3876314769c57526", upload-time = "2022-12-21T15:25:21.046Z" }, + { url = "https://files.pythonhosted.org/packages/54/d0/d04f1d1e064ac901439699ee097f58688caadea42498ec9c4b4ad2ef84ab/pip_requirements_parser-32.0.1-py3-none-any.whl", hash = "sha256:4659bc2a667783e7a15d190f6fccf8b2486685b6dba4c19c3876314769c57526", size = 35648, upload-time = "2022-12-21T15:25:21.046Z" }, ] [[package]] name = "platformdirs" version = "4.5.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", upload-time = "2025-12-05T13:52:58.638Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cf/86/0248f086a84f01b37aaec0fa567b397df1a119f73c16f6c7a9aac73ea309/platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda", size = 21715, upload-time = "2025-12-05T13:52:58.638Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", upload-time = "2025-12-05T13:52:56.823Z" }, + { url = "https://files.pythonhosted.org/packages/cb/28/3bfe2fa5a7b9c46fe7e13c97bda14c895fb10fa2ebf1d0abb90e0cea7ee1/platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31", size = 18731, upload-time = "2025-12-05T13:52:56.823Z" }, ] [[package]] @@ -3951,23 +3947,23 @@ dependencies = [ { name = "pyee" }, ] wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/c9/9c6061d5703267f1baae6a4647bfd1862e386fbfdb97d889f6f6ae9e3f64/playwright-1.58.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:96e3204aac292ee639edbfdef6298b4be2ea0a55a16b7068df91adac077cc606", upload-time = "2026-01-30T15:09:24.028Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/40/59d34a756e02f8c670f0fee987d46f7ee53d05447d43cd114ca015cb168c/playwright-1.58.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:70c763694739d28df71ed578b9c8202bb83e8fe8fb9268c04dd13afe36301f71", upload-time = "2026-01-30T15:09:27.558Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e1/ee/3ce6209c9c74a650aac9028c621f357a34ea5cd4d950700f8e2c4b7fe2c4/playwright-1.58.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:185e0132578733d02802dfddfbbc35f42be23a45ff49ccae5081f25952238117", upload-time = "2026-01-30T15:09:30.461Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/af/009958cbf23fac551a940d34e3206e6c7eed2b8c940d0c3afd1feb0b0589/playwright-1.58.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:c95568ba1eda83812598c1dc9be60b4406dffd60b149bc1536180ad108723d6b", upload-time = "2026-01-30T15:09:33.787Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d9/a6/0e66ad04b6d3440dae73efb39540c5685c5fc95b17c8b29340b62abbd952/playwright-1.58.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f9999948f1ab541d98812de25e3a8c410776aa516d948807140aff797b4bffa", upload-time = "2026-01-30T15:09:36.751Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0e/4b/236e60ab9f6d62ed0fd32150d61f1f494cefbf02304c0061e78ed80c1c32/playwright-1.58.0-py3-none-win32.whl", hash = "sha256:1e03be090e75a0fabbdaeab65ce17c308c425d879fa48bb1d7986f96bfad0b99", upload-time = "2026-01-30T15:09:39.627Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/41/f8/5ec599c5e59d2f2f336a05b4f318e733077cd5044f24adb6f86900c3e6a7/playwright-1.58.0-py3-none-win_amd64.whl", hash = "sha256:a2bf639d0ce33b3ba38de777e08697b0d8f3dc07ab6802e4ac53fb65e3907af8", upload-time = "2026-01-30T15:09:42.449Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c8/c4/cc0229fea55c87d6c9c67fe44a21e2cd28d1d558a5478ed4d617e9fb0c93/playwright-1.58.0-py3-none-win_arm64.whl", hash = "sha256:32ffe5c303901a13a0ecab91d1c3f74baf73b84f4bedbb6b935f5bc11cc98e1b", upload-time = "2026-01-30T15:09:45.71Z" }, + { url = "https://files.pythonhosted.org/packages/f8/c9/9c6061d5703267f1baae6a4647bfd1862e386fbfdb97d889f6f6ae9e3f64/playwright-1.58.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:96e3204aac292ee639edbfdef6298b4be2ea0a55a16b7068df91adac077cc606", size = 42251098, upload-time = "2026-01-30T15:09:24.028Z" }, + { url = "https://files.pythonhosted.org/packages/e0/40/59d34a756e02f8c670f0fee987d46f7ee53d05447d43cd114ca015cb168c/playwright-1.58.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:70c763694739d28df71ed578b9c8202bb83e8fe8fb9268c04dd13afe36301f71", size = 41039625, upload-time = "2026-01-30T15:09:27.558Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ee/3ce6209c9c74a650aac9028c621f357a34ea5cd4d950700f8e2c4b7fe2c4/playwright-1.58.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:185e0132578733d02802dfddfbbc35f42be23a45ff49ccae5081f25952238117", size = 42251098, upload-time = "2026-01-30T15:09:30.461Z" }, + { url = "https://files.pythonhosted.org/packages/f1/af/009958cbf23fac551a940d34e3206e6c7eed2b8c940d0c3afd1feb0b0589/playwright-1.58.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:c95568ba1eda83812598c1dc9be60b4406dffd60b149bc1536180ad108723d6b", size = 46235268, upload-time = "2026-01-30T15:09:33.787Z" }, + { url = "https://files.pythonhosted.org/packages/d9/a6/0e66ad04b6d3440dae73efb39540c5685c5fc95b17c8b29340b62abbd952/playwright-1.58.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f9999948f1ab541d98812de25e3a8c410776aa516d948807140aff797b4bffa", size = 45964214, upload-time = "2026-01-30T15:09:36.751Z" }, + { url = "https://files.pythonhosted.org/packages/0e/4b/236e60ab9f6d62ed0fd32150d61f1f494cefbf02304c0061e78ed80c1c32/playwright-1.58.0-py3-none-win32.whl", hash = "sha256:1e03be090e75a0fabbdaeab65ce17c308c425d879fa48bb1d7986f96bfad0b99", size = 36815998, upload-time = "2026-01-30T15:09:39.627Z" }, + { url = "https://files.pythonhosted.org/packages/41/f8/5ec599c5e59d2f2f336a05b4f318e733077cd5044f24adb6f86900c3e6a7/playwright-1.58.0-py3-none-win_amd64.whl", hash = "sha256:a2bf639d0ce33b3ba38de777e08697b0d8f3dc07ab6802e4ac53fb65e3907af8", size = 36816005, upload-time = "2026-01-30T15:09:42.449Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c4/cc0229fea55c87d6c9c67fe44a21e2cd28d1d558a5478ed4d617e9fb0c93/playwright-1.58.0-py3-none-win_arm64.whl", hash = "sha256:32ffe5c303901a13a0ecab91d1c3f74baf73b84f4bedbb6b935f5bc11cc98e1b", size = 33085919, upload-time = "2026-01-30T15:09:45.71Z" }, ] [[package]] name = "pluggy" version = "1.6.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", upload-time = "2025-05-15T12:30:07.975Z" } +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://pypi-proxy.dev.databricks.com/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", upload-time = "2025-05-15T12:30:06.134Z" }, + { 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]] @@ -3977,138 +3973,138 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "wcwidth" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/79/45/b0847d88d6cfeb4413566738c8bbf1e1995fad3d42515327ff32cc1eb578/prettytable-3.17.0.tar.gz", hash = "sha256:59f2590776527f3c9e8cf9fe7b66dd215837cca96a9c39567414cbc632e8ddb0", upload-time = "2025-11-14T17:33:20.212Z" } +sdist = { url = "https://files.pythonhosted.org/packages/79/45/b0847d88d6cfeb4413566738c8bbf1e1995fad3d42515327ff32cc1eb578/prettytable-3.17.0.tar.gz", hash = "sha256:59f2590776527f3c9e8cf9fe7b66dd215837cca96a9c39567414cbc632e8ddb0", size = 67892, upload-time = "2025-11-14T17:33:20.212Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/ee/8c/83087ebc47ab0396ce092363001fa37c17153119ee282700c0713a195853/prettytable-3.17.0-py3-none-any.whl", hash = "sha256:aad69b294ddbe3e1f95ef8886a060ed1666a0b83018bbf56295f6f226c43d287", upload-time = "2025-11-14T17:33:19.093Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8c/83087ebc47ab0396ce092363001fa37c17153119ee282700c0713a195853/prettytable-3.17.0-py3-none-any.whl", hash = "sha256:aad69b294ddbe3e1f95ef8886a060ed1666a0b83018bbf56295f6f226c43d287", size = 34433, upload-time = "2025-11-14T17:33:19.093Z" }, ] [[package]] name = "propcache" version = "0.4.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", upload-time = "2025-10-08T19:49:02.291Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/3c/0e/934b541323035566a9af292dba85a195f7b78179114f2c6ebb24551118a9/propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db", upload-time = "2025-10-08T19:46:02.083Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a1/6b/db0d03d96726d995dc7171286c6ba9d8d14251f37433890f88368951a44e/propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8", upload-time = "2025-10-08T19:46:03.884Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e4/c3/82728404aea669e1600f304f2609cde9e665c18df5a11cdd57ed73c1dceb/propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925", upload-time = "2025-10-08T19:46:05.405Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/1b/39313ddad2bf9187a1432654c38249bab4562ef535ef07f5eb6eb04d0b1b/propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21", upload-time = "2025-10-08T19:46:07.165Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5b/01/f1d0b57d136f294a142acf97f4ed58c8e5b974c21e543000968357115011/propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5", upload-time = "2025-10-08T19:46:08.909Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a1/c8/038d909c61c5bb039070b3fb02ad5cccdb1dde0d714792e251cdb17c9c05/propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db", upload-time = "2025-10-08T19:46:10.7Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/08/57/8c87e93142b2c1fa2408e45695205a7ba05fb5db458c0bf5c06ba0e09ea6/propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7", upload-time = "2025-10-08T19:46:12.003Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/42/df/5615fec76aa561987a534759b3686008a288e73107faa49a8ae5795a9f7a/propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4", upload-time = "2025-10-08T19:46:13.495Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/21/62949eb3a7a54afe8327011c90aca7e03547787a88fb8bd9726806482fea/propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60", upload-time = "2025-10-08T19:46:14.938Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/30/ee/ab4d727dd70806e5b4de96a798ae7ac6e4d42516f030ee60522474b6b332/propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f", upload-time = "2025-10-08T19:46:16.695Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8a/0b/38b46208e6711b016aa8966a3ac793eee0d05c7159d8342aa27fc0bc365e/propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900", upload-time = "2025-10-08T19:46:18.023Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/81/5abec54355ed344476bee711e9f04815d4b00a311ab0535599204eecc257/propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c", upload-time = "2025-10-08T19:46:19.449Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ec/b6/1f237c04e32063cb034acd5f6ef34ef3a394f75502e72703545631ab1ef6/propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb", upload-time = "2025-10-08T19:46:20.643Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a6/67/354aac4e0603a15f76439caf0427781bcd6797f370377f75a642133bc954/propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37", upload-time = "2025-10-08T19:46:21.935Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/e1/74e55b9fd1a4c209ff1a9a824bf6c8b3d1fc5a1ac3eabe23462637466785/propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581", upload-time = "2025-10-08T19:46:23.368Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", upload-time = "2025-10-08T19:46:24.597Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", upload-time = "2025-10-08T19:46:25.733Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", upload-time = "2025-10-08T19:46:27.304Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", upload-time = "2025-10-08T19:46:28.62Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/56/b9/8fa98f850960b367c4b8fe0592e7fc341daa7a9462e925228f10a60cf74f/propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165", upload-time = "2025-10-08T19:46:30.358Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/46/a6/0ab4f660eb59649d14b3d3d65c439421cf2f87fe5dd68591cbe3c1e78a89/propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc", upload-time = "2025-10-08T19:46:32.607Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", upload-time = "2025-10-08T19:46:33.969Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", upload-time = "2025-10-08T19:46:35.309Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9e/f8/91c27b22ccda1dbc7967f921c42825564fa5336a01ecd72eb78a9f4f53c2/propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85", upload-time = "2025-10-08T19:46:36.993Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/26/7f00bd6bd1adba5aafe5f4a66390f243acab58eab24ff1a08bebb2ef9d40/propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e", upload-time = "2025-10-08T19:46:38.398Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/84/89/fd108ba7815c1117ddca79c228f3f8a15fc82a73bca8b142eb5de13b2785/propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757", upload-time = "2025-10-08T19:46:39.732Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", upload-time = "2025-10-08T19:46:41.025Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/61/b0/b2631c19793f869d35f47d5a3a56fb19e9160d3c119f15ac7344fc3ccae7/propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1", upload-time = "2025-10-08T19:46:42.693Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6", upload-time = "2025-10-08T19:46:43.778Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/e9/754f180cccd7f51a39913782c74717c581b9cc8177ad0e949f4d51812383/propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239", upload-time = "2025-10-08T19:46:44.872Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", upload-time = "2025-10-08T19:46:46.075Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", upload-time = "2025-10-08T19:46:47.23Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", upload-time = "2025-10-08T19:46:48.384Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", upload-time = "2025-10-08T19:46:50.055Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", upload-time = "2025-10-08T19:46:51.815Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", upload-time = "2025-10-08T19:46:53.208Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", upload-time = "2025-10-08T19:46:54.511Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", upload-time = "2025-10-08T19:46:56.212Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", upload-time = "2025-10-08T19:46:57.595Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", upload-time = "2025-10-08T19:46:59.067Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", upload-time = "2025-10-08T19:47:00.544Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", upload-time = "2025-10-08T19:47:01.968Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", upload-time = "2025-10-08T19:47:03.503Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", upload-time = "2025-10-08T19:47:04.973Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", upload-time = "2025-10-08T19:47:06.077Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", upload-time = "2025-10-08T19:47:07.648Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", upload-time = "2025-10-08T19:47:08.851Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", upload-time = "2025-10-08T19:47:09.982Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", upload-time = "2025-10-08T19:47:11.319Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", upload-time = "2025-10-08T19:47:13.146Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", upload-time = "2025-10-08T19:47:14.913Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", upload-time = "2025-10-08T19:47:16.277Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", upload-time = "2025-10-08T19:47:17.962Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", upload-time = "2025-10-08T19:47:19.355Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", upload-time = "2025-10-08T19:47:21.338Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", upload-time = "2025-10-08T19:47:23.059Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", upload-time = "2025-10-08T19:47:24.445Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", upload-time = "2025-10-08T19:47:25.736Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", upload-time = "2025-10-08T19:47:26.847Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", upload-time = "2025-10-08T19:47:27.961Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", upload-time = "2025-10-08T19:47:29.445Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", upload-time = "2025-10-08T19:47:30.579Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", upload-time = "2025-10-08T19:47:31.79Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", upload-time = "2025-10-08T19:47:33.481Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", upload-time = "2025-10-08T19:47:34.906Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", upload-time = "2025-10-08T19:47:36.338Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", upload-time = "2025-10-08T19:47:37.692Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", upload-time = "2025-10-08T19:47:39.659Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", upload-time = "2025-10-08T19:47:41.084Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", upload-time = "2025-10-08T19:47:42.51Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", upload-time = "2025-10-08T19:47:43.927Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", upload-time = "2025-10-08T19:47:45.448Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", upload-time = "2025-10-08T19:47:47.202Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", upload-time = "2025-10-08T19:47:48.336Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", upload-time = "2025-10-08T19:47:49.876Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", upload-time = "2025-10-08T19:47:51.051Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", upload-time = "2025-10-08T19:47:52.594Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", upload-time = "2025-10-08T19:47:54.073Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", upload-time = "2025-10-08T19:47:55.715Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", upload-time = "2025-10-08T19:47:57.499Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", upload-time = "2025-10-08T19:47:59.317Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", upload-time = "2025-10-08T19:48:00.67Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", upload-time = "2025-10-08T19:48:02.604Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", upload-time = "2025-10-08T19:48:04.499Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", upload-time = "2025-10-08T19:48:06.213Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", upload-time = "2025-10-08T19:48:08.432Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", upload-time = "2025-10-08T19:48:09.968Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", upload-time = "2025-10-08T19:48:11.232Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", upload-time = "2025-10-08T19:48:12.707Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", upload-time = "2025-10-08T19:48:13.923Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", upload-time = "2025-10-08T19:48:15.16Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", upload-time = "2025-10-08T19:48:16.424Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", upload-time = "2025-10-08T19:48:17.577Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", upload-time = "2025-10-08T19:48:18.901Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", upload-time = "2025-10-08T19:48:20.762Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", upload-time = "2025-10-08T19:48:22.592Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", upload-time = "2025-10-08T19:48:23.947Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", upload-time = "2025-10-08T19:48:25.656Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", upload-time = "2025-10-08T19:48:27.207Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", upload-time = "2025-10-08T19:48:28.65Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", upload-time = "2025-10-08T19:48:30.133Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", upload-time = "2025-10-08T19:48:31.567Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", upload-time = "2025-10-08T19:48:32.872Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", upload-time = "2025-10-08T19:48:34.226Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", upload-time = "2025-10-08T19:48:35.441Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", upload-time = "2025-10-08T19:49:00.792Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/0e/934b541323035566a9af292dba85a195f7b78179114f2c6ebb24551118a9/propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db", size = 79534, upload-time = "2025-10-08T19:46:02.083Z" }, + { url = "https://files.pythonhosted.org/packages/a1/6b/db0d03d96726d995dc7171286c6ba9d8d14251f37433890f88368951a44e/propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8", size = 45526, upload-time = "2025-10-08T19:46:03.884Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c3/82728404aea669e1600f304f2609cde9e665c18df5a11cdd57ed73c1dceb/propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925", size = 47263, upload-time = "2025-10-08T19:46:05.405Z" }, + { url = "https://files.pythonhosted.org/packages/df/1b/39313ddad2bf9187a1432654c38249bab4562ef535ef07f5eb6eb04d0b1b/propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21", size = 201012, upload-time = "2025-10-08T19:46:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/5b/01/f1d0b57d136f294a142acf97f4ed58c8e5b974c21e543000968357115011/propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5", size = 209491, upload-time = "2025-10-08T19:46:08.909Z" }, + { url = "https://files.pythonhosted.org/packages/a1/c8/038d909c61c5bb039070b3fb02ad5cccdb1dde0d714792e251cdb17c9c05/propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db", size = 215319, upload-time = "2025-10-08T19:46:10.7Z" }, + { url = "https://files.pythonhosted.org/packages/08/57/8c87e93142b2c1fa2408e45695205a7ba05fb5db458c0bf5c06ba0e09ea6/propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7", size = 196856, upload-time = "2025-10-08T19:46:12.003Z" }, + { url = "https://files.pythonhosted.org/packages/42/df/5615fec76aa561987a534759b3686008a288e73107faa49a8ae5795a9f7a/propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4", size = 193241, upload-time = "2025-10-08T19:46:13.495Z" }, + { url = "https://files.pythonhosted.org/packages/d5/21/62949eb3a7a54afe8327011c90aca7e03547787a88fb8bd9726806482fea/propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60", size = 190552, upload-time = "2025-10-08T19:46:14.938Z" }, + { url = "https://files.pythonhosted.org/packages/30/ee/ab4d727dd70806e5b4de96a798ae7ac6e4d42516f030ee60522474b6b332/propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f", size = 200113, upload-time = "2025-10-08T19:46:16.695Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0b/38b46208e6711b016aa8966a3ac793eee0d05c7159d8342aa27fc0bc365e/propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900", size = 200778, upload-time = "2025-10-08T19:46:18.023Z" }, + { url = "https://files.pythonhosted.org/packages/cf/81/5abec54355ed344476bee711e9f04815d4b00a311ab0535599204eecc257/propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c", size = 193047, upload-time = "2025-10-08T19:46:19.449Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b6/1f237c04e32063cb034acd5f6ef34ef3a394f75502e72703545631ab1ef6/propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb", size = 38093, upload-time = "2025-10-08T19:46:20.643Z" }, + { url = "https://files.pythonhosted.org/packages/a6/67/354aac4e0603a15f76439caf0427781bcd6797f370377f75a642133bc954/propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37", size = 41638, upload-time = "2025-10-08T19:46:21.935Z" }, + { url = "https://files.pythonhosted.org/packages/e0/e1/74e55b9fd1a4c209ff1a9a824bf6c8b3d1fc5a1ac3eabe23462637466785/propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581", size = 38229, upload-time = "2025-10-08T19:46:23.368Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208, upload-time = "2025-10-08T19:46:24.597Z" }, + { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777, upload-time = "2025-10-08T19:46:25.733Z" }, + { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647, upload-time = "2025-10-08T19:46:27.304Z" }, + { url = "https://files.pythonhosted.org/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", size = 214929, upload-time = "2025-10-08T19:46:28.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/b9/8fa98f850960b367c4b8fe0592e7fc341daa7a9462e925228f10a60cf74f/propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165", size = 221778, upload-time = "2025-10-08T19:46:30.358Z" }, + { url = "https://files.pythonhosted.org/packages/46/a6/0ab4f660eb59649d14b3d3d65c439421cf2f87fe5dd68591cbe3c1e78a89/propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc", size = 228144, upload-time = "2025-10-08T19:46:32.607Z" }, + { url = "https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", size = 210030, upload-time = "2025-10-08T19:46:33.969Z" }, + { url = "https://files.pythonhosted.org/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", size = 208252, upload-time = "2025-10-08T19:46:35.309Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f8/91c27b22ccda1dbc7967f921c42825564fa5336a01ecd72eb78a9f4f53c2/propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85", size = 202064, upload-time = "2025-10-08T19:46:36.993Z" }, + { url = "https://files.pythonhosted.org/packages/f2/26/7f00bd6bd1adba5aafe5f4a66390f243acab58eab24ff1a08bebb2ef9d40/propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e", size = 212429, upload-time = "2025-10-08T19:46:38.398Z" }, + { url = "https://files.pythonhosted.org/packages/84/89/fd108ba7815c1117ddca79c228f3f8a15fc82a73bca8b142eb5de13b2785/propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757", size = 216727, upload-time = "2025-10-08T19:46:39.732Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", size = 205097, upload-time = "2025-10-08T19:46:41.025Z" }, + { url = "https://files.pythonhosted.org/packages/61/b0/b2631c19793f869d35f47d5a3a56fb19e9160d3c119f15ac7344fc3ccae7/propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1", size = 38084, upload-time = "2025-10-08T19:46:42.693Z" }, + { url = "https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6", size = 41637, upload-time = "2025-10-08T19:46:43.778Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e9/754f180cccd7f51a39913782c74717c581b9cc8177ad0e949f4d51812383/propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239", size = 38064, upload-time = "2025-10-08T19:46:44.872Z" }, + { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, + { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, + { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, + { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, + { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, + { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, + { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, + { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, + { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, + { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, + { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, + { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, + { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, + { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, + { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215, upload-time = "2025-10-08T19:47:13.146Z" }, + { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112, upload-time = "2025-10-08T19:47:14.913Z" }, + { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, + { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920, upload-time = "2025-10-08T19:47:19.355Z" }, + { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748, upload-time = "2025-10-08T19:47:21.338Z" }, + { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877, upload-time = "2025-10-08T19:47:23.059Z" }, + { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, + { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586, upload-time = "2025-10-08T19:47:25.736Z" }, + { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790, upload-time = "2025-10-08T19:47:26.847Z" }, + { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158, upload-time = "2025-10-08T19:47:27.961Z" }, + { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, + { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374, upload-time = "2025-10-08T19:47:30.579Z" }, + { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, + { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856, upload-time = "2025-10-08T19:47:34.906Z" }, + { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420, upload-time = "2025-10-08T19:47:36.338Z" }, + { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, + { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, + { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873, upload-time = "2025-10-08T19:47:41.084Z" }, + { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739, upload-time = "2025-10-08T19:47:42.51Z" }, + { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514, upload-time = "2025-10-08T19:47:43.927Z" }, + { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, + { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396, upload-time = "2025-10-08T19:47:47.202Z" }, + { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897, upload-time = "2025-10-08T19:47:48.336Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789, upload-time = "2025-10-08T19:47:49.876Z" }, + { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152, upload-time = "2025-10-08T19:47:51.051Z" }, + { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869, upload-time = "2025-10-08T19:47:52.594Z" }, + { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596, upload-time = "2025-10-08T19:47:54.073Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981, upload-time = "2025-10-08T19:47:55.715Z" }, + { url = "https://files.pythonhosted.org/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490, upload-time = "2025-10-08T19:47:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371, upload-time = "2025-10-08T19:47:59.317Z" }, + { url = "https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424, upload-time = "2025-10-08T19:48:00.67Z" }, + { url = "https://files.pythonhosted.org/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566, upload-time = "2025-10-08T19:48:02.604Z" }, + { url = "https://files.pythonhosted.org/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130, upload-time = "2025-10-08T19:48:04.499Z" }, + { url = "https://files.pythonhosted.org/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625, upload-time = "2025-10-08T19:48:06.213Z" }, + { url = "https://files.pythonhosted.org/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209, upload-time = "2025-10-08T19:48:08.432Z" }, + { url = "https://files.pythonhosted.org/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797, upload-time = "2025-10-08T19:48:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140, upload-time = "2025-10-08T19:48:11.232Z" }, + { url = "https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257, upload-time = "2025-10-08T19:48:12.707Z" }, + { url = "https://files.pythonhosted.org/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097, upload-time = "2025-10-08T19:48:13.923Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455, upload-time = "2025-10-08T19:48:15.16Z" }, + { url = "https://files.pythonhosted.org/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372, upload-time = "2025-10-08T19:48:16.424Z" }, + { url = "https://files.pythonhosted.org/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411, upload-time = "2025-10-08T19:48:17.577Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712, upload-time = "2025-10-08T19:48:18.901Z" }, + { url = "https://files.pythonhosted.org/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557, upload-time = "2025-10-08T19:48:20.762Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015, upload-time = "2025-10-08T19:48:22.592Z" }, + { url = "https://files.pythonhosted.org/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880, upload-time = "2025-10-08T19:48:23.947Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938, upload-time = "2025-10-08T19:48:25.656Z" }, + { url = "https://files.pythonhosted.org/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641, upload-time = "2025-10-08T19:48:27.207Z" }, + { url = "https://files.pythonhosted.org/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510, upload-time = "2025-10-08T19:48:28.65Z" }, + { url = "https://files.pythonhosted.org/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161, upload-time = "2025-10-08T19:48:30.133Z" }, + { url = "https://files.pythonhosted.org/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393, upload-time = "2025-10-08T19:48:31.567Z" }, + { url = "https://files.pythonhosted.org/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546, upload-time = "2025-10-08T19:48:32.872Z" }, + { url = "https://files.pythonhosted.org/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259, upload-time = "2025-10-08T19:48:34.226Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428, upload-time = "2025-10-08T19:48:35.441Z" }, + { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, ] [[package]] name = "protobuf" version = "6.33.5" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/ba/25/7c72c307aafc96fa87062aa6291d9f7c94836e43214d43722e86037aac02/protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c", upload-time = "2026-01-29T21:51:33.494Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/25/7c72c307aafc96fa87062aa6291d9f7c94836e43214d43722e86037aac02/protobuf-6.33.5.tar.gz", hash = "sha256:6ddcac2a081f8b7b9642c09406bc6a4290128fce5f471cddd165960bb9119e5c", size = 444465, upload-time = "2026-01-29T21:51:33.494Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/b1/79/af92d0a8369732b027e6d6084251dd8e782c685c72da161bd4a2e00fbabb/protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b", upload-time = "2026-01-29T21:51:21.751Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/55/75/bb9bc917d10e9ee13dee8607eb9ab963b7cf8be607c46e7862c748aa2af7/protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c", upload-time = "2026-01-29T21:51:24.022Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a2/6b/e48dfc1191bc5b52950246275bf4089773e91cb5ba3592621723cdddca62/protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5", upload-time = "2026-01-29T21:51:25.413Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4e/b1/c79468184310de09d75095ed1314b839eb2f72df71097db9d1404a1b2717/protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190", upload-time = "2026-01-29T21:51:26.423Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c5/f5/65d838092fd01c44d16037953fd4c2cc851e783de9b8f02b27ec4ffd906f/protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd", upload-time = "2026-01-29T21:51:27.446Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9b/53/a9443aa3ca9ba8724fdfa02dd1887c1bcd8e89556b715cfbacca6b63dbec/protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0", upload-time = "2026-01-29T21:51:28.925Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/57/bf/2086963c69bdac3d7cff1cc7ff79b8ce5ea0bec6797a017e1be338a46248/protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02", upload-time = "2026-01-29T21:51:32.557Z" }, + { url = "https://files.pythonhosted.org/packages/b1/79/af92d0a8369732b027e6d6084251dd8e782c685c72da161bd4a2e00fbabb/protobuf-6.33.5-cp310-abi3-win32.whl", hash = "sha256:d71b040839446bac0f4d162e758bea99c8251161dae9d0983a3b88dee345153b", size = 425769, upload-time = "2026-01-29T21:51:21.751Z" }, + { url = "https://files.pythonhosted.org/packages/55/75/bb9bc917d10e9ee13dee8607eb9ab963b7cf8be607c46e7862c748aa2af7/protobuf-6.33.5-cp310-abi3-win_amd64.whl", hash = "sha256:3093804752167bcab3998bec9f1048baae6e29505adaf1afd14a37bddede533c", size = 437118, upload-time = "2026-01-29T21:51:24.022Z" }, + { url = "https://files.pythonhosted.org/packages/a2/6b/e48dfc1191bc5b52950246275bf4089773e91cb5ba3592621723cdddca62/protobuf-6.33.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a5cb85982d95d906df1e2210e58f8e4f1e3cdc088e52c921a041f9c9a0386de5", size = 427766, upload-time = "2026-01-29T21:51:25.413Z" }, + { url = "https://files.pythonhosted.org/packages/4e/b1/c79468184310de09d75095ed1314b839eb2f72df71097db9d1404a1b2717/protobuf-6.33.5-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:9b71e0281f36f179d00cbcb119cb19dec4d14a81393e5ea220f64b286173e190", size = 324638, upload-time = "2026-01-29T21:51:26.423Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f5/65d838092fd01c44d16037953fd4c2cc851e783de9b8f02b27ec4ffd906f/protobuf-6.33.5-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:8afa18e1d6d20af15b417e728e9f60f3aa108ee76f23c3b2c07a2c3b546d3afd", size = 339411, upload-time = "2026-01-29T21:51:27.446Z" }, + { url = "https://files.pythonhosted.org/packages/9b/53/a9443aa3ca9ba8724fdfa02dd1887c1bcd8e89556b715cfbacca6b63dbec/protobuf-6.33.5-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:cbf16ba3350fb7b889fca858fb215967792dc125b35c7976ca4818bee3521cf0", size = 323465, upload-time = "2026-01-29T21:51:28.925Z" }, + { url = "https://files.pythonhosted.org/packages/57/bf/2086963c69bdac3d7cff1cc7ff79b8ce5ea0bec6797a017e1be338a46248/protobuf-6.33.5-py3-none-any.whl", hash = "sha256:69915a973dd0f60f31a08b8318b73eab2bd6a392c79184b3612226b0a3f8ec02", size = 170687, upload-time = "2026-01-29T21:51:32.557Z" }, ] [[package]] @@ -4119,9 +4115,9 @@ dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.13'" }, { name = "tzdata", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/d3/b6/379d0a960f8f435ec78720462fd94c4863e7a31237cf81bf76d0af5883bf/psycopg-3.3.3.tar.gz", hash = "sha256:5e9a47458b3c1583326513b2556a2a9473a1001a56c9efe9e587245b43148dd9", upload-time = "2026-02-18T16:52:16.546Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/b6/379d0a960f8f435ec78720462fd94c4863e7a31237cf81bf76d0af5883bf/psycopg-3.3.3.tar.gz", hash = "sha256:5e9a47458b3c1583326513b2556a2a9473a1001a56c9efe9e587245b43148dd9", size = 165624, upload-time = "2026-02-18T16:52:16.546Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c8/5b/181e2e3becb7672b502f0ed7f16ed7352aca7c109cfb94cf3878a9186db9/psycopg-3.3.3-py3-none-any.whl", hash = "sha256:f96525a72bcfade6584ab17e89de415ff360748c766f0106959144dcbb38c698", upload-time = "2026-02-18T16:46:27.365Z" }, + { url = "https://files.pythonhosted.org/packages/c8/5b/181e2e3becb7672b502f0ed7f16ed7352aca7c109cfb94cf3878a9186db9/psycopg-3.3.3-py3-none-any.whl", hash = "sha256:f96525a72bcfade6584ab17e89de415ff360748c766f0106959144dcbb38c698", size = 212768, upload-time = "2026-02-18T16:46:27.365Z" }, ] [package.optional-dependencies] @@ -4134,61 +4130,61 @@ name = "psycopg-binary" version = "3.3.3" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/b4/d8/a763308a41e2ecfb6256ba0877d340c2f2b124c8b2746401863d96fa2c7a/psycopg_binary-3.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b3385b58b2fe408a13d084c14b8dcf468cd36cbbe774408250facc128f9fa75c", upload-time = "2026-02-18T16:46:33.132Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6c/a9/f8a683e85400c1208685e7c895abc049dc13aa0b6ea989e6adf0a3681fe0/psycopg_binary-3.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1bef235a50a80f6aba05147002bc354559657cb6386dbd04d8e1c97d1d7cbe84", upload-time = "2026-02-18T16:46:42.904Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e3/7d/03512c4aaac8a58fc3b1221f38293aa517a1950d10ef8646c72c49addc7d/psycopg_binary-3.3.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:97c839717bf8c8df3f6d983a20949c4fb22e2a34ee172e3e427ede363feda27b", upload-time = "2026-02-18T16:46:51.517Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8a/bc/23319b4b1c2c0b810d225e1b6f16efbb16150074fc0ea96bfcabdf59ee09/psycopg_binary-3.3.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:48e500cf1c0984dacf1f28ea482c3cdbb4c2288d51c336c04bc64198ab21fc51", upload-time = "2026-02-18T16:47:00.878Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/c8/6d61dc0a56654c558a37b2d9b2094e470aa12621305cc7935fd769122e32/psycopg_binary-3.3.3-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb36a08859b9432d94ea6b26ec41a2f98f83f14868c91321d0c1e11f672eeae7", upload-time = "2026-02-18T16:47:11.784Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9e/b5/e2a3c90aa1059f5b5f593379caad7be3cc3c2ce1ddfc7730e39854e174fe/psycopg_binary-3.3.3-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0dde92cfde09293fb63b3f547919ba7d73bd2654573c03502b3263dd0218e44e", upload-time = "2026-02-18T16:47:17.062Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/3e/bf126e0a1f864e191b7f3eeea667ee2ce13d582b036255fb8b12946d1f7a/psycopg_binary-3.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:78c9ce98caaf82ac8484d269791c1b403d7598633e0e4e2fa1097baae244e2f1", upload-time = "2026-02-18T16:47:21.673Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f4/d8/bb5e8d395deb945629aa0c65d12ab90ec3bfcbdf56be89e2a84d001864c9/psycopg_binary-3.3.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d593612758d0041cb13cb0003f7f8d3fabb7ad9319e651e78afae49b1cf5860e", upload-time = "2026-02-18T16:47:25.82Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/70/33eef61b0f0fd41ebf93b9699f44067313a45016827f67b3c8cc41f0a7ab/psycopg_binary-3.3.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:f24e8e17035200a465c178e9ea945527ad0738118694184c450f1192a452ff25", upload-time = "2026-02-18T16:47:30.434Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ea/db/27c2b3b9698e713e83e11e8540daa27516f9e90390ec21a41091cb15fcaf/psycopg_binary-3.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e7b607f0e14f2a4cf7e78a05ebd13df6144acfba87cb90842e70d3f125d9f53f", upload-time = "2026-02-18T16:47:36.128Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a1/3b/71e5d603059bf5474215f573a3e2d357a4e95672b26e04d41674400d4862/psycopg_binary-3.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b27d3a23c79fa59557d2cc63a7e8bb4c7e022c018558eda36f9d7c4e6b99a6e0", upload-time = "2026-02-18T16:47:42.799Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/be/c0/b389119dd754483d316805260f3e73cdcad97925839107cc7a296f6132b1/psycopg_binary-3.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a89bb9ee11177b2995d87186b1d9fa892d8ea725e85eab28c6525e4cc14ee048", upload-time = "2026-02-18T16:47:51.093Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/e3/9976eef20f61840285174d360da4c820a311ab39d6b82fa09fbb545be825/psycopg_binary-3.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f7d0cf072c6fbac3795b08c98ef9ea013f11db609659dcfc6b1f6cc31f9e181", upload-time = "2026-02-18T16:47:55.523Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/f2/d28ba2f7404fd7f68d41e8a11df86313bd646258244cb12a8dd83b868a97/psycopg_binary-3.3.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:90eecd93073922f085967f3ed3a98ba8c325cbbc8c1a204e300282abd2369e13", upload-time = "2026-02-18T16:47:59.929Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/de/2f/6c5c54b815edeb30a281cfcea96dc93b3bb6be939aea022f00cab7aa1420/psycopg_binary-3.3.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dac7ee2f88b4d7bb12837989ca354c38d400eeb21bce3b73dac02622f0a3c8d6", upload-time = "2026-02-18T16:48:05.665Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/51/75/8206c7008b57de03c1ada46bd3110cc3743f3fd9ed52031c4601401d766d/psycopg_binary-3.3.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b62cf8784eb6d35beaee1056d54caf94ec6ecf2b7552395e305518ab61eb8fd2", upload-time = "2026-02-18T16:48:13.541Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/5a/ea1641a1e6c8c8b3454b0fcb43c3045133a8b703e6e824fae134088e63bd/psycopg_binary-3.3.3-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a39f34c9b18e8f6794cca17bfbcd64572ca2482318db644268049f8c738f35a6", upload-time = "2026-02-18T16:48:22.176Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/fb/538df099bf55ae1637d52d7ccb6b9620b535a40f4c733897ac2b7bb9e14c/psycopg_binary-3.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:883d68d48ca9ff3cb3d10c5fdebea02c79b48eecacdddbf7cce6e7cdbdc216b8", upload-time = "2026-02-18T16:48:27.338Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a1/d1/00780c0e187ea3c13dfc53bd7060654b2232cd30df562aac91a5f1c545ac/psycopg_binary-3.3.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:cab7bc3d288d37a80aa8c0820033250c95e40b1c2b5c57cf59827b19c2a8b69d", upload-time = "2026-02-18T16:48:31.221Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/34/a07f1ff713c51d64dc9f19f2c32be80299a2055d5d109d5853662b922cb4/psycopg_binary-3.3.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:56c767007ca959ca32f796b42379fc7e1ae2ed085d29f20b05b3fc394f3715cc", upload-time = "2026-02-18T16:48:35.869Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/67/d33f268a7759b4445f3c9b5a181039b01af8c8263c865c1be7a6444d4749/psycopg_binary-3.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:da2f331a01af232259a21573a01338530c6016dcfad74626c01330535bcd8628", upload-time = "2026-02-18T16:48:41.365Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b4/3b/0d8d2c5e8e29ccc07d28c8af38445d9d9abcd238d590186cac82ee71fc84/psycopg_binary-3.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:19f93235ece6dbfc4036b5e4f6d8b13f0b8f2b3eeb8b0bd2936d406991bcdd40", upload-time = "2026-02-18T16:48:46.679Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/90/15/021be5c0cbc5b7c1ab46e91cc3434eb42569f79a0592e67b8d25e66d844d/psycopg_binary-3.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6698dbab5bcef8fdb570fc9d35fd9ac52041771bfcfe6fd0fc5f5c4e36f1e99d", upload-time = "2026-02-18T16:48:55.594Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/54/a60211c346c9a2f8c6b272b5f2bbe21f6e11800ce7f61e99ba75cf8b63e1/psycopg_binary-3.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:329ff393441e75f10b673ae99ab45276887993d49e65f141da20d915c05aafd8", upload-time = "2026-02-18T16:49:03.608Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c1/53/ac7c18671347c553362aadbf65f92786eef9540676ca24114cc02f5be405/psycopg_binary-3.3.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:eb072949b8ebf4082ae24289a2b0fd724da9adc8f22743409d6fd718ddb379df", upload-time = "2026-02-18T16:49:10.128Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7f/c3/4f4e040902b82a344eff1c736cde2f2720f127fe939c7e7565706f96dd44/psycopg_binary-3.3.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:263a24f39f26e19ed7fc982d7859a36f17841b05bebad3eb47bb9cd2dd785351", upload-time = "2026-02-18T16:49:16.335Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/e7/d929679c6a5c212bcf738806c7c89f5b3d0919f2e1685a0e08d6ff877945/psycopg_binary-3.3.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5152d50798c2fa5bd9b68ec68eb68a1b71b95126c1d70adaa1a08cd5eefdc23d", upload-time = "2026-02-18T16:49:22.687Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/69/b0/09703aeb69a9443d232d7b5318d58742e8ca51ff79f90ffe6b88f1db45e7/psycopg_binary-3.3.3-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9d6a1e56dd267848edb824dbeb08cf5bac649e02ee0b03ba883ba3f4f0bd54f2", upload-time = "2026-02-18T16:49:27.313Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cc/a6/e662558b793c6e13a7473b970fee327d635270e41eded3090ef14045a6a5/psycopg_binary-3.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73eaaf4bb04709f545606c1db2f65f4000e8a04cdbf3e00d165a23004692093e", upload-time = "2026-02-18T16:49:31.575Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/7f/0f8b2e1d5e0093921b6f324a948a5c740c1447fbb45e97acaf50241d0f39/psycopg_binary-3.3.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:162e5675efb4704192411eaf8e00d07f7960b679cd3306e7efb120bb8d9456cc", upload-time = "2026-02-18T16:49:35.801Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/92/ec/ce2e91c33bc8d10b00c87e2f6b0fb570641a6a60042d6a9ae35658a3a797/psycopg_binary-3.3.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:fab6b5e37715885c69f5d091f6ff229be71e235f272ebaa35158d5a46fd548a0", upload-time = "2026-02-18T16:49:41.129Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c5/2f/7718141485f73a924205af60041c392938852aa447a94c8cbd222ff389a1/psycopg_binary-3.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a4aab31bd6d1057f287c96c0effca3a25584eb9cc702f282ecb96ded7814e830", upload-time = "2026-02-18T16:49:46.726Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/57/f9/1add717e2643a003bbde31b1b220172e64fbc0cb09f06429820c9173f7fc/psycopg_binary-3.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:59aa31fe11a0e1d1bcc2ce37ed35fe2ac84cd65bb9036d049b1a1c39064d0f14", upload-time = "2026-02-18T16:49:52.999Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/0a/cac9fdf1df16a269ba0e5f0f06cac61f826c94cadb39df028cdfe19d3a33/psycopg_binary-3.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05f32239aec25c5fb15f7948cffdc2dc0dac098e48b80a140e4ba32b572a2e7d", upload-time = "2026-02-18T16:50:01.441Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/c0/d8f8508fbf440edbc0099b1abff33003cd80c9e66eb3a1e78834e3fb4fb9/psycopg_binary-3.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c84f9d214f2d1de2fafebc17fa68ac3f6561a59e291553dfc45ad299f4898c1", upload-time = "2026-02-18T16:50:08.803Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/04/05/097016b77e343b4568feddf12c72171fc513acef9a4214d21b9478569068/psycopg_binary-3.3.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e77957d2ba17cada11be09a5066d93026cdb61ada7c8893101d7fe1c6e1f3925", upload-time = "2026-02-18T16:50:14.985Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/91/23/73244e5feb55b5ca109cede6e97f32ef45189f0fdac4c80d75c99862729d/psycopg_binary-3.3.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:42961609ac07c232a427da7c87a468d3c82fee6762c220f38e37cfdacb2b178d", upload-time = "2026-02-18T16:50:24.82Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/11/49/5309473b9803b207682095201d8708bbc7842ddf3f192488a69204e36455/psycopg_binary-3.3.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae07a3114313dd91fce686cab2f4c44af094398519af0e0f854bc707e1aeedf1", upload-time = "2026-02-18T16:50:35.106Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/5d/03abe74ef34d460b33c4d9662bf6ec1dd38888324323c1a1752133c10377/psycopg_binary-3.3.3-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d257c58d7b36a621dcce1d01476ad8b60f12d80eb1406aee4cf796f88b2ae482", upload-time = "2026-02-18T16:50:42.067Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f0/6c/3fbf8e604e15f2f3752900434046c00c90bb8764305a1b81112bff30ba24/psycopg_binary-3.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:07c7211f9327d522c9c47560cae00a4ecf6687f4e02d779d035dd3177b41cb12", upload-time = "2026-02-18T16:50:50.116Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/6b/1a06b43b7c7af756c80b67eac8bfaa51d77e68635a8a8d246e4f0bb7604a/psycopg_binary-3.3.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8e7e9eca9b363dbedeceeadd8be97149d2499081f3c52d141d7cd1f395a91f83", upload-time = "2026-02-18T16:50:55.97Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2b/d3/bf49e3dcaadba510170c8d111e5e69e5ae3f981c1554c5bb71c75ce354bb/psycopg_binary-3.3.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:cb85b1d5702877c16f28d7b92ba030c1f49ebcc9b87d03d8c10bf45a2f1c7508", upload-time = "2026-02-18T16:51:03.299Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/92/0aac830ed6a944fe334404e1687a074e4215630725753f0e3e9a9a595b62/psycopg_binary-3.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4d4606c84d04b80f9138d72f1e28c6c02dc5ae0c7b8f3f8aaf89c681ce1cd1b1", upload-time = "2026-02-18T16:51:09.097Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2e/96/102244653ee5a143ece5afe33f00f52fe64e389dfce8dbc87580c6d70d3d/psycopg_binary-3.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:74eae563166ebf74e8d950ff359be037b85723d99ca83f57d9b244a871d6c13b", upload-time = "2026-02-18T16:51:13.892Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a2/71/7a57e5b12275fe7e7d84d54113f0226080423a869118419c9106c083a21c/psycopg_binary-3.3.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:497852c5eaf1f0c2d88ab74a64a8097c099deac0c71de1cbcf18659a8a04a4b2", upload-time = "2026-02-18T16:51:19.295Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/04/cb834f120f2b2c10d4003515ef9ca9d688115b9431735e3936ae48549af8/psycopg_binary-3.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:258d1ea53464d29768bf25930f43291949f4c7becc706f6e220c515a63a24edd", upload-time = "2026-02-18T16:51:23.84Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/e9/47a69692d3da9704468041aa5ed3ad6fc7f6bb1a5ae788d261a26bbca6c7/psycopg_binary-3.3.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:111c59897a452196116db12e7f608da472fbff000693a21040e35fc978b23430", upload-time = "2026-02-18T16:51:29.645Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/b6/0e0dd6a2f802864a4ae3dbadf4ec620f05e3904c7842b326aafc43e5f464/psycopg_binary-3.3.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:17bb6600e2455993946385249a3c3d0af52cd70c1c1cdbf712e9d696d0b0bf1b", upload-time = "2026-02-18T16:51:36.499Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/0d/977af38ac19a6b55d22dff508bd743fd7c1901e1b73657e7937c7cccb0a3/psycopg_binary-3.3.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:642050398583d61c9856210568eb09a8e4f2fe8224bf3be21b67a370e677eead", upload-time = "2026-02-18T16:51:43.167Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/34/40/912a39d48322cf86895c0eaf2d5b95cb899402443faefd4b09abbba6b6e1/psycopg_binary-3.3.3-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:533efe6dc3a7cba5e2a84e38970786bb966306863e45f3db152007e9f48638a6", upload-time = "2026-02-18T16:51:47.707Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/98/0c/c14d0e259c65dc7be854d926993f151077887391d5a081118907a9d89603/psycopg_binary-3.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5958dbf28b77ce2033482f6cb9ef04d43f5d8f4b7636e6963d5626f000efb23e", upload-time = "2026-02-18T16:51:51.421Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/39/21/8b7c50a194cfca6ea0fd4d1f276158307785775426e90700ab2eba5cd623/psycopg_binary-3.3.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a6af77b6626ce92b5817bf294b4d45ec1a6161dba80fc2d82cdffdd6814fd023", upload-time = "2026-02-18T16:51:57.336Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/2c/a4981bf42cf30ebba0424971d7ce70a222ae9b82594c42fc3f2105d7b525/psycopg_binary-3.3.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:47f06fcbe8542b4d96d7392c476a74ada521c5aebdb41c3c0155f6595fc14c8d", upload-time = "2026-02-18T16:52:04.266Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/60/e9/b7c29b56aa0b85a4e0c4d89db691c1ceef08f46a356369144430c155a2f5/psycopg_binary-3.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e7800e6c6b5dc4b0ca7cc7370f770f53ac83886b76afda0848065a674231e856", upload-time = "2026-02-18T16:52:10.444Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/98/5a/291d89f44d3820fffb7a04ebc8f3ef5dda4f542f44a5daea0c55a84abf45/psycopg_binary-3.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:165f22ab5a9513a3d7425ffb7fcc7955ed8ccaeef6d37e369d6cc1dff1582383", upload-time = "2026-02-18T16:52:14.02Z" }, + { url = "https://files.pythonhosted.org/packages/b4/d8/a763308a41e2ecfb6256ba0877d340c2f2b124c8b2746401863d96fa2c7a/psycopg_binary-3.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b3385b58b2fe408a13d084c14b8dcf468cd36cbbe774408250facc128f9fa75c", size = 4609758, upload-time = "2026-02-18T16:46:33.132Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a9/f8a683e85400c1208685e7c895abc049dc13aa0b6ea989e6adf0a3681fe0/psycopg_binary-3.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1bef235a50a80f6aba05147002bc354559657cb6386dbd04d8e1c97d1d7cbe84", size = 4676740, upload-time = "2026-02-18T16:46:42.904Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7d/03512c4aaac8a58fc3b1221f38293aa517a1950d10ef8646c72c49addc7d/psycopg_binary-3.3.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:97c839717bf8c8df3f6d983a20949c4fb22e2a34ee172e3e427ede363feda27b", size = 5496335, upload-time = "2026-02-18T16:46:51.517Z" }, + { url = "https://files.pythonhosted.org/packages/8a/bc/23319b4b1c2c0b810d225e1b6f16efbb16150074fc0ea96bfcabdf59ee09/psycopg_binary-3.3.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:48e500cf1c0984dacf1f28ea482c3cdbb4c2288d51c336c04bc64198ab21fc51", size = 5172032, upload-time = "2026-02-18T16:47:00.878Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c8/6d61dc0a56654c558a37b2d9b2094e470aa12621305cc7935fd769122e32/psycopg_binary-3.3.3-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb36a08859b9432d94ea6b26ec41a2f98f83f14868c91321d0c1e11f672eeae7", size = 6763107, upload-time = "2026-02-18T16:47:11.784Z" }, + { url = "https://files.pythonhosted.org/packages/9e/b5/e2a3c90aa1059f5b5f593379caad7be3cc3c2ce1ddfc7730e39854e174fe/psycopg_binary-3.3.3-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0dde92cfde09293fb63b3f547919ba7d73bd2654573c03502b3263dd0218e44e", size = 5006494, upload-time = "2026-02-18T16:47:17.062Z" }, + { url = "https://files.pythonhosted.org/packages/5d/3e/bf126e0a1f864e191b7f3eeea667ee2ce13d582b036255fb8b12946d1f7a/psycopg_binary-3.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:78c9ce98caaf82ac8484d269791c1b403d7598633e0e4e2fa1097baae244e2f1", size = 4533850, upload-time = "2026-02-18T16:47:21.673Z" }, + { url = "https://files.pythonhosted.org/packages/f4/d8/bb5e8d395deb945629aa0c65d12ab90ec3bfcbdf56be89e2a84d001864c9/psycopg_binary-3.3.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d593612758d0041cb13cb0003f7f8d3fabb7ad9319e651e78afae49b1cf5860e", size = 4223316, upload-time = "2026-02-18T16:47:25.82Z" }, + { url = "https://files.pythonhosted.org/packages/c2/70/33eef61b0f0fd41ebf93b9699f44067313a45016827f67b3c8cc41f0a7ab/psycopg_binary-3.3.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:f24e8e17035200a465c178e9ea945527ad0738118694184c450f1192a452ff25", size = 3954515, upload-time = "2026-02-18T16:47:30.434Z" }, + { url = "https://files.pythonhosted.org/packages/ea/db/27c2b3b9698e713e83e11e8540daa27516f9e90390ec21a41091cb15fcaf/psycopg_binary-3.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e7b607f0e14f2a4cf7e78a05ebd13df6144acfba87cb90842e70d3f125d9f53f", size = 4260274, upload-time = "2026-02-18T16:47:36.128Z" }, + { url = "https://files.pythonhosted.org/packages/a1/3b/71e5d603059bf5474215f573a3e2d357a4e95672b26e04d41674400d4862/psycopg_binary-3.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:b27d3a23c79fa59557d2cc63a7e8bb4c7e022c018558eda36f9d7c4e6b99a6e0", size = 3557375, upload-time = "2026-02-18T16:47:42.799Z" }, + { url = "https://files.pythonhosted.org/packages/be/c0/b389119dd754483d316805260f3e73cdcad97925839107cc7a296f6132b1/psycopg_binary-3.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a89bb9ee11177b2995d87186b1d9fa892d8ea725e85eab28c6525e4cc14ee048", size = 4609740, upload-time = "2026-02-18T16:47:51.093Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9976eef20f61840285174d360da4c820a311ab39d6b82fa09fbb545be825/psycopg_binary-3.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9f7d0cf072c6fbac3795b08c98ef9ea013f11db609659dcfc6b1f6cc31f9e181", size = 4676837, upload-time = "2026-02-18T16:47:55.523Z" }, + { url = "https://files.pythonhosted.org/packages/9f/f2/d28ba2f7404fd7f68d41e8a11df86313bd646258244cb12a8dd83b868a97/psycopg_binary-3.3.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:90eecd93073922f085967f3ed3a98ba8c325cbbc8c1a204e300282abd2369e13", size = 5497070, upload-time = "2026-02-18T16:47:59.929Z" }, + { url = "https://files.pythonhosted.org/packages/de/2f/6c5c54b815edeb30a281cfcea96dc93b3bb6be939aea022f00cab7aa1420/psycopg_binary-3.3.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dac7ee2f88b4d7bb12837989ca354c38d400eeb21bce3b73dac02622f0a3c8d6", size = 5172410, upload-time = "2026-02-18T16:48:05.665Z" }, + { url = "https://files.pythonhosted.org/packages/51/75/8206c7008b57de03c1ada46bd3110cc3743f3fd9ed52031c4601401d766d/psycopg_binary-3.3.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b62cf8784eb6d35beaee1056d54caf94ec6ecf2b7552395e305518ab61eb8fd2", size = 6763408, upload-time = "2026-02-18T16:48:13.541Z" }, + { url = "https://files.pythonhosted.org/packages/d4/5a/ea1641a1e6c8c8b3454b0fcb43c3045133a8b703e6e824fae134088e63bd/psycopg_binary-3.3.3-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a39f34c9b18e8f6794cca17bfbcd64572ca2482318db644268049f8c738f35a6", size = 5006255, upload-time = "2026-02-18T16:48:22.176Z" }, + { url = "https://files.pythonhosted.org/packages/aa/fb/538df099bf55ae1637d52d7ccb6b9620b535a40f4c733897ac2b7bb9e14c/psycopg_binary-3.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:883d68d48ca9ff3cb3d10c5fdebea02c79b48eecacdddbf7cce6e7cdbdc216b8", size = 4532694, upload-time = "2026-02-18T16:48:27.338Z" }, + { url = "https://files.pythonhosted.org/packages/a1/d1/00780c0e187ea3c13dfc53bd7060654b2232cd30df562aac91a5f1c545ac/psycopg_binary-3.3.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:cab7bc3d288d37a80aa8c0820033250c95e40b1c2b5c57cf59827b19c2a8b69d", size = 4222833, upload-time = "2026-02-18T16:48:31.221Z" }, + { url = "https://files.pythonhosted.org/packages/7a/34/a07f1ff713c51d64dc9f19f2c32be80299a2055d5d109d5853662b922cb4/psycopg_binary-3.3.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:56c767007ca959ca32f796b42379fc7e1ae2ed085d29f20b05b3fc394f3715cc", size = 3952818, upload-time = "2026-02-18T16:48:35.869Z" }, + { url = "https://files.pythonhosted.org/packages/d3/67/d33f268a7759b4445f3c9b5a181039b01af8c8263c865c1be7a6444d4749/psycopg_binary-3.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:da2f331a01af232259a21573a01338530c6016dcfad74626c01330535bcd8628", size = 4258061, upload-time = "2026-02-18T16:48:41.365Z" }, + { url = "https://files.pythonhosted.org/packages/b4/3b/0d8d2c5e8e29ccc07d28c8af38445d9d9abcd238d590186cac82ee71fc84/psycopg_binary-3.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:19f93235ece6dbfc4036b5e4f6d8b13f0b8f2b3eeb8b0bd2936d406991bcdd40", size = 3558915, upload-time = "2026-02-18T16:48:46.679Z" }, + { url = "https://files.pythonhosted.org/packages/90/15/021be5c0cbc5b7c1ab46e91cc3434eb42569f79a0592e67b8d25e66d844d/psycopg_binary-3.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6698dbab5bcef8fdb570fc9d35fd9ac52041771bfcfe6fd0fc5f5c4e36f1e99d", size = 4591170, upload-time = "2026-02-18T16:48:55.594Z" }, + { url = "https://files.pythonhosted.org/packages/f1/54/a60211c346c9a2f8c6b272b5f2bbe21f6e11800ce7f61e99ba75cf8b63e1/psycopg_binary-3.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:329ff393441e75f10b673ae99ab45276887993d49e65f141da20d915c05aafd8", size = 4670009, upload-time = "2026-02-18T16:49:03.608Z" }, + { url = "https://files.pythonhosted.org/packages/c1/53/ac7c18671347c553362aadbf65f92786eef9540676ca24114cc02f5be405/psycopg_binary-3.3.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:eb072949b8ebf4082ae24289a2b0fd724da9adc8f22743409d6fd718ddb379df", size = 5469735, upload-time = "2026-02-18T16:49:10.128Z" }, + { url = "https://files.pythonhosted.org/packages/7f/c3/4f4e040902b82a344eff1c736cde2f2720f127fe939c7e7565706f96dd44/psycopg_binary-3.3.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:263a24f39f26e19ed7fc982d7859a36f17841b05bebad3eb47bb9cd2dd785351", size = 5152919, upload-time = "2026-02-18T16:49:16.335Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e7/d929679c6a5c212bcf738806c7c89f5b3d0919f2e1685a0e08d6ff877945/psycopg_binary-3.3.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5152d50798c2fa5bd9b68ec68eb68a1b71b95126c1d70adaa1a08cd5eefdc23d", size = 6738785, upload-time = "2026-02-18T16:49:22.687Z" }, + { url = "https://files.pythonhosted.org/packages/69/b0/09703aeb69a9443d232d7b5318d58742e8ca51ff79f90ffe6b88f1db45e7/psycopg_binary-3.3.3-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9d6a1e56dd267848edb824dbeb08cf5bac649e02ee0b03ba883ba3f4f0bd54f2", size = 4979008, upload-time = "2026-02-18T16:49:27.313Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a6/e662558b793c6e13a7473b970fee327d635270e41eded3090ef14045a6a5/psycopg_binary-3.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73eaaf4bb04709f545606c1db2f65f4000e8a04cdbf3e00d165a23004692093e", size = 4508255, upload-time = "2026-02-18T16:49:31.575Z" }, + { url = "https://files.pythonhosted.org/packages/5f/7f/0f8b2e1d5e0093921b6f324a948a5c740c1447fbb45e97acaf50241d0f39/psycopg_binary-3.3.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:162e5675efb4704192411eaf8e00d07f7960b679cd3306e7efb120bb8d9456cc", size = 4189166, upload-time = "2026-02-18T16:49:35.801Z" }, + { url = "https://files.pythonhosted.org/packages/92/ec/ce2e91c33bc8d10b00c87e2f6b0fb570641a6a60042d6a9ae35658a3a797/psycopg_binary-3.3.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:fab6b5e37715885c69f5d091f6ff229be71e235f272ebaa35158d5a46fd548a0", size = 3924544, upload-time = "2026-02-18T16:49:41.129Z" }, + { url = "https://files.pythonhosted.org/packages/c5/2f/7718141485f73a924205af60041c392938852aa447a94c8cbd222ff389a1/psycopg_binary-3.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a4aab31bd6d1057f287c96c0effca3a25584eb9cc702f282ecb96ded7814e830", size = 4235297, upload-time = "2026-02-18T16:49:46.726Z" }, + { url = "https://files.pythonhosted.org/packages/57/f9/1add717e2643a003bbde31b1b220172e64fbc0cb09f06429820c9173f7fc/psycopg_binary-3.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:59aa31fe11a0e1d1bcc2ce37ed35fe2ac84cd65bb9036d049b1a1c39064d0f14", size = 3547659, upload-time = "2026-02-18T16:49:52.999Z" }, + { url = "https://files.pythonhosted.org/packages/03/0a/cac9fdf1df16a269ba0e5f0f06cac61f826c94cadb39df028cdfe19d3a33/psycopg_binary-3.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05f32239aec25c5fb15f7948cffdc2dc0dac098e48b80a140e4ba32b572a2e7d", size = 4590414, upload-time = "2026-02-18T16:50:01.441Z" }, + { url = "https://files.pythonhosted.org/packages/9c/c0/d8f8508fbf440edbc0099b1abff33003cd80c9e66eb3a1e78834e3fb4fb9/psycopg_binary-3.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c84f9d214f2d1de2fafebc17fa68ac3f6561a59e291553dfc45ad299f4898c1", size = 4669021, upload-time = "2026-02-18T16:50:08.803Z" }, + { url = "https://files.pythonhosted.org/packages/04/05/097016b77e343b4568feddf12c72171fc513acef9a4214d21b9478569068/psycopg_binary-3.3.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e77957d2ba17cada11be09a5066d93026cdb61ada7c8893101d7fe1c6e1f3925", size = 5467453, upload-time = "2026-02-18T16:50:14.985Z" }, + { url = "https://files.pythonhosted.org/packages/91/23/73244e5feb55b5ca109cede6e97f32ef45189f0fdac4c80d75c99862729d/psycopg_binary-3.3.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:42961609ac07c232a427da7c87a468d3c82fee6762c220f38e37cfdacb2b178d", size = 5151135, upload-time = "2026-02-18T16:50:24.82Z" }, + { url = "https://files.pythonhosted.org/packages/11/49/5309473b9803b207682095201d8708bbc7842ddf3f192488a69204e36455/psycopg_binary-3.3.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae07a3114313dd91fce686cab2f4c44af094398519af0e0f854bc707e1aeedf1", size = 6737315, upload-time = "2026-02-18T16:50:35.106Z" }, + { url = "https://files.pythonhosted.org/packages/d4/5d/03abe74ef34d460b33c4d9662bf6ec1dd38888324323c1a1752133c10377/psycopg_binary-3.3.3-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d257c58d7b36a621dcce1d01476ad8b60f12d80eb1406aee4cf796f88b2ae482", size = 4979783, upload-time = "2026-02-18T16:50:42.067Z" }, + { url = "https://files.pythonhosted.org/packages/f0/6c/3fbf8e604e15f2f3752900434046c00c90bb8764305a1b81112bff30ba24/psycopg_binary-3.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:07c7211f9327d522c9c47560cae00a4ecf6687f4e02d779d035dd3177b41cb12", size = 4509023, upload-time = "2026-02-18T16:50:50.116Z" }, + { url = "https://files.pythonhosted.org/packages/9c/6b/1a06b43b7c7af756c80b67eac8bfaa51d77e68635a8a8d246e4f0bb7604a/psycopg_binary-3.3.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:8e7e9eca9b363dbedeceeadd8be97149d2499081f3c52d141d7cd1f395a91f83", size = 4185874, upload-time = "2026-02-18T16:50:55.97Z" }, + { url = "https://files.pythonhosted.org/packages/2b/d3/bf49e3dcaadba510170c8d111e5e69e5ae3f981c1554c5bb71c75ce354bb/psycopg_binary-3.3.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:cb85b1d5702877c16f28d7b92ba030c1f49ebcc9b87d03d8c10bf45a2f1c7508", size = 3925668, upload-time = "2026-02-18T16:51:03.299Z" }, + { url = "https://files.pythonhosted.org/packages/f8/92/0aac830ed6a944fe334404e1687a074e4215630725753f0e3e9a9a595b62/psycopg_binary-3.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4d4606c84d04b80f9138d72f1e28c6c02dc5ae0c7b8f3f8aaf89c681ce1cd1b1", size = 4234973, upload-time = "2026-02-18T16:51:09.097Z" }, + { url = "https://files.pythonhosted.org/packages/2e/96/102244653ee5a143ece5afe33f00f52fe64e389dfce8dbc87580c6d70d3d/psycopg_binary-3.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:74eae563166ebf74e8d950ff359be037b85723d99ca83f57d9b244a871d6c13b", size = 3551342, upload-time = "2026-02-18T16:51:13.892Z" }, + { url = "https://files.pythonhosted.org/packages/a2/71/7a57e5b12275fe7e7d84d54113f0226080423a869118419c9106c083a21c/psycopg_binary-3.3.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:497852c5eaf1f0c2d88ab74a64a8097c099deac0c71de1cbcf18659a8a04a4b2", size = 4607368, upload-time = "2026-02-18T16:51:19.295Z" }, + { url = "https://files.pythonhosted.org/packages/c7/04/cb834f120f2b2c10d4003515ef9ca9d688115b9431735e3936ae48549af8/psycopg_binary-3.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:258d1ea53464d29768bf25930f43291949f4c7becc706f6e220c515a63a24edd", size = 4687047, upload-time = "2026-02-18T16:51:23.84Z" }, + { url = "https://files.pythonhosted.org/packages/40/e9/47a69692d3da9704468041aa5ed3ad6fc7f6bb1a5ae788d261a26bbca6c7/psycopg_binary-3.3.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:111c59897a452196116db12e7f608da472fbff000693a21040e35fc978b23430", size = 5487096, upload-time = "2026-02-18T16:51:29.645Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b6/0e0dd6a2f802864a4ae3dbadf4ec620f05e3904c7842b326aafc43e5f464/psycopg_binary-3.3.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:17bb6600e2455993946385249a3c3d0af52cd70c1c1cdbf712e9d696d0b0bf1b", size = 5168720, upload-time = "2026-02-18T16:51:36.499Z" }, + { url = "https://files.pythonhosted.org/packages/6f/0d/977af38ac19a6b55d22dff508bd743fd7c1901e1b73657e7937c7cccb0a3/psycopg_binary-3.3.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:642050398583d61c9856210568eb09a8e4f2fe8224bf3be21b67a370e677eead", size = 6762076, upload-time = "2026-02-18T16:51:43.167Z" }, + { url = "https://files.pythonhosted.org/packages/34/40/912a39d48322cf86895c0eaf2d5b95cb899402443faefd4b09abbba6b6e1/psycopg_binary-3.3.3-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:533efe6dc3a7cba5e2a84e38970786bb966306863e45f3db152007e9f48638a6", size = 4997623, upload-time = "2026-02-18T16:51:47.707Z" }, + { url = "https://files.pythonhosted.org/packages/98/0c/c14d0e259c65dc7be854d926993f151077887391d5a081118907a9d89603/psycopg_binary-3.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5958dbf28b77ce2033482f6cb9ef04d43f5d8f4b7636e6963d5626f000efb23e", size = 4532096, upload-time = "2026-02-18T16:51:51.421Z" }, + { url = "https://files.pythonhosted.org/packages/39/21/8b7c50a194cfca6ea0fd4d1f276158307785775426e90700ab2eba5cd623/psycopg_binary-3.3.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a6af77b6626ce92b5817bf294b4d45ec1a6161dba80fc2d82cdffdd6814fd023", size = 4208884, upload-time = "2026-02-18T16:51:57.336Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2c/a4981bf42cf30ebba0424971d7ce70a222ae9b82594c42fc3f2105d7b525/psycopg_binary-3.3.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:47f06fcbe8542b4d96d7392c476a74ada521c5aebdb41c3c0155f6595fc14c8d", size = 3944542, upload-time = "2026-02-18T16:52:04.266Z" }, + { url = "https://files.pythonhosted.org/packages/60/e9/b7c29b56aa0b85a4e0c4d89db691c1ceef08f46a356369144430c155a2f5/psycopg_binary-3.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e7800e6c6b5dc4b0ca7cc7370f770f53ac83886b76afda0848065a674231e856", size = 4254339, upload-time = "2026-02-18T16:52:10.444Z" }, + { url = "https://files.pythonhosted.org/packages/98/5a/291d89f44d3820fffb7a04ebc8f3ef5dda4f542f44a5daea0c55a84abf45/psycopg_binary-3.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:165f22ab5a9513a3d7425ffb7fcc7955ed8ccaeef6d37e369d6cc1dff1582383", size = 3652796, upload-time = "2026-02-18T16:52:14.02Z" }, ] [[package]] @@ -4198,9 +4194,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/56/9a/9470d013d0d50af0da9c4251614aeb3c1823635cab3edc211e3839db0bcf/psycopg_pool-3.3.0.tar.gz", hash = "sha256:fa115eb2860bd88fce1717d75611f41490dec6135efb619611142b24da3f6db5", upload-time = "2025-12-01T11:34:33.11Z" } +sdist = { url = "https://files.pythonhosted.org/packages/56/9a/9470d013d0d50af0da9c4251614aeb3c1823635cab3edc211e3839db0bcf/psycopg_pool-3.3.0.tar.gz", hash = "sha256:fa115eb2860bd88fce1717d75611f41490dec6135efb619611142b24da3f6db5", size = 31606, upload-time = "2025-12-01T11:34:33.11Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/e7/c3/26b8a0908a9db249de3b4169692e1c7c19048a9bc41a4d3209cee7dbb758/psycopg_pool-3.3.0-py3-none-any.whl", hash = "sha256:2e44329155c410b5e8666372db44276a8b1ebd8c90f1c3026ebba40d4bc81063", upload-time = "2025-12-01T11:34:29.761Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c3/26b8a0908a9db249de3b4169692e1c7c19048a9bc41a4d3209cee7dbb758/psycopg_pool-3.3.0-py3-none-any.whl", hash = "sha256:2e44329155c410b5e8666372db44276a8b1ebd8c90f1c3026ebba40d4bc81063", size = 39995, upload-time = "2025-12-01T11:34:29.761Z" }, ] [[package]] @@ -4211,9 +4207,9 @@ dependencies = [ { name = "beartype" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/04/3c/0397c072a38d4bc580994b42e0c90c5f44f679303489e4376289534735e5/py_key_value_aio-0.4.4.tar.gz", hash = "sha256:e3012e6243ed7cc09bb05457bd4d03b1ba5c2b1ca8700096b3927db79ffbbe55", upload-time = "2026-02-16T21:21:43.245Z" } +sdist = { url = "https://files.pythonhosted.org/packages/04/3c/0397c072a38d4bc580994b42e0c90c5f44f679303489e4376289534735e5/py_key_value_aio-0.4.4.tar.gz", hash = "sha256:e3012e6243ed7cc09bb05457bd4d03b1ba5c2b1ca8700096b3927db79ffbbe55", size = 92300, upload-time = "2026-02-16T21:21:43.245Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/32/69/f1b537ee70b7def42d63124a539ed3026a11a3ffc3086947a1ca6e861868/py_key_value_aio-0.4.4-py3-none-any.whl", hash = "sha256:18e17564ecae61b987f909fc2cd41ee2012c84b4b1dcb8c055cf8b4bc1bf3f5d", upload-time = "2026-02-16T21:21:44.241Z" }, + { url = "https://files.pythonhosted.org/packages/32/69/f1b537ee70b7def42d63124a539ed3026a11a3ffc3086947a1ca6e861868/py_key_value_aio-0.4.4-py3-none-any.whl", hash = "sha256:18e17564ecae61b987f909fc2cd41ee2012c84b4b1dcb8c055cf8b4bc1bf3f5d", size = 152291, upload-time = "2026-02-16T21:21:44.241Z" }, ] [package.optional-dependencies] @@ -4236,75 +4232,75 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "defusedxml" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/73/21/d250cfca8ff30c2e5a7447bc13861541126ce9bd4426cd5d0c9f08b5547d/py_serializable-2.1.0.tar.gz", hash = "sha256:9d5db56154a867a9b897c0163b33a793c804c80cee984116d02d49e4578fc103", upload-time = "2025-07-21T09:56:48.07Z" } +sdist = { url = "https://files.pythonhosted.org/packages/73/21/d250cfca8ff30c2e5a7447bc13861541126ce9bd4426cd5d0c9f08b5547d/py_serializable-2.1.0.tar.gz", hash = "sha256:9d5db56154a867a9b897c0163b33a793c804c80cee984116d02d49e4578fc103", size = 52368, upload-time = "2025-07-21T09:56:48.07Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/9b/bf/7595e817906a29453ba4d99394e781b6fabe55d21f3c15d240f85dd06bb1/py_serializable-2.1.0-py3-none-any.whl", hash = "sha256:b56d5d686b5a03ba4f4db5e769dc32336e142fc3bd4d68a8c25579ebb0a67304", upload-time = "2025-07-21T09:56:46.848Z" }, + { url = "https://files.pythonhosted.org/packages/9b/bf/7595e817906a29453ba4d99394e781b6fabe55d21f3c15d240f85dd06bb1/py_serializable-2.1.0-py3-none-any.whl", hash = "sha256:b56d5d686b5a03ba4f4db5e769dc32336e142fc3bd4d68a8c25579ebb0a67304", size = 23045, upload-time = "2025-07-21T09:56:46.848Z" }, ] [[package]] name = "pyarrow" version = "23.0.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/88/22/134986a4cc224d593c1afde5494d18ff629393d74cc2eddb176669f234a4/pyarrow-23.0.1.tar.gz", hash = "sha256:b8c5873e33440b2bc2f4a79d2b47017a89c5a24116c055625e6f2ee50523f019", upload-time = "2026-02-16T10:14:12.39Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/a8/24e5dc6855f50a62936ceb004e6e9645e4219a8065f304145d7fb8a79d5d/pyarrow-23.0.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:3fab8f82571844eb3c460f90a75583801d14ca0cc32b1acc8c361650e006fd56", upload-time = "2026-02-16T10:08:08.654Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/8e/4be5617b4aaae0287f621ad31c6036e5f63118cfca0dc57d42121ff49b51/pyarrow-23.0.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:3f91c038b95f71ddfc865f11d5876c42f343b4495535bd262c7b321b0b94507c", upload-time = "2026-02-16T10:08:17.811Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2e/08/3e56a18819462210432ae37d10f5c8eed3828be1d6c751b6e6a2e93c286a/pyarrow-23.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:d0744403adabef53c985a7f8a082b502a368510c40d184df349a0a8754533258", upload-time = "2026-02-16T10:08:25.792Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/82/c40b68001dbec8a3faa4c08cd8c200798ac732d2854537c5449dc859f55a/pyarrow-23.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c33b5bf406284fd0bba436ed6f6c3ebe8e311722b441d89397c54f871c6863a2", upload-time = "2026-02-16T10:08:34.27Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/20/bc/73f611989116b6f53347581b02177f9f620efdf3cd3f405d0e83cdf53a83/pyarrow-23.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ddf743e82f69dcd6dbbcb63628895d7161e04e56794ef80550ac6f3315eeb1d5", upload-time = "2026-02-16T10:08:42.889Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/cc/6c6b3ecdae2a8c3aced99956187e8302fc954cc2cca2a37cf2111dad16ce/pyarrow-23.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e052a211c5ac9848ae15d5ec875ed0943c0221e2fcfe69eee80b604b4e703222", upload-time = "2026-02-16T10:08:51.641Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8d/94/d359e708672878d7638a04a0448edf7c707f9e5606cee11e15aaa5c7535a/pyarrow-23.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:5abde149bb3ce524782d838eb67ac095cd3fd6090eba051130589793f1a7f76d", upload-time = "2026-02-16T10:08:58.077Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/41/8e6b6ef7e225d4ceead8459427a52afdc23379768f54dd3566014d7618c1/pyarrow-23.0.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6f0147ee9e0386f519c952cc670eb4a8b05caa594eeffe01af0e25f699e4e9bb", upload-time = "2026-02-16T10:09:03.859Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/4a/1472c00392f521fea03ae93408bf445cc7bfa1ab81683faf9bc188e36629/pyarrow-23.0.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:0ae6e17c828455b6265d590100c295193f93cc5675eb0af59e49dbd00d2de350", upload-time = "2026-02-16T10:09:11.877Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/b2/bd1f2f05ded56af7f54d702c8364c9c43cd6abb91b0e9933f3d77b4f4132/pyarrow-23.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:fed7020203e9ef273360b9e45be52a2a47d3103caf156a30ace5247ffb51bdbd", upload-time = "2026-02-16T10:09:18.144Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/62/96459ef5b67957eac38a90f541d1c28833d1b367f014a482cb63f3b7cd2d/pyarrow-23.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:26d50dee49d741ac0e82185033488d28d35be4d763ae6f321f97d1140eb7a0e9", upload-time = "2026-02-16T10:09:25.792Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7d/94/1170e235add1f5f45a954e26cd0e906e7e74e23392dcb560de471f7366ec/pyarrow-23.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3c30143b17161310f151f4a2bcfe41b5ff744238c1039338779424e38579d701", upload-time = "2026-02-16T10:09:34.645Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0e/2d/39a42af4570377b99774cdb47f63ee6c7da7616bd55b3d5001aa18edfe4f/pyarrow-23.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db2190fa79c80a23fdd29fef4b8992893f024ae7c17d2f5f4db7171fa30c2c78", upload-time = "2026-02-16T10:09:44.153Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/00/ca/db94101c187f3df742133ac837e93b1f269ebdac49427f8310ee40b6a58f/pyarrow-23.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:f00f993a8179e0e1c9713bcc0baf6d6c01326a406a9c23495ec1ba9c9ebf2919", upload-time = "2026-02-16T10:09:50.263Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9a/4b/4166bb5abbfe6f750fc60ad337c43ecf61340fa52ab386da6e8dbf9e63c4/pyarrow-23.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f4b0dbfa124c0bb161f8b5ebb40f1a680b70279aa0c9901d44a2b5a20806039f", upload-time = "2026-02-16T10:09:56.225Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e1/da/3f941e3734ac8088ea588b53e860baeddac8323ea40ce22e3d0baa865cc9/pyarrow-23.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:7707d2b6673f7de054e2e83d59f9e805939038eebe1763fe811ee8fa5c0cd1a7", upload-time = "2026-02-16T10:10:03.428Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/88/7c/3d841c366620e906d54430817531b877ba646310296df42ef697308c2705/pyarrow-23.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:86ff03fb9f1a320266e0de855dee4b17da6794c595d207f89bba40d16b5c78b9", upload-time = "2026-02-16T10:10:10.704Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2c/a5/da83046273d990f256cb79796a190bbf7ec999269705ddc609403f8c6b06/pyarrow-23.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:813d99f31275919c383aab17f0f455a04f5a429c261cc411b1e9a8f5e4aaaa05", upload-time = "2026-02-16T10:10:17.95Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5b/3c/b7d2ebcff47a514f47f9da1e74b7949138c58cfeb108cdd4ee62f43f0cf3/pyarrow-23.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bf5842f960cddd2ef757d486041d57c96483efc295a8c4a0e20e704cbbf39c67", upload-time = "2026-02-16T10:10:25.363Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/43/b2/b40961262213beaba6acfc88698eb773dfce32ecdf34d19291db94c2bd73/pyarrow-23.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564baf97c858ecc03ec01a41062e8f4698abc3e6e2acd79c01c2e97880a19730", upload-time = "2026-02-16T10:10:33.477Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f6/70/1fdda42d65b28b078e93d75d371b2185a61da89dda4def8ba6ba41ebdeb4/pyarrow-23.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:07deae7783782ac7250989a7b2ecde9b3c343a643f82e8a4df03d93b633006f0", upload-time = "2026-02-16T10:10:39.31Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/47/10/2cbe4c6f0fb83d2de37249567373d64327a5e4d8db72f486db42875b08f6/pyarrow-23.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6b8fda694640b00e8af3c824f99f789e836720aa8c9379fb435d4c4953a756b8", upload-time = "2026-02-16T10:10:45.487Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cb/4f/679fa7e84dadbaca7a65f7cdba8d6c83febbd93ca12fa4adf40ba3b6362b/pyarrow-23.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:8ff51b1addc469b9444b7c6f3548e19dc931b172ab234e995a60aea9f6e6025f", upload-time = "2026-02-16T10:10:52.266Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/63/d2747d930882c9d661e9398eefc54f15696547b8983aaaf11d4a2e8b5426/pyarrow-23.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:71c5be5cbf1e1cb6169d2a0980850bccb558ddc9b747b6206435313c47c37677", upload-time = "2026-02-16T10:11:01.557Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/93/10a48b5e238de6d562a411af6467e71e7aedbc9b87f8d3a35f1560ae30fb/pyarrow-23.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:9b6f4f17b43bc39d56fec96e53fe89d94bac3eb134137964371b45352d40d0c2", upload-time = "2026-02-16T10:11:09.401Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5c/20/476943001c54ef078dbf9542280e22741219a184a0632862bca4feccd666/pyarrow-23.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fc13fc6c403d1337acab46a2c4346ca6c9dec5780c3c697cf8abfd5e19b6b37", upload-time = "2026-02-16T10:11:17.781Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/b6/5dd0c47b335fcd8edba9bfab78ad961bd0fd55ebe53468cc393f45e0be60/pyarrow-23.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5c16ed4f53247fa3ffb12a14d236de4213a4415d127fe9cebed33d51671113e2", upload-time = "2026-02-16T10:11:26.185Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/09/a532297c9591a727d67760e2e756b83905dd89adb365a7f6e9c72578bcc1/pyarrow-23.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:cecfb12ef629cf6be0b1887f9f86463b0dd3dc3195ae6224e74006be4736035a", upload-time = "2026-02-16T10:12:23.297Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a5/8e/38749c4b1303e6ae76b3c80618f84861ae0c55dd3c2273842ea6f8258233/pyarrow-23.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:29f7f7419a0e30264ea261fdc0e5fe63ce5a6095003db2945d7cd78df391a7e1", upload-time = "2026-02-16T10:11:32.535Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a3/73/f237b2bc8c669212f842bcfd842b04fc8d936bfc9d471630569132dc920d/pyarrow-23.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:33d648dc25b51fd8055c19e4261e813dfc4d2427f068bcecc8b53d01b81b0500", upload-time = "2026-02-16T10:11:39.813Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/86/b912195eee0903b5611bf596833def7d146ab2d301afeb4b722c57ffc966/pyarrow-23.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:cd395abf8f91c673dd3589cadc8cc1ee4e8674fa61b2e923c8dd215d9c7d1f41", upload-time = "2026-02-16T10:11:47.764Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/69/c2/f2a717fb824f62d0be952ea724b4f6f9372a17eed6f704b5c9526f12f2f1/pyarrow-23.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:00be9576d970c31defb5c32eb72ef585bf600ef6d0a82d5eccaae96639cf9d07", upload-time = "2026-02-16T10:11:56.607Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/84/a7/90007d476b9f0dc308e3bc57b832d004f848fd6c0da601375d20d92d1519/pyarrow-23.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c2139549494445609f35a5cda4eb94e2c9e4d704ce60a095b342f82460c73a83", upload-time = "2026-02-16T10:12:04.47Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/3f/b16fab3e77709856eb6ac328ce35f57a6d4a18462c7ca5186ef31b45e0e0/pyarrow-23.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7044b442f184d84e2351e5084600f0d7343d6117aabcbc1ac78eb1ae11eb4125", upload-time = "2026-02-16T10:12:11.797Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e9/a1/22df0620a9fac31d68397a75465c344e83c3dfe521f7612aea33e27ab6c0/pyarrow-23.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a35581e856a2fafa12f3f54fce4331862b1cfb0bef5758347a858a4aa9d6bae8", upload-time = "2026-02-16T10:12:17.746Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8d/1b/6da9a89583ce7b23ac611f183ae4843cd3a6cf54f079549b0e8c14031e73/pyarrow-23.0.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:5df1161da23636a70838099d4aaa65142777185cc0cdba4037a18cee7d8db9ca", upload-time = "2026-02-16T10:12:32.819Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ae/b5/d58a241fbe324dbaeb8df07be6af8752c846192d78d2272e551098f74e88/pyarrow-23.0.1-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:fa8e51cb04b9f8c9c5ace6bab63af9a1f88d35c0d6cbf53e8c17c098552285e1", upload-time = "2026-02-16T10:12:38.949Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/54/a5/8cbc83f04aba433ca7b331b38f39e000efd9f0c7ce47128670e737542996/pyarrow-23.0.1-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:0b95a3994f015be13c63148fef8832e8a23938128c185ee951c98908a696e0eb", upload-time = "2026-02-16T10:12:45.467Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/36/2e/c0f017c405fcdc252dbccafbe05e36b0d0eb1ea9a958f081e01c6972927f/pyarrow-23.0.1-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:4982d71350b1a6e5cfe1af742c53dfb759b11ce14141870d05d9e540d13bc5d1", upload-time = "2026-02-16T10:12:55.525Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/af/6b/2314a78057912f5627afa13ba43809d9d653e6630859618b0fd81a4e0759/pyarrow-23.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c250248f1fe266db627921c89b47b7c06fee0489ad95b04d50353537d74d6886", upload-time = "2026-02-16T10:13:04.729Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/f2/1bcb1d3be3460832ef3370d621142216e15a2c7c62602a4ea19ec240dd64/pyarrow-23.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5f4763b83c11c16e5f4c15601ba6dfa849e20723b46aa2617cb4bffe8768479f", upload-time = "2026-02-16T10:13:14.147Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/eb/3f/b1da7b61cd66566a4d4c8383d376c606d1c34a906c3f1cb35c479f59d1aa/pyarrow-23.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:3a4c85ef66c134161987c17b147d6bffdca4566f9a4c1d81a0a01cdf08414ea5", upload-time = "2026-02-16T10:14:09.397Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/78/07f67434e910a0f7323269be7bfbf58699bd0c1d080b18a1ab49ba943fe8/pyarrow-23.0.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:17cd28e906c18af486a499422740298c52d7c6795344ea5002a7720b4eadf16d", upload-time = "2026-02-16T10:13:21.541Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/76/34cf7ae93ece1f740a04910d9f7e80ba166b9b4ab9596a953e9e62b90fe1/pyarrow-23.0.1-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:76e823d0e86b4fb5e1cf4a58d293036e678b5a4b03539be933d3b31f9406859f", upload-time = "2026-02-16T10:13:28.63Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/46/90/459b827238936d4244214be7c684e1b366a63f8c78c380807ae25ed92199/pyarrow-23.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a62e1899e3078bf65943078b3ad2a6ddcacf2373bc06379aac61b1e548a75814", upload-time = "2026-02-16T10:13:35.506Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/28/a1/93a71ae5881e99d1f9de1d4554a87be37da11cd6b152239fb5bd924fdc64/pyarrow-23.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:df088e8f640c9fae3b1f495b3c64755c4e719091caf250f3a74d095ddf3c836d", upload-time = "2026-02-16T10:13:42.504Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/88/a3/d2c462d4ef313521eaf2eff04d204ac60775263f1fb08c374b543f79f610/pyarrow-23.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:46718a220d64677c93bc243af1d44b55998255427588e400677d7192671845c7", upload-time = "2026-02-16T10:13:49.226Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cc/f1/11a544b8c3d38a759eb3fbb022039117fd633e9a7b19e4841cc3da091915/pyarrow-23.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a09f3876e87f48bc2f13583ab551f0379e5dfb83210391e68ace404181a20690", upload-time = "2026-02-16T10:13:57.238Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/f2/c0e76a0b451ffdf0cf788932e182758eb7558953f4f27f1aff8e2518b653/pyarrow-23.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:527e8d899f14bd15b740cd5a54ad56b7f98044955373a17179d5956ddb93d9ce", upload-time = "2026-02-16T10:14:03.892Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/88/22/134986a4cc224d593c1afde5494d18ff629393d74cc2eddb176669f234a4/pyarrow-23.0.1.tar.gz", hash = "sha256:b8c5873e33440b2bc2f4a79d2b47017a89c5a24116c055625e6f2ee50523f019", size = 1167336, upload-time = "2026-02-16T10:14:12.39Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/a8/24e5dc6855f50a62936ceb004e6e9645e4219a8065f304145d7fb8a79d5d/pyarrow-23.0.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:3fab8f82571844eb3c460f90a75583801d14ca0cc32b1acc8c361650e006fd56", size = 34307390, upload-time = "2026-02-16T10:08:08.654Z" }, + { url = "https://files.pythonhosted.org/packages/bc/8e/4be5617b4aaae0287f621ad31c6036e5f63118cfca0dc57d42121ff49b51/pyarrow-23.0.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:3f91c038b95f71ddfc865f11d5876c42f343b4495535bd262c7b321b0b94507c", size = 35853761, upload-time = "2026-02-16T10:08:17.811Z" }, + { url = "https://files.pythonhosted.org/packages/2e/08/3e56a18819462210432ae37d10f5c8eed3828be1d6c751b6e6a2e93c286a/pyarrow-23.0.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:d0744403adabef53c985a7f8a082b502a368510c40d184df349a0a8754533258", size = 44493116, upload-time = "2026-02-16T10:08:25.792Z" }, + { url = "https://files.pythonhosted.org/packages/f8/82/c40b68001dbec8a3faa4c08cd8c200798ac732d2854537c5449dc859f55a/pyarrow-23.0.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:c33b5bf406284fd0bba436ed6f6c3ebe8e311722b441d89397c54f871c6863a2", size = 47564532, upload-time = "2026-02-16T10:08:34.27Z" }, + { url = "https://files.pythonhosted.org/packages/20/bc/73f611989116b6f53347581b02177f9f620efdf3cd3f405d0e83cdf53a83/pyarrow-23.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ddf743e82f69dcd6dbbcb63628895d7161e04e56794ef80550ac6f3315eeb1d5", size = 48183685, upload-time = "2026-02-16T10:08:42.889Z" }, + { url = "https://files.pythonhosted.org/packages/b0/cc/6c6b3ecdae2a8c3aced99956187e8302fc954cc2cca2a37cf2111dad16ce/pyarrow-23.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e052a211c5ac9848ae15d5ec875ed0943c0221e2fcfe69eee80b604b4e703222", size = 50605582, upload-time = "2026-02-16T10:08:51.641Z" }, + { url = "https://files.pythonhosted.org/packages/8d/94/d359e708672878d7638a04a0448edf7c707f9e5606cee11e15aaa5c7535a/pyarrow-23.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:5abde149bb3ce524782d838eb67ac095cd3fd6090eba051130589793f1a7f76d", size = 27521148, upload-time = "2026-02-16T10:08:58.077Z" }, + { url = "https://files.pythonhosted.org/packages/b0/41/8e6b6ef7e225d4ceead8459427a52afdc23379768f54dd3566014d7618c1/pyarrow-23.0.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:6f0147ee9e0386f519c952cc670eb4a8b05caa594eeffe01af0e25f699e4e9bb", size = 34302230, upload-time = "2026-02-16T10:09:03.859Z" }, + { url = "https://files.pythonhosted.org/packages/bf/4a/1472c00392f521fea03ae93408bf445cc7bfa1ab81683faf9bc188e36629/pyarrow-23.0.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:0ae6e17c828455b6265d590100c295193f93cc5675eb0af59e49dbd00d2de350", size = 35850050, upload-time = "2026-02-16T10:09:11.877Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b2/bd1f2f05ded56af7f54d702c8364c9c43cd6abb91b0e9933f3d77b4f4132/pyarrow-23.0.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:fed7020203e9ef273360b9e45be52a2a47d3103caf156a30ace5247ffb51bdbd", size = 44491918, upload-time = "2026-02-16T10:09:18.144Z" }, + { url = "https://files.pythonhosted.org/packages/0b/62/96459ef5b67957eac38a90f541d1c28833d1b367f014a482cb63f3b7cd2d/pyarrow-23.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:26d50dee49d741ac0e82185033488d28d35be4d763ae6f321f97d1140eb7a0e9", size = 47562811, upload-time = "2026-02-16T10:09:25.792Z" }, + { url = "https://files.pythonhosted.org/packages/7d/94/1170e235add1f5f45a954e26cd0e906e7e74e23392dcb560de471f7366ec/pyarrow-23.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3c30143b17161310f151f4a2bcfe41b5ff744238c1039338779424e38579d701", size = 48183766, upload-time = "2026-02-16T10:09:34.645Z" }, + { url = "https://files.pythonhosted.org/packages/0e/2d/39a42af4570377b99774cdb47f63ee6c7da7616bd55b3d5001aa18edfe4f/pyarrow-23.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db2190fa79c80a23fdd29fef4b8992893f024ae7c17d2f5f4db7171fa30c2c78", size = 50607669, upload-time = "2026-02-16T10:09:44.153Z" }, + { url = "https://files.pythonhosted.org/packages/00/ca/db94101c187f3df742133ac837e93b1f269ebdac49427f8310ee40b6a58f/pyarrow-23.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:f00f993a8179e0e1c9713bcc0baf6d6c01326a406a9c23495ec1ba9c9ebf2919", size = 27527698, upload-time = "2026-02-16T10:09:50.263Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4b/4166bb5abbfe6f750fc60ad337c43ecf61340fa52ab386da6e8dbf9e63c4/pyarrow-23.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f4b0dbfa124c0bb161f8b5ebb40f1a680b70279aa0c9901d44a2b5a20806039f", size = 34214575, upload-time = "2026-02-16T10:09:56.225Z" }, + { url = "https://files.pythonhosted.org/packages/e1/da/3f941e3734ac8088ea588b53e860baeddac8323ea40ce22e3d0baa865cc9/pyarrow-23.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:7707d2b6673f7de054e2e83d59f9e805939038eebe1763fe811ee8fa5c0cd1a7", size = 35832540, upload-time = "2026-02-16T10:10:03.428Z" }, + { url = "https://files.pythonhosted.org/packages/88/7c/3d841c366620e906d54430817531b877ba646310296df42ef697308c2705/pyarrow-23.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:86ff03fb9f1a320266e0de855dee4b17da6794c595d207f89bba40d16b5c78b9", size = 44470940, upload-time = "2026-02-16T10:10:10.704Z" }, + { url = "https://files.pythonhosted.org/packages/2c/a5/da83046273d990f256cb79796a190bbf7ec999269705ddc609403f8c6b06/pyarrow-23.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:813d99f31275919c383aab17f0f455a04f5a429c261cc411b1e9a8f5e4aaaa05", size = 47586063, upload-time = "2026-02-16T10:10:17.95Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3c/b7d2ebcff47a514f47f9da1e74b7949138c58cfeb108cdd4ee62f43f0cf3/pyarrow-23.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bf5842f960cddd2ef757d486041d57c96483efc295a8c4a0e20e704cbbf39c67", size = 48173045, upload-time = "2026-02-16T10:10:25.363Z" }, + { url = "https://files.pythonhosted.org/packages/43/b2/b40961262213beaba6acfc88698eb773dfce32ecdf34d19291db94c2bd73/pyarrow-23.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564baf97c858ecc03ec01a41062e8f4698abc3e6e2acd79c01c2e97880a19730", size = 50621741, upload-time = "2026-02-16T10:10:33.477Z" }, + { url = "https://files.pythonhosted.org/packages/f6/70/1fdda42d65b28b078e93d75d371b2185a61da89dda4def8ba6ba41ebdeb4/pyarrow-23.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:07deae7783782ac7250989a7b2ecde9b3c343a643f82e8a4df03d93b633006f0", size = 27620678, upload-time = "2026-02-16T10:10:39.31Z" }, + { url = "https://files.pythonhosted.org/packages/47/10/2cbe4c6f0fb83d2de37249567373d64327a5e4d8db72f486db42875b08f6/pyarrow-23.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6b8fda694640b00e8af3c824f99f789e836720aa8c9379fb435d4c4953a756b8", size = 34210066, upload-time = "2026-02-16T10:10:45.487Z" }, + { url = "https://files.pythonhosted.org/packages/cb/4f/679fa7e84dadbaca7a65f7cdba8d6c83febbd93ca12fa4adf40ba3b6362b/pyarrow-23.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:8ff51b1addc469b9444b7c6f3548e19dc931b172ab234e995a60aea9f6e6025f", size = 35825526, upload-time = "2026-02-16T10:10:52.266Z" }, + { url = "https://files.pythonhosted.org/packages/f9/63/d2747d930882c9d661e9398eefc54f15696547b8983aaaf11d4a2e8b5426/pyarrow-23.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:71c5be5cbf1e1cb6169d2a0980850bccb558ddc9b747b6206435313c47c37677", size = 44473279, upload-time = "2026-02-16T10:11:01.557Z" }, + { url = "https://files.pythonhosted.org/packages/b3/93/10a48b5e238de6d562a411af6467e71e7aedbc9b87f8d3a35f1560ae30fb/pyarrow-23.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:9b6f4f17b43bc39d56fec96e53fe89d94bac3eb134137964371b45352d40d0c2", size = 47585798, upload-time = "2026-02-16T10:11:09.401Z" }, + { url = "https://files.pythonhosted.org/packages/5c/20/476943001c54ef078dbf9542280e22741219a184a0632862bca4feccd666/pyarrow-23.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fc13fc6c403d1337acab46a2c4346ca6c9dec5780c3c697cf8abfd5e19b6b37", size = 48179446, upload-time = "2026-02-16T10:11:17.781Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b6/5dd0c47b335fcd8edba9bfab78ad961bd0fd55ebe53468cc393f45e0be60/pyarrow-23.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5c16ed4f53247fa3ffb12a14d236de4213a4415d127fe9cebed33d51671113e2", size = 50623972, upload-time = "2026-02-16T10:11:26.185Z" }, + { url = "https://files.pythonhosted.org/packages/d5/09/a532297c9591a727d67760e2e756b83905dd89adb365a7f6e9c72578bcc1/pyarrow-23.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:cecfb12ef629cf6be0b1887f9f86463b0dd3dc3195ae6224e74006be4736035a", size = 27540749, upload-time = "2026-02-16T10:12:23.297Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8e/38749c4b1303e6ae76b3c80618f84861ae0c55dd3c2273842ea6f8258233/pyarrow-23.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:29f7f7419a0e30264ea261fdc0e5fe63ce5a6095003db2945d7cd78df391a7e1", size = 34471544, upload-time = "2026-02-16T10:11:32.535Z" }, + { url = "https://files.pythonhosted.org/packages/a3/73/f237b2bc8c669212f842bcfd842b04fc8d936bfc9d471630569132dc920d/pyarrow-23.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:33d648dc25b51fd8055c19e4261e813dfc4d2427f068bcecc8b53d01b81b0500", size = 35949911, upload-time = "2026-02-16T10:11:39.813Z" }, + { url = "https://files.pythonhosted.org/packages/0c/86/b912195eee0903b5611bf596833def7d146ab2d301afeb4b722c57ffc966/pyarrow-23.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:cd395abf8f91c673dd3589cadc8cc1ee4e8674fa61b2e923c8dd215d9c7d1f41", size = 44520337, upload-time = "2026-02-16T10:11:47.764Z" }, + { url = "https://files.pythonhosted.org/packages/69/c2/f2a717fb824f62d0be952ea724b4f6f9372a17eed6f704b5c9526f12f2f1/pyarrow-23.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:00be9576d970c31defb5c32eb72ef585bf600ef6d0a82d5eccaae96639cf9d07", size = 47548944, upload-time = "2026-02-16T10:11:56.607Z" }, + { url = "https://files.pythonhosted.org/packages/84/a7/90007d476b9f0dc308e3bc57b832d004f848fd6c0da601375d20d92d1519/pyarrow-23.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c2139549494445609f35a5cda4eb94e2c9e4d704ce60a095b342f82460c73a83", size = 48236269, upload-time = "2026-02-16T10:12:04.47Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3f/b16fab3e77709856eb6ac328ce35f57a6d4a18462c7ca5186ef31b45e0e0/pyarrow-23.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7044b442f184d84e2351e5084600f0d7343d6117aabcbc1ac78eb1ae11eb4125", size = 50604794, upload-time = "2026-02-16T10:12:11.797Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a1/22df0620a9fac31d68397a75465c344e83c3dfe521f7612aea33e27ab6c0/pyarrow-23.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a35581e856a2fafa12f3f54fce4331862b1cfb0bef5758347a858a4aa9d6bae8", size = 27660642, upload-time = "2026-02-16T10:12:17.746Z" }, + { url = "https://files.pythonhosted.org/packages/8d/1b/6da9a89583ce7b23ac611f183ae4843cd3a6cf54f079549b0e8c14031e73/pyarrow-23.0.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:5df1161da23636a70838099d4aaa65142777185cc0cdba4037a18cee7d8db9ca", size = 34238755, upload-time = "2026-02-16T10:12:32.819Z" }, + { url = "https://files.pythonhosted.org/packages/ae/b5/d58a241fbe324dbaeb8df07be6af8752c846192d78d2272e551098f74e88/pyarrow-23.0.1-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:fa8e51cb04b9f8c9c5ace6bab63af9a1f88d35c0d6cbf53e8c17c098552285e1", size = 35847826, upload-time = "2026-02-16T10:12:38.949Z" }, + { url = "https://files.pythonhosted.org/packages/54/a5/8cbc83f04aba433ca7b331b38f39e000efd9f0c7ce47128670e737542996/pyarrow-23.0.1-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:0b95a3994f015be13c63148fef8832e8a23938128c185ee951c98908a696e0eb", size = 44536859, upload-time = "2026-02-16T10:12:45.467Z" }, + { url = "https://files.pythonhosted.org/packages/36/2e/c0f017c405fcdc252dbccafbe05e36b0d0eb1ea9a958f081e01c6972927f/pyarrow-23.0.1-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:4982d71350b1a6e5cfe1af742c53dfb759b11ce14141870d05d9e540d13bc5d1", size = 47614443, upload-time = "2026-02-16T10:12:55.525Z" }, + { url = "https://files.pythonhosted.org/packages/af/6b/2314a78057912f5627afa13ba43809d9d653e6630859618b0fd81a4e0759/pyarrow-23.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c250248f1fe266db627921c89b47b7c06fee0489ad95b04d50353537d74d6886", size = 48232991, upload-time = "2026-02-16T10:13:04.729Z" }, + { url = "https://files.pythonhosted.org/packages/40/f2/1bcb1d3be3460832ef3370d621142216e15a2c7c62602a4ea19ec240dd64/pyarrow-23.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5f4763b83c11c16e5f4c15601ba6dfa849e20723b46aa2617cb4bffe8768479f", size = 50645077, upload-time = "2026-02-16T10:13:14.147Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3f/b1da7b61cd66566a4d4c8383d376c606d1c34a906c3f1cb35c479f59d1aa/pyarrow-23.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:3a4c85ef66c134161987c17b147d6bffdca4566f9a4c1d81a0a01cdf08414ea5", size = 28234271, upload-time = "2026-02-16T10:14:09.397Z" }, + { url = "https://files.pythonhosted.org/packages/b5/78/07f67434e910a0f7323269be7bfbf58699bd0c1d080b18a1ab49ba943fe8/pyarrow-23.0.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:17cd28e906c18af486a499422740298c52d7c6795344ea5002a7720b4eadf16d", size = 34488692, upload-time = "2026-02-16T10:13:21.541Z" }, + { url = "https://files.pythonhosted.org/packages/50/76/34cf7ae93ece1f740a04910d9f7e80ba166b9b4ab9596a953e9e62b90fe1/pyarrow-23.0.1-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:76e823d0e86b4fb5e1cf4a58d293036e678b5a4b03539be933d3b31f9406859f", size = 35964383, upload-time = "2026-02-16T10:13:28.63Z" }, + { url = "https://files.pythonhosted.org/packages/46/90/459b827238936d4244214be7c684e1b366a63f8c78c380807ae25ed92199/pyarrow-23.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a62e1899e3078bf65943078b3ad2a6ddcacf2373bc06379aac61b1e548a75814", size = 44538119, upload-time = "2026-02-16T10:13:35.506Z" }, + { url = "https://files.pythonhosted.org/packages/28/a1/93a71ae5881e99d1f9de1d4554a87be37da11cd6b152239fb5bd924fdc64/pyarrow-23.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:df088e8f640c9fae3b1f495b3c64755c4e719091caf250f3a74d095ddf3c836d", size = 47571199, upload-time = "2026-02-16T10:13:42.504Z" }, + { url = "https://files.pythonhosted.org/packages/88/a3/d2c462d4ef313521eaf2eff04d204ac60775263f1fb08c374b543f79f610/pyarrow-23.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:46718a220d64677c93bc243af1d44b55998255427588e400677d7192671845c7", size = 48259435, upload-time = "2026-02-16T10:13:49.226Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f1/11a544b8c3d38a759eb3fbb022039117fd633e9a7b19e4841cc3da091915/pyarrow-23.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a09f3876e87f48bc2f13583ab551f0379e5dfb83210391e68ace404181a20690", size = 50629149, upload-time = "2026-02-16T10:13:57.238Z" }, + { url = "https://files.pythonhosted.org/packages/50/f2/c0e76a0b451ffdf0cf788932e182758eb7558953f4f27f1aff8e2518b653/pyarrow-23.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:527e8d899f14bd15b740cd5a54ad56b7f98044955373a17179d5956ddb93d9ce", size = 28365807, upload-time = "2026-02-16T10:14:03.892Z" }, ] [[package]] name = "pyasn1" version = "0.6.3" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", upload-time = "2026-03-17T01:06:53.382Z" } +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://pypi-proxy.dev.databricks.com/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", upload-time = "2026-03-17T01:06:52.036Z" }, + { 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]] @@ -4314,36 +4310,36 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", upload-time = "2025-03-28T02:41:22.17Z" } +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://pypi-proxy.dev.databricks.com/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", upload-time = "2025-03-28T02:41:19.028Z" }, + { 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 = "pybreaker" version = "1.4.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/f2/89/fbf98e383f1ec6d117af2cd983efdb3eb7018b63834c427025764194cac2/pybreaker-1.4.1.tar.gz", hash = "sha256:8df2d245c73ba40c8242c56ffb4f12138fbadc23e296224740c2028ea9dc1178", upload-time = "2025-09-21T15:12:04.499Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/89/fbf98e383f1ec6d117af2cd983efdb3eb7018b63834c427025764194cac2/pybreaker-1.4.1.tar.gz", hash = "sha256:8df2d245c73ba40c8242c56ffb4f12138fbadc23e296224740c2028ea9dc1178", size = 15555, upload-time = "2025-09-21T15:12:04.499Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/44/75/e64d3d40a741e2be21d69154f4e5c43a66f0c603c5ef11f49e01429a5932/pybreaker-1.4.1-py3-none-any.whl", hash = "sha256:b4dab4a05195b7f2a64a6c1a6c4ba7a96534ef56ea7210e6bcb59f28897160e0", upload-time = "2025-09-21T15:12:02.284Z" }, + { url = "https://files.pythonhosted.org/packages/44/75/e64d3d40a741e2be21d69154f4e5c43a66f0c603c5ef11f49e01429a5932/pybreaker-1.4.1-py3-none-any.whl", hash = "sha256:b4dab4a05195b7f2a64a6c1a6c4ba7a96534ef56ea7210e6bcb59f28897160e0", size = 12915, upload-time = "2025-09-21T15:12:02.284Z" }, ] [[package]] name = "pycodestyle" version = "2.14.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/11/e0/abfd2a0d2efe47670df87f3e3a0e2edda42f055053c85361f19c0e2c1ca8/pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783", upload-time = "2025-06-20T18:49:48.75Z" } +sdist = { url = "https://files.pythonhosted.org/packages/11/e0/abfd2a0d2efe47670df87f3e3a0e2edda42f055053c85361f19c0e2c1ca8/pycodestyle-2.14.0.tar.gz", hash = "sha256:c4b5b517d278089ff9d0abdec919cd97262a3367449ea1c8b49b91529167b783", size = 39472, upload-time = "2025-06-20T18:49:48.75Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d", upload-time = "2025-06-20T18:49:47.491Z" }, + { url = "https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d", size = 31594, upload-time = "2025-06-20T18:49:47.491Z" }, ] [[package]] name = "pycparser" version = "3.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", upload-time = "2026-01-21T14:26:51.89Z" } +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://pypi-proxy.dev.databricks.com/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", upload-time = "2026-01-21T14:26:50.693Z" }, + { 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]] @@ -4356,9 +4352,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", upload-time = "2025-11-26T15:11:46.471Z" } +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", upload-time = "2025-11-26T15:11:44.605Z" }, + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, ] [package.optional-dependencies] @@ -4373,115 +4369,115 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", upload-time = "2025-11-04T13:43:49.098Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", upload-time = "2025-11-04T13:39:04.116Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", upload-time = "2025-11-04T13:39:06.055Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", upload-time = "2025-11-04T13:39:10.41Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", upload-time = "2025-11-04T13:39:12.244Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52", upload-time = "2025-11-04T13:39:13.962Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", upload-time = "2025-11-04T13:39:15.889Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", upload-time = "2025-11-04T13:39:17.403Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", upload-time = "2025-11-04T13:39:19.351Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", upload-time = "2025-11-04T13:39:21Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", upload-time = "2025-11-04T13:39:22.606Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", upload-time = "2025-11-04T13:39:25.843Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", upload-time = "2025-11-04T13:39:27.92Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", upload-time = "2025-11-04T13:39:29.848Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", upload-time = "2025-11-04T13:39:31.373Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", upload-time = "2025-11-04T13:39:32.897Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", upload-time = "2025-11-04T13:39:34.469Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", upload-time = "2025-11-04T13:39:36.053Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", upload-time = "2025-11-04T13:39:37.753Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", upload-time = "2025-11-04T13:39:40.94Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", upload-time = "2025-11-04T13:39:42.523Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", upload-time = "2025-11-04T13:39:44.553Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", upload-time = "2025-11-04T13:39:46.238Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", upload-time = "2025-11-04T13:39:48.002Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", upload-time = "2025-11-04T13:39:49.705Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", upload-time = "2025-11-04T13:39:51.842Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", upload-time = "2025-11-04T13:39:53.485Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", upload-time = "2025-11-04T13:39:56.488Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", upload-time = "2025-11-04T13:39:58.079Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", upload-time = "2025-11-04T13:39:59.956Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", upload-time = "2025-11-04T13:40:02.241Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", upload-time = "2025-11-04T13:40:04.401Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", upload-time = "2025-11-04T13:40:06.072Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", upload-time = "2025-11-04T13:40:07.835Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", upload-time = "2025-11-04T13:40:09.804Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", upload-time = "2025-11-04T13:40:12.004Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", upload-time = "2025-11-04T13:40:13.868Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", upload-time = "2025-11-04T13:40:15.672Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", upload-time = "2025-11-04T13:40:17.532Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", upload-time = "2025-11-04T13:40:19.309Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", upload-time = "2025-11-04T13:40:21.548Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", upload-time = "2025-11-04T13:40:23.393Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", upload-time = "2025-11-04T13:40:25.248Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", upload-time = "2025-11-04T13:40:27.099Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", upload-time = "2025-11-04T13:40:29.806Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", upload-time = "2025-11-04T13:40:33.544Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", upload-time = "2025-11-04T13:40:35.479Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", upload-time = "2025-11-04T13:40:37.436Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", upload-time = "2025-11-04T13:40:40.289Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", upload-time = "2025-11-04T13:40:42.809Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", upload-time = "2025-11-04T13:40:44.752Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", upload-time = "2025-11-04T13:40:46.66Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", upload-time = "2025-11-04T13:40:48.575Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", upload-time = "2025-11-04T13:40:50.619Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", upload-time = "2025-11-04T13:40:52.631Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", upload-time = "2025-11-04T13:40:54.734Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", upload-time = "2025-11-04T13:40:56.68Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", upload-time = "2025-11-04T13:40:58.807Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", upload-time = "2025-11-04T13:41:00.853Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", upload-time = "2025-11-04T13:41:03.504Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", upload-time = "2025-11-04T13:41:05.804Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", upload-time = "2025-11-04T13:41:07.809Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", upload-time = "2025-11-04T13:41:09.827Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", upload-time = "2025-11-04T13:41:12.379Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", upload-time = "2025-11-04T13:41:14.627Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", upload-time = "2025-11-04T13:41:16.868Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", upload-time = "2025-11-04T13:41:18.934Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", upload-time = "2025-11-04T13:41:21.418Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", upload-time = "2025-11-04T13:41:24.076Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", upload-time = "2025-11-04T13:41:26.33Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", upload-time = "2025-11-04T13:41:28.569Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", upload-time = "2025-11-04T13:41:31.055Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", upload-time = "2025-11-04T13:41:33.21Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", upload-time = "2025-11-04T13:41:35.508Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", upload-time = "2025-11-04T13:41:37.732Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", upload-time = "2025-11-04T13:41:40Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", upload-time = "2025-11-04T13:41:42.323Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", upload-time = "2025-11-04T13:41:45.221Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", upload-time = "2025-11-04T13:41:47.474Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", upload-time = "2025-11-04T13:41:49.992Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", upload-time = "2025-11-04T13:41:54.079Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", upload-time = "2025-11-04T13:41:56.606Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", upload-time = "2025-11-04T13:41:58.889Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", upload-time = "2025-11-04T13:42:01.186Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", upload-time = "2025-11-04T13:42:39.557Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", upload-time = "2025-11-04T13:42:42.169Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", upload-time = "2025-11-04T13:42:44.564Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", upload-time = "2025-11-04T13:42:47.156Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", upload-time = "2025-11-04T13:42:49.689Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", upload-time = "2025-11-04T13:42:52.215Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", upload-time = "2025-11-04T13:42:56.483Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", upload-time = "2025-11-04T13:42:59.471Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", upload-time = "2025-11-04T13:43:02.058Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", upload-time = "2025-11-04T13:43:05.159Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", upload-time = "2025-11-04T13:43:08.116Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", upload-time = "2025-11-04T13:43:12.49Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", upload-time = "2025-11-04T13:43:15.431Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", upload-time = "2025-11-04T13:43:18.062Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", upload-time = "2025-11-04T13:43:20.679Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", upload-time = "2025-11-04T13:43:23.286Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", upload-time = "2025-11-04T13:43:25.97Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", upload-time = "2025-11-04T13:43:28.763Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", upload-time = "2025-11-04T13:43:31.71Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", upload-time = "2025-11-04T13:43:34.744Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", upload-time = "2025-11-04T13:43:37.701Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", upload-time = "2025-11-04T13:43:40.406Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", upload-time = "2025-11-04T13:43:43.602Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", upload-time = "2025-11-04T13:43:46.64Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", size = 2107298, upload-time = "2025-11-04T13:39:04.116Z" }, + { url = "https://files.pythonhosted.org/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", size = 1901475, upload-time = "2025-11-04T13:39:06.055Z" }, + { url = "https://files.pythonhosted.org/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", size = 1918815, upload-time = "2025-11-04T13:39:10.41Z" }, + { url = "https://files.pythonhosted.org/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", size = 2065567, upload-time = "2025-11-04T13:39:12.244Z" }, + { url = "https://files.pythonhosted.org/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52", size = 2230442, upload-time = "2025-11-04T13:39:13.962Z" }, + { url = "https://files.pythonhosted.org/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", size = 2350956, upload-time = "2025-11-04T13:39:15.889Z" }, + { url = "https://files.pythonhosted.org/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", size = 2068253, upload-time = "2025-11-04T13:39:17.403Z" }, + { url = "https://files.pythonhosted.org/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", size = 2177050, upload-time = "2025-11-04T13:39:19.351Z" }, + { url = "https://files.pythonhosted.org/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", size = 2147178, upload-time = "2025-11-04T13:39:21Z" }, + { url = "https://files.pythonhosted.org/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", size = 2341833, upload-time = "2025-11-04T13:39:22.606Z" }, + { url = "https://files.pythonhosted.org/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", size = 2321156, upload-time = "2025-11-04T13:39:25.843Z" }, + { url = "https://files.pythonhosted.org/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", size = 1989378, upload-time = "2025-11-04T13:39:27.92Z" }, + { url = "https://files.pythonhosted.org/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", size = 2013622, upload-time = "2025-11-04T13:39:29.848Z" }, + { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, + { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, + { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, + { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, + { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, + { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, + { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, + { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, + { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, + { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, + { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, + { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, + { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, + { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, + { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, + { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, + { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, + { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, + { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, + { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, + { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, + { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, + { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, + { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, + { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, + { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, + { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, + { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, + { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, + { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, + { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, + { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, + { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, + { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, + { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, + { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, + { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, + { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, + { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, + { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, + { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, + { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, + { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, + { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, + { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, + { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, + { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, + { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, + { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, + { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, + { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, + { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, + { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, + { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, + { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, + { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", size = 2103351, upload-time = "2025-11-04T13:43:02.058Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", size = 1925363, upload-time = "2025-11-04T13:43:05.159Z" }, + { url = "https://files.pythonhosted.org/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", size = 2135615, upload-time = "2025-11-04T13:43:08.116Z" }, + { url = "https://files.pythonhosted.org/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", size = 2175369, upload-time = "2025-11-04T13:43:12.49Z" }, + { url = "https://files.pythonhosted.org/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", size = 2144218, upload-time = "2025-11-04T13:43:15.431Z" }, + { url = "https://files.pythonhosted.org/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", size = 2329951, upload-time = "2025-11-04T13:43:18.062Z" }, + { url = "https://files.pythonhosted.org/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", size = 2318428, upload-time = "2025-11-04T13:43:20.679Z" }, + { url = "https://files.pythonhosted.org/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", size = 2147009, upload-time = "2025-11-04T13:43:23.286Z" }, + { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, + { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, + { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, + { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, + { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, + { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, ] [[package]] @@ -4493,9 +4489,9 @@ dependencies = [ { name = "python-dotenv" }, { name = "typing-inspection" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/43/4b/ac7e0aae12027748076d72a8764ff1c9d82ca75a7a52622e67ed3f765c54/pydantic_settings-2.12.0.tar.gz", hash = "sha256:005538ef951e3c2a68e1c08b292b5f2e71490def8589d4221b95dab00dafcfd0", upload-time = "2025-11-10T14:25:47.013Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/4b/ac7e0aae12027748076d72a8764ff1c9d82ca75a7a52622e67ed3f765c54/pydantic_settings-2.12.0.tar.gz", hash = "sha256:005538ef951e3c2a68e1c08b292b5f2e71490def8589d4221b95dab00dafcfd0", size = 194184, upload-time = "2025-11-10T14:25:47.013Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c1/60/5d4751ba3f4a40a6891f24eec885f51afd78d208498268c734e256fb13c4/pydantic_settings-2.12.0-py3-none-any.whl", hash = "sha256:fddb9fd99a5b18da837b29710391e945b1e30c135477f484084ee513adb93809", upload-time = "2025-11-10T14:25:45.546Z" }, + { url = "https://files.pythonhosted.org/packages/c1/60/5d4751ba3f4a40a6891f24eec885f51afd78d208498268c734e256fb13c4/pydantic_settings-2.12.0-py3-none-any.whl", hash = "sha256:fddb9fd99a5b18da837b29710391e945b1e30c135477f484084ee513adb93809", size = 51880, upload-time = "2025-11-10T14:25:45.546Z" }, ] [[package]] @@ -4505,27 +4501,27 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/8b/04/e7c1fe4dc78a6fdbfd6c337b1c3732ff543b8a397683ab38378447baa331/pyee-13.0.1.tar.gz", hash = "sha256:0b931f7c14535667ed4c7e0d531716368715e860b988770fc7eb8578d1f67fc8", upload-time = "2026-02-14T21:12:28.044Z" } +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://pypi-proxy.dev.databricks.com/packages/a0/c4/b4d4827c93ef43c01f599ef31453ccc1c132b353284fc6c87d535c233129/pyee-13.0.1-py3-none-any.whl", hash = "sha256:af2f8fede4171ef667dfded53f96e2ed0d6e6bd7ee3bb46437f77e3b57689228", upload-time = "2026-02-14T21:12:26.263Z" }, + { 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 = "pyflakes" version = "3.4.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/45/dc/fd034dc20b4b264b3d015808458391acbf9df40b1e54750ef175d39180b1/pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58", upload-time = "2025-06-20T18:45:27.834Z" } +sdist = { url = "https://files.pythonhosted.org/packages/45/dc/fd034dc20b4b264b3d015808458391acbf9df40b1e54750ef175d39180b1/pyflakes-3.4.0.tar.gz", hash = "sha256:b24f96fafb7d2ab0ec5075b7350b3d2d2218eab42003821c06344973d3ea2f58", size = 64669, upload-time = "2025-06-20T18:45:27.834Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f", upload-time = "2025-06-20T18:45:26.937Z" }, + { url = "https://files.pythonhosted.org/packages/c2/2f/81d580a0fb83baeb066698975cb14a618bdbed7720678566f1b046a95fe8/pyflakes-3.4.0-py2.py3-none-any.whl", hash = "sha256:f742a7dbd0d9cb9ea41e9a24a918996e8170c799fa528688d40dd582c8265f4f", size = 63551, upload-time = "2025-06-20T18:45:26.937Z" }, ] [[package]] name = "pygments" version = "2.20.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", upload-time = "2026-03-29T13:29:33.898Z" } +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://pypi-proxy.dev.databricks.com/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", upload-time = "2026-03-29T13:29:30.038Z" }, + { 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]] @@ -4535,9 +4531,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/c2/27/a3b6e5bf6ff856d2509292e95c8f57f0df7017cf5394921fc4e4ef40308a/pyjwt-2.12.1.tar.gz", hash = "sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b", upload-time = "2026-03-13T19:27:37.25Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c2/27/a3b6e5bf6ff856d2509292e95c8f57f0df7017cf5394921fc4e4ef40308a/pyjwt-2.12.1.tar.gz", hash = "sha256:c74a7a2adf861c04d002db713dd85f84beb242228e671280bf709d765b03672b", size = 102564, upload-time = "2026-03-13T19:27:37.25Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/7a/8dd906bd22e79e47397a61742927f6747fe93242ef86645ee9092e610244/pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c", upload-time = "2026-03-13T19:27:35.677Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7a/8dd906bd22e79e47397a61742927f6747fe93242ef86645ee9092e610244/pyjwt-2.12.1-py3-none-any.whl", hash = "sha256:28ca37c070cad8ba8cd9790cd940535d40274d22f80ab87f3ac6a713e6e8454c", size = 29726, upload-time = "2026-03-13T19:27:35.677Z" }, ] [package.optional-dependencies] @@ -4549,18 +4545,18 @@ crypto = [ name = "pyparsing" version = "3.3.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/33/c1/1d9de9aeaa1b89b0186e5fe23294ff6517fce1bc69149185577cd31016b2/pyparsing-3.3.1.tar.gz", hash = "sha256:47fad0f17ac1e2cad3de3b458570fbc9b03560aa029ed5e16ee5554da9a2251c", upload-time = "2025-12-23T03:14:04.391Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/c1/1d9de9aeaa1b89b0186e5fe23294ff6517fce1bc69149185577cd31016b2/pyparsing-3.3.1.tar.gz", hash = "sha256:47fad0f17ac1e2cad3de3b458570fbc9b03560aa029ed5e16ee5554da9a2251c", size = 1550512, upload-time = "2025-12-23T03:14:04.391Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl", hash = "sha256:023b5e7e5520ad96642e2c6db4cb683d3970bd640cdf7115049a6e9c3682df82", upload-time = "2025-12-23T03:14:02.103Z" }, + { url = "https://files.pythonhosted.org/packages/8b/40/2614036cdd416452f5bf98ec037f38a1afb17f327cb8e6b652d4729e0af8/pyparsing-3.3.1-py3-none-any.whl", hash = "sha256:023b5e7e5520ad96642e2c6db4cb683d3970bd640cdf7115049a6e9c3682df82", size = 121793, upload-time = "2025-12-23T03:14:02.103Z" }, ] [[package]] name = "pyperclip" version = "1.11.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/e8/52/d87eba7cb129b81563019d1679026e7a112ef76855d6159d24754dbd2a51/pyperclip-1.11.0.tar.gz", hash = "sha256:244035963e4428530d9e3a6101a1ef97209c6825edab1567beac148ccc1db1b6", upload-time = "2025-09-26T14:40:37.245Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/52/d87eba7cb129b81563019d1679026e7a112ef76855d6159d24754dbd2a51/pyperclip-1.11.0.tar.gz", hash = "sha256:244035963e4428530d9e3a6101a1ef97209c6825edab1567beac148ccc1db1b6", size = 12185, upload-time = "2025-09-26T14:40:37.245Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/df/80/fc9d01d5ed37ba4c42ca2b55b4339ae6e200b456be3a1aaddf4a9fa99b8c/pyperclip-1.11.0-py3-none-any.whl", hash = "sha256:299403e9ff44581cb9ba2ffeed69c7aa96a008622ad0c46cb575ca75b5b84273", upload-time = "2025-09-26T14:40:36.069Z" }, + { url = "https://files.pythonhosted.org/packages/df/80/fc9d01d5ed37ba4c42ca2b55b4339ae6e200b456be3a1aaddf4a9fa99b8c/pyperclip-1.11.0-py3-none-any.whl", hash = "sha256:299403e9ff44581cb9ba2ffeed69c7aa96a008622ad0c46cb575ca75b5b84273", size = 11063, upload-time = "2025-09-26T14:40:36.069Z" }, ] [[package]] @@ -4574,9 +4570,9 @@ dependencies = [ { name = "prettytable" }, { name = "rdflib", extra = ["html"] }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/61/2d/8eaada41b9b57c028a54494688e45cfeefd6756098a6bf1bfa2dd9470cdf/pyshacl-0.31.0.tar.gz", hash = "sha256:327950875a5bb0d1a15c246a8a272b2dbf6bc9b96e28cfa8fdbfa4d73aadc0ba", upload-time = "2026-01-16T06:34:06.113Z" } +sdist = { url = "https://files.pythonhosted.org/packages/61/2d/8eaada41b9b57c028a54494688e45cfeefd6756098a6bf1bfa2dd9470cdf/pyshacl-0.31.0.tar.gz", hash = "sha256:327950875a5bb0d1a15c246a8a272b2dbf6bc9b96e28cfa8fdbfa4d73aadc0ba", size = 1406151, upload-time = "2026-01-16T06:34:06.113Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/3f/3b/ebd7c9595fcdf176555aaf2fd2254f4d890658334ca3556b611e579f8294/pyshacl-0.31.0-py3-none-any.whl", hash = "sha256:5cae2184401d956b67deebb00e3c78ab7052784741a730e52e309e33c8a0b9a5", upload-time = "2026-01-16T06:34:03.679Z" }, + { url = "https://files.pythonhosted.org/packages/3f/3b/ebd7c9595fcdf176555aaf2fd2254f4d890658334ca3556b611e579f8294/pyshacl-0.31.0-py3-none-any.whl", hash = "sha256:5cae2184401d956b67deebb00e3c78ab7052784741a730e52e309e33c8a0b9a5", size = 1297210, upload-time = "2026-01-16T06:34:03.679Z" }, ] [[package]] @@ -4592,9 +4588,9 @@ dependencies = [ { name = "pygments" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", upload-time = "2026-04-07T17:16:18.027Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", upload-time = "2026-04-07T17:16:16.13Z" }, + { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, ] [[package]] @@ -4606,9 +4602,9 @@ dependencies = [ { name = "pytest" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", upload-time = "2025-11-10T16:07:47.256Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/2c/8af215c0f776415f3590cac4f9086ccefd6fd463befeae41cd4d3f193e5a/pytest_asyncio-1.3.0.tar.gz", hash = "sha256:d7f52f36d231b80ee124cd216ffb19369aa168fc10095013c6b014a34d3ee9e5", size = 50087, upload-time = "2025-11-10T16:07:47.256Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", upload-time = "2025-11-10T16:07:45.537Z" }, + { url = "https://files.pythonhosted.org/packages/e5/35/f8b19922b6a25bc0880171a2f1a003eaeb93657475193ab516fd87cac9da/pytest_asyncio-1.3.0-py3-none-any.whl", hash = "sha256:611e26147c7f77640e6d0a92a38ed17c3e9848063698d5c93d5aa7aa11cebff5", size = 15075, upload-time = "2025-11-10T16:07:45.537Z" }, ] [[package]] @@ -4620,9 +4616,9 @@ dependencies = [ { name = "pluggy" }, { name = "pytest" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", upload-time = "2025-09-09T10:57:02.113Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328, upload-time = "2025-09-09T10:57:02.113Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", upload-time = "2025-09-09T10:57:00.695Z" }, + { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424, upload-time = "2025-09-09T10:57:00.695Z" }, ] [[package]] @@ -4632,9 +4628,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/68/14/eb014d26be205d38ad5ad20d9a80f7d201472e08167f0bb4361e251084a9/pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f", upload-time = "2025-09-16T16:37:27.081Z" } +sdist = { url = "https://files.pythonhosted.org/packages/68/14/eb014d26be205d38ad5ad20d9a80f7d201472e08167f0bb4361e251084a9/pytest_mock-3.15.1.tar.gz", hash = "sha256:1849a238f6f396da19762269de72cb1814ab44416fa73a8686deac10b0d87a0f", size = 34036, upload-time = "2025-09-16T16:37:27.081Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/5a/cc/06253936f4a7fa2e0f48dfe6d851d9c56df896a9ab09ac019d70b760619c/pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d", upload-time = "2025-09-16T16:37:25.734Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cc/06253936f4a7fa2e0f48dfe6d851d9c56df896a9ab09ac019d70b760619c/pytest_mock-3.15.1-py3-none-any.whl", hash = "sha256:0a25e2eb88fe5168d535041d09a4529a188176ae608a6d249ee65abc0949630d", size = 10095, upload-time = "2025-09-16T16:37:25.734Z" }, ] [[package]] @@ -4644,75 +4640,75 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", upload-time = "2024-03-01T18:36:20.211Z" } +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://pypi-proxy.dev.databricks.com/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", upload-time = "2024-03-01T18:36:18.57Z" }, + { 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-dotenv" version = "1.2.2" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", upload-time = "2026-03-01T16:00:26.196Z" } +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://pypi-proxy.dev.databricks.com/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", upload-time = "2026-03-01T16:00:25.09Z" }, + { 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 = "python-multipart" -version = "0.0.32" +version = "0.0.27" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/5b/42/55c32bb9b12693c092ad250a0e82edb5b31ddeda6eb772de5f308b3804ad/python_multipart-0.0.32.tar.gz", hash = "sha256:be54b7f3fa167bb83e4fcd936b887b708f4e57fe75911c02aebf53efaf8d938e", upload-time = "2026-06-04T16:18:58.647Z" } +sdist = { url = "https://files.pythonhosted.org/packages/69/9b/f23807317a113dc36e74e75eb265a02dd1a4d9082abc3c1064acd22997c4/python_multipart-0.0.27.tar.gz", hash = "sha256:9870a6a8c5a20a5bf4f07c017bd1489006ff8836cff097b6933355ee2b49b602", size = 44043, upload-time = "2026-04-27T10:51:26.649Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/e1/04/e8135ebd1ad02c56ec633277529b2602ff99ff634be76cdba5744cf554fd/python_multipart-0.0.32-py3-none-any.whl", hash = "sha256:ff6d3f776f16878c894e52e107296ffc890e913c611b1a4ec6c44e2821fe2e23", upload-time = "2026-06-04T16:18:57.319Z" }, + { url = "https://files.pythonhosted.org/packages/99/78/4126abcbdbd3c559d43e0db7f7b9173fc6befe45d39a2856cc0b8ec2a5a6/python_multipart-0.0.27-py3-none-any.whl", hash = "sha256:6fccfad17a27334bd0193681b369f476eda3409f17381a2d65aa7df3f7275645", size = 29254, upload-time = "2026-04-27T10:51:24.997Z" }, ] [[package]] name = "pytokens" version = "0.4.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", upload-time = "2026-01-30T01:03:45.924Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/42/24/f206113e05cb8ef51b3850e7ef88f20da6f4bf932190ceb48bd3da103e10/pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5", upload-time = "2026-01-30T01:02:50.393Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/e9/06a6bf1b90c2ed81a9c7d2544232fe5d2891d1cd480e8a1809ca354a8eb2/pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe", upload-time = "2026-01-30T01:02:52.399Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/69/66/f6fb1007a4c3d8b682d5d65b7c1fb33257587a5f782647091e3408abe0b8/pytokens-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c", upload-time = "2026-01-30T01:02:53.737Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/04/92/086f89b4d622a18418bac74ab5db7f68cf0c21cf7cc92de6c7b919d76c88/pytokens-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7", upload-time = "2026-01-30T01:02:54.871Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b4/7b/8b31c347cf94a3f900bdde750b2e9131575a61fdb620d3d3c75832262137/pytokens-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2", upload-time = "2026-01-30T01:02:56.414Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/92/790ebe03f07b57e53b10884c329b9a1a308648fc083a6d4a39a10a28c8fc/pytokens-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440", upload-time = "2026-01-30T01:02:57.882Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/13/25/a4f555281d975bfdd1eba731450e2fe3a95870274da73fb12c40aeae7625/pytokens-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc", upload-time = "2026-01-30T01:02:59.912Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/17/50/bc0394b4ad5b1601be22fa43652173d47e4c9efbf0044c62e9a59b747c56/pytokens-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d", upload-time = "2026-01-30T01:03:01.471Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4e/54/3e04f9d92a4be4fc6c80016bc396b923d2a6933ae94b5f557c939c460ee0/pytokens-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16", upload-time = "2026-01-30T01:03:04.143Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/1b/44b0326cb5470a4375f37988aea5d61b5cc52407143303015ebee94abfd6/pytokens-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6", upload-time = "2026-01-30T01:03:05.412Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/41/5d/e44573011401fb82e9d51e97f1290ceb377800fb4eed650b96f4753b499c/pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083", upload-time = "2026-01-30T01:03:06.473Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f0/e6/5bbc3019f8e6f21d09c41f8b8654536117e5e211a85d89212d59cbdab381/pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1", upload-time = "2026-01-30T01:03:08.177Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/3c/2d5297d82286f6f3d92770289fd439956b201c0a4fc7e72efb9b2293758e/pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1", upload-time = "2026-01-30T01:03:09.756Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/20/01/7436e9ad693cebda0551203e0bf28f7669976c60ad07d6402098208476de/pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9", upload-time = "2026-01-30T01:03:10.957Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2e/df/533c82a3c752ba13ae7ef238b7f8cdd272cf1475f03c63ac6cf3fcfb00b6/pytokens-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68", upload-time = "2026-01-30T01:03:12.066Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", upload-time = "2026-01-30T01:03:13.843Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", upload-time = "2026-01-30T01:03:14.886Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", upload-time = "2026-01-30T01:03:15.936Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", upload-time = "2026-01-30T01:03:17.458Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", upload-time = "2026-01-30T01:03:18.652Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8f/a7/b470f672e6fc5fee0a01d9e75005a0e617e162381974213a945fcd274843/pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321", upload-time = "2026-01-30T01:03:19.684Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/98/e83a36fe8d170c911f864bfded690d2542bfcfacb9c649d11a9e6eb9dc41/pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa", upload-time = "2026-01-30T01:03:20.834Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0f/95/70d7041273890f9f97a24234c00b746e8da86df462620194cef1d411ddeb/pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d", upload-time = "2026-01-30T01:03:21.888Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/da/79/76e6d09ae19c99404656d7db9c35dfd20f2086f3eb6ecb496b5b31163bad/pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324", upload-time = "2026-01-30T01:03:23.633Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/79/37/482e55fa1602e0a7ff012661d8c946bafdc05e480ea5a32f4f7e336d4aa9/pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9", upload-time = "2026-01-30T01:03:24.788Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/30/e8/20e7db907c23f3d63b0be3b8a4fd1927f6da2395f5bcc7f72242bb963dfe/pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb", upload-time = "2026-01-30T01:03:26.428Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d6/81/88a95ee9fafdd8f5f3452107748fd04c24930d500b9aba9738f3ade642cc/pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3", upload-time = "2026-01-30T01:03:27.415Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/35/3aa899645e29b6375b4aed9f8d21df219e7c958c4c186b465e42ee0a06bf/pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975", upload-time = "2026-01-30T01:03:28.558Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/52/a0/07907b6ff512674d9b201859f7d212298c44933633c946703a20c25e9d81/pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a", upload-time = "2026-01-30T01:03:29.653Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/39/2a/cbbf9250020a4a8dd53ba83a46c097b69e5eb49dd14e708f496f548c6612/pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918", upload-time = "2026-01-30T01:03:30.912Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", upload-time = "2026-01-30T01:03:45.029Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", size = 23015, upload-time = "2026-01-30T01:03:45.924Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/24/f206113e05cb8ef51b3850e7ef88f20da6f4bf932190ceb48bd3da103e10/pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5", size = 161522, upload-time = "2026-01-30T01:02:50.393Z" }, + { url = "https://files.pythonhosted.org/packages/d4/e9/06a6bf1b90c2ed81a9c7d2544232fe5d2891d1cd480e8a1809ca354a8eb2/pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe", size = 246945, upload-time = "2026-01-30T01:02:52.399Z" }, + { url = "https://files.pythonhosted.org/packages/69/66/f6fb1007a4c3d8b682d5d65b7c1fb33257587a5f782647091e3408abe0b8/pytokens-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c", size = 259525, upload-time = "2026-01-30T01:02:53.737Z" }, + { url = "https://files.pythonhosted.org/packages/04/92/086f89b4d622a18418bac74ab5db7f68cf0c21cf7cc92de6c7b919d76c88/pytokens-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7", size = 262693, upload-time = "2026-01-30T01:02:54.871Z" }, + { url = "https://files.pythonhosted.org/packages/b4/7b/8b31c347cf94a3f900bdde750b2e9131575a61fdb620d3d3c75832262137/pytokens-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2", size = 103567, upload-time = "2026-01-30T01:02:56.414Z" }, + { url = "https://files.pythonhosted.org/packages/3d/92/790ebe03f07b57e53b10884c329b9a1a308648fc083a6d4a39a10a28c8fc/pytokens-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440", size = 160864, upload-time = "2026-01-30T01:02:57.882Z" }, + { url = "https://files.pythonhosted.org/packages/13/25/a4f555281d975bfdd1eba731450e2fe3a95870274da73fb12c40aeae7625/pytokens-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc", size = 248565, upload-time = "2026-01-30T01:02:59.912Z" }, + { url = "https://files.pythonhosted.org/packages/17/50/bc0394b4ad5b1601be22fa43652173d47e4c9efbf0044c62e9a59b747c56/pytokens-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d", size = 260824, upload-time = "2026-01-30T01:03:01.471Z" }, + { url = "https://files.pythonhosted.org/packages/4e/54/3e04f9d92a4be4fc6c80016bc396b923d2a6933ae94b5f557c939c460ee0/pytokens-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16", size = 264075, upload-time = "2026-01-30T01:03:04.143Z" }, + { url = "https://files.pythonhosted.org/packages/d1/1b/44b0326cb5470a4375f37988aea5d61b5cc52407143303015ebee94abfd6/pytokens-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6", size = 103323, upload-time = "2026-01-30T01:03:05.412Z" }, + { url = "https://files.pythonhosted.org/packages/41/5d/e44573011401fb82e9d51e97f1290ceb377800fb4eed650b96f4753b499c/pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083", size = 160663, upload-time = "2026-01-30T01:03:06.473Z" }, + { url = "https://files.pythonhosted.org/packages/f0/e6/5bbc3019f8e6f21d09c41f8b8654536117e5e211a85d89212d59cbdab381/pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1", size = 255626, upload-time = "2026-01-30T01:03:08.177Z" }, + { url = "https://files.pythonhosted.org/packages/bf/3c/2d5297d82286f6f3d92770289fd439956b201c0a4fc7e72efb9b2293758e/pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1", size = 269779, upload-time = "2026-01-30T01:03:09.756Z" }, + { url = "https://files.pythonhosted.org/packages/20/01/7436e9ad693cebda0551203e0bf28f7669976c60ad07d6402098208476de/pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9", size = 268076, upload-time = "2026-01-30T01:03:10.957Z" }, + { url = "https://files.pythonhosted.org/packages/2e/df/533c82a3c752ba13ae7ef238b7f8cdd272cf1475f03c63ac6cf3fcfb00b6/pytokens-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68", size = 103552, upload-time = "2026-01-30T01:03:12.066Z" }, + { url = "https://files.pythonhosted.org/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", size = 160720, upload-time = "2026-01-30T01:03:13.843Z" }, + { url = "https://files.pythonhosted.org/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", size = 254204, upload-time = "2026-01-30T01:03:14.886Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", size = 268423, upload-time = "2026-01-30T01:03:15.936Z" }, + { url = "https://files.pythonhosted.org/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", size = 266859, upload-time = "2026-01-30T01:03:17.458Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", size = 103520, upload-time = "2026-01-30T01:03:18.652Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a7/b470f672e6fc5fee0a01d9e75005a0e617e162381974213a945fcd274843/pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321", size = 160821, upload-time = "2026-01-30T01:03:19.684Z" }, + { url = "https://files.pythonhosted.org/packages/80/98/e83a36fe8d170c911f864bfded690d2542bfcfacb9c649d11a9e6eb9dc41/pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa", size = 254263, upload-time = "2026-01-30T01:03:20.834Z" }, + { url = "https://files.pythonhosted.org/packages/0f/95/70d7041273890f9f97a24234c00b746e8da86df462620194cef1d411ddeb/pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d", size = 268071, upload-time = "2026-01-30T01:03:21.888Z" }, + { url = "https://files.pythonhosted.org/packages/da/79/76e6d09ae19c99404656d7db9c35dfd20f2086f3eb6ecb496b5b31163bad/pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324", size = 271716, upload-time = "2026-01-30T01:03:23.633Z" }, + { url = "https://files.pythonhosted.org/packages/79/37/482e55fa1602e0a7ff012661d8c946bafdc05e480ea5a32f4f7e336d4aa9/pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9", size = 104539, upload-time = "2026-01-30T01:03:24.788Z" }, + { url = "https://files.pythonhosted.org/packages/30/e8/20e7db907c23f3d63b0be3b8a4fd1927f6da2395f5bcc7f72242bb963dfe/pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb", size = 168474, upload-time = "2026-01-30T01:03:26.428Z" }, + { url = "https://files.pythonhosted.org/packages/d6/81/88a95ee9fafdd8f5f3452107748fd04c24930d500b9aba9738f3ade642cc/pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3", size = 290473, upload-time = "2026-01-30T01:03:27.415Z" }, + { url = "https://files.pythonhosted.org/packages/cf/35/3aa899645e29b6375b4aed9f8d21df219e7c958c4c186b465e42ee0a06bf/pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975", size = 303485, upload-time = "2026-01-30T01:03:28.558Z" }, + { url = "https://files.pythonhosted.org/packages/52/a0/07907b6ff512674d9b201859f7d212298c44933633c946703a20c25e9d81/pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a", size = 306698, upload-time = "2026-01-30T01:03:29.653Z" }, + { url = "https://files.pythonhosted.org/packages/39/2a/cbbf9250020a4a8dd53ba83a46c097b69e5eb49dd14e708f496f548c6612/pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918", size = 116287, upload-time = "2026-01-30T01:03:30.912Z" }, + { url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", size = 13729, upload-time = "2026-01-30T01:03:45.029Z" }, ] [[package]] name = "pytz" version = "2025.2" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", upload-time = "2025-03-25T02:25:00.538Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", upload-time = "2025-03-25T02:24:58.468Z" }, + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, ] [[package]] @@ -4720,94 +4716,94 @@ name = "pywin32" version = "311" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", upload-time = "2025-07-14T20:13:05.9Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", upload-time = "2025-07-14T20:13:07.698Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", upload-time = "2025-07-14T20:13:11.11Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", upload-time = "2025-07-14T20:13:13.266Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", upload-time = "2025-07-14T20:13:15.147Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", upload-time = "2025-07-14T20:13:16.945Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", upload-time = "2025-07-14T20:13:20.765Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", upload-time = "2025-07-14T20:13:22.543Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", upload-time = "2025-07-14T20:13:24.682Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", upload-time = "2025-07-14T20:13:26.471Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", upload-time = "2025-07-14T20:13:28.243Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", upload-time = "2025-07-14T20:13:30.348Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", upload-time = "2025-07-14T20:13:32.449Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", upload-time = "2025-07-14T20:13:34.312Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", upload-time = "2025-07-14T20:13:36.379Z" }, + { url = "https://files.pythonhosted.org/packages/7b/40/44efbb0dfbd33aca6a6483191dae0716070ed99e2ecb0c53683f400a0b4f/pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3", size = 8760432, upload-time = "2025-07-14T20:13:05.9Z" }, + { url = "https://files.pythonhosted.org/packages/5e/bf/360243b1e953bd254a82f12653974be395ba880e7ec23e3731d9f73921cc/pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b", size = 9590103, upload-time = "2025-07-14T20:13:07.698Z" }, + { url = "https://files.pythonhosted.org/packages/57/38/d290720e6f138086fb3d5ffe0b6caa019a791dd57866940c82e4eeaf2012/pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b", size = 8778557, upload-time = "2025-07-14T20:13:11.11Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031, upload-time = "2025-07-14T20:13:13.266Z" }, + { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308, upload-time = "2025-07-14T20:13:15.147Z" }, + { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930, upload-time = "2025-07-14T20:13:16.945Z" }, + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543, upload-time = "2025-07-14T20:13:20.765Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040, upload-time = "2025-07-14T20:13:22.543Z" }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102, upload-time = "2025-07-14T20:13:24.682Z" }, + { url = "https://files.pythonhosted.org/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700, upload-time = "2025-07-14T20:13:26.471Z" }, + { url = "https://files.pythonhosted.org/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700, upload-time = "2025-07-14T20:13:28.243Z" }, + { url = "https://files.pythonhosted.org/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318, upload-time = "2025-07-14T20:13:30.348Z" }, + { url = "https://files.pythonhosted.org/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714, upload-time = "2025-07-14T20:13:32.449Z" }, + { url = "https://files.pythonhosted.org/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800, upload-time = "2025-07-14T20:13:34.312Z" }, + { url = "https://files.pythonhosted.org/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540, upload-time = "2025-07-14T20:13:36.379Z" }, ] [[package]] name = "pywin32-ctypes" version = "0.2.3" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", upload-time = "2024-08-14T10:15:34.626Z" } +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471, upload-time = "2024-08-14T10:15:34.626Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", upload-time = "2024-08-14T10:15:33.187Z" }, + { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" }, ] [[package]] name = "pyyaml" version = "6.0.3" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", upload-time = "2025-09-25T21:33:16.546Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", upload-time = "2025-09-25T21:31:46.04Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", upload-time = "2025-09-25T21:31:47.706Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", upload-time = "2025-09-25T21:31:49.21Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", upload-time = "2025-09-25T21:31:50.735Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-09-25T21:31:51.828Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", upload-time = "2025-09-25T21:31:53.282Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", upload-time = "2025-09-25T21:31:54.807Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", upload-time = "2025-09-25T21:31:55.885Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", upload-time = "2025-09-25T21:31:57.406Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", upload-time = "2025-09-25T21:31:58.655Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", upload-time = "2025-09-25T21:32:00.088Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", upload-time = "2025-09-25T21:32:01.31Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", upload-time = "2025-09-25T21:32:03.376Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-09-25T21:32:04.553Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", upload-time = "2025-09-25T21:32:06.152Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", upload-time = "2025-09-25T21:32:07.367Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", upload-time = "2025-09-25T21:32:08.95Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", upload-time = "2025-09-25T21:32:09.96Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", upload-time = "2025-09-25T21:32:11.445Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", upload-time = "2025-09-25T21:32:12.492Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", upload-time = "2025-09-25T21:32:13.652Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", upload-time = "2025-09-25T21:32:15.21Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-09-25T21:32:16.431Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", upload-time = "2025-09-25T21:32:17.56Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", upload-time = "2025-09-25T21:32:18.834Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", upload-time = "2025-09-25T21:32:20.209Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", upload-time = "2025-09-25T21:32:21.167Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", upload-time = "2025-09-25T21:32:22.617Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", upload-time = "2025-09-25T21:32:23.673Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", upload-time = "2025-09-25T21:32:25.149Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", upload-time = "2025-09-25T21:32:26.575Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", upload-time = "2025-09-25T21:32:27.727Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", upload-time = "2025-09-25T21:32:28.878Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", upload-time = "2025-09-25T21:32:30.178Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", upload-time = "2025-09-25T21:32:31.353Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", upload-time = "2025-09-25T21:32:32.58Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", upload-time = "2025-09-25T21:32:33.659Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", upload-time = "2025-09-25T21:32:34.663Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", upload-time = "2025-09-25T21:32:35.712Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", upload-time = "2025-09-25T21:32:36.789Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", upload-time = "2025-09-25T21:32:37.966Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", upload-time = "2025-09-25T21:32:39.178Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", upload-time = "2025-09-25T21:32:40.865Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", upload-time = "2025-09-25T21:32:42.084Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", upload-time = "2025-09-25T21:32:43.362Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", upload-time = "2025-09-25T21:32:57.844Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", upload-time = "2025-09-25T21:32:59.247Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", upload-time = "2025-09-25T21:32:44.377Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", upload-time = "2025-09-25T21:32:45.407Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", upload-time = "2025-09-25T21:32:48.83Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", upload-time = "2025-09-25T21:32:50.149Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", upload-time = "2025-09-25T21:32:51.808Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", upload-time = "2025-09-25T21:32:52.941Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", upload-time = "2025-09-25T21:32:54.537Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", upload-time = "2025-09-25T21:32:55.767Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", upload-time = "2025-09-25T21:32:56.828Z" }, +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" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] [[package]] @@ -4818,9 +4814,9 @@ dependencies = [ { name = "isodate", marker = "python_full_version < '3.11'" }, { name = "pyparsing" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/98/f5/18bb77b7af9526add0c727a3b2048959847dc5fb030913e2918bf384fec3/rdflib-7.6.0.tar.gz", hash = "sha256:6c831288d5e4a5a7ece85d0ccde9877d512a3d0f02d7c06455d00d6d0ea379df", upload-time = "2026-02-13T07:15:55.938Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/f5/18bb77b7af9526add0c727a3b2048959847dc5fb030913e2918bf384fec3/rdflib-7.6.0.tar.gz", hash = "sha256:6c831288d5e4a5a7ece85d0ccde9877d512a3d0f02d7c06455d00d6d0ea379df", size = 4943826, upload-time = "2026-02-13T07:15:55.938Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/10/c2/6604a71269e0c1bd75656d5a001432d16f2cc5b8c057140ec797155c295e/rdflib-7.6.0-py3-none-any.whl", hash = "sha256:30c0a3ebf4c0e09215f066be7246794b6492e054e782d7ac2a34c9f70a15e0dd", upload-time = "2026-02-13T07:15:46.487Z" }, + { url = "https://files.pythonhosted.org/packages/10/c2/6604a71269e0c1bd75656d5a001432d16f2cc5b8c057140ec797155c295e/rdflib-7.6.0-py3-none-any.whl", hash = "sha256:30c0a3ebf4c0e09215f066be7246794b6492e054e782d7ac2a34c9f70a15e0dd", size = 615416, upload-time = "2026-02-13T07:15:46.487Z" }, ] [package.optional-dependencies] @@ -4837,130 +4833,130 @@ dependencies = [ { name = "rpds-py" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", upload-time = "2025-10-13T15:30:48.871Z" } +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://pypi-proxy.dev.databricks.com/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", upload-time = "2025-10-13T15:30:47.625Z" }, + { 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.5.9" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/dc/0e/49aee608ad09480e7fd276898c99ec6192985fa331abe4eb3a986094490b/regex-2026.5.9.tar.gz", hash = "sha256:a8234aa23ec39894bfe4a3f1b85616a7032481964a13ac6fc9f10de4f6fca270", upload-time = "2026-05-09T23:15:19.37Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/ed/0ad2c8edf634918eb4484365d3819fa7bd7f58daf807fe7fb21812c316e5/regex-2026.5.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a9e1328e17c84c1a5d22ec9f785ecef4a967fab9a42b6a8dc3bcbebd0a0c9e44", upload-time = "2026-05-09T23:11:29.374Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/a9/4ed972ad263963b860b7c3e86e0e1bcc791def47b43b8c8efe57e710f139/regex-2026.5.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bfe1ce50cbfb569d74e1e4337da6468961f31dbea55fd85aa5de59c0947a805a", upload-time = "2026-05-09T23:11:33.254Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/16/81/075930d9fa28c4ea1f53398dd015ee7c882f623539759113cda1257f4b82/regex-2026.5.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15ee42209947f4ca045412eae98416317238163618ace2a8e54f99586a466733", upload-time = "2026-05-09T23:11:35.769Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/c8/5cdfbf0b5dc6599e1b6131eff43262e5275d4ec3469ce10216061659aadb/regex-2026.5.9-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4bb445ff3f725f59df8f6014edb547ee928ec7023a774f6a39a3f953038cbb2", upload-time = "2026-05-09T23:11:37.689Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cd/ca/ae5fd6edc59b7f84b904b31d6ec39a860cbcecd10f64bd5a062ca83a4864/regex-2026.5.9-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:446ddd671e43ab535810c4b21cff7104945c701d4a14d1e6d1cd6f4e445a8bea", upload-time = "2026-05-09T23:11:39.973Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f6/ce/a91cf555afb51f3b74a182e24ba073b91ea7bb64592fc4b315c111bb19fd/regex-2026.5.9-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b92817338591505f282cf3864c145244b1edcf5381d237038df955001091538", upload-time = "2026-05-09T23:11:42.48Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/55/7f/725a0a2b245a4cf0c4bab29d0e97c74285d94136a65d1b55a6459a583502/regex-2026.5.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6b8a143aca6c39b446ea8092cde25cc8fe9304d4f5fecfbc1a9dbb0282703c2", upload-time = "2026-05-09T23:11:44.681Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e3/2a/996efbd59ce6b5d4a09e3af6180ceb62af171f4a9a6fb557d2f0ae0d462b/regex-2026.5.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0f03aa6898aaaac4592479821df16e68e8d0e29e903e65d8f2dfb2f19028a989", upload-time = "2026-05-09T23:11:46.882Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/0a/8731e8b8806174c9cdd5903f80a14990331c1f42fc4209b540952e9e010d/regex-2026.5.9-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ed457d8e98ae812ed7732bef7bf78de78e834eae0372a74e23ca90ef21d910f9", upload-time = "2026-05-09T23:11:49.324Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9a/0b/932473194bd563f342a412ae2ffbbd6da608306a2bc4e99249a41c2b0b92/regex-2026.5.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71b61c5bfe1c806332defc42ad6c780b3c55f661986d7f40283a3a88274b4c00", upload-time = "2026-05-09T23:11:51.261Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/98/80/9523d196010031df25f7177ee0a467efbee436324038e5d99def17a57515/regex-2026.5.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3b1e39888c5e0c7d92cea4fc777396c4a90363b05de75d02eb459a4752200808", upload-time = "2026-05-09T23:11:53.232Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3c/07/56987b35e89edf47e4a38cf2845aeee476bfa688a6bdbd3e820cda461dc1/regex-2026.5.9-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:6ba42b2e7e7f46cf68cc6a5ca36fa07959f9bbd9c6bdcc47b6ee76549a590248", upload-time = "2026-05-09T23:11:55.82Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/04/2a/ff713fff0c566507c06a4ce2dc0ae8e7eeebc88811a95fc81cf1e7d534dd/regex-2026.5.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:c010eb8caca74bdb40c07498d7ece26b4428fd3f04aa8a72c9ac6f79e8faaac6", upload-time = "2026-05-09T23:11:57.934Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/90/df6d982b03e3614785c6937ba51b57f6733d97d2ee1c9bc7531dbfab3a54/regex-2026.5.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a6a563446a41adc451393dc6b8e6ad87979efaee3c8738690a8d1b08ebead1b4", upload-time = "2026-05-09T23:11:59.607Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/8a/4e88a5f7c3e98489aac4dd23142723d907b2a595b4a6abcbacabefeded09/regex-2026.5.9-cp310-cp310-win32.whl", hash = "sha256:954cc214c04663ee6d266fc61739cad83054683048de65c5bd1d640ad28098ac", upload-time = "2026-05-09T23:12:01.116Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6a/40/4b224cb0582b2dca1786726e6cdabe26abbf757d7f6718332f186da155d2/regex-2026.5.9-cp310-cp310-win_amd64.whl", hash = "sha256:b310768746dd314ea6e2ff4cc89ef215426813396ff4e94ee8e6f7096c8b6e03", upload-time = "2026-05-09T23:12:03.2Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/12/4d/014fbe803204cab0947ee428f09f658a29632053dde1d3c6176bb4f0fd4c/regex-2026.5.9-cp310-cp310-win_arm64.whl", hash = "sha256:19c16ceb4a267a8789e25733e583983eeab9f0f8664e66b0bd1c5d21f14c2d4b", upload-time = "2026-05-09T23:12:04.649Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/dc/c1f2df4027e82fc54b5a473e4b250f5139faca49a0fbe29a48668d228f34/regex-2026.5.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ccf5249114cc3e772ecdd88a98a86eca0fd74c61ce32a94743758c083fc05d48", upload-time = "2026-05-09T23:12:06.111Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/d2/59f01110660081cce9c0bc30ebd0b5ee250dacf658e3248ed92f01e0e8ee/regex-2026.5.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46f1326ca6e65b0879d23ca302c0f2415aad42ff0309b9c818e7949fe19a41d8", upload-time = "2026-05-09T23:12:07.731Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/b6/14b2c84ff90ddb370c81d27503f4a0fcf071496416f4855f6cc8c5d81c35/regex-2026.5.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef31cbfe458e21c6122ba8150ff060e0c7789ed0d26eb423f25472584920b555", upload-time = "2026-05-09T23:12:09.266Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/d0/4db86529117320de0c84afd90e70bb47434625875e34fcef9d8c127c5b16/regex-2026.5.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:992604d02e6d9c6d786c24a706a71ecffe1020fc1ef264044474cd81fa2c3919", upload-time = "2026-05-09T23:12:11.416Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/07/78/fe4800cd322f862ecffd2d553409b20d80650e5ed71b9d178f853d020b82/regex-2026.5.9-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c9411dd64ca95477225734a93dfc8583b51916b8d5942f99d6cac21e09965451", upload-time = "2026-05-09T23:12:13.681Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/d0/b3618a895dd8feb897c61bb2954edd265e1767d82a01d53065d5871127a3/regex-2026.5.9-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4a3ff360dfb836fecdb93a4598f9d6e2ac81e3e397125145c6221bf58cf4c", upload-time = "2026-05-09T23:12:15.443Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/33/6f/1481597e859ef19508b345eec4afd1416ed6e6b459c75a64026ef193aecf/regex-2026.5.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2a661a7d270a61f7cf460caee8b9fa2d5ef9e5c681234bcb9e0fe14f488e7dfc", upload-time = "2026-05-09T23:12:16.892Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/59/955734c803f59108deccba3597ae440c76b62a652733c0006e6243758420/regex-2026.5.9-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f079e50a0d3cc3cd5091fa9ff45869a2e6b2cd35895731edafb0327901a8d86d", upload-time = "2026-05-09T23:12:19.127Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/68/8f/70c04a236d651c81881dac42ef8538bddda6121434509d0a22d9e601503b/regex-2026.5.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4ebe8f0b5ec5a5024dc4a4c59f444c4e9afc5f2abdbb8962065b75d27fb971f9", upload-time = "2026-05-09T23:12:20.806Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1d/96/05c7434d88185e5d27fe54aeb74df86bd77cd79f52f0b4eae54faa8fea70/regex-2026.5.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:97cf3bc1b7d7d2306772ec07366c80d9df00ff79e79cea32898883a646d2fae2", upload-time = "2026-05-09T23:12:22.465Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4e/c1/6e3d8202d981f3117004bf341ee74893ba4ba8a9fbaf4b94615846550a08/regex-2026.5.9-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0f9eede6a5cbdc02d4978090186390936e1776a7d1359b21e41014c609880bcf", upload-time = "2026-05-09T23:12:24.351Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/93/c7/e7737f1526b3fb32bd4c337fd6c71c3ebb5c8296fc34d11197e0955d2e35/regex-2026.5.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:01f0f5f55f4b64dacec85dc116d3c05fd23ad3ff037bbc73a2085775953c2611", upload-time = "2026-05-09T23:12:26.341Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a5/27/0daffb1a535bb39f422c3d200f4ab023c71110ad66a32b366bee708baba0/regex-2026.5.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1268eddd8486dc561d08eee1156e40aa3a8fe10f4bdec8fa653b455fcbffd12c", upload-time = "2026-05-09T23:12:27.975Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ce/fc/294fe4fac4f2ed67207b17471815870c1c45b3a489e08e0ac96daea16ef6/regex-2026.5.9-cp311-cp311-win32.whl", hash = "sha256:8676474c07469d6f33dd1085ca2cd45f65785f32518f2b20e36d9953ca07f994", upload-time = "2026-05-09T23:12:30.141Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d0/b0/8dce459f6245bcf8f6e9f23ac9569f1a0f15c131cc0745e82b43226204cf/regex-2026.5.9-cp311-cp311-win_amd64.whl", hash = "sha256:246de9d60aa3f8538b519834dd95cbf276ea263d6a7bd5a3666dc3fa0230505b", upload-time = "2026-05-09T23:12:31.676Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/db/8d/f9aeff6ad63a3ef720386f2907e6d34a35a510a6e498ebad28b0fb3f6ab6/regex-2026.5.9-cp311-cp311-win_arm64.whl", hash = "sha256:d726ca3f0d76969bf1e8e477d160d3d666bbf999f6860bd314889e5345782046", upload-time = "2026-05-09T23:12:33.194Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/9b/6550044bc44e17c84d312c031c2ec42fbdb6a4ec4e29093be3a172d08772/regex-2026.5.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:57eeeb05db7979413dec5438f2db21d7ecbba787cde7a711df1a6f6df672aa06", upload-time = "2026-05-09T23:12:34.72Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1e/95/fc7ba4303b5a0f92446a12ee6778ef2c6c799233f5060042a31bf390cfe9/regex-2026.5.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:398c521292f4c7fb807001dcd54694d3a1fcafc179a36ad9cc56f98df85930b6", upload-time = "2026-05-09T23:12:36.285Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/54/4b/ee27938d1b2c443e89a9a10e00d2d19aa5ee300cd3d61140644e93bb083e/regex-2026.5.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f7a7c26137296beba7784de6eba69c6a93a63ccebc385e4962fe67e267a91225", upload-time = "2026-05-09T23:12:38.089Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d8/dd/ba103dc19614e25f3880800ca67ce093d6e21b325d72b8383c7bf906e9fa/regex-2026.5.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6441cc660d76107934a09c22167200839a0e89604a6297f78a974e66e931d2c0", upload-time = "2026-05-09T23:12:40.062Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/e7/f035b4fd858b050b0080bf302968dc0f59ba34e391872d54936758e6844e/regex-2026.5.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:91328f1c23d47595ca3ef0a7557fa129c5a23404b775c770697d2f35b33e0107", upload-time = "2026-05-09T23:12:42.059Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/51/8cd301ecc899aea28124357f729f4272f44de7806fc7ca02490bfbe253e8/regex-2026.5.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:93a7860539414dddaefba2b40f8771765ae17949d4c7182b876ce429e11a8309", upload-time = "2026-05-09T23:12:44.373Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cc/1e/3fbe2fa1e8cebd62f3bb7d3321cff1640aca2e240b51d9bd624aad949260/regex-2026.5.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd2810d22146b6d838acc5ec15602cb6b47920aa4e33015df3868eedfd20bab8", upload-time = "2026-05-09T23:12:46.268Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/17/2f/6f6008682bf2cf98040a0d3153a8e557b6ab728d7713d045cee4ce544ab8/regex-2026.5.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daff2bdbaf1d23e52fdff7c0b7bc2048b68f978df6a4d107ac981f94caef2e66", upload-time = "2026-05-09T23:12:48.051Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/2b/eee0d20a6842ba04df4b8847a920b57ef56853f14ef85405473e586b605a/regex-2026.5.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4eeb011098fcb77af513dcef521a3dbecbf8849b1e38940759d293b7a93f5026", upload-time = "2026-05-09T23:12:49.851Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4a/98/6fc1e6410feefb92159edaed5041992bfe390e8d26c721865434acbca558/regex-2026.5.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ea9c8ecfa1b73c73b626534d6626e5340d429630943672b8480724f44e84b962", upload-time = "2026-05-09T23:12:51.666Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/a3/bd855e0f2cb1a978ecf6fa6bb69632dd9c3f6ea3b81cde62fde14c9daec7/regex-2026.5.9-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cd2846168eb9ee3c513902bc8225409cb1caab31d04728b145171fa1625d9621", upload-time = "2026-05-09T23:12:53.413Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dc/66/0ae8c092e60b14c79d24f8e0b7f0aea5bfbffdcab00b5483d13404d3c3a5/regex-2026.5.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:39617fb0cde9c0e6306dc70e3bfc096f3da793219879f7ae7aa341a69fbdcf6d", upload-time = "2026-05-09T23:12:55.256Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/21/de/8dfde60fc1b21c946a893ba273403b72617edb261370cb1087099a83f088/regex-2026.5.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fd03c4f0e33280d15cae17159b899245d6b7c53d21def19b263b39655061f5ce", upload-time = "2026-05-09T23:12:57.573Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c3/1c/bdcc98f9a4af4fdd166c74941174619ccff4726d3ce32faa8e9a2ecd38dd/regex-2026.5.9-cp312-cp312-win32.whl", hash = "sha256:164eba9b755ea6f244b0d881196fbc1fac09714e9782c9e2732b813142033c8e", upload-time = "2026-05-09T23:12:59.14Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/78/87/240d36864f9e48ace85f72e79ced97ceb7f27ce87739a947dcb834b4e6bc/regex-2026.5.9-cp312-cp312-win_amd64.whl", hash = "sha256:86f40a5d6444db30a125c9c9177e6b25dad981cbc37451fd838f145e6edac92e", upload-time = "2026-05-09T23:13:00.789Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4f/b5/7b30f312b0669dff5beebe5b0989dc2d1a312b1a44fab852199c387a5b96/regex-2026.5.9-cp312-cp312-win_arm64.whl", hash = "sha256:96f5f58b54a063d7ea9dca08e1cf57bfe10499c4d579ee672da284f57f5f0070", upload-time = "2026-05-09T23:13:02.426Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/da/797e91ecec6f84135da778ddce78c20e0af5d2a15c26f87a81bc3eadb6db/regex-2026.5.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d626b84406444b165fc0ba981604edea39f0588ff1f92baa23fe50799ea9afdb", upload-time = "2026-05-09T23:13:04.382Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/44/da/bf30abaaa737b58f4a4b8c4a03659e02fd92092c822e0197ed9e0daab917/regex-2026.5.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d7bdc0ab8f3dd7e1b4f9ab88634e13374669db86bb3c72e8292f07ae313f539f", upload-time = "2026-05-09T23:13:06.022Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2d/e7/d0eaf5713828417b9e5648cf81fa9bacd4961f6ab98c380c2034f8716e35/regex-2026.5.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a8820737949116ffff55fe18f9fc644530063ba6ebfcb8314239416e78f1347c", upload-time = "2026-05-09T23:13:08.214Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/9b/b3fdd62b003baa1a9b593cd8c8699c9651c2e80cc21a5c715707983c42d7/regex-2026.5.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0fbdbac82cb3e4450d0ccde7d7a35607f4cb2dd9fba4b8b69bfaf8c9fa6aed", upload-time = "2026-05-09T23:13:10.573Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/30/66ab84588765f5b4b271a9ca09ef7ce2b87caa95176ec3d2ad65d7bc4902/regex-2026.5.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:57e8915c7986aa33d25e4d3629cef711cd2863f2961b10409f0c04cb8b7d9020", upload-time = "2026-05-09T23:13:12.523Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1a/89/f05169e8588aac365f35ffc7f3bc3184f095ef4cfded7cfaa3c7fd5dbd89/regex-2026.5.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:508f56a89ba9cb26e4168cbc37dbd60a28d82430a9e18ad1d25fe0883c314ca2", upload-time = "2026-05-09T23:13:14.281Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/30/e1/c93444052cf41581f3c884ab3fb5823daf0992f11cd4388d4275ca610558/regex-2026.5.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6d189041f15691cfa2b6c4290448ec221244d225b3f5fe9e7771b34ffcdf6e2", upload-time = "2026-05-09T23:13:16.569Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/fe/0cf96b882f540e62e8b9956599798203d599c44cf4c77917ca27400ff69b/regex-2026.5.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e82db382b44d0111b22601c509c89f64434816c9e0eef9d1989cda8cc6ff1c04", upload-time = "2026-05-09T23:13:18.675Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/23/5c/d78d4924e7fc875557b9e9b768423925fdfaac5549d06da7810019a9bd26/regex-2026.5.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2acfb48634f64996b57f90f39afa692ff362162722581921fe92239a59960f3c", upload-time = "2026-05-09T23:13:20.525Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/e0/5214774090e7b4524dcea3e3c4aa74141d43043f8beb49c1599db1c8b53a/regex-2026.5.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d29eebfc9525db68cad3c97eedd7f754fa265aa5cd0cf4f863b2421e1b48fc9f", upload-time = "2026-05-09T23:13:22.263Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6e/e1/4a57a83350319b1271f0d7a249b8672513ed928b237a741631270de6caea/regex-2026.5.9-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:debb893095e944091c16e641a6e33c1b0f4cb61ab945ec5afbf53ce7068834d8", upload-time = "2026-05-09T23:13:24.277Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/12/f4/499e74a20c156fc75836ee04a72a38d1a063978f600937f9760467beb1b0/regex-2026.5.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d659eee77986549c9ea45b861c7567e44d6287c3dc9a4565478853f7b9fe2ff6", upload-time = "2026-05-09T23:13:26.125Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5b/92/7eebc0d0a01e78629695f342ba17e0deaff8fb45e79cc0d7b98287da6e3e/regex-2026.5.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2efa205e6d98b24d1f3ab395c11aa15cdf10935bca283d0285e0499c284fba21", upload-time = "2026-05-09T23:13:27.814Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/05/a4/018e71f7d2ad48c1ebe6d3ae0026f9b7cb4802fd15c7cc02fdf724355102/regex-2026.5.9-cp313-cp313-win32.whl", hash = "sha256:f3844f134e834076677dd369976e9f5068679fcb8e50102fdf6b7ac96a3ec127", upload-time = "2026-05-09T23:13:29.549Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e6/1d/861a93719fb9ee7dbfc3761b3797b7a3e112a5d42c6129459d2d741be9b5/regex-2026.5.9-cp313-cp313-win_amd64.whl", hash = "sha256:3527bb4942d2c14552155406cdedd906567456821848aed1cb4933a391bf5eca", upload-time = "2026-05-09T23:13:31.859Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d9/c6/0a2436ae4da1ba76e51cb98943c6838a9a721faa40ebe2dce07694ae34e3/regex-2026.5.9-cp313-cp313-win_arm64.whl", hash = "sha256:56a33f191f17d8c417f99945ebdc1e691d3af9605d86ec68c7e54a57e3e17af6", upload-time = "2026-05-09T23:13:33.525Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e8/e9/d21346f7b60ed58789371358ed66b09d00f832e1bd7c06e55d9da5679882/regex-2026.5.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:01f28d868834624c934b8d2e0aa1c8341337e37831f4a012f18a5afcba4cbaf3", upload-time = "2026-05-09T23:13:35.935Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c4/43/fd1177a2032037c681baecdb3422ee4e1424aec4e4f470ef47793d325274/regex-2026.5.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:48036f6374aaa79eb3b754ec29c61d1c6b1606749d705a13f8854fa2539671f6", upload-time = "2026-05-09T23:13:38.307Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/7d/9fbf919768368d3f8a4f6c692cf2aa61e482b2b81ec6a298ace4cbf02480/regex-2026.5.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b96350aa424e79d4fd6b567b344dcbe2b2d6bfc48dfe7717587e1fa6d43da6ff", upload-time = "2026-05-09T23:13:40.353Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/6c/e41bfeecb589716843e7c4df09ba46ff2a42961457afece19059d85caeef/regex-2026.5.9-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f3af7a4903c5c04a11a196a5aa75cdd7dd3f8508132f9fb3259d9f5908e3b88", upload-time = "2026-05-09T23:13:42.543Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/87/83/a5c1c525fba0aa656e88ad0face0b1829788ef4c2fb6b26df58aa1151b84/regex-2026.5.9-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7e87577720152d2caae19fe2baaf1f8d5ca12091e9e229f03915c37d1e4b9178", upload-time = "2026-05-09T23:13:44.326Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/d4/80882e799e440dd878b0979cbebf8fa4d54624a332c83037c7a701649e3f/regex-2026.5.9-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c8b9b9d294cfea3cd19c718ade7cc93492b2c4991abd9a68d0b3477ae6d8e100", upload-time = "2026-05-09T23:13:47.295Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ae/ff/8db60211e2286e396aad7dc7725356c502bff0901ea05bd6cdc2e1a042b9/regex-2026.5.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:728d8bfd28a8845c8b6bc5dc7ce010453d206396786c0765c2740cb65f37791e", upload-time = "2026-05-09T23:13:49.885Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4c/47/742ef579c61730f8d268e5cf1f9ce0e37e2ea041ad0f5644724f2378e463/regex-2026.5.9-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7e30b874d341fac767d7df5a0870540541c2c054b80cfaac116e8d367a8a7ff2", upload-time = "2026-05-09T23:13:52.25Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7f/ab/cb0999802dcb0fb95b1ab005e8d4163d8afdd67efc2cb6b6630ac13f8cb1/regex-2026.5.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fd190e88a895a8901325fad284a3f74ea52b1da8525b76cc811fa9b1edf0ce2b", upload-time = "2026-05-09T23:13:54.127Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7d/62/8ca59a24c55bc34d166eefaf3717bd77772f329fdbf984d86581e0a3571c/regex-2026.5.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:8e76e8161ad00694cfce6767d5dea860c6391ac5b83e5c3a39661e696f11fc7e", upload-time = "2026-05-09T23:13:56.067Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8d/3d/30f2ae62cef3278bb5bb821f467277a55fb73f01032cf85997e15e8289a8/regex-2026.5.9-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ddda5340e6c01a293027dd46232fa79eaff1b48058ce7a98f572b6445b088041", upload-time = "2026-05-09T23:13:57.867Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d8/ae/7d2089bcd78ad0c0161bc684339df50032acb438a7bd3305e7ddb1193cec/regex-2026.5.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:205109e96b3cf5adf8f4cd62bedde9487feb282b9497a3535451e5a24cd706a0", upload-time = "2026-05-09T23:13:59.679Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a9/29/92ff47f75990131ea4f24ba17819e5a9d141e10819807e09addd73409af6/regex-2026.5.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dfbe4579b9f08036aa7d101d1835437a20783574ac66327e6b29b4018a138081", upload-time = "2026-05-09T23:14:01.978Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/04/99/eff29f1037dcab36702c9ee5d6858cf1ce2336ea8ea2987f64245b99ea5e/regex-2026.5.9-cp313-cp313t-win32.whl", hash = "sha256:ed2c9e8068b614c574d8d30e543d617cf5379b0535d46f97ef00e904745a08b5", upload-time = "2026-05-09T23:14:03.661Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0e/9d/8870b8981d27b22cda77bb26a5ac7ebfa9c7d9e0dea195a834a82380e748/regex-2026.5.9-cp313-cp313t-win_amd64.whl", hash = "sha256:b46b0f094dc1d3b90356c85a0bd2c9bafc4a6a190b9d6f8ddd5a033b6e088ed4", upload-time = "2026-05-09T23:14:05.56Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/72/b1/3379415e8f135c13ac551353397cc4fe97b4978f3cac73c5fcbcded548b8/regex-2026.5.9-cp313-cp313t-win_arm64.whl", hash = "sha256:872acc074bd29ffc9913ecdfedf6ea77502312ca44a4aa0d3779089c6069d8de", upload-time = "2026-05-09T23:14:07.843Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/13/3e/9c3cd292d8808b3645a2ce517e200179b6d0e903f176300bd8b542e14de5/regex-2026.5.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:1bd7587a2948b4085195d5a3374eaf4a425dc3e55784c038175355ecf3bbbf8a", upload-time = "2026-05-09T23:14:09.64Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/60/70/d43ee8a2ca0a8b68d167f21658b85520ac0574617c7f320367c5047f7556/regex-2026.5.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:dea2e88e1cce4522496cce630e11e67b98b7076620bc4336c3f674bc21a375f4", upload-time = "2026-05-09T23:14:11.424Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/21/91/9d50b433828d8e74196904e168a43abf1e6e88b2a15d47ed742456720c37/regex-2026.5.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2099f7e7ff7b6aa3192312650a56e91cc091e49d50b04e4f6f8b6e28b3b27f1c", upload-time = "2026-05-09T23:14:13.123Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3e/d2/b835e3cafbb9d977736912436259ff551d60919f7d7b3d37d46659c63564/regex-2026.5.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecd353045824e4477562a2ac718c25799cdaaa41f7aa925a806a8a3e6848a5b9", upload-time = "2026-05-09T23:14:14.923Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2c/a6/9f992d00019166b9de01c546dd4549bc679f2a68df11b877740b0760b7c2/regex-2026.5.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65c8c8c37377794bd5b2f3ebe51919042bf17aec802e23c833d89782ed0c78af", upload-time = "2026-05-09T23:14:17.757Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/08/4d32af657e049b19cb62b02e46e38fe1518797bfb2203ee93a510b21b0dc/regex-2026.5.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b73ab8afcf66c622db143d1c6fda4e58e4d537ee4f125229ad47b1ab80f34c0", upload-time = "2026-05-09T23:14:20.353Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d9/27/2af43dd1dc201d1fecefda64a45f4ad0995855b92724f795a777b402ee69/regex-2026.5.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0de5cf193997384ed2ca6f1cd4f78055b255d93d82d5a8cd6ba0d11c10b167e4", upload-time = "2026-05-09T23:14:22.265Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a4/dd/23a249047013b5321d4a60c4d2437462086f601b061776a525e5fba2a59f/regex-2026.5.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d641a8c9a61618047796d572a39a79b26167b0411d2c3031937b2fe2d081e2cf", upload-time = "2026-05-09T23:14:24.179Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/94/6a/e85ed9538cd19586d0465076a4578a12e093ce776d15f3f8ce92733a8dd6/regex-2026.5.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:24b2355ef5cc9aa5b8f07d17704face1c166fdcc2290fa7bd6e6c925655a8346", upload-time = "2026-05-09T23:14:26.065Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/c4/f25473209438638e947c55f9156fd8f236f74169229028cc99116380868e/regex-2026.5.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a24852d3c29ad9e47593593d8a247c44ccc3d0548ef12c822d6ed0810affe676", upload-time = "2026-05-09T23:14:28.17Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/f7/f4f86e3c74419c37370e91f150ae0c2ef7d34b2e0e4cdd5da046a02e4022/regex-2026.5.9-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:916714069da19329ef7de197dcbc77bb3104145c7c2c864dbfbe318f46b88b14", upload-time = "2026-05-09T23:14:30.06Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/26/70/704d8e13765939146b1cd0ef4e2feb71d7929727d2290f026eed10095955/regex-2026.5.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:fa411799ca8da32a8d38d020a88faa5b6f91657d284761352940ecf9f7c3bbdd", upload-time = "2026-05-09T23:14:32.123Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/26/29/1a13582a8460038edc38e49f64ceb0dd7c60f5caba77571f4bf6601965d9/regex-2026.5.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1e6da47d679b7010ef27556b6e0f99771b744936db1792a10ceac6547ae1503e", upload-time = "2026-05-09T23:14:34.799Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/56/3dcafe34fc72e271d62ad9a291801e88a1457bb251c132f15fcc2e5aad1a/regex-2026.5.9-cp314-cp314-win32.whl", hash = "sha256:98bd73080e8756255137e1bd3f3f00295bbc5aa383c0e0f973920e9134d7c4ad", upload-time = "2026-05-09T23:14:36.729Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d0/9c/02eebf0be95efe416c664db7fb8b6b05b7a0b06a7544f2884f2558b0526f/regex-2026.5.9-cp314-cp314-win_amd64.whl", hash = "sha256:ff8d372ac2acdc048d1c19916f27ee61bc5722728458ba6ca5052f2c72d51763", upload-time = "2026-05-09T23:14:39.126Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/70/5a/1dd1abee76cb7a846a0bcf42fdc87e5720c3c33c24f3e37814310a513d9f/regex-2026.5.9-cp314-cp314-win_arm64.whl", hash = "sha256:e1d93bf647916292e8edcec150c07ddf3dc50179ccaf770c04a7f9e452155372", upload-time = "2026-05-09T23:14:41.059Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/c1/c5f619b0057a7965cb78ec559c1d7a45ce8c99a35bea95483d64959a93d9/regex-2026.5.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:83d0ee4a57d1c87cb549e195ec300b8f0ec3a82eba66d835e4e2ed8634fe4499", upload-time = "2026-05-09T23:14:42.869Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/05/2c/5d01f1aee33de4bbe60c8452945bfc8477ca7c5ae4450f6bfe711036cb36/regex-2026.5.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d3d7eb5c9a7f6df82ed3cfac9beb93882a5cbcb5b8b157b56cb2b3b276574ac1", upload-time = "2026-05-09T23:14:44.822Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/fe/e8988b2ae2108c6ef71bd4aa8d87fbe257976dd0810e826cd75f701c68b6/regex-2026.5.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:075160bf16658e16d35233300b8453aac25de4cbea808d22348b6979668e924d", upload-time = "2026-05-09T23:14:47.211Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/79/34/d2b0937faa7859263f7f0a3c6b103a1296306be6952dc173d0154e9a2f49/regex-2026.5.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45375819235558a4ff1c4971dc32881f022613abdb180128f5cb4768c1765a1c", upload-time = "2026-05-09T23:14:49.21Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/fe/daf53a47457a8486db66c66c01ceb9c2303eecee3f87197f1e77eb1a736d/regex-2026.5.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ead4b163ac30a29574510cd4b3e2e985ac5290c05fc7095557d6a5f403fc31b5", upload-time = "2026-05-09T23:14:51.555Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1c/75/058fc4470cbfbf57d800aff1a0022b929a3f9fa553ee10a0cdf2070eb31f/regex-2026.5.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c6e4218fbdfbcd4f6c19efca40930d24a621bf4b48cb76bc6640543bd28ef20", upload-time = "2026-05-09T23:14:53.633Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/88/e7/179cfda3a28bc843b5c6cfe7f79f23489c791ed95f151083803660878432/regex-2026.5.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6351571c8a42b505eb555c0dc47d740d0fb66977dc142919eea6f4325b7c56a0", upload-time = "2026-05-09T23:14:56.198Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/41/90/6f0cc422071688266d344fca8462d787cba0a2c144acb25721f9a61ec265/regex-2026.5.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:002205cafd2a9e78c6290c7d1df277bf3277b3b7a30e0b4bb0dac2e2e3f7cb2d", upload-time = "2026-05-09T23:14:58.602Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/02/67/a31f1760f09c27b251ef39e9beb541f462cf977381d067faa764c2c0e393/regex-2026.5.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8abd33fef90b2a9efac5557d6033ca82d1195ed3a15fea5af15ba7b463c6a63b", upload-time = "2026-05-09T23:15:00.642Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e3/c4/1a80654597b6bc1e1ea0494824c31200e8a956abe290afae9b19a166a148/regex-2026.5.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:31037c82eccb44b7ea2e9e221d7c01429430e989a1f4b91ea5a855f6017b509a", upload-time = "2026-05-09T23:15:03.384Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/11/960724e06482c08466ff5611e242e86f80062949cdf6b4b9cc317b9dd93d/regex-2026.5.9-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5604dfd046dc37eca90250fc3be938b076c8059fa772ac0ed6f499b0f0fb0415", upload-time = "2026-05-09T23:15:05.625Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/a8/a9979c3e7918280e93159ebcab5ef1a65116dd4f3bd6091be0eae4a126e8/regex-2026.5.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e1b1b4e496afbb24f4a62aba855ee4f88f25578927697b340702e48c9ee6bc2", upload-time = "2026-05-09T23:15:07.966Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/d4/a9b732f2f0072c0ab12227483abb24fffcb9f73f8a2b203df0a6d0434735/regex-2026.5.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:be3372b9df6ddecff6486d37e19095a7b4973137caf5512407a89f4455361f41", upload-time = "2026-05-09T23:15:10.215Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/fe/1b3113817447a1d4155e4ac76d2e072f42c0bcba2f43fa8a0e756ea2cd91/regex-2026.5.9-cp314-cp314t-win32.whl", hash = "sha256:3ddd90103f9e5c471c49c7852ecc1fe27c7e45eb99e977aefe7caa4e779f4f58", upload-time = "2026-05-09T23:15:12.609Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/92/73/93d42045302636c91f2e5ef588b65b84b01428f28ec77de256b1dfdfbe5c/regex-2026.5.9-cp314-cp314t-win_amd64.whl", hash = "sha256:ca518ed29c46eecba6010b15f1b9a479314d2de409536e71b6a13aa04e3b8a77", upload-time = "2026-05-09T23:15:15.086Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/da/80/35b4c33c804a165a7f55289afda3ea9e3eb6d15800341a2d66455c0f1f30/regex-2026.5.9-cp314-cp314t-win_arm64.whl", hash = "sha256:5e41809d2683fcde7d5a8c87a6567ba1fb1ce0de9f31bff578de00a4b2d76daa", upload-time = "2026-05-09T23:15:16.98Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/dc/0e/49aee608ad09480e7fd276898c99ec6192985fa331abe4eb3a986094490b/regex-2026.5.9.tar.gz", hash = "sha256:a8234aa23ec39894bfe4a3f1b85616a7032481964a13ac6fc9f10de4f6fca270", size = 416074, upload-time = "2026-05-09T23:15:19.37Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/ed/0ad2c8edf634918eb4484365d3819fa7bd7f58daf807fe7fb21812c316e5/regex-2026.5.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a9e1328e17c84c1a5d22ec9f785ecef4a967fab9a42b6a8dc3bcbebd0a0c9e44", size = 489438, upload-time = "2026-05-09T23:11:29.374Z" }, + { url = "https://files.pythonhosted.org/packages/89/a9/4ed972ad263963b860b7c3e86e0e1bcc791def47b43b8c8efe57e710f139/regex-2026.5.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bfe1ce50cbfb569d74e1e4337da6468961f31dbea55fd85aa5de59c0947a805a", size = 291270, upload-time = "2026-05-09T23:11:33.254Z" }, + { url = "https://files.pythonhosted.org/packages/16/81/075930d9fa28c4ea1f53398dd015ee7c882f623539759113cda1257f4b82/regex-2026.5.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15ee42209947f4ca045412eae98416317238163618ace2a8e54f99586a466733", size = 289198, upload-time = "2026-05-09T23:11:35.769Z" }, + { url = "https://files.pythonhosted.org/packages/d4/c8/5cdfbf0b5dc6599e1b6131eff43262e5275d4ec3469ce10216061659aadb/regex-2026.5.9-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4bb445ff3f725f59df8f6014edb547ee928ec7023a774f6a39a3f953038cbb2", size = 784765, upload-time = "2026-05-09T23:11:37.689Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ca/ae5fd6edc59b7f84b904b31d6ec39a860cbcecd10f64bd5a062ca83a4864/regex-2026.5.9-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:446ddd671e43ab535810c4b21cff7104945c701d4a14d1e6d1cd6f4e445a8bea", size = 852115, upload-time = "2026-05-09T23:11:39.973Z" }, + { url = "https://files.pythonhosted.org/packages/f6/ce/a91cf555afb51f3b74a182e24ba073b91ea7bb64592fc4b315c111bb19fd/regex-2026.5.9-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7b92817338591505f282cf3864c145244b1edcf5381d237038df955001091538", size = 899503, upload-time = "2026-05-09T23:11:42.48Z" }, + { url = "https://files.pythonhosted.org/packages/55/7f/725a0a2b245a4cf0c4bab29d0e97c74285d94136a65d1b55a6459a583502/regex-2026.5.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6b8a143aca6c39b446ea8092cde25cc8fe9304d4f5fecfbc1a9dbb0282703c2", size = 794093, upload-time = "2026-05-09T23:11:44.681Z" }, + { url = "https://files.pythonhosted.org/packages/e3/2a/996efbd59ce6b5d4a09e3af6180ceb62af171f4a9a6fb557d2f0ae0d462b/regex-2026.5.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0f03aa6898aaaac4592479821df16e68e8d0e29e903e65d8f2dfb2f19028a989", size = 786234, upload-time = "2026-05-09T23:11:46.882Z" }, + { url = "https://files.pythonhosted.org/packages/4b/0a/8731e8b8806174c9cdd5903f80a14990331c1f42fc4209b540952e9e010d/regex-2026.5.9-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ed457d8e98ae812ed7732bef7bf78de78e834eae0372a74e23ca90ef21d910f9", size = 769895, upload-time = "2026-05-09T23:11:49.324Z" }, + { url = "https://files.pythonhosted.org/packages/9a/0b/932473194bd563f342a412ae2ffbbd6da608306a2bc4e99249a41c2b0b92/regex-2026.5.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71b61c5bfe1c806332defc42ad6c780b3c55f661986d7f40283a3a88274b4c00", size = 774991, upload-time = "2026-05-09T23:11:51.261Z" }, + { url = "https://files.pythonhosted.org/packages/98/80/9523d196010031df25f7177ee0a467efbee436324038e5d99def17a57515/regex-2026.5.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3b1e39888c5e0c7d92cea4fc777396c4a90363b05de75d02eb459a4752200808", size = 848790, upload-time = "2026-05-09T23:11:53.232Z" }, + { url = "https://files.pythonhosted.org/packages/3c/07/56987b35e89edf47e4a38cf2845aeee476bfa688a6bdbd3e820cda461dc1/regex-2026.5.9-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:6ba42b2e7e7f46cf68cc6a5ca36fa07959f9bbd9c6bdcc47b6ee76549a590248", size = 757679, upload-time = "2026-05-09T23:11:55.82Z" }, + { url = "https://files.pythonhosted.org/packages/04/2a/ff713fff0c566507c06a4ce2dc0ae8e7eeebc88811a95fc81cf1e7d534dd/regex-2026.5.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:c010eb8caca74bdb40c07498d7ece26b4428fd3f04aa8a72c9ac6f79e8faaac6", size = 837116, upload-time = "2026-05-09T23:11:57.934Z" }, + { url = "https://files.pythonhosted.org/packages/77/90/df6d982b03e3614785c6937ba51b57f6733d97d2ee1c9bc7531dbfab3a54/regex-2026.5.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a6a563446a41adc451393dc6b8e6ad87979efaee3c8738690a8d1b08ebead1b4", size = 782081, upload-time = "2026-05-09T23:11:59.607Z" }, + { url = "https://files.pythonhosted.org/packages/c7/8a/4e88a5f7c3e98489aac4dd23142723d907b2a595b4a6abcbacabefeded09/regex-2026.5.9-cp310-cp310-win32.whl", hash = "sha256:954cc214c04663ee6d266fc61739cad83054683048de65c5bd1d640ad28098ac", size = 266247, upload-time = "2026-05-09T23:12:01.116Z" }, + { url = "https://files.pythonhosted.org/packages/6a/40/4b224cb0582b2dca1786726e6cdabe26abbf757d7f6718332f186da155d2/regex-2026.5.9-cp310-cp310-win_amd64.whl", hash = "sha256:b310768746dd314ea6e2ff4cc89ef215426813396ff4e94ee8e6f7096c8b6e03", size = 278416, upload-time = "2026-05-09T23:12:03.2Z" }, + { url = "https://files.pythonhosted.org/packages/12/4d/014fbe803204cab0947ee428f09f658a29632053dde1d3c6176bb4f0fd4c/regex-2026.5.9-cp310-cp310-win_arm64.whl", hash = "sha256:19c16ceb4a267a8789e25733e583983eeab9f0f8664e66b0bd1c5d21f14c2d4b", size = 270413, upload-time = "2026-05-09T23:12:04.649Z" }, + { url = "https://files.pythonhosted.org/packages/c2/dc/c1f2df4027e82fc54b5a473e4b250f5139faca49a0fbe29a48668d228f34/regex-2026.5.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ccf5249114cc3e772ecdd88a98a86eca0fd74c61ce32a94743758c083fc05d48", size = 489445, upload-time = "2026-05-09T23:12:06.111Z" }, + { url = "https://files.pythonhosted.org/packages/03/d2/59f01110660081cce9c0bc30ebd0b5ee250dacf658e3248ed92f01e0e8ee/regex-2026.5.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46f1326ca6e65b0879d23ca302c0f2415aad42ff0309b9c818e7949fe19a41d8", size = 291271, upload-time = "2026-05-09T23:12:07.731Z" }, + { url = "https://files.pythonhosted.org/packages/58/b6/14b2c84ff90ddb370c81d27503f4a0fcf071496416f4855f6cc8c5d81c35/regex-2026.5.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ef31cbfe458e21c6122ba8150ff060e0c7789ed0d26eb423f25472584920b555", size = 289212, upload-time = "2026-05-09T23:12:09.266Z" }, + { url = "https://files.pythonhosted.org/packages/03/d0/4db86529117320de0c84afd90e70bb47434625875e34fcef9d8c127c5b16/regex-2026.5.9-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:992604d02e6d9c6d786c24a706a71ecffe1020fc1ef264044474cd81fa2c3919", size = 792310, upload-time = "2026-05-09T23:12:11.416Z" }, + { url = "https://files.pythonhosted.org/packages/07/78/fe4800cd322f862ecffd2d553409b20d80650e5ed71b9d178f853d020b82/regex-2026.5.9-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c9411dd64ca95477225734a93dfc8583b51916b8d5942f99d6cac21e09965451", size = 861721, upload-time = "2026-05-09T23:12:13.681Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d0/b3618a895dd8feb897c61bb2954edd265e1767d82a01d53065d5871127a3/regex-2026.5.9-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4a3ff360dfb836fecdb93a4598f9d6e2ac81e3e397125145c6221bf58cf4c", size = 906460, upload-time = "2026-05-09T23:12:15.443Z" }, + { url = "https://files.pythonhosted.org/packages/33/6f/1481597e859ef19508b345eec4afd1416ed6e6b459c75a64026ef193aecf/regex-2026.5.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2a661a7d270a61f7cf460caee8b9fa2d5ef9e5c681234bcb9e0fe14f488e7dfc", size = 799843, upload-time = "2026-05-09T23:12:16.892Z" }, + { url = "https://files.pythonhosted.org/packages/73/59/955734c803f59108deccba3597ae440c76b62a652733c0006e6243758420/regex-2026.5.9-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f079e50a0d3cc3cd5091fa9ff45869a2e6b2cd35895731edafb0327901a8d86d", size = 773610, upload-time = "2026-05-09T23:12:19.127Z" }, + { url = "https://files.pythonhosted.org/packages/68/8f/70c04a236d651c81881dac42ef8538bddda6121434509d0a22d9e601503b/regex-2026.5.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4ebe8f0b5ec5a5024dc4a4c59f444c4e9afc5f2abdbb8962065b75d27fb971f9", size = 781645, upload-time = "2026-05-09T23:12:20.806Z" }, + { url = "https://files.pythonhosted.org/packages/1d/96/05c7434d88185e5d27fe54aeb74df86bd77cd79f52f0b4eae54faa8fea70/regex-2026.5.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:97cf3bc1b7d7d2306772ec07366c80d9df00ff79e79cea32898883a646d2fae2", size = 854473, upload-time = "2026-05-09T23:12:22.465Z" }, + { url = "https://files.pythonhosted.org/packages/4e/c1/6e3d8202d981f3117004bf341ee74893ba4ba8a9fbaf4b94615846550a08/regex-2026.5.9-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0f9eede6a5cbdc02d4978090186390936e1776a7d1359b21e41014c609880bcf", size = 763311, upload-time = "2026-05-09T23:12:24.351Z" }, + { url = "https://files.pythonhosted.org/packages/93/c7/e7737f1526b3fb32bd4c337fd6c71c3ebb5c8296fc34d11197e0955d2e35/regex-2026.5.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:01f0f5f55f4b64dacec85dc116d3c05fd23ad3ff037bbc73a2085775953c2611", size = 844593, upload-time = "2026-05-09T23:12:26.341Z" }, + { url = "https://files.pythonhosted.org/packages/a5/27/0daffb1a535bb39f422c3d200f4ab023c71110ad66a32b366bee708baba0/regex-2026.5.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1268eddd8486dc561d08eee1156e40aa3a8fe10f4bdec8fa653b455fcbffd12c", size = 789167, upload-time = "2026-05-09T23:12:27.975Z" }, + { url = "https://files.pythonhosted.org/packages/ce/fc/294fe4fac4f2ed67207b17471815870c1c45b3a489e08e0ac96daea16ef6/regex-2026.5.9-cp311-cp311-win32.whl", hash = "sha256:8676474c07469d6f33dd1085ca2cd45f65785f32518f2b20e36d9953ca07f994", size = 266249, upload-time = "2026-05-09T23:12:30.141Z" }, + { url = "https://files.pythonhosted.org/packages/d0/b0/8dce459f6245bcf8f6e9f23ac9569f1a0f15c131cc0745e82b43226204cf/regex-2026.5.9-cp311-cp311-win_amd64.whl", hash = "sha256:246de9d60aa3f8538b519834dd95cbf276ea263d6a7bd5a3666dc3fa0230505b", size = 278423, upload-time = "2026-05-09T23:12:31.676Z" }, + { url = "https://files.pythonhosted.org/packages/db/8d/f9aeff6ad63a3ef720386f2907e6d34a35a510a6e498ebad28b0fb3f6ab6/regex-2026.5.9-cp311-cp311-win_arm64.whl", hash = "sha256:d726ca3f0d76969bf1e8e477d160d3d666bbf999f6860bd314889e5345782046", size = 270420, upload-time = "2026-05-09T23:12:33.194Z" }, + { url = "https://files.pythonhosted.org/packages/50/9b/6550044bc44e17c84d312c031c2ec42fbdb6a4ec4e29093be3a172d08772/regex-2026.5.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:57eeeb05db7979413dec5438f2db21d7ecbba787cde7a711df1a6f6df672aa06", size = 490451, upload-time = "2026-05-09T23:12:34.72Z" }, + { url = "https://files.pythonhosted.org/packages/1e/95/fc7ba4303b5a0f92446a12ee6778ef2c6c799233f5060042a31bf390cfe9/regex-2026.5.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:398c521292f4c7fb807001dcd54694d3a1fcafc179a36ad9cc56f98df85930b6", size = 292112, upload-time = "2026-05-09T23:12:36.285Z" }, + { url = "https://files.pythonhosted.org/packages/54/4b/ee27938d1b2c443e89a9a10e00d2d19aa5ee300cd3d61140644e93bb083e/regex-2026.5.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f7a7c26137296beba7784de6eba69c6a93a63ccebc385e4962fe67e267a91225", size = 289599, upload-time = "2026-05-09T23:12:38.089Z" }, + { url = "https://files.pythonhosted.org/packages/d8/dd/ba103dc19614e25f3880800ca67ce093d6e21b325d72b8383c7bf906e9fa/regex-2026.5.9-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6441cc660d76107934a09c22167200839a0e89604a6297f78a974e66e931d2c0", size = 796732, upload-time = "2026-05-09T23:12:40.062Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e7/f035b4fd858b050b0080bf302968dc0f59ba34e391872d54936758e6844e/regex-2026.5.9-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:91328f1c23d47595ca3ef0a7557fa129c5a23404b775c770697d2f35b33e0107", size = 865440, upload-time = "2026-05-09T23:12:42.059Z" }, + { url = "https://files.pythonhosted.org/packages/0a/51/8cd301ecc899aea28124357f729f4272f44de7806fc7ca02490bfbe253e8/regex-2026.5.9-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:93a7860539414dddaefba2b40f8771765ae17949d4c7182b876ce429e11a8309", size = 912329, upload-time = "2026-05-09T23:12:44.373Z" }, + { url = "https://files.pythonhosted.org/packages/cc/1e/3fbe2fa1e8cebd62f3bb7d3321cff1640aca2e240b51d9bd624aad949260/regex-2026.5.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd2810d22146b6d838acc5ec15602cb6b47920aa4e33015df3868eedfd20bab8", size = 801239, upload-time = "2026-05-09T23:12:46.268Z" }, + { url = "https://files.pythonhosted.org/packages/17/2f/6f6008682bf2cf98040a0d3153a8e557b6ab728d7713d045cee4ce544ab8/regex-2026.5.9-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daff2bdbaf1d23e52fdff7c0b7bc2048b68f978df6a4d107ac981f94caef2e66", size = 777054, upload-time = "2026-05-09T23:12:48.051Z" }, + { url = "https://files.pythonhosted.org/packages/19/2b/eee0d20a6842ba04df4b8847a920b57ef56853f14ef85405473e586b605a/regex-2026.5.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4eeb011098fcb77af513dcef521a3dbecbf8849b1e38940759d293b7a93f5026", size = 785098, upload-time = "2026-05-09T23:12:49.851Z" }, + { url = "https://files.pythonhosted.org/packages/4a/98/6fc1e6410feefb92159edaed5041992bfe390e8d26c721865434acbca558/regex-2026.5.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:ea9c8ecfa1b73c73b626534d6626e5340d429630943672b8480724f44e84b962", size = 860095, upload-time = "2026-05-09T23:12:51.666Z" }, + { url = "https://files.pythonhosted.org/packages/18/a3/bd855e0f2cb1a978ecf6fa6bb69632dd9c3f6ea3b81cde62fde14c9daec7/regex-2026.5.9-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:cd2846168eb9ee3c513902bc8225409cb1caab31d04728b145171fa1625d9621", size = 765762, upload-time = "2026-05-09T23:12:53.413Z" }, + { url = "https://files.pythonhosted.org/packages/dc/66/0ae8c092e60b14c79d24f8e0b7f0aea5bfbffdcab00b5483d13404d3c3a5/regex-2026.5.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:39617fb0cde9c0e6306dc70e3bfc096f3da793219879f7ae7aa341a69fbdcf6d", size = 852100, upload-time = "2026-05-09T23:12:55.256Z" }, + { url = "https://files.pythonhosted.org/packages/21/de/8dfde60fc1b21c946a893ba273403b72617edb261370cb1087099a83f088/regex-2026.5.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fd03c4f0e33280d15cae17159b899245d6b7c53d21def19b263b39655061f5ce", size = 789479, upload-time = "2026-05-09T23:12:57.573Z" }, + { url = "https://files.pythonhosted.org/packages/c3/1c/bdcc98f9a4af4fdd166c74941174619ccff4726d3ce32faa8e9a2ecd38dd/regex-2026.5.9-cp312-cp312-win32.whl", hash = "sha256:164eba9b755ea6f244b0d881196fbc1fac09714e9782c9e2732b813142033c8e", size = 266699, upload-time = "2026-05-09T23:12:59.14Z" }, + { url = "https://files.pythonhosted.org/packages/78/87/240d36864f9e48ace85f72e79ced97ceb7f27ce87739a947dcb834b4e6bc/regex-2026.5.9-cp312-cp312-win_amd64.whl", hash = "sha256:86f40a5d6444db30a125c9c9177e6b25dad981cbc37451fd838f145e6edac92e", size = 277783, upload-time = "2026-05-09T23:13:00.789Z" }, + { url = "https://files.pythonhosted.org/packages/4f/b5/7b30f312b0669dff5beebe5b0989dc2d1a312b1a44fab852199c387a5b96/regex-2026.5.9-cp312-cp312-win_arm64.whl", hash = "sha256:96f5f58b54a063d7ea9dca08e1cf57bfe10499c4d579ee672da284f57f5f0070", size = 270513, upload-time = "2026-05-09T23:13:02.426Z" }, + { url = "https://files.pythonhosted.org/packages/aa/da/797e91ecec6f84135da778ddce78c20e0af5d2a15c26f87a81bc3eadb6db/regex-2026.5.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d626b84406444b165fc0ba981604edea39f0588ff1f92baa23fe50799ea9afdb", size = 490303, upload-time = "2026-05-09T23:13:04.382Z" }, + { url = "https://files.pythonhosted.org/packages/44/da/bf30abaaa737b58f4a4b8c4a03659e02fd92092c822e0197ed9e0daab917/regex-2026.5.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d7bdc0ab8f3dd7e1b4f9ab88634e13374669db86bb3c72e8292f07ae313f539f", size = 292019, upload-time = "2026-05-09T23:13:06.022Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e7/d0eaf5713828417b9e5648cf81fa9bacd4961f6ab98c380c2034f8716e35/regex-2026.5.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a8820737949116ffff55fe18f9fc644530063ba6ebfcb8314239416e78f1347c", size = 289468, upload-time = "2026-05-09T23:13:08.214Z" }, + { url = "https://files.pythonhosted.org/packages/d3/9b/b3fdd62b003baa1a9b593cd8c8699c9651c2e80cc21a5c715707983c42d7/regex-2026.5.9-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa0fbdbac82cb3e4450d0ccde7d7a35607f4cb2dd9fba4b8b69bfaf8c9fa6aed", size = 796749, upload-time = "2026-05-09T23:13:10.573Z" }, + { url = "https://files.pythonhosted.org/packages/d4/30/66ab84588765f5b4b271a9ca09ef7ce2b87caa95176ec3d2ad65d7bc4902/regex-2026.5.9-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:57e8915c7986aa33d25e4d3629cef711cd2863f2961b10409f0c04cb8b7d9020", size = 865445, upload-time = "2026-05-09T23:13:12.523Z" }, + { url = "https://files.pythonhosted.org/packages/1a/89/f05169e8588aac365f35ffc7f3bc3184f095ef4cfded7cfaa3c7fd5dbd89/regex-2026.5.9-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:508f56a89ba9cb26e4168cbc37dbd60a28d82430a9e18ad1d25fe0883c314ca2", size = 912322, upload-time = "2026-05-09T23:13:14.281Z" }, + { url = "https://files.pythonhosted.org/packages/30/e1/c93444052cf41581f3c884ab3fb5823daf0992f11cd4388d4275ca610558/regex-2026.5.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6d189041f15691cfa2b6c4290448ec221244d225b3f5fe9e7771b34ffcdf6e2", size = 801269, upload-time = "2026-05-09T23:13:16.569Z" }, + { url = "https://files.pythonhosted.org/packages/50/fe/0cf96b882f540e62e8b9956599798203d599c44cf4c77917ca27400ff69b/regex-2026.5.9-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e82db382b44d0111b22601c509c89f64434816c9e0eef9d1989cda8cc6ff1c04", size = 777085, upload-time = "2026-05-09T23:13:18.675Z" }, + { url = "https://files.pythonhosted.org/packages/23/5c/d78d4924e7fc875557b9e9b768423925fdfaac5549d06da7810019a9bd26/regex-2026.5.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2acfb48634f64996b57f90f39afa692ff362162722581921fe92239a59960f3c", size = 785153, upload-time = "2026-05-09T23:13:20.525Z" }, + { url = "https://files.pythonhosted.org/packages/bf/e0/5214774090e7b4524dcea3e3c4aa74141d43043f8beb49c1599db1c8b53a/regex-2026.5.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:d29eebfc9525db68cad3c97eedd7f754fa265aa5cd0cf4f863b2421e1b48fc9f", size = 860164, upload-time = "2026-05-09T23:13:22.263Z" }, + { url = "https://files.pythonhosted.org/packages/6e/e1/4a57a83350319b1271f0d7a249b8672513ed928b237a741631270de6caea/regex-2026.5.9-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:debb893095e944091c16e641a6e33c1b0f4cb61ab945ec5afbf53ce7068834d8", size = 765731, upload-time = "2026-05-09T23:13:24.277Z" }, + { url = "https://files.pythonhosted.org/packages/12/f4/499e74a20c156fc75836ee04a72a38d1a063978f600937f9760467beb1b0/regex-2026.5.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d659eee77986549c9ea45b861c7567e44d6287c3dc9a4565478853f7b9fe2ff6", size = 852062, upload-time = "2026-05-09T23:13:26.125Z" }, + { url = "https://files.pythonhosted.org/packages/5b/92/7eebc0d0a01e78629695f342ba17e0deaff8fb45e79cc0d7b98287da6e3e/regex-2026.5.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2efa205e6d98b24d1f3ab395c11aa15cdf10935bca283d0285e0499c284fba21", size = 789577, upload-time = "2026-05-09T23:13:27.814Z" }, + { url = "https://files.pythonhosted.org/packages/05/a4/018e71f7d2ad48c1ebe6d3ae0026f9b7cb4802fd15c7cc02fdf724355102/regex-2026.5.9-cp313-cp313-win32.whl", hash = "sha256:f3844f134e834076677dd369976e9f5068679fcb8e50102fdf6b7ac96a3ec127", size = 266691, upload-time = "2026-05-09T23:13:29.549Z" }, + { url = "https://files.pythonhosted.org/packages/e6/1d/861a93719fb9ee7dbfc3761b3797b7a3e112a5d42c6129459d2d741be9b5/regex-2026.5.9-cp313-cp313-win_amd64.whl", hash = "sha256:3527bb4942d2c14552155406cdedd906567456821848aed1cb4933a391bf5eca", size = 277747, upload-time = "2026-05-09T23:13:31.859Z" }, + { url = "https://files.pythonhosted.org/packages/d9/c6/0a2436ae4da1ba76e51cb98943c6838a9a721faa40ebe2dce07694ae34e3/regex-2026.5.9-cp313-cp313-win_arm64.whl", hash = "sha256:56a33f191f17d8c417f99945ebdc1e691d3af9605d86ec68c7e54a57e3e17af6", size = 270500, upload-time = "2026-05-09T23:13:33.525Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e9/d21346f7b60ed58789371358ed66b09d00f832e1bd7c06e55d9da5679882/regex-2026.5.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:01f28d868834624c934b8d2e0aa1c8341337e37831f4a012f18a5afcba4cbaf3", size = 494172, upload-time = "2026-05-09T23:13:35.935Z" }, + { url = "https://files.pythonhosted.org/packages/c4/43/fd1177a2032037c681baecdb3422ee4e1424aec4e4f470ef47793d325274/regex-2026.5.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:48036f6374aaa79eb3b754ec29c61d1c6b1606749d705a13f8854fa2539671f6", size = 293952, upload-time = "2026-05-09T23:13:38.307Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7d/9fbf919768368d3f8a4f6c692cf2aa61e482b2b81ec6a298ace4cbf02480/regex-2026.5.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b96350aa424e79d4fd6b567b344dcbe2b2d6bfc48dfe7717587e1fa6d43da6ff", size = 292314, upload-time = "2026-05-09T23:13:40.353Z" }, + { url = "https://files.pythonhosted.org/packages/e2/6c/e41bfeecb589716843e7c4df09ba46ff2a42961457afece19059d85caeef/regex-2026.5.9-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8f3af7a4903c5c04a11a196a5aa75cdd7dd3f8508132f9fb3259d9f5908e3b88", size = 811681, upload-time = "2026-05-09T23:13:42.543Z" }, + { url = "https://files.pythonhosted.org/packages/87/83/a5c1c525fba0aa656e88ad0face0b1829788ef4c2fb6b26df58aa1151b84/regex-2026.5.9-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7e87577720152d2caae19fe2baaf1f8d5ca12091e9e229f03915c37d1e4b9178", size = 871135, upload-time = "2026-05-09T23:13:44.326Z" }, + { url = "https://files.pythonhosted.org/packages/18/d4/80882e799e440dd878b0979cbebf8fa4d54624a332c83037c7a701649e3f/regex-2026.5.9-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c8b9b9d294cfea3cd19c718ade7cc93492b2c4991abd9a68d0b3477ae6d8e100", size = 917265, upload-time = "2026-05-09T23:13:47.295Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ff/8db60211e2286e396aad7dc7725356c502bff0901ea05bd6cdc2e1a042b9/regex-2026.5.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:728d8bfd28a8845c8b6bc5dc7ce010453d206396786c0765c2740cb65f37791e", size = 816311, upload-time = "2026-05-09T23:13:49.885Z" }, + { url = "https://files.pythonhosted.org/packages/4c/47/742ef579c61730f8d268e5cf1f9ce0e37e2ea041ad0f5644724f2378e463/regex-2026.5.9-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7e30b874d341fac767d7df5a0870540541c2c054b80cfaac116e8d367a8a7ff2", size = 785498, upload-time = "2026-05-09T23:13:52.25Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ab/cb0999802dcb0fb95b1ab005e8d4163d8afdd67efc2cb6b6630ac13f8cb1/regex-2026.5.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fd190e88a895a8901325fad284a3f74ea52b1da8525b76cc811fa9b1edf0ce2b", size = 801348, upload-time = "2026-05-09T23:13:54.127Z" }, + { url = "https://files.pythonhosted.org/packages/7d/62/8ca59a24c55bc34d166eefaf3717bd77772f329fdbf984d86581e0a3571c/regex-2026.5.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:8e76e8161ad00694cfce6767d5dea860c6391ac5b83e5c3a39661e696f11fc7e", size = 866493, upload-time = "2026-05-09T23:13:56.067Z" }, + { url = "https://files.pythonhosted.org/packages/8d/3d/30f2ae62cef3278bb5bb821f467277a55fb73f01032cf85997e15e8289a8/regex-2026.5.9-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ddda5340e6c01a293027dd46232fa79eaff1b48058ce7a98f572b6445b088041", size = 772811, upload-time = "2026-05-09T23:13:57.867Z" }, + { url = "https://files.pythonhosted.org/packages/d8/ae/7d2089bcd78ad0c0161bc684339df50032acb438a7bd3305e7ddb1193cec/regex-2026.5.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:205109e96b3cf5adf8f4cd62bedde9487feb282b9497a3535451e5a24cd706a0", size = 856584, upload-time = "2026-05-09T23:13:59.679Z" }, + { url = "https://files.pythonhosted.org/packages/a9/29/92ff47f75990131ea4f24ba17819e5a9d141e10819807e09addd73409af6/regex-2026.5.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dfbe4579b9f08036aa7d101d1835437a20783574ac66327e6b29b4018a138081", size = 803453, upload-time = "2026-05-09T23:14:01.978Z" }, + { url = "https://files.pythonhosted.org/packages/04/99/eff29f1037dcab36702c9ee5d6858cf1ce2336ea8ea2987f64245b99ea5e/regex-2026.5.9-cp313-cp313t-win32.whl", hash = "sha256:ed2c9e8068b614c574d8d30e543d617cf5379b0535d46f97ef00e904745a08b5", size = 269951, upload-time = "2026-05-09T23:14:03.661Z" }, + { url = "https://files.pythonhosted.org/packages/0e/9d/8870b8981d27b22cda77bb26a5ac7ebfa9c7d9e0dea195a834a82380e748/regex-2026.5.9-cp313-cp313t-win_amd64.whl", hash = "sha256:b46b0f094dc1d3b90356c85a0bd2c9bafc4a6a190b9d6f8ddd5a033b6e088ed4", size = 281240, upload-time = "2026-05-09T23:14:05.56Z" }, + { url = "https://files.pythonhosted.org/packages/72/b1/3379415e8f135c13ac551353397cc4fe97b4978f3cac73c5fcbcded548b8/regex-2026.5.9-cp313-cp313t-win_arm64.whl", hash = "sha256:872acc074bd29ffc9913ecdfedf6ea77502312ca44a4aa0d3779089c6069d8de", size = 272383, upload-time = "2026-05-09T23:14:07.843Z" }, + { url = "https://files.pythonhosted.org/packages/13/3e/9c3cd292d8808b3645a2ce517e200179b6d0e903f176300bd8b542e14de5/regex-2026.5.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:1bd7587a2948b4085195d5a3374eaf4a425dc3e55784c038175355ecf3bbbf8a", size = 490376, upload-time = "2026-05-09T23:14:09.64Z" }, + { url = "https://files.pythonhosted.org/packages/60/70/d43ee8a2ca0a8b68d167f21658b85520ac0574617c7f320367c5047f7556/regex-2026.5.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:dea2e88e1cce4522496cce630e11e67b98b7076620bc4336c3f674bc21a375f4", size = 291964, upload-time = "2026-05-09T23:14:11.424Z" }, + { url = "https://files.pythonhosted.org/packages/21/91/9d50b433828d8e74196904e168a43abf1e6e88b2a15d47ed742456720c37/regex-2026.5.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2099f7e7ff7b6aa3192312650a56e91cc091e49d50b04e4f6f8b6e28b3b27f1c", size = 289682, upload-time = "2026-05-09T23:14:13.123Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/b835e3cafbb9d977736912436259ff551d60919f7d7b3d37d46659c63564/regex-2026.5.9-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecd353045824e4477562a2ac718c25799cdaaa41f7aa925a806a8a3e6848a5b9", size = 796996, upload-time = "2026-05-09T23:14:14.923Z" }, + { url = "https://files.pythonhosted.org/packages/2c/a6/9f992d00019166b9de01c546dd4549bc679f2a68df11b877740b0760b7c2/regex-2026.5.9-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65c8c8c37377794bd5b2f3ebe51919042bf17aec802e23c833d89782ed0c78af", size = 866089, upload-time = "2026-05-09T23:14:17.757Z" }, + { url = "https://files.pythonhosted.org/packages/e0/08/4d32af657e049b19cb62b02e46e38fe1518797bfb2203ee93a510b21b0dc/regex-2026.5.9-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b73ab8afcf66c622db143d1c6fda4e58e4d537ee4f125229ad47b1ab80f34c0", size = 911530, upload-time = "2026-05-09T23:14:20.353Z" }, + { url = "https://files.pythonhosted.org/packages/d9/27/2af43dd1dc201d1fecefda64a45f4ad0995855b92724f795a777b402ee69/regex-2026.5.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0de5cf193997384ed2ca6f1cd4f78055b255d93d82d5a8cd6ba0d11c10b167e4", size = 800643, upload-time = "2026-05-09T23:14:22.265Z" }, + { url = "https://files.pythonhosted.org/packages/a4/dd/23a249047013b5321d4a60c4d2437462086f601b061776a525e5fba2a59f/regex-2026.5.9-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d641a8c9a61618047796d572a39a79b26167b0411d2c3031937b2fe2d081e2cf", size = 777223, upload-time = "2026-05-09T23:14:24.179Z" }, + { url = "https://files.pythonhosted.org/packages/94/6a/e85ed9538cd19586d0465076a4578a12e093ce776d15f3f8ce92733a8dd6/regex-2026.5.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:24b2355ef5cc9aa5b8f07d17704face1c166fdcc2290fa7bd6e6c925655a8346", size = 785760, upload-time = "2026-05-09T23:14:26.065Z" }, + { url = "https://files.pythonhosted.org/packages/2a/c4/f25473209438638e947c55f9156fd8f236f74169229028cc99116380868e/regex-2026.5.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:a24852d3c29ad9e47593593d8a247c44ccc3d0548ef12c822d6ed0810affe676", size = 860891, upload-time = "2026-05-09T23:14:28.17Z" }, + { url = "https://files.pythonhosted.org/packages/f9/f7/f4f86e3c74419c37370e91f150ae0c2ef7d34b2e0e4cdd5da046a02e4022/regex-2026.5.9-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:916714069da19329ef7de197dcbc77bb3104145c7c2c864dbfbe318f46b88b14", size = 765891, upload-time = "2026-05-09T23:14:30.06Z" }, + { url = "https://files.pythonhosted.org/packages/26/70/704d8e13765939146b1cd0ef4e2feb71d7929727d2290f026eed10095955/regex-2026.5.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:fa411799ca8da32a8d38d020a88faa5b6f91657d284761352940ecf9f7c3bbdd", size = 851380, upload-time = "2026-05-09T23:14:32.123Z" }, + { url = "https://files.pythonhosted.org/packages/26/29/1a13582a8460038edc38e49f64ceb0dd7c60f5caba77571f4bf6601965d9/regex-2026.5.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1e6da47d679b7010ef27556b6e0f99771b744936db1792a10ceac6547ae1503e", size = 789350, upload-time = "2026-05-09T23:14:34.799Z" }, + { url = "https://files.pythonhosted.org/packages/73/56/3dcafe34fc72e271d62ad9a291801e88a1457bb251c132f15fcc2e5aad1a/regex-2026.5.9-cp314-cp314-win32.whl", hash = "sha256:98bd73080e8756255137e1bd3f3f00295bbc5aa383c0e0f973920e9134d7c4ad", size = 272130, upload-time = "2026-05-09T23:14:36.729Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9c/02eebf0be95efe416c664db7fb8b6b05b7a0b06a7544f2884f2558b0526f/regex-2026.5.9-cp314-cp314-win_amd64.whl", hash = "sha256:ff8d372ac2acdc048d1c19916f27ee61bc5722728458ba6ca5052f2c72d51763", size = 280999, upload-time = "2026-05-09T23:14:39.126Z" }, + { url = "https://files.pythonhosted.org/packages/70/5a/1dd1abee76cb7a846a0bcf42fdc87e5720c3c33c24f3e37814310a513d9f/regex-2026.5.9-cp314-cp314-win_arm64.whl", hash = "sha256:e1d93bf647916292e8edcec150c07ddf3dc50179ccaf770c04a7f9e452155372", size = 273500, upload-time = "2026-05-09T23:14:41.059Z" }, + { url = "https://files.pythonhosted.org/packages/86/c1/c5f619b0057a7965cb78ec559c1d7a45ce8c99a35bea95483d64959a93d9/regex-2026.5.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:83d0ee4a57d1c87cb549e195ec300b8f0ec3a82eba66d835e4e2ed8634fe4499", size = 494269, upload-time = "2026-05-09T23:14:42.869Z" }, + { url = "https://files.pythonhosted.org/packages/05/2c/5d01f1aee33de4bbe60c8452945bfc8477ca7c5ae4450f6bfe711036cb36/regex-2026.5.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d3d7eb5c9a7f6df82ed3cfac9beb93882a5cbcb5b8b157b56cb2b3b276574ac1", size = 293954, upload-time = "2026-05-09T23:14:44.822Z" }, + { url = "https://files.pythonhosted.org/packages/7a/fe/e8988b2ae2108c6ef71bd4aa8d87fbe257976dd0810e826cd75f701c68b6/regex-2026.5.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:075160bf16658e16d35233300b8453aac25de4cbea808d22348b6979668e924d", size = 292405, upload-time = "2026-05-09T23:14:47.211Z" }, + { url = "https://files.pythonhosted.org/packages/79/34/d2b0937faa7859263f7f0a3c6b103a1296306be6952dc173d0154e9a2f49/regex-2026.5.9-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45375819235558a4ff1c4971dc32881f022613abdb180128f5cb4768c1765a1c", size = 811855, upload-time = "2026-05-09T23:14:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/80/fe/daf53a47457a8486db66c66c01ceb9c2303eecee3f87197f1e77eb1a736d/regex-2026.5.9-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ead4b163ac30a29574510cd4b3e2e985ac5290c05fc7095557d6a5f403fc31b5", size = 871189, upload-time = "2026-05-09T23:14:51.555Z" }, + { url = "https://files.pythonhosted.org/packages/1c/75/058fc4470cbfbf57d800aff1a0022b929a3f9fa553ee10a0cdf2070eb31f/regex-2026.5.9-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c6e4218fbdfbcd4f6c19efca40930d24a621bf4b48cb76bc6640543bd28ef20", size = 917485, upload-time = "2026-05-09T23:14:53.633Z" }, + { url = "https://files.pythonhosted.org/packages/88/e7/179cfda3a28bc843b5c6cfe7f79f23489c791ed95f151083803660878432/regex-2026.5.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6351571c8a42b505eb555c0dc47d740d0fb66977dc142919eea6f4325b7c56a0", size = 816369, upload-time = "2026-05-09T23:14:56.198Z" }, + { url = "https://files.pythonhosted.org/packages/41/90/6f0cc422071688266d344fca8462d787cba0a2c144acb25721f9a61ec265/regex-2026.5.9-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:002205cafd2a9e78c6290c7d1df277bf3277b3b7a30e0b4bb0dac2e2e3f7cb2d", size = 785869, upload-time = "2026-05-09T23:14:58.602Z" }, + { url = "https://files.pythonhosted.org/packages/02/67/a31f1760f09c27b251ef39e9beb541f462cf977381d067faa764c2c0e393/regex-2026.5.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8abd33fef90b2a9efac5557d6033ca82d1195ed3a15fea5af15ba7b463c6a63b", size = 801427, upload-time = "2026-05-09T23:15:00.642Z" }, + { url = "https://files.pythonhosted.org/packages/e3/c4/1a80654597b6bc1e1ea0494824c31200e8a956abe290afae9b19a166a148/regex-2026.5.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:31037c82eccb44b7ea2e9e221d7c01429430e989a1f4b91ea5a855f6017b509a", size = 866482, upload-time = "2026-05-09T23:15:03.384Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/960724e06482c08466ff5611e242e86f80062949cdf6b4b9cc317b9dd93d/regex-2026.5.9-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:5604dfd046dc37eca90250fc3be938b076c8059fa772ac0ed6f499b0f0fb0415", size = 773022, upload-time = "2026-05-09T23:15:05.625Z" }, + { url = "https://files.pythonhosted.org/packages/50/a8/a9979c3e7918280e93159ebcab5ef1a65116dd4f3bd6091be0eae4a126e8/regex-2026.5.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e1b1b4e496afbb24f4a62aba855ee4f88f25578927697b340702e48c9ee6bc2", size = 856642, upload-time = "2026-05-09T23:15:07.966Z" }, + { url = "https://files.pythonhosted.org/packages/fe/d4/a9b732f2f0072c0ab12227483abb24fffcb9f73f8a2b203df0a6d0434735/regex-2026.5.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:be3372b9df6ddecff6486d37e19095a7b4973137caf5512407a89f4455361f41", size = 803552, upload-time = "2026-05-09T23:15:10.215Z" }, + { url = "https://files.pythonhosted.org/packages/d5/fe/1b3113817447a1d4155e4ac76d2e072f42c0bcba2f43fa8a0e756ea2cd91/regex-2026.5.9-cp314-cp314t-win32.whl", hash = "sha256:3ddd90103f9e5c471c49c7852ecc1fe27c7e45eb99e977aefe7caa4e779f4f58", size = 275746, upload-time = "2026-05-09T23:15:12.609Z" }, + { url = "https://files.pythonhosted.org/packages/92/73/93d42045302636c91f2e5ef588b65b84b01428f28ec77de256b1dfdfbe5c/regex-2026.5.9-cp314-cp314t-win_amd64.whl", hash = "sha256:ca518ed29c46eecba6010b15f1b9a479314d2de409536e71b6a13aa04e3b8a77", size = 285685, upload-time = "2026-05-09T23:15:15.086Z" }, + { url = "https://files.pythonhosted.org/packages/da/80/35b4c33c804a165a7f55289afda3ea9e3eb6d15800341a2d66455c0f1f30/regex-2026.5.9-cp314-cp314t-win_arm64.whl", hash = "sha256:5e41809d2683fcde7d5a8c87a6567ba1fb1ce0de9f31bff578de00a4b2d76daa", size = 275713, upload-time = "2026-05-09T23:15:16.98Z" }, ] [[package]] @@ -4973,9 +4969,9 @@ dependencies = [ { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", upload-time = "2026-03-30T16:09:15.531Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", upload-time = "2026-03-30T16:09:13.83Z" }, + { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, ] [[package]] @@ -4987,9 +4983,9 @@ dependencies = [ { name = "requests" }, { name = "urllib3" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/9f/b4/b7e040379838cc71bf5aabdb26998dfbe5ee73904c92c1c161faf5de8866/responses-0.26.0.tar.gz", hash = "sha256:c7f6923e6343ef3682816ba421c006626777893cb0d5e1434f674b649bac9eb4", upload-time = "2026-02-19T14:38:05.574Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/b4/b7e040379838cc71bf5aabdb26998dfbe5ee73904c92c1c161faf5de8866/responses-0.26.0.tar.gz", hash = "sha256:c7f6923e6343ef3682816ba421c006626777893cb0d5e1434f674b649bac9eb4", size = 81303, upload-time = "2026-02-19T14:38:05.574Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/ce/04/7f73d05b556da048923e31a0cc878f03be7c5425ed1f268082255c75d872/responses-0.26.0-py3-none-any.whl", hash = "sha256:03ec4409088cd5c66b71ecbbbd27fe2c58ddfad801c66203457b3e6a04868c37", upload-time = "2026-02-19T14:38:03.847Z" }, + { url = "https://files.pythonhosted.org/packages/ce/04/7f73d05b556da048923e31a0cc878f03be7c5425ed1f268082255c75d872/responses-0.26.0-py3-none-any.whl", hash = "sha256:03ec4409088cd5c66b71ecbbbd27fe2c58ddfad801c66203457b3e6a04868c37", size = 35099, upload-time = "2026-02-19T14:38:03.847Z" }, ] [[package]] @@ -5001,9 +4997,9 @@ dependencies = [ { name = "markdown-it-py", version = "4.0.0", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version >= '3.11'" }, { name = "pygments" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", upload-time = "2026-04-12T08:24:00.75Z" } +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://pypi-proxy.dev.databricks.com/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", upload-time = "2026-04-12T08:24:02.83Z" }, + { 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]] @@ -5014,140 +5010,140 @@ dependencies = [ { name = "pygments" }, { name = "rich" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/57/56/3191bae66b08ccc637ea8120426068bcb361cc323c96404c310886937067/rich_rst-2.0.1.tar.gz", hash = "sha256:cbe236ed0901d1ec8427cc6a50bf0a34353ba28ad014dc24def68bfe7f3b9e68", upload-time = "2026-05-16T00:47:57.362Z" } +sdist = { url = "https://files.pythonhosted.org/packages/57/56/3191bae66b08ccc637ea8120426068bcb361cc323c96404c310886937067/rich_rst-2.0.1.tar.gz", hash = "sha256:cbe236ed0901d1ec8427cc6a50bf0a34353ba28ad014dc24def68bfe7f3b9e68", size = 300570, upload-time = "2026-05-16T00:47:57.362Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/a0/3d/55c17d3ebdf3cd81356002afe5bef9bb8af631db2819785b6eac845b925b/rich_rst-2.0.1-py3-none-any.whl", hash = "sha256:7ee15f345ce25fa02b582c272a6cdbaf0c21243e38061cea273cff659bf3ef61", upload-time = "2026-05-16T00:47:55.508Z" }, + { url = "https://files.pythonhosted.org/packages/a0/3d/55c17d3ebdf3cd81356002afe5bef9bb8af631db2819785b6eac845b925b/rich_rst-2.0.1-py3-none-any.whl", hash = "sha256:7ee15f345ce25fa02b582c272a6cdbaf0c21243e38061cea273cff659bf3ef61", size = 272922, upload-time = "2026-05-16T00:47:55.508Z" }, ] [[package]] name = "roman-numerals" version = "4.1.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/ae/f9/41dc953bbeb056c17d5f7a519f50fdf010bd0553be2d630bc69d1e022703/roman_numerals-4.1.0.tar.gz", hash = "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2", upload-time = "2025-12-17T18:25:34.381Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/f9/41dc953bbeb056c17d5f7a519f50fdf010bd0553be2d630bc69d1e022703/roman_numerals-4.1.0.tar.gz", hash = "sha256:1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2", size = 9077, upload-time = "2025-12-17T18:25:34.381Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", upload-time = "2025-12-17T18:25:33.098Z" }, + { url = "https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", size = 7676, upload-time = "2025-12-17T18:25:33.098Z" }, ] [[package]] name = "rpds-py" version = "0.30.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", upload-time = "2025-11-30T20:24:38.837Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", upload-time = "2025-11-30T20:21:33.256Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", upload-time = "2025-11-30T20:21:34.591Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", upload-time = "2025-11-30T20:21:36.122Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", upload-time = "2025-11-30T20:21:37.728Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", upload-time = "2025-11-30T20:21:38.92Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", upload-time = "2025-11-30T20:21:40.407Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", upload-time = "2025-11-30T20:21:42.17Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", upload-time = "2025-11-30T20:21:43.769Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", upload-time = "2025-11-30T20:21:44.994Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", upload-time = "2025-11-30T20:21:46.91Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", upload-time = "2025-11-30T20:21:48.709Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", upload-time = "2025-11-30T20:21:50.024Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", upload-time = "2025-11-30T20:21:51.32Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", upload-time = "2025-11-30T20:21:52.505Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", upload-time = "2025-11-30T20:21:53.789Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", upload-time = "2025-11-30T20:21:55.475Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", upload-time = "2025-11-30T20:21:57.079Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/42/bb/1463f0b1722b7f45431bdd468301991d1328b16cffe0b1c2918eba2c4eee/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f", upload-time = "2025-11-30T20:21:58.47Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/99/ee/2520700a5c1f2d76631f948b0736cdf9b0acb25abd0ca8e889b5c62ac2e3/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4", upload-time = "2025-11-30T20:21:59.699Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/ad/bd0331f740f5705cc555a5e17fdf334671262160270962e69a2bdef3bf76/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97", upload-time = "2025-11-30T20:22:00.991Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", upload-time = "2025-11-30T20:22:02.723Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ab/2b/d88bb33294e3e0c76bc8f351a3721212713629ffca1700fa94979cb3eae8/rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d", upload-time = "2025-11-30T20:22:04.367Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/32/c759a8d42bcb5289c1fac697cd92f6fe01a018dd937e62ae77e0e7f15702/rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038", upload-time = "2025-11-30T20:22:05.814Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", upload-time = "2025-11-30T20:22:07.713Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/14/f6/69066a924c3557c9c30baa6ec3a0aa07526305684c6f86c696b08860726c/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed", upload-time = "2025-11-30T20:22:09.312Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", upload-time = "2025-11-30T20:22:11.309Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/22/16/cd3027c7e279d22e5eb431dd3c0fbc677bed58797fe7581e148f3f68818b/rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c", upload-time = "2025-11-30T20:22:13.101Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825", upload-time = "2025-11-30T20:22:14.853Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/14/a6/364bba985e4c13658edb156640608f2c9e1d3ea3c81b27aa9d889fff0e31/rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229", upload-time = "2025-11-30T20:22:16.577Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", upload-time = "2025-11-30T20:22:17.93Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", upload-time = "2025-11-30T20:22:19.297Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", upload-time = "2025-11-30T20:22:21.661Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", upload-time = "2025-11-30T20:22:23.408Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", upload-time = "2025-11-30T20:22:25.16Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", upload-time = "2025-11-30T20:22:26.505Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", upload-time = "2025-11-30T20:22:27.934Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", upload-time = "2025-11-30T20:22:29.341Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", upload-time = "2025-11-30T20:22:31.469Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", upload-time = "2025-11-30T20:22:32.997Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", upload-time = "2025-11-30T20:22:34.419Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", upload-time = "2025-11-30T20:22:35.903Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", upload-time = "2025-11-30T20:22:37.271Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", upload-time = "2025-11-30T20:22:39.021Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", upload-time = "2025-11-30T20:22:40.493Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", upload-time = "2025-11-30T20:22:41.812Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", upload-time = "2025-11-30T20:22:43.479Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", upload-time = "2025-11-30T20:22:44.819Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", upload-time = "2025-11-30T20:22:46.103Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", upload-time = "2025-11-30T20:22:47.458Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", upload-time = "2025-11-30T20:22:48.872Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", upload-time = "2025-11-30T20:22:50.196Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", upload-time = "2025-11-30T20:22:51.87Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", upload-time = "2025-11-30T20:22:53.341Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", upload-time = "2025-11-30T20:22:54.778Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", upload-time = "2025-11-30T20:22:56.212Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", upload-time = "2025-11-30T20:22:58.2Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", upload-time = "2025-11-30T20:23:00.209Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", upload-time = "2025-11-30T20:23:02.008Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", upload-time = "2025-11-30T20:23:03.43Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", upload-time = "2025-11-30T20:23:04.878Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", upload-time = "2025-11-30T20:23:06.342Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", upload-time = "2025-11-30T20:23:07.825Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", upload-time = "2025-11-30T20:23:09.228Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", upload-time = "2025-11-30T20:23:11.186Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", upload-time = "2025-11-30T20:23:12.864Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", upload-time = "2025-11-30T20:23:14.638Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", upload-time = "2025-11-30T20:23:16.105Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", upload-time = "2025-11-30T20:23:17.539Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", upload-time = "2025-11-30T20:23:19.029Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", upload-time = "2025-11-30T20:23:20.885Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", upload-time = "2025-11-30T20:23:22.488Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", upload-time = "2025-11-30T20:23:24.449Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", upload-time = "2025-11-30T20:23:25.908Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", upload-time = "2025-11-30T20:23:27.316Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", upload-time = "2025-11-30T20:23:29.151Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", upload-time = "2025-11-30T20:23:30.785Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", upload-time = "2025-11-30T20:23:32.209Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", upload-time = "2025-11-30T20:23:33.742Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", upload-time = "2025-11-30T20:23:35.253Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", upload-time = "2025-11-30T20:23:36.842Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", upload-time = "2025-11-30T20:23:38.343Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", upload-time = "2025-11-30T20:23:40.263Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", upload-time = "2025-11-30T20:23:42.186Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", upload-time = "2025-11-30T20:23:44.086Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", upload-time = "2025-11-30T20:23:46.004Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", upload-time = "2025-11-30T20:23:47.696Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", upload-time = "2025-11-30T20:23:49.501Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", upload-time = "2025-11-30T20:23:50.96Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", upload-time = "2025-11-30T20:23:52.494Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", upload-time = "2025-11-30T20:23:54.036Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", upload-time = "2025-11-30T20:23:55.556Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", upload-time = "2025-11-30T20:23:57.033Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", upload-time = "2025-11-30T20:23:58.637Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", upload-time = "2025-11-30T20:24:00.2Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", upload-time = "2025-11-30T20:24:01.759Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", upload-time = "2025-11-30T20:24:03.687Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", upload-time = "2025-11-30T20:24:05.232Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", upload-time = "2025-11-30T20:24:06.878Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", upload-time = "2025-11-30T20:24:08.445Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", upload-time = "2025-11-30T20:24:10.956Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", upload-time = "2025-11-30T20:24:12.735Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", upload-time = "2025-11-30T20:24:14.634Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/69/71/3f34339ee70521864411f8b6992e7ab13ac30d8e4e3309e07c7361767d91/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58", upload-time = "2025-11-30T20:24:16.537Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", upload-time = "2025-11-30T20:24:18.086Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", upload-time = "2025-11-30T20:24:20.092Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/5c/31ef1afd70b4b4fbdb2800249f34c57c64beb687495b10aec0365f53dfc4/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c", upload-time = "2025-11-30T20:24:22.231Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e3/63/0cfbea38d05756f3440ce6534d51a491d26176ac045e2707adc99bb6e60a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3", upload-time = "2025-11-30T20:24:24.302Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/42/e6/01e1f72a2456678b0f618fc9a1a13f882061690893c192fcad9f2926553a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5", upload-time = "2025-11-30T20:24:25.916Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", upload-time = "2025-11-30T20:24:27.834Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4a/b4/0a771378c5f16f8115f796d1f437950158679bcd2a7c68cf251cfb00ed5b/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f", upload-time = "2025-11-30T20:24:29.457Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/36/d8/456dbba0af75049dc6f63ff295a2f92766b9d521fa00de67a2bd6427d57a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877", upload-time = "2025-11-30T20:24:31.22Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", upload-time = "2025-11-30T20:24:32.934Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/20/91/092bacadeda3edf92bf743cc96a7be133e13a39cdbfd7b5082e7ab638406/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4", upload-time = "2025-11-30T20:24:35.169Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", upload-time = "2025-11-30T20:24:36.853Z" }, +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/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, + { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, + { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, + { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, + { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, + { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, + { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, + { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, + { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, + { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, + { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" }, + { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" }, + { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" }, + { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, + { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, + { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, + { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, + { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, + { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, + { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, + { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, + { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, + { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, + { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, + { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" }, + { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" }, + { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, + { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, + { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, + { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, + { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, + { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, + { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, + { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, + { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, + { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, + { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, + { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, + { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, + { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, + { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, + { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, + { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, + { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, + { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, + { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, + { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, + { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, + { 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]] @@ -5157,60 +5153,60 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "pyasn1" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", upload-time = "2025-04-16T09:51:18.218Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/8a/22b7beea3ee0d44b1916c0c1cb0ee3af23b700b6da9f04991899d0c555d4/rsa-4.9.1.tar.gz", hash = "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75", size = 29034, upload-time = "2025-04-16T09:51:18.218Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", upload-time = "2025-04-16T09:51:17.142Z" }, + { url = "https://files.pythonhosted.org/packages/64/8d/0133e4eb4beed9e425d9a98ed6e081a55d195481b7632472be1af08d2f6b/rsa-4.9.1-py3-none-any.whl", hash = "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", size = 34696, upload-time = "2025-04-16T09:51:17.142Z" }, ] [[package]] name = "ruff" version = "0.15.14" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/dc/8a/8bce2894573e9dae6ff4d77fe34ad727d79b9e6238ad288c5638990d90f6/ruff-0.15.14.tar.gz", hash = "sha256:48e866b165be4a9bdbf310f7d3c9a07edef2fe8cd63ffeb4e00bb590506ebf9f", upload-time = "2026-05-21T14:34:55.177Z" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/8a/8bce2894573e9dae6ff4d77fe34ad727d79b9e6238ad288c5638990d90f6/ruff-0.15.14.tar.gz", hash = "sha256:48e866b165be4a9bdbf310f7d3c9a07edef2fe8cd63ffeb4e00bb590506ebf9f", size = 4700910, upload-time = "2026-05-21T14:34:55.177Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/b9/c8/74a92c6ff9fcfb4f1f947126d3ebee8389276e161ecc85de5bda7cda51bd/ruff-0.15.14-py3-none-linux_armv6l.whl", hash = "sha256:8dd2db9416e487c8d4b01fa7056bb02c4d05969d4f8d17a08c229c2f4ff3c108", upload-time = "2026-05-21T14:34:37.332Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/45/91/254a35c20acc38a7223c9d2d594af12e794432464f2cdeb52af1dc4a892d/ruff-0.15.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:be4ff55af755bd71a00ab3dc6bd7ffc467bd76e0df6881e286c2e3d23e8fb43b", upload-time = "2026-05-21T14:34:43.978Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/56/9e/d13e40f83b8d0a94430e6778ce1d94a43b38cf2efe63278bdd2b4c65abbf/ruff-0.15.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:48d5909d7d06276ce7dde6d32bfa4b0d4cb2651145cd8ee4b440722cbc77832f", upload-time = "2026-05-21T14:34:48.378Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8d/f1/b15a7839fa4f332f8acec78e20564f26bb2d866e3d21710b877fd0263000/ruff-0.15.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca8cbfa94c4f90984a67561978602746d4cd27103568f745fa90eee3f0d4107d", upload-time = "2026-05-21T14:34:22.318Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/45/33/53d651177f84f94b400a0e27f8824eeada3dddc9d5ee8aeb048f4352a520/ruff-0.15.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a6bbc0333f1ab053423bcbf6226477d266ca7cec7738c4c8e3f55647803f3c4", upload-time = "2026-05-21T14:34:20.209Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b8/a6/868f87e0bf9786ed24b5d0d0ad8676b8a94fd1912f42cddf9cfc7857818a/ruff-0.15.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a24a4f7605d7003a6674d4387651effd939dead3fddd0f36561eb77a9a2e542", upload-time = "2026-05-21T14:34:46.365Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/8b/38cd5c19faffdcc05a408d2b78edccc69492ab9720eadb49ea15ef80d768/ruff-0.15.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:049b5326e53ed80978f2fc041a280603f69dd6b0c95464342a2bb4572d9d9e2f", upload-time = "2026-05-21T14:34:28.579Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3e/4d/a3c5b874a556d5731e3e657aaf04311bb76f0a5c3ec220ed43051be6b64b/ruff-0.15.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4ed42e6696c8dfa5f06728e6441993901f548eb92d73bc472cb5a38d1395fbf", upload-time = "2026-05-21T14:34:41.836Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1e/c0/56472c251d09858a53e51efbd485b09e1995d8731668b76d52e5dd6ee0f1/ruff-0.15.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715c543cf450c4888251f91c52f1942a800541d9bddd7ac060aa4e6b77ae7cba", upload-time = "2026-05-21T14:34:57.276Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2c/4a/e2e7b4d8dbf233d4eace59c75bc3435fa6d8bd3bae82d351d4e4300c0fd1/ruff-0.15.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:72ebab6013ec887d439d8b7593737a0a4ffb06d45d209d4e4bf2e92813082d3f", upload-time = "2026-05-21T14:34:39.773Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/97/c7/83c0539fe34c3e09136204d1e75d6052492364e0b3cb05e9465423f567d7/ruff-0.15.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:49072d36abdbe97a8dd7f480afe9c675699c0c495d4c84076e2c1203c4550581", upload-time = "2026-05-21T14:34:31.045Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/a6/18f2bfc095a2ab4a78745644e428205532ce6653a5d0fa8501572891534d/ruff-0.15.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:958522aee105068640c2c2ceae08f413ae44d922f52a1374ac13d6a96032fc93", upload-time = "2026-05-21T14:34:53.064Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/54/3a/5a8b3b69c654d4e4bf1d246ac5b49cbcdac6eaab6905925f8915f31e3b80/ruff-0.15.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f3707da619a143a2e8830e2abab8224478d69ace2d28cb6c20543ae97c36bf61", upload-time = "2026-05-21T14:34:24.484Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ed/c5/8864e4e7925b836ea354b31d57641ec03830564e281a8b6f061f8c3e0ec1/ruff-0.15.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:bb01d645694e3ec0102105d07ef2d53703970407d59c04e59d3ba0b7a1d53553", upload-time = "2026-05-21T14:34:50.975Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/36/38/012bf76752e1f89ed50b77b99532d90f3a3e287bc7918e1fc0948ac866ac/ruff-0.15.14-py3-none-win32.whl", hash = "sha256:6d0c1ad2a0ab718d39b6d8fd2217981ce4d625cd96a720095f798fb47d8b13e6", upload-time = "2026-05-21T14:34:33.453Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/b7/4ea2c170f10ad760fff2a5250beb18897719dc8b52b53a24cddbb9dd3f19/ruff-0.15.14-py3-none-win_amd64.whl", hash = "sha256:802342981e056db3851a7836e5b070f8f15f67d4a685ae2a6160939d364b2902", upload-time = "2026-05-21T14:34:18.077Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/62/d5/bc97ff895ec35cf3925d4bd60f3b39d822f377a446906ec9bcc87405e59b/ruff-0.15.14-py3-none-win_arm64.whl", hash = "sha256:ff47b90a9ef6a40c9e2f3b479c1fb78531adf055b94c1eba0a7ba04b31951826", upload-time = "2026-05-21T14:34:26.525Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c8/74a92c6ff9fcfb4f1f947126d3ebee8389276e161ecc85de5bda7cda51bd/ruff-0.15.14-py3-none-linux_armv6l.whl", hash = "sha256:8dd2db9416e487c8d4b01fa7056bb02c4d05969d4f8d17a08c229c2f4ff3c108", size = 10739177, upload-time = "2026-05-21T14:34:37.332Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/254a35c20acc38a7223c9d2d594af12e794432464f2cdeb52af1dc4a892d/ruff-0.15.14-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:be4ff55af755bd71a00ab3dc6bd7ffc467bd76e0df6881e286c2e3d23e8fb43b", size = 11144969, upload-time = "2026-05-21T14:34:43.978Z" }, + { url = "https://files.pythonhosted.org/packages/56/9e/d13e40f83b8d0a94430e6778ce1d94a43b38cf2efe63278bdd2b4c65abbf/ruff-0.15.14-py3-none-macosx_11_0_arm64.whl", hash = "sha256:48d5909d7d06276ce7dde6d32bfa4b0d4cb2651145cd8ee4b440722cbc77832f", size = 10478207, upload-time = "2026-05-21T14:34:48.378Z" }, + { url = "https://files.pythonhosted.org/packages/8d/f1/b15a7839fa4f332f8acec78e20564f26bb2d866e3d21710b877fd0263000/ruff-0.15.14-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca8cbfa94c4f90984a67561978602746d4cd27103568f745fa90eee3f0d4107d", size = 10818459, upload-time = "2026-05-21T14:34:22.318Z" }, + { url = "https://files.pythonhosted.org/packages/45/33/53d651177f84f94b400a0e27f8824eeada3dddc9d5ee8aeb048f4352a520/ruff-0.15.14-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a6bbc0333f1ab053423bcbf6226477d266ca7cec7738c4c8e3f55647803f3c4", size = 10541800, upload-time = "2026-05-21T14:34:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a6/868f87e0bf9786ed24b5d0d0ad8676b8a94fd1912f42cddf9cfc7857818a/ruff-0.15.14-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a24a4f7605d7003a6674d4387651effd939dead3fddd0f36561eb77a9a2e542", size = 11342149, upload-time = "2026-05-21T14:34:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/a7/8b/38cd5c19faffdcc05a408d2b78edccc69492ab9720eadb49ea15ef80d768/ruff-0.15.14-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:049b5326e53ed80978f2fc041a280603f69dd6b0c95464342a2bb4572d9d9e2f", size = 12212563, upload-time = "2026-05-21T14:34:28.579Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4d/a3c5b874a556d5731e3e657aaf04311bb76f0a5c3ec220ed43051be6b64b/ruff-0.15.14-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4ed42e6696c8dfa5f06728e6441993901f548eb92d73bc472cb5a38d1395fbf", size = 11493299, upload-time = "2026-05-21T14:34:41.836Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c0/56472c251d09858a53e51efbd485b09e1995d8731668b76d52e5dd6ee0f1/ruff-0.15.14-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715c543cf450c4888251f91c52f1942a800541d9bddd7ac060aa4e6b77ae7cba", size = 11455931, upload-time = "2026-05-21T14:34:57.276Z" }, + { url = "https://files.pythonhosted.org/packages/2c/4a/e2e7b4d8dbf233d4eace59c75bc3435fa6d8bd3bae82d351d4e4300c0fd1/ruff-0.15.14-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:72ebab6013ec887d439d8b7593737a0a4ffb06d45d209d4e4bf2e92813082d3f", size = 11400794, upload-time = "2026-05-21T14:34:39.773Z" }, + { url = "https://files.pythonhosted.org/packages/97/c7/83c0539fe34c3e09136204d1e75d6052492364e0b3cb05e9465423f567d7/ruff-0.15.14-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:49072d36abdbe97a8dd7f480afe9c675699c0c495d4c84076e2c1203c4550581", size = 10804759, upload-time = "2026-05-21T14:34:31.045Z" }, + { url = "https://files.pythonhosted.org/packages/86/a6/18f2bfc095a2ab4a78745644e428205532ce6653a5d0fa8501572891534d/ruff-0.15.14-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:958522aee105068640c2c2ceae08f413ae44d922f52a1374ac13d6a96032fc93", size = 10539517, upload-time = "2026-05-21T14:34:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/54/3a/5a8b3b69c654d4e4bf1d246ac5b49cbcdac6eaab6905925f8915f31e3b80/ruff-0.15.14-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f3707da619a143a2e8830e2abab8224478d69ace2d28cb6c20543ae97c36bf61", size = 11065169, upload-time = "2026-05-21T14:34:24.484Z" }, + { url = "https://files.pythonhosted.org/packages/ed/c5/8864e4e7925b836ea354b31d57641ec03830564e281a8b6f061f8c3e0ec1/ruff-0.15.14-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:bb01d645694e3ec0102105d07ef2d53703970407d59c04e59d3ba0b7a1d53553", size = 11560214, upload-time = "2026-05-21T14:34:50.975Z" }, + { url = "https://files.pythonhosted.org/packages/36/38/012bf76752e1f89ed50b77b99532d90f3a3e287bc7918e1fc0948ac866ac/ruff-0.15.14-py3-none-win32.whl", hash = "sha256:6d0c1ad2a0ab718d39b6d8fd2217981ce4d625cd96a720095f798fb47d8b13e6", size = 10805548, upload-time = "2026-05-21T14:34:33.453Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b7/4ea2c170f10ad760fff2a5250beb18897719dc8b52b53a24cddbb9dd3f19/ruff-0.15.14-py3-none-win_amd64.whl", hash = "sha256:802342981e056db3851a7836e5b070f8f15f67d4a685ae2a6160939d364b2902", size = 11939523, upload-time = "2026-05-21T14:34:18.077Z" }, + { url = "https://files.pythonhosted.org/packages/62/d5/bc97ff895ec35cf3925d4bd60f3b39d822f377a446906ec9bcc87405e59b/ruff-0.15.14-py3-none-win_arm64.whl", hash = "sha256:ff47b90a9ef6a40c9e2f3b479c1fb78531adf055b94c1eba0a7ba04b31951826", size = 11208607, upload-time = "2026-05-21T14:34:26.525Z" }, ] [[package]] name = "safetensors" version = "0.7.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/29/9c/6e74567782559a63bd040a236edca26fd71bc7ba88de2ef35d75df3bca5e/safetensors-0.7.0.tar.gz", hash = "sha256:07663963b67e8bd9f0b8ad15bb9163606cd27cc5a1b96235a50d8369803b96b0", upload-time = "2025-11-19T15:18:43.199Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/fa/47/aef6c06649039accf914afef490268e1067ed82be62bcfa5b7e886ad15e8/safetensors-0.7.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c82f4d474cf725255d9e6acf17252991c3c8aac038d6ef363a4bf8be2f6db517", upload-time = "2025-11-19T15:18:35.84Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e8/00/374c0c068e30cd31f1e1b46b4b5738168ec79e7689ca82ee93ddfea05109/safetensors-0.7.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:94fd4858284736bb67a897a41608b5b0c2496c9bdb3bf2af1fa3409127f20d57", upload-time = "2025-11-19T15:18:34.416Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/06/578ffed52c2296f93d7fd2d844cabfa92be51a587c38c8afbb8ae449ca89/safetensors-0.7.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e07d91d0c92a31200f25351f4acb2bc6aff7f48094e13ebb1d0fb995b54b6542", upload-time = "2025-11-19T15:18:09.79Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ae/33/1debbbb70e4791dde185edb9413d1fe01619255abb64b300157d7f15dddd/safetensors-0.7.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8469155f4cb518bafb4acf4865e8bb9d6804110d2d9bdcaa78564b9fd841e104", upload-time = "2025-11-19T15:18:16.145Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8e/1c/40c2ca924d60792c3be509833df711b553c60effbd91da6f5284a83f7122/safetensors-0.7.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54bef08bf00a2bff599982f6b08e8770e09cc012d7bba00783fc7ea38f1fb37d", upload-time = "2025-11-19T15:18:21.11Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9b/3a/13784a9364bd43b0d61eef4bea2845039bc2030458b16594a1bd787ae26e/safetensors-0.7.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42cb091236206bb2016d245c377ed383aa7f78691748f3bb6ee1bfa51ae2ce6a", upload-time = "2025-11-19T15:18:25.719Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a0/60/429e9b1cb3fc651937727befe258ea24122d9663e4d5709a48c9cbfceecb/safetensors-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac7252938f0696ddea46f5e855dd3138444e82236e3be475f54929f0c510d48", upload-time = "2025-11-19T15:18:33.023Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3c/a8/4b45e4e059270d17af60359713ffd83f97900d45a6afa73aaa0d737d48b6/safetensors-0.7.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1d060c70284127fa805085d8f10fbd0962792aed71879d00864acda69dbab981", upload-time = "2025-11-19T15:18:31.075Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/06/87/d26d8407c44175d8ae164a95b5a62707fcc445f3c0c56108e37d98070a3d/safetensors-0.7.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cdab83a366799fa730f90a4ebb563e494f28e9e92c4819e556152ad55e43591b", upload-time = "2025-11-19T15:18:37.211Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/11/f5/57644a2ff08dc6325816ba7217e5095f17269dada2554b658442c66aed51/safetensors-0.7.0-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:672132907fcad9f2aedcb705b2d7b3b93354a2aec1b2f706c4db852abe338f85", upload-time = "2025-11-19T15:18:38.689Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/31/17883e13a814bd278ae6e266b13282a01049b0c81341da7fd0e3e71a80a3/safetensors-0.7.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:5d72abdb8a4d56d4020713724ba81dac065fedb7f3667151c4a637f1d3fb26c0", upload-time = "2025-11-19T15:18:40.162Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4a/d8/0c8a7dc9b41dcac53c4cbf9df2b9c83e0e0097203de8b37a712b345c0be5/safetensors-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0f6d66c1c538d5a94a73aa9ddca8ccc4227e6c9ff555322ea40bdd142391dd4", upload-time = "2025-11-19T15:18:41.627Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/05/e5/cb4b713c8a93469e3c5be7c3f8d77d307e65fe89673e731f5c2bfd0a9237/safetensors-0.7.0-cp38-abi3-win32.whl", hash = "sha256:c74af94bf3ac15ac4d0f2a7c7b4663a15f8c2ab15ed0fc7531ca61d0835eccba", upload-time = "2025-11-19T15:18:45.74Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", upload-time = "2025-11-19T15:18:44.427Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/6a/4d08d89a6fcbe905c5ae68b8b34f0791850882fc19782d0d02c65abbdf3b/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4729811a6640d019a4b7ba8638ee2fd21fa5ca8c7e7bdf0fed62068fcaac737", upload-time = "2025-11-19T15:18:11.884Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dd/29/59ed8152b30f72c42d00d241e58eaca558ae9dbfa5695206e2e0f54c7063/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12f49080303fa6bb424b362149a12949dfbbf1e06811a88f2307276b0c131afd", upload-time = "2025-11-19T15:18:17.523Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/0b/4811bfec67fa260e791369b16dab105e4bae82686120554cc484064e22b4/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0071bffba4150c2f46cae1432d31995d77acfd9f8db598b5d1a2ce67e8440ad2", upload-time = "2025-11-19T15:18:22.666Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/5b/632a58724221ef03d78ab65062e82a1010e1bef8e8e0b9d7c6d7b8044841/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:473b32699f4200e69801bf5abf93f1a4ecd432a70984df164fc22ccf39c4a6f3", upload-time = "2025-11-19T15:18:27.146Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/29/9c/6e74567782559a63bd040a236edca26fd71bc7ba88de2ef35d75df3bca5e/safetensors-0.7.0.tar.gz", hash = "sha256:07663963b67e8bd9f0b8ad15bb9163606cd27cc5a1b96235a50d8369803b96b0", size = 200878, upload-time = "2025-11-19T15:18:43.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/47/aef6c06649039accf914afef490268e1067ed82be62bcfa5b7e886ad15e8/safetensors-0.7.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c82f4d474cf725255d9e6acf17252991c3c8aac038d6ef363a4bf8be2f6db517", size = 467781, upload-time = "2025-11-19T15:18:35.84Z" }, + { url = "https://files.pythonhosted.org/packages/e8/00/374c0c068e30cd31f1e1b46b4b5738168ec79e7689ca82ee93ddfea05109/safetensors-0.7.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:94fd4858284736bb67a897a41608b5b0c2496c9bdb3bf2af1fa3409127f20d57", size = 447058, upload-time = "2025-11-19T15:18:34.416Z" }, + { url = "https://files.pythonhosted.org/packages/f1/06/578ffed52c2296f93d7fd2d844cabfa92be51a587c38c8afbb8ae449ca89/safetensors-0.7.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e07d91d0c92a31200f25351f4acb2bc6aff7f48094e13ebb1d0fb995b54b6542", size = 491748, upload-time = "2025-11-19T15:18:09.79Z" }, + { url = "https://files.pythonhosted.org/packages/ae/33/1debbbb70e4791dde185edb9413d1fe01619255abb64b300157d7f15dddd/safetensors-0.7.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8469155f4cb518bafb4acf4865e8bb9d6804110d2d9bdcaa78564b9fd841e104", size = 503881, upload-time = "2025-11-19T15:18:16.145Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1c/40c2ca924d60792c3be509833df711b553c60effbd91da6f5284a83f7122/safetensors-0.7.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54bef08bf00a2bff599982f6b08e8770e09cc012d7bba00783fc7ea38f1fb37d", size = 623463, upload-time = "2025-11-19T15:18:21.11Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3a/13784a9364bd43b0d61eef4bea2845039bc2030458b16594a1bd787ae26e/safetensors-0.7.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42cb091236206bb2016d245c377ed383aa7f78691748f3bb6ee1bfa51ae2ce6a", size = 532855, upload-time = "2025-11-19T15:18:25.719Z" }, + { url = "https://files.pythonhosted.org/packages/a0/60/429e9b1cb3fc651937727befe258ea24122d9663e4d5709a48c9cbfceecb/safetensors-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac7252938f0696ddea46f5e855dd3138444e82236e3be475f54929f0c510d48", size = 507152, upload-time = "2025-11-19T15:18:33.023Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a8/4b45e4e059270d17af60359713ffd83f97900d45a6afa73aaa0d737d48b6/safetensors-0.7.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1d060c70284127fa805085d8f10fbd0962792aed71879d00864acda69dbab981", size = 541856, upload-time = "2025-11-19T15:18:31.075Z" }, + { url = "https://files.pythonhosted.org/packages/06/87/d26d8407c44175d8ae164a95b5a62707fcc445f3c0c56108e37d98070a3d/safetensors-0.7.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cdab83a366799fa730f90a4ebb563e494f28e9e92c4819e556152ad55e43591b", size = 674060, upload-time = "2025-11-19T15:18:37.211Z" }, + { url = "https://files.pythonhosted.org/packages/11/f5/57644a2ff08dc6325816ba7217e5095f17269dada2554b658442c66aed51/safetensors-0.7.0-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:672132907fcad9f2aedcb705b2d7b3b93354a2aec1b2f706c4db852abe338f85", size = 771715, upload-time = "2025-11-19T15:18:38.689Z" }, + { url = "https://files.pythonhosted.org/packages/86/31/17883e13a814bd278ae6e266b13282a01049b0c81341da7fd0e3e71a80a3/safetensors-0.7.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:5d72abdb8a4d56d4020713724ba81dac065fedb7f3667151c4a637f1d3fb26c0", size = 714377, upload-time = "2025-11-19T15:18:40.162Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d8/0c8a7dc9b41dcac53c4cbf9df2b9c83e0e0097203de8b37a712b345c0be5/safetensors-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0f6d66c1c538d5a94a73aa9ddca8ccc4227e6c9ff555322ea40bdd142391dd4", size = 677368, upload-time = "2025-11-19T15:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/05/e5/cb4b713c8a93469e3c5be7c3f8d77d307e65fe89673e731f5c2bfd0a9237/safetensors-0.7.0-cp38-abi3-win32.whl", hash = "sha256:c74af94bf3ac15ac4d0f2a7c7b4663a15f8c2ab15ed0fc7531ca61d0835eccba", size = 326423, upload-time = "2025-11-19T15:18:45.74Z" }, + { url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380, upload-time = "2025-11-19T15:18:44.427Z" }, + { url = "https://files.pythonhosted.org/packages/a7/6a/4d08d89a6fcbe905c5ae68b8b34f0791850882fc19782d0d02c65abbdf3b/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4729811a6640d019a4b7ba8638ee2fd21fa5ca8c7e7bdf0fed62068fcaac737", size = 492430, upload-time = "2025-11-19T15:18:11.884Z" }, + { url = "https://files.pythonhosted.org/packages/dd/29/59ed8152b30f72c42d00d241e58eaca558ae9dbfa5695206e2e0f54c7063/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12f49080303fa6bb424b362149a12949dfbbf1e06811a88f2307276b0c131afd", size = 503977, upload-time = "2025-11-19T15:18:17.523Z" }, + { url = "https://files.pythonhosted.org/packages/d3/0b/4811bfec67fa260e791369b16dab105e4bae82686120554cc484064e22b4/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0071bffba4150c2f46cae1432d31995d77acfd9f8db598b5d1a2ce67e8440ad2", size = 623890, upload-time = "2025-11-19T15:18:22.666Z" }, + { url = "https://files.pythonhosted.org/packages/58/5b/632a58724221ef03d78ab65062e82a1010e1bef8e8e0b9d7c6d7b8044841/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:473b32699f4200e69801bf5abf93f1a4ecd432a70984df164fc22ccf39c4a6f3", size = 531885, upload-time = "2025-11-19T15:18:27.146Z" }, ] [[package]] @@ -5226,38 +5222,38 @@ dependencies = [ { name = "scipy", version = "1.15.3", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version < '3.11'" }, { name = "threadpoolctl", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/98/c2/a7855e41c9d285dfe86dc50b250978105dce513d6e459ea66a6aeb0e1e0c/scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda", upload-time = "2025-09-09T08:21:29.075Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/ba/3e/daed796fd69cce768b8788401cc464ea90b306fb196ae1ffed0b98182859/scikit_learn-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b33579c10a3081d076ab403df4a4190da4f4432d443521674637677dc91e61f", upload-time = "2025-09-09T08:20:19.328Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1c/ce/af9d99533b24c55ff4e18d9b7b4d9919bbc6cd8f22fe7a7be01519a347d5/scikit_learn-1.7.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:36749fb62b3d961b1ce4fedf08fa57a1986cd409eff2d783bca5d4b9b5fce51c", upload-time = "2025-09-09T08:20:22.073Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/0e/8c2a03d518fb6bd0b6b0d4b114c63d5f1db01ff0f9925d8eb10960d01c01/scikit_learn-1.7.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7a58814265dfc52b3295b1900cfb5701589d30a8bb026c7540f1e9d3499d5ec8", upload-time = "2025-09-09T08:20:24.327Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2b/75/4311605069b5d220e7cf5adabb38535bd96f0079313cdbb04b291479b22a/scikit_learn-1.7.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a847fea807e278f821a0406ca01e387f97653e284ecbd9750e3ee7c90347f18", upload-time = "2025-09-09T08:20:26.845Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7f/9b/87961813c34adbca21a6b3f6b2bea344c43b30217a6d24cc437c6147f3e8/scikit_learn-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:ca250e6836d10e6f402436d6463d6c0e4d8e0234cfb6a9a47835bd392b852ce5", upload-time = "2025-09-09T08:20:29.329Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/43/83/564e141eef908a5863a54da8ca342a137f45a0bfb71d1d79704c9894c9d1/scikit_learn-1.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7509693451651cd7361d30ce4e86a1347493554f172b1c72a39300fa2aea79e", upload-time = "2025-09-09T08:20:32.421Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/d6/ba863a4171ac9d7314c4d3fc251f015704a2caeee41ced89f321c049ed83/scikit_learn-1.7.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:0486c8f827c2e7b64837c731c8feff72c0bd2b998067a8a9cbc10643c31f0fe1", upload-time = "2025-09-09T08:20:34.436Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ef/0e/97dbca66347b8cf0ea8b529e6bb9367e337ba2e8be0ef5c1a545232abfde/scikit_learn-1.7.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89877e19a80c7b11a2891a27c21c4894fb18e2c2e077815bcade10d34287b20d", upload-time = "2025-09-09T08:20:36.776Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f7/32/1f3b22e3207e1d2c883a7e09abb956362e7d1bd2f14458c7de258a26ac15/scikit_learn-1.7.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8da8bf89d4d79aaec192d2bda62f9b56ae4e5b4ef93b6a56b5de4977e375c1f1", upload-time = "2025-09-09T08:20:38.957Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/71/34ddbd21f1da67c7a768146968b4d0220ee6831e4bcbad3e03dd3eae88b6/scikit_learn-1.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:9b7ed8d58725030568523e937c43e56bc01cadb478fc43c042a9aca1dacb3ba1", upload-time = "2025-09-09T08:20:41.166Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/aa/3996e2196075689afb9fce0410ebdb4a09099d7964d061d7213700204409/scikit_learn-1.7.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d91a97fa2b706943822398ab943cde71858a50245e31bc71dba62aab1d60a96", upload-time = "2025-09-09T08:20:43.19Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/43/5d/779320063e88af9c4a7c2cf463ff11c21ac9c8bd730c4a294b0000b666c9/scikit_learn-1.7.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:acbc0f5fd2edd3432a22c69bed78e837c70cf896cd7993d71d51ba6708507476", upload-time = "2025-09-09T08:20:45.468Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5c/d0/0c577d9325b05594fdd33aa970bf53fb673f051a45496842caee13cfd7fe/scikit_learn-1.7.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5bf3d930aee75a65478df91ac1225ff89cd28e9ac7bd1196853a9229b6adb0b", upload-time = "2025-09-09T08:20:47.982Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/82/70/8bf44b933837ba8494ca0fc9a9ab60f1c13b062ad0197f60a56e2fc4c43e/scikit_learn-1.7.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d6e9deed1a47aca9fe2f267ab8e8fe82ee20b4526b2c0cd9e135cea10feb44", upload-time = "2025-09-09T08:20:50.366Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c6/99/ed35197a158f1fdc2fe7c3680e9c70d0128f662e1fee4ed495f4b5e13db0/scikit_learn-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:6088aa475f0785e01bcf8529f55280a3d7d298679f50c0bb70a2364a82d0b290", upload-time = "2025-09-09T08:20:52.627Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ae/93/a3038cb0293037fd335f77f31fe053b89c72f17b1c8908c576c29d953e84/scikit_learn-1.7.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b7dacaa05e5d76759fb071558a8b5130f4845166d88654a0f9bdf3eb57851b7", upload-time = "2025-09-09T08:20:54.731Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/dd/9a88879b0c1104259136146e4742026b52df8540c39fec21a6383f8292c7/scikit_learn-1.7.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:abebbd61ad9e1deed54cca45caea8ad5f79e1b93173dece40bb8e0c658dbe6fe", upload-time = "2025-09-09T08:20:57.313Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/46/af/c5e286471b7d10871b811b72ae794ac5fe2989c0a2df07f0ec723030f5f5/scikit_learn-1.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:502c18e39849c0ea1a5d681af1dbcf15f6cce601aebb657aabbfe84133c1907f", upload-time = "2025-09-09T08:20:59.671Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/fd/df59faa53312d585023b2da27e866524ffb8faf87a68516c23896c718320/scikit_learn-1.7.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a4c328a71785382fe3fe676a9ecf2c86189249beff90bf85e22bdb7efaf9ae0", upload-time = "2025-09-09T08:21:01.71Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/c7/03000262759d7b6f38c836ff9d512f438a70d8a8ddae68ee80de72dcfb63/scikit_learn-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:63a9afd6f7b229aad94618c01c252ce9e6fa97918c5ca19c9a17a087d819440c", upload-time = "2025-09-09T08:21:04.234Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/55/87/ef5eb1f267084532c8e4aef98a28b6ffe7425acbfd64b5e2f2e066bc29b3/scikit_learn-1.7.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9acb6c5e867447b4e1390930e3944a005e2cb115922e693c08a323421a6966e8", upload-time = "2025-09-09T08:21:06.381Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/93/f8/6c1e3fc14b10118068d7938878a9f3f4e6d7b74a8ddb1e5bed65159ccda8/scikit_learn-1.7.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:2a41e2a0ef45063e654152ec9d8bcfc39f7afce35b08902bfe290c2498a67a6a", upload-time = "2025-09-09T08:21:08.628Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/83/87/066cafc896ee540c34becf95d30375fe5cbe93c3b75a0ee9aa852cd60021/scikit_learn-1.7.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98335fb98509b73385b3ab2bd0639b1f610541d3988ee675c670371d6a87aa7c", upload-time = "2025-09-09T08:21:11.486Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/2b/4903e1ccafa1f6453b1ab78413938c8800633988c838aa0be386cbb33072/scikit_learn-1.7.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191e5550980d45449126e23ed1d5e9e24b2c68329ee1f691a3987476e115e09c", upload-time = "2025-09-09T08:21:13.602Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/aa/8444be3cfb10451617ff9d177b3c190288f4563e6c50ff02728be67ad094/scikit_learn-1.7.2-cp313-cp313t-win_amd64.whl", hash = "sha256:57dc4deb1d3762c75d685507fbd0bc17160144b2f2ba4ccea5dc285ab0d0e973", upload-time = "2025-09-09T08:21:15.96Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d9/82/dee5acf66837852e8e68df6d8d3a6cb22d3df997b733b032f513d95205b7/scikit_learn-1.7.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fa8f63940e29c82d1e67a45d5297bdebbcb585f5a5a50c4914cc2e852ab77f33", upload-time = "2025-09-09T08:21:18.557Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3c/30/9029e54e17b87cb7d50d51a5926429c683d5b4c1732f0507a6c3bed9bf65/scikit_learn-1.7.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f95dc55b7902b91331fa4e5845dd5bde0580c9cd9612b1b2791b7e80c3d32615", upload-time = "2025-09-09T08:21:20.695Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/60/18/4a52c635c71b536879f4b971c2cedf32c35ee78f48367885ed8025d1f7ee/scikit_learn-1.7.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9656e4a53e54578ad10a434dc1f993330568cfee176dff07112b8785fb413106", upload-time = "2025-09-09T08:21:22.645Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/99/7e/290362f6ab582128c53445458a5befd471ed1ea37953d5bcf80604619250/scikit_learn-1.7.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96dc05a854add0e50d3f47a1ef21a10a595016da5b007c7d9cd9d0bffd1fcc61", upload-time = "2025-09-09T08:21:24.65Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8e/87/24f541b6d62b1794939ae6422f8023703bbf6900378b2b34e0b4384dfefd/scikit_learn-1.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:bb24510ed3f9f61476181e4db51ce801e2ba37541def12dc9333b946fc7a9cf8", upload-time = "2025-09-09T08:21:26.713Z" }, +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" }, + { url = "https://files.pythonhosted.org/packages/ae/93/a3038cb0293037fd335f77f31fe053b89c72f17b1c8908c576c29d953e84/scikit_learn-1.7.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b7dacaa05e5d76759fb071558a8b5130f4845166d88654a0f9bdf3eb57851b7", size = 9212382, upload-time = "2025-09-09T08:20:54.731Z" }, + { url = "https://files.pythonhosted.org/packages/40/dd/9a88879b0c1104259136146e4742026b52df8540c39fec21a6383f8292c7/scikit_learn-1.7.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:abebbd61ad9e1deed54cca45caea8ad5f79e1b93173dece40bb8e0c658dbe6fe", size = 8592042, upload-time = "2025-09-09T08:20:57.313Z" }, + { url = "https://files.pythonhosted.org/packages/46/af/c5e286471b7d10871b811b72ae794ac5fe2989c0a2df07f0ec723030f5f5/scikit_learn-1.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:502c18e39849c0ea1a5d681af1dbcf15f6cce601aebb657aabbfe84133c1907f", size = 9434180, upload-time = "2025-09-09T08:20:59.671Z" }, + { url = "https://files.pythonhosted.org/packages/f1/fd/df59faa53312d585023b2da27e866524ffb8faf87a68516c23896c718320/scikit_learn-1.7.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a4c328a71785382fe3fe676a9ecf2c86189249beff90bf85e22bdb7efaf9ae0", size = 9283660, upload-time = "2025-09-09T08:21:01.71Z" }, + { url = "https://files.pythonhosted.org/packages/a7/c7/03000262759d7b6f38c836ff9d512f438a70d8a8ddae68ee80de72dcfb63/scikit_learn-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:63a9afd6f7b229aad94618c01c252ce9e6fa97918c5ca19c9a17a087d819440c", size = 8702057, upload-time = "2025-09-09T08:21:04.234Z" }, + { url = "https://files.pythonhosted.org/packages/55/87/ef5eb1f267084532c8e4aef98a28b6ffe7425acbfd64b5e2f2e066bc29b3/scikit_learn-1.7.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9acb6c5e867447b4e1390930e3944a005e2cb115922e693c08a323421a6966e8", size = 9558731, upload-time = "2025-09-09T08:21:06.381Z" }, + { url = "https://files.pythonhosted.org/packages/93/f8/6c1e3fc14b10118068d7938878a9f3f4e6d7b74a8ddb1e5bed65159ccda8/scikit_learn-1.7.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:2a41e2a0ef45063e654152ec9d8bcfc39f7afce35b08902bfe290c2498a67a6a", size = 9038852, upload-time = "2025-09-09T08:21:08.628Z" }, + { url = "https://files.pythonhosted.org/packages/83/87/066cafc896ee540c34becf95d30375fe5cbe93c3b75a0ee9aa852cd60021/scikit_learn-1.7.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98335fb98509b73385b3ab2bd0639b1f610541d3988ee675c670371d6a87aa7c", size = 9527094, upload-time = "2025-09-09T08:21:11.486Z" }, + { url = "https://files.pythonhosted.org/packages/9c/2b/4903e1ccafa1f6453b1ab78413938c8800633988c838aa0be386cbb33072/scikit_learn-1.7.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191e5550980d45449126e23ed1d5e9e24b2c68329ee1f691a3987476e115e09c", size = 9367436, upload-time = "2025-09-09T08:21:13.602Z" }, + { url = "https://files.pythonhosted.org/packages/b5/aa/8444be3cfb10451617ff9d177b3c190288f4563e6c50ff02728be67ad094/scikit_learn-1.7.2-cp313-cp313t-win_amd64.whl", hash = "sha256:57dc4deb1d3762c75d685507fbd0bc17160144b2f2ba4ccea5dc285ab0d0e973", size = 9275749, upload-time = "2025-09-09T08:21:15.96Z" }, + { url = "https://files.pythonhosted.org/packages/d9/82/dee5acf66837852e8e68df6d8d3a6cb22d3df997b733b032f513d95205b7/scikit_learn-1.7.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fa8f63940e29c82d1e67a45d5297bdebbcb585f5a5a50c4914cc2e852ab77f33", size = 9208906, upload-time = "2025-09-09T08:21:18.557Z" }, + { url = "https://files.pythonhosted.org/packages/3c/30/9029e54e17b87cb7d50d51a5926429c683d5b4c1732f0507a6c3bed9bf65/scikit_learn-1.7.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f95dc55b7902b91331fa4e5845dd5bde0580c9cd9612b1b2791b7e80c3d32615", size = 8627836, upload-time = "2025-09-09T08:21:20.695Z" }, + { url = "https://files.pythonhosted.org/packages/60/18/4a52c635c71b536879f4b971c2cedf32c35ee78f48367885ed8025d1f7ee/scikit_learn-1.7.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9656e4a53e54578ad10a434dc1f993330568cfee176dff07112b8785fb413106", size = 9426236, upload-time = "2025-09-09T08:21:22.645Z" }, + { url = "https://files.pythonhosted.org/packages/99/7e/290362f6ab582128c53445458a5befd471ed1ea37953d5bcf80604619250/scikit_learn-1.7.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96dc05a854add0e50d3f47a1ef21a10a595016da5b007c7d9cd9d0bffd1fcc61", size = 9312593, upload-time = "2025-09-09T08:21:24.65Z" }, + { url = "https://files.pythonhosted.org/packages/8e/87/24f541b6d62b1794939ae6422f8023703bbf6900378b2b34e0b4384dfefd/scikit_learn-1.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:bb24510ed3f9f61476181e4db51ce801e2ba37541def12dc9333b946fc7a9cf8", size = 8820007, upload-time = "2025-09-09T08:21:26.713Z" }, ] [[package]] @@ -5277,44 +5273,44 @@ dependencies = [ { name = "scipy", version = "1.17.1", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version >= '3.11'" }, { name = "threadpoolctl", marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/0e/d4/40988bf3b8e34feec1d0e6a051446b1f66225f8529b9309becaeef62b6c4/scikit_learn-1.8.0.tar.gz", hash = "sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd", upload-time = "2025-12-10T07:08:53.618Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c9/92/53ea2181da8ac6bf27170191028aee7251f8f841f8d3edbfdcaf2008fde9/scikit_learn-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:146b4d36f800c013d267b29168813f7a03a43ecd2895d04861f1240b564421da", upload-time = "2025-12-10T07:07:39.385Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/01/18/d154dc1638803adf987910cdd07097d9c526663a55666a97c124d09fb96a/scikit_learn-1.8.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f984ca4b14914e6b4094c5d52a32ea16b49832c03bd17a110f004db3c223e8e1", upload-time = "2025-12-10T07:07:41.93Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8a/44/226142fcb7b7101e64fdee5f49dbe6288d4c7af8abf593237b70fca080a4/scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e30adb87f0cc81c7690a84f7932dd66be5bac57cfe16b91cb9151683a4a2d3b", upload-time = "2025-12-10T07:07:43.899Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/36/4d/4a67f30778a45d542bbea5db2dbfa1e9e100bf9ba64aefe34215ba9f11f6/scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ada8121bcb4dac28d930febc791a69f7cb1673c8495e5eee274190b73a4559c1", upload-time = "2025-12-10T07:07:45.982Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/3c/45c352094cfa60050bcbb967b1faf246b22e93cb459f2f907b600f2ceda5/scikit_learn-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:c57b1b610bd1f40ba43970e11ce62821c2e6569e4d74023db19c6b26f246cb3b", upload-time = "2025-12-10T07:07:48.111Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/46/5416595bb395757f754feb20c3d776553a386b661658fb21b7c814e89efe/scikit_learn-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:2838551e011a64e3053ad7618dda9310175f7515f1742fa2d756f7c874c05961", upload-time = "2025-12-10T07:07:49.873Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/90/74/e6a7cc4b820e95cc38cf36cd74d5aa2b42e8ffc2d21fe5a9a9c45c1c7630/scikit_learn-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fb63362b5a7ddab88e52b6dbb47dac3fd7dafeee740dc6c8d8a446ddedade8e", upload-time = "2025-12-10T07:07:51.568Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/d8/9be608c6024d021041c7f0b3928d4749a706f4e2c3832bbede4fb4f58c95/scikit_learn-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5025ce924beccb28298246e589c691fe1b8c1c96507e6d27d12c5fadd85bfd76", upload-time = "2025-12-10T07:07:53.697Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dd/47/f187b4636ff80cc63f21cd40b7b2d177134acaa10f6bb73746130ee8c2e5/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4496bb2cf7a43ce1a2d7524a79e40bc5da45cf598dbf9545b7e8316ccba47bb4", upload-time = "2025-12-10T07:07:55.574Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/97/74/b7a304feb2b49df9fafa9382d4d09061a96ee9a9449a7cbea7988dda0828/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0bcfe4d0d14aec44921545fd2af2338c7471de9cb701f1da4c9d85906ab847a", upload-time = "2025-12-10T07:07:57.666Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/c4/0ab22726a04ede56f689476b760f98f8f46607caecff993017ac1b64aa5d/scikit_learn-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:35c007dedb2ffe38fe3ee7d201ebac4a2deccd2408e8621d53067733e3c74809", upload-time = "2025-12-10T07:07:59.838Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/90/344a67811cfd561d7335c1b96ca21455e7e472d281c3c279c4d3f2300236/scikit_learn-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:8c497fff237d7b4e07e9ef1a640887fa4fb765647f86fbe00f969ff6280ce2bb", upload-time = "2025-12-10T07:08:01.36Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/03/aa/e22e0768512ce9255eba34775be2e85c2048da73da1193e841707f8f039c/scikit_learn-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d6ae97234d5d7079dc0040990a6f7aeb97cb7fa7e8945f1999a429b23569e0a", upload-time = "2025-12-10T07:08:03.251Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/37/31b83b2594105f61a381fc74ca19e8780ee923be2d496fcd8d2e1147bd99/scikit_learn-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:edec98c5e7c128328124a029bceb09eda2d526997780fef8d65e9a69eead963e", upload-time = "2025-12-10T07:08:05.336Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2d/5a/3f1caed8765f33eabb723596666da4ebbf43d11e96550fb18bdec42b467b/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74b66d8689d52ed04c271e1329f0c61635bcaf5b926db9b12d58914cdc01fe57", upload-time = "2025-12-10T07:08:07.732Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/38/cf/06896db3f71c75902a8e9943b444a56e727418f6b4b4a90c98c934f51ed4/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fdf95767f989b0cfedb85f7ed8ca215d4be728031f56ff5a519ee1e3276dc2e", upload-time = "2025-12-10T07:08:09.862Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1c/f9/9b7563caf3ec8873e17a31401858efab6b39a882daf6c1bfa88879c0aa11/scikit_learn-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:2de443b9373b3b615aec1bb57f9baa6bb3a9bd093f1269ba95c17d870422b271", upload-time = "2025-12-10T07:08:12.028Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/bd/1f4001503650e72c4f6009ac0c4413cb17d2d601cef6f71c0453da2732fc/scikit_learn-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:eddde82a035681427cbedded4e6eff5e57fa59216c2e3e90b10b19ab1d0a65c3", upload-time = "2025-12-10T07:08:13.688Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/7d/a630359fc9dcc95496588c8d8e3245cc8fd81980251079bc09c70d41d951/scikit_learn-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7cc267b6108f0a1499a734167282c00c4ebf61328566b55ef262d48e9849c735", upload-time = "2025-12-10T07:08:15.215Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cc/56/a0c86f6930cfcd1c7054a2bc417e26960bb88d32444fe7f71d5c2cfae891/scikit_learn-1.8.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:fe1c011a640a9f0791146011dfd3c7d9669785f9fed2b2a5f9e207536cf5c2fd", upload-time = "2025-12-10T07:08:17.561Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/46/1e/05962ea1cebc1cf3876667ecb14c283ef755bf409993c5946ade3b77e303/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72358cce49465d140cc4e7792015bb1f0296a9742d5622c67e31399b75468b9e", upload-time = "2025-12-10T07:08:19.952Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/56/a85473cd75f200c9759e3a5f0bcab2d116c92a8a02ee08ccd73b870f8bb4/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80832434a6cc114f5219211eec13dcbc16c2bac0e31ef64c6d346cde3cf054cb", upload-time = "2025-12-10T07:08:22.11Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cc/b7/64d8cfa896c64435ae57f4917a548d7ac7a44762ff9802f75a79b77cb633/scikit_learn-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ee787491dbfe082d9c3013f01f5991658b0f38aa8177e4cd4bf434c58f551702", upload-time = "2025-12-10T07:08:23.943Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5e/37/e192ea709551799379958b4c4771ec507347027bb7c942662c7fbeba31cb/scikit_learn-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf97c10a3f5a7543f9b88cbf488d33d175e9146115a451ae34568597ba33dcde", upload-time = "2025-12-10T07:08:25.71Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/05/1af2c186174cc92dcab2233f327336058c077d38f6fe2aceb08e6ab4d509/scikit_learn-1.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3", upload-time = "2025-12-10T07:08:27.541Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a8/25/01c0af38fe969473fb292bba9dc2b8f9b451f3112ff242c647fee3d0dfe7/scikit_learn-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7", upload-time = "2025-12-10T07:08:29.822Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/be/ce/a0623350aa0b68647333940ee46fe45086c6060ec604874e38e9ab7d8e6c/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6", upload-time = "2025-12-10T07:08:31.865Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b8/cb/861b41341d6f1245e6ca80b1c1a8c4dfce43255b03df034429089ca2a2c5/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4", upload-time = "2025-12-10T07:08:34.166Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/76/18/a8def8f91b18cd1ba6e05dbe02540168cb24d47e8dcf69e8d00b7da42a08/scikit_learn-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:56079a99c20d230e873ea40753102102734c5953366972a71d5cb39a32bc40c6", upload-time = "2025-12-10T07:08:36.339Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/77/482076a678458307f0deb44e29891d6022617b2a64c840c725495bee343f/scikit_learn-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3bad7565bc9cf37ce19a7c0d107742b320c1285df7aab1a6e2d28780df167242", upload-time = "2025-12-10T07:08:38.128Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2d/d1/ef294ca754826daa043b2a104e59960abfab4cf653891037d19dd5b6f3cf/scikit_learn-1.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7", upload-time = "2025-12-10T07:08:41.013Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5b/e2/b1f8b05138ee813b8e1a4149f2f0d289547e60851fd1bb268886915adbda/scikit_learn-1.8.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9", upload-time = "2025-12-10T07:08:42.873Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/26/11/c32b2138a85dcb0c99f6afd13a70a951bfdff8a6ab42d8160522542fb647/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f", upload-time = "2025-12-10T07:08:45.362Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/57/51f2384575bdec454f4fe4e7a919d696c9ebce914590abf3e52d47607ab8/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9", upload-time = "2025-12-10T07:08:47.408Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/35/4d/748c9e2872637a57981a04adc038dacaa16ba8ca887b23e34953f0b3f742/scikit_learn-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2", upload-time = "2025-12-10T07:08:49.337Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/60/22/d7b2ebe4704a5e50790ba089d5c2ae308ab6bb852719e6c3bd4f04c3a363/scikit_learn-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f28dd15c6bb0b66ba09728cf09fd8736c304be29409bd8445a080c1280619e8c", upload-time = "2025-12-10T07:08:51.601Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/0e/d4/40988bf3b8e34feec1d0e6a051446b1f66225f8529b9309becaeef62b6c4/scikit_learn-1.8.0.tar.gz", hash = "sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd", size = 7335585, upload-time = "2025-12-10T07:08:53.618Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c9/92/53ea2181da8ac6bf27170191028aee7251f8f841f8d3edbfdcaf2008fde9/scikit_learn-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:146b4d36f800c013d267b29168813f7a03a43ecd2895d04861f1240b564421da", size = 8595835, upload-time = "2025-12-10T07:07:39.385Z" }, + { url = "https://files.pythonhosted.org/packages/01/18/d154dc1638803adf987910cdd07097d9c526663a55666a97c124d09fb96a/scikit_learn-1.8.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f984ca4b14914e6b4094c5d52a32ea16b49832c03bd17a110f004db3c223e8e1", size = 8080381, upload-time = "2025-12-10T07:07:41.93Z" }, + { url = "https://files.pythonhosted.org/packages/8a/44/226142fcb7b7101e64fdee5f49dbe6288d4c7af8abf593237b70fca080a4/scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e30adb87f0cc81c7690a84f7932dd66be5bac57cfe16b91cb9151683a4a2d3b", size = 8799632, upload-time = "2025-12-10T07:07:43.899Z" }, + { url = "https://files.pythonhosted.org/packages/36/4d/4a67f30778a45d542bbea5db2dbfa1e9e100bf9ba64aefe34215ba9f11f6/scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ada8121bcb4dac28d930febc791a69f7cb1673c8495e5eee274190b73a4559c1", size = 9103788, upload-time = "2025-12-10T07:07:45.982Z" }, + { url = "https://files.pythonhosted.org/packages/89/3c/45c352094cfa60050bcbb967b1faf246b22e93cb459f2f907b600f2ceda5/scikit_learn-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:c57b1b610bd1f40ba43970e11ce62821c2e6569e4d74023db19c6b26f246cb3b", size = 8081706, upload-time = "2025-12-10T07:07:48.111Z" }, + { url = "https://files.pythonhosted.org/packages/3d/46/5416595bb395757f754feb20c3d776553a386b661658fb21b7c814e89efe/scikit_learn-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:2838551e011a64e3053ad7618dda9310175f7515f1742fa2d756f7c874c05961", size = 7688451, upload-time = "2025-12-10T07:07:49.873Z" }, + { url = "https://files.pythonhosted.org/packages/90/74/e6a7cc4b820e95cc38cf36cd74d5aa2b42e8ffc2d21fe5a9a9c45c1c7630/scikit_learn-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fb63362b5a7ddab88e52b6dbb47dac3fd7dafeee740dc6c8d8a446ddedade8e", size = 8548242, upload-time = "2025-12-10T07:07:51.568Z" }, + { url = "https://files.pythonhosted.org/packages/49/d8/9be608c6024d021041c7f0b3928d4749a706f4e2c3832bbede4fb4f58c95/scikit_learn-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5025ce924beccb28298246e589c691fe1b8c1c96507e6d27d12c5fadd85bfd76", size = 8079075, upload-time = "2025-12-10T07:07:53.697Z" }, + { url = "https://files.pythonhosted.org/packages/dd/47/f187b4636ff80cc63f21cd40b7b2d177134acaa10f6bb73746130ee8c2e5/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4496bb2cf7a43ce1a2d7524a79e40bc5da45cf598dbf9545b7e8316ccba47bb4", size = 8660492, upload-time = "2025-12-10T07:07:55.574Z" }, + { url = "https://files.pythonhosted.org/packages/97/74/b7a304feb2b49df9fafa9382d4d09061a96ee9a9449a7cbea7988dda0828/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0bcfe4d0d14aec44921545fd2af2338c7471de9cb701f1da4c9d85906ab847a", size = 8931904, upload-time = "2025-12-10T07:07:57.666Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c4/0ab22726a04ede56f689476b760f98f8f46607caecff993017ac1b64aa5d/scikit_learn-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:35c007dedb2ffe38fe3ee7d201ebac4a2deccd2408e8621d53067733e3c74809", size = 8019359, upload-time = "2025-12-10T07:07:59.838Z" }, + { url = "https://files.pythonhosted.org/packages/24/90/344a67811cfd561d7335c1b96ca21455e7e472d281c3c279c4d3f2300236/scikit_learn-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:8c497fff237d7b4e07e9ef1a640887fa4fb765647f86fbe00f969ff6280ce2bb", size = 7641898, upload-time = "2025-12-10T07:08:01.36Z" }, + { url = "https://files.pythonhosted.org/packages/03/aa/e22e0768512ce9255eba34775be2e85c2048da73da1193e841707f8f039c/scikit_learn-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d6ae97234d5d7079dc0040990a6f7aeb97cb7fa7e8945f1999a429b23569e0a", size = 8513770, upload-time = "2025-12-10T07:08:03.251Z" }, + { url = "https://files.pythonhosted.org/packages/58/37/31b83b2594105f61a381fc74ca19e8780ee923be2d496fcd8d2e1147bd99/scikit_learn-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:edec98c5e7c128328124a029bceb09eda2d526997780fef8d65e9a69eead963e", size = 8044458, upload-time = "2025-12-10T07:08:05.336Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5a/3f1caed8765f33eabb723596666da4ebbf43d11e96550fb18bdec42b467b/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74b66d8689d52ed04c271e1329f0c61635bcaf5b926db9b12d58914cdc01fe57", size = 8610341, upload-time = "2025-12-10T07:08:07.732Z" }, + { url = "https://files.pythonhosted.org/packages/38/cf/06896db3f71c75902a8e9943b444a56e727418f6b4b4a90c98c934f51ed4/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fdf95767f989b0cfedb85f7ed8ca215d4be728031f56ff5a519ee1e3276dc2e", size = 8900022, upload-time = "2025-12-10T07:08:09.862Z" }, + { url = "https://files.pythonhosted.org/packages/1c/f9/9b7563caf3ec8873e17a31401858efab6b39a882daf6c1bfa88879c0aa11/scikit_learn-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:2de443b9373b3b615aec1bb57f9baa6bb3a9bd093f1269ba95c17d870422b271", size = 7989409, upload-time = "2025-12-10T07:08:12.028Z" }, + { url = "https://files.pythonhosted.org/packages/49/bd/1f4001503650e72c4f6009ac0c4413cb17d2d601cef6f71c0453da2732fc/scikit_learn-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:eddde82a035681427cbedded4e6eff5e57fa59216c2e3e90b10b19ab1d0a65c3", size = 7619760, upload-time = "2025-12-10T07:08:13.688Z" }, + { url = "https://files.pythonhosted.org/packages/d2/7d/a630359fc9dcc95496588c8d8e3245cc8fd81980251079bc09c70d41d951/scikit_learn-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7cc267b6108f0a1499a734167282c00c4ebf61328566b55ef262d48e9849c735", size = 8826045, upload-time = "2025-12-10T07:08:15.215Z" }, + { url = "https://files.pythonhosted.org/packages/cc/56/a0c86f6930cfcd1c7054a2bc417e26960bb88d32444fe7f71d5c2cfae891/scikit_learn-1.8.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:fe1c011a640a9f0791146011dfd3c7d9669785f9fed2b2a5f9e207536cf5c2fd", size = 8420324, upload-time = "2025-12-10T07:08:17.561Z" }, + { url = "https://files.pythonhosted.org/packages/46/1e/05962ea1cebc1cf3876667ecb14c283ef755bf409993c5946ade3b77e303/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72358cce49465d140cc4e7792015bb1f0296a9742d5622c67e31399b75468b9e", size = 8680651, upload-time = "2025-12-10T07:08:19.952Z" }, + { url = "https://files.pythonhosted.org/packages/fe/56/a85473cd75f200c9759e3a5f0bcab2d116c92a8a02ee08ccd73b870f8bb4/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80832434a6cc114f5219211eec13dcbc16c2bac0e31ef64c6d346cde3cf054cb", size = 8925045, upload-time = "2025-12-10T07:08:22.11Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b7/64d8cfa896c64435ae57f4917a548d7ac7a44762ff9802f75a79b77cb633/scikit_learn-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ee787491dbfe082d9c3013f01f5991658b0f38aa8177e4cd4bf434c58f551702", size = 8507994, upload-time = "2025-12-10T07:08:23.943Z" }, + { url = "https://files.pythonhosted.org/packages/5e/37/e192ea709551799379958b4c4771ec507347027bb7c942662c7fbeba31cb/scikit_learn-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf97c10a3f5a7543f9b88cbf488d33d175e9146115a451ae34568597ba33dcde", size = 7869518, upload-time = "2025-12-10T07:08:25.71Z" }, + { url = "https://files.pythonhosted.org/packages/24/05/1af2c186174cc92dcab2233f327336058c077d38f6fe2aceb08e6ab4d509/scikit_learn-1.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3", size = 8528667, upload-time = "2025-12-10T07:08:27.541Z" }, + { url = "https://files.pythonhosted.org/packages/a8/25/01c0af38fe969473fb292bba9dc2b8f9b451f3112ff242c647fee3d0dfe7/scikit_learn-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7", size = 8066524, upload-time = "2025-12-10T07:08:29.822Z" }, + { url = "https://files.pythonhosted.org/packages/be/ce/a0623350aa0b68647333940ee46fe45086c6060ec604874e38e9ab7d8e6c/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6", size = 8657133, upload-time = "2025-12-10T07:08:31.865Z" }, + { url = "https://files.pythonhosted.org/packages/b8/cb/861b41341d6f1245e6ca80b1c1a8c4dfce43255b03df034429089ca2a2c5/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4", size = 8923223, upload-time = "2025-12-10T07:08:34.166Z" }, + { url = "https://files.pythonhosted.org/packages/76/18/a8def8f91b18cd1ba6e05dbe02540168cb24d47e8dcf69e8d00b7da42a08/scikit_learn-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:56079a99c20d230e873ea40753102102734c5953366972a71d5cb39a32bc40c6", size = 8096518, upload-time = "2025-12-10T07:08:36.339Z" }, + { url = "https://files.pythonhosted.org/packages/d1/77/482076a678458307f0deb44e29891d6022617b2a64c840c725495bee343f/scikit_learn-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3bad7565bc9cf37ce19a7c0d107742b320c1285df7aab1a6e2d28780df167242", size = 7754546, upload-time = "2025-12-10T07:08:38.128Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d1/ef294ca754826daa043b2a104e59960abfab4cf653891037d19dd5b6f3cf/scikit_learn-1.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7", size = 8848305, upload-time = "2025-12-10T07:08:41.013Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e2/b1f8b05138ee813b8e1a4149f2f0d289547e60851fd1bb268886915adbda/scikit_learn-1.8.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9", size = 8432257, upload-time = "2025-12-10T07:08:42.873Z" }, + { url = "https://files.pythonhosted.org/packages/26/11/c32b2138a85dcb0c99f6afd13a70a951bfdff8a6ab42d8160522542fb647/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f", size = 8678673, upload-time = "2025-12-10T07:08:45.362Z" }, + { url = "https://files.pythonhosted.org/packages/c7/57/51f2384575bdec454f4fe4e7a919d696c9ebce914590abf3e52d47607ab8/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9", size = 8922467, upload-time = "2025-12-10T07:08:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/35/4d/748c9e2872637a57981a04adc038dacaa16ba8ca887b23e34953f0b3f742/scikit_learn-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2", size = 8774395, upload-time = "2025-12-10T07:08:49.337Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/d7b2ebe4704a5e50790ba089d5c2ae308ab6bb852719e6c3bd4f04c3a363/scikit_learn-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f28dd15c6bb0b66ba09728cf09fd8736c304be29409bd8445a080c1280619e8c", size = 8002647, upload-time = "2025-12-10T07:08:51.601Z" }, ] [[package]] @@ -5327,53 +5323,53 @@ resolution-markers = [ dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", upload-time = "2025-05-08T16:13:05.955Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/78/2f/4966032c5f8cc7e6a60f1b2e0ad686293b9474b65246b0c642e3ef3badd0/scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", upload-time = "2025-05-08T16:04:20.849Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a0/6e/0c3bf90fae0e910c274db43304ebe25a6b391327f3f10b5dcc638c090795/scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", upload-time = "2025-05-08T16:04:27.103Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ea/b1/4deb37252311c1acff7f101f6453f0440794f51b6eacb1aad4459a134081/scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", upload-time = "2025-05-08T16:04:31.731Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/38/7d/f457626e3cd3c29b3a49ca115a304cebb8cc6f31b04678f03b216899d3c6/scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", upload-time = "2025-05-08T16:04:36.596Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", upload-time = "2025-05-08T16:04:43.546Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", upload-time = "2025-05-08T16:04:49.431Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", upload-time = "2025-05-08T16:04:55.215Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", upload-time = "2025-05-08T16:05:01.914Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/84/55bc4881973d3f79b479a5a2e2df61c8c9a04fcb986a213ac9c02cfb659b/scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13", upload-time = "2025-05-08T16:05:08.166Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/96/ab/5cc9f80f28f6a7dff646c5756e559823614a42b1939d86dd0ed550470210/scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", upload-time = "2025-05-08T16:05:14.596Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4a/4a/66ba30abe5ad1a3ad15bfb0b59d22174012e8056ff448cb1644deccbfed2/scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", upload-time = "2025-05-08T16:05:20.152Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/fa/a7e5b95afd80d24313307f03624acc65801846fa75599034f8ceb9e2cbf6/scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", upload-time = "2025-05-08T16:05:24.494Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/17/99/f3aaddccf3588bb4aea70ba35328c204cadd89517a1612ecfda5b2dd9d7a/scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", upload-time = "2025-05-08T16:05:29.313Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/56/c5/1032cdb565f146109212153339f9cb8b993701e9fe56b1c97699eee12586/scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", upload-time = "2025-05-08T16:05:34.699Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bd/37/89f19c8c05505d0601ed5650156e50eb881ae3918786c8fd7262b4ee66d3/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", upload-time = "2025-05-08T16:05:40.762Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7e/31/be59513aa9695519b18e1851bb9e487de66f2d31f835201f1b42f5d4d475/scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", upload-time = "2025-05-08T16:05:48.119Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/10/c0/4f5f3eeccc235632aab79b27a74a9130c6c35df358129f7ac8b29f562ac7/scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", upload-time = "2025-05-08T16:05:54.22Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ab/a7/0ddaf514ce8a8714f6ed243a2b391b41dbb65251affe21ee3077ec45ea9a/scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb", upload-time = "2025-05-08T16:06:00.437Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", upload-time = "2025-05-08T16:06:06.471Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", upload-time = "2025-05-08T16:06:11.686Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", upload-time = "2025-05-08T16:06:15.97Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", upload-time = "2025-05-08T16:06:20.394Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", upload-time = "2025-05-08T16:06:26.159Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", upload-time = "2025-05-08T16:06:32.778Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", upload-time = "2025-05-08T16:06:39.249Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", upload-time = "2025-05-08T16:06:45.729Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", upload-time = "2025-05-08T16:06:52.623Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/73/18/ec27848c9baae6e0d6573eda6e01a602e5649ee72c27c3a8aad673ebecfd/scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", upload-time = "2025-05-08T16:06:58.696Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/74/cd/1aef2184948728b4b6e21267d53b3339762c285a46a274ebb7863c9e4742/scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", upload-time = "2025-05-08T16:07:04.209Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5b/d8/59e452c0a255ec352bd0a833537a3bc1bfb679944c4938ab375b0a6b3a3e/scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", upload-time = "2025-05-08T16:07:08.998Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/08/f5/456f56bbbfccf696263b47095291040655e3cbaf05d063bdc7c7517f32ac/scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", upload-time = "2025-05-08T16:07:14.091Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a2/66/a9618b6a435a0f0c0b8a6d0a2efb32d4ec5a85f023c2b79d39512040355b/scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", upload-time = "2025-05-08T16:07:19.427Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", upload-time = "2025-05-08T16:07:25.712Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/0a/eac00ff741f23bcabd352731ed9b8995a0a60ef57f5fd788d611d43d69a1/scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", upload-time = "2025-05-08T16:07:31.468Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/54/4379be86dd74b6ad81551689107360d9a3e18f24d20767a2d5b9253a3f0a/scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126", upload-time = "2025-05-08T16:07:38.002Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163", upload-time = "2025-05-08T16:08:33.671Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1b/e9/7a879c137f7e55b30d75d90ce3eb468197646bc7b443ac036ae3fe109055/scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", upload-time = "2025-05-08T16:07:44.039Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/51/d1/226a806bbd69f62ce5ef5f3ffadc35286e9fbc802f606a07eb83bf2359de/scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", upload-time = "2025-05-08T16:07:49.891Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/9b/f32d1d6093ab9eeabbd839b0f7619c62e46cc4b7b6dbf05b6e615bbd4400/scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", upload-time = "2025-05-08T16:07:54.121Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e7/29/c278f699b095c1a884f29fda126340fcc201461ee8bfea5c8bdb1c7c958b/scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", upload-time = "2025-05-08T16:07:58.506Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/18/9e5374b617aba742a990581373cd6b68a2945d65cc588482749ef2e64467/scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", upload-time = "2025-05-08T16:08:03.929Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e1/fe/9c4361e7ba2927074360856db6135ef4904d505e9b3afbbcb073c4008328/scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", upload-time = "2025-05-08T16:08:09.558Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/8e/038ccfe29d272b30086b25a4960f757f97122cb2ec42e62b460d02fe98e9/scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", upload-time = "2025-05-08T16:08:15.34Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/10/7e/5c12285452970be5bdbe8352c619250b97ebf7917d7a9a9e96b8a8140f17/scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", upload-time = "2025-05-08T16:08:21.513Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/81/06/0a5e5349474e1cbc5757975b21bd4fad0e72ebf138c5592f191646154e06/scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca", upload-time = "2025-05-08T16:08:27.627Z" }, +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" }, + { url = "https://files.pythonhosted.org/packages/73/18/ec27848c9baae6e0d6573eda6e01a602e5649ee72c27c3a8aad673ebecfd/scipy-1.15.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", size = 38728256, upload-time = "2025-05-08T16:06:58.696Z" }, + { url = "https://files.pythonhosted.org/packages/74/cd/1aef2184948728b4b6e21267d53b3339762c285a46a274ebb7863c9e4742/scipy-1.15.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", size = 30109540, upload-time = "2025-05-08T16:07:04.209Z" }, + { url = "https://files.pythonhosted.org/packages/5b/d8/59e452c0a255ec352bd0a833537a3bc1bfb679944c4938ab375b0a6b3a3e/scipy-1.15.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", size = 22383115, upload-time = "2025-05-08T16:07:08.998Z" }, + { url = "https://files.pythonhosted.org/packages/08/f5/456f56bbbfccf696263b47095291040655e3cbaf05d063bdc7c7517f32ac/scipy-1.15.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", size = 25163884, upload-time = "2025-05-08T16:07:14.091Z" }, + { url = "https://files.pythonhosted.org/packages/a2/66/a9618b6a435a0f0c0b8a6d0a2efb32d4ec5a85f023c2b79d39512040355b/scipy-1.15.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", size = 35174018, upload-time = "2025-05-08T16:07:19.427Z" }, + { url = "https://files.pythonhosted.org/packages/b5/09/c5b6734a50ad4882432b6bb7c02baf757f5b2f256041da5df242e2d7e6b6/scipy-1.15.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", size = 37269716, upload-time = "2025-05-08T16:07:25.712Z" }, + { url = "https://files.pythonhosted.org/packages/77/0a/eac00ff741f23bcabd352731ed9b8995a0a60ef57f5fd788d611d43d69a1/scipy-1.15.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", size = 36872342, upload-time = "2025-05-08T16:07:31.468Z" }, + { url = "https://files.pythonhosted.org/packages/fe/54/4379be86dd74b6ad81551689107360d9a3e18f24d20767a2d5b9253a3f0a/scipy-1.15.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126", size = 39670869, upload-time = "2025-05-08T16:07:38.002Z" }, + { url = "https://files.pythonhosted.org/packages/87/2e/892ad2862ba54f084ffe8cc4a22667eaf9c2bcec6d2bff1d15713c6c0703/scipy-1.15.3-cp313-cp313-win_amd64.whl", hash = "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163", size = 40988851, upload-time = "2025-05-08T16:08:33.671Z" }, + { url = "https://files.pythonhosted.org/packages/1b/e9/7a879c137f7e55b30d75d90ce3eb468197646bc7b443ac036ae3fe109055/scipy-1.15.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", size = 38863011, upload-time = "2025-05-08T16:07:44.039Z" }, + { url = "https://files.pythonhosted.org/packages/51/d1/226a806bbd69f62ce5ef5f3ffadc35286e9fbc802f606a07eb83bf2359de/scipy-1.15.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", size = 30266407, upload-time = "2025-05-08T16:07:49.891Z" }, + { url = "https://files.pythonhosted.org/packages/e5/9b/f32d1d6093ab9eeabbd839b0f7619c62e46cc4b7b6dbf05b6e615bbd4400/scipy-1.15.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", size = 22540030, upload-time = "2025-05-08T16:07:54.121Z" }, + { url = "https://files.pythonhosted.org/packages/e7/29/c278f699b095c1a884f29fda126340fcc201461ee8bfea5c8bdb1c7c958b/scipy-1.15.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", size = 25218709, upload-time = "2025-05-08T16:07:58.506Z" }, + { url = "https://files.pythonhosted.org/packages/24/18/9e5374b617aba742a990581373cd6b68a2945d65cc588482749ef2e64467/scipy-1.15.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", size = 34809045, upload-time = "2025-05-08T16:08:03.929Z" }, + { url = "https://files.pythonhosted.org/packages/e1/fe/9c4361e7ba2927074360856db6135ef4904d505e9b3afbbcb073c4008328/scipy-1.15.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", size = 36703062, upload-time = "2025-05-08T16:08:09.558Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8e/038ccfe29d272b30086b25a4960f757f97122cb2ec42e62b460d02fe98e9/scipy-1.15.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", size = 36393132, upload-time = "2025-05-08T16:08:15.34Z" }, + { url = "https://files.pythonhosted.org/packages/10/7e/5c12285452970be5bdbe8352c619250b97ebf7917d7a9a9e96b8a8140f17/scipy-1.15.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", size = 38979503, upload-time = "2025-05-08T16:08:21.513Z" }, + { url = "https://files.pythonhosted.org/packages/81/06/0a5e5349474e1cbc5757975b21bd4fad0e72ebf138c5592f191646154e06/scipy-1.15.3-cp313-cp313t-win_amd64.whl", hash = "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca", size = 40308097, upload-time = "2025-05-08T16:08:27.627Z" }, ] [[package]] @@ -5390,68 +5386,68 @@ resolution-markers = [ dependencies = [ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", upload-time = "2026-02-23T00:26:24.851Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec", upload-time = "2026-02-23T00:16:00.13Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696", upload-time = "2026-02-23T00:16:09.456Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee", upload-time = "2026-02-23T00:16:17.358Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd", upload-time = "2026-02-23T00:16:25.791Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4d/60/8804678875fc59362b0fb759ab3ecce1f09c10a735680318ac30da8cd76b/scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c", upload-time = "2026-02-23T00:16:36.931Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4", upload-time = "2026-02-23T00:16:49.108Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b4/3d/7ccbbdcbb54c8fdc20d3b6930137c782a163fa626f0aef920349873421ba/scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444", upload-time = "2026-02-23T00:17:01.293Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e8/19/f926cb11c42b15ba08e3a71e376d816ac08614f769b4f47e06c3580c836a/scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082", upload-time = "2026-02-23T00:17:12.576Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff", upload-time = "2026-02-23T00:17:23.424Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/68/7f/bdd79ceaad24b671543ffe0ef61ed8e659440eb683b66f033454dcee90eb/scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d", upload-time = "2026-02-23T00:17:34.561Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/35/48/b992b488d6f299dbe3f11a20b24d3dda3d46f1a635ede1c46b5b17a7b163/scipy-1.17.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:35c3a56d2ef83efc372eaec584314bd0ef2e2f0d2adb21c55e6ad5b344c0dcb8", upload-time = "2026-02-23T00:17:49.855Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/02/cf107b01494c19dc100f1d0b7ac3cc08666e96ba2d64db7626066cee895e/scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76", upload-time = "2026-02-23T00:18:01.64Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/a9/599c28631bad314d219cf9ffd40e985b24d603fc8a2f4ccc5ae8419a535b/scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086", upload-time = "2026-02-23T00:18:12.015Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/35/f5/906eda513271c8deb5af284e5ef0206d17a96239af79f9fa0aebfe0e36b4/scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b", upload-time = "2026-02-23T00:18:21.502Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/da/34/16f10e3042d2f1d6b66e0428308ab52224b6a23049cb2f5c1756f713815f/scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21", upload-time = "2026-02-23T00:18:35.367Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458", upload-time = "2026-02-23T00:18:49.188Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c5/5c/9d7f4c88bea6e0d5a4f1bc0506a53a00e9fcb198de372bfe4d3652cef482/scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb", upload-time = "2026-02-23T00:18:54.74Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/65/94/7698add8f276dbab7a9de9fb6b0e02fc13ee61d51c7c3f85ac28b65e1239/scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea", upload-time = "2026-02-23T00:19:00.307Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a2/84/dc08d77fbf3d87d3ee27f6a0c6dcce1de5829a64f2eae85a0ecc1f0daa73/scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87", upload-time = "2026-02-23T00:19:07.67Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/98/fe9ae9ffb3b54b62559f52dedaebe204b408db8109a8c66fdd04869e6424/scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3", upload-time = "2026-02-23T00:19:12.024Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c", upload-time = "2026-02-23T00:19:17.192Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f", upload-time = "2026-02-23T00:19:22.241Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5b/58/3ce96251560107b381cbd6e8413c483bbb1228a6b919fa8652b0d4090e7f/scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d", upload-time = "2026-02-23T00:19:26.329Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/83/15087d945e0e4d48ce2377498abf5ad171ae013232ae31d06f336e64c999/scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b", upload-time = "2026-02-23T00:19:30.304Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b4/e0/e58fbde4a1a594c8be8114eb4aac1a55bcd6587047efc18a61eb1f5c0d30/scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6", upload-time = "2026-02-23T00:19:35.536Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464", upload-time = "2026-02-23T00:19:42.259Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8d/a5/9afd17de24f657fdfe4df9a3f1ea049b39aef7c06000c13db1530d81ccca/scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950", upload-time = "2026-02-23T00:19:47.547Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/13/88b1d2384b424bf7c924f2038c1c409f8d88bb2a8d49d097861dd64a57b2/scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369", upload-time = "2026-02-23T00:19:53.238Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448", upload-time = "2026-02-23T00:20:50.89Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/fd/3be73c564e2a01e690e19cc618811540ba5354c67c8680dce3281123fb79/scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87", upload-time = "2026-02-23T00:20:55.871Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/6b/17787db8b8114933a66f9dcc479a8272e4b4da75fe03b0c282f7b0ade8cd/scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a", upload-time = "2026-02-23T00:19:58.694Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/38/2e/524405c2b6392765ab1e2b722a41d5da33dc5c7b7278184a8ad29b6cb206/scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0", upload-time = "2026-02-23T00:20:03.934Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/c3/5bd7199f4ea8556c0c8e39f04ccb014ac37d1468e6cfa6a95c6b3562b76e/scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce", upload-time = "2026-02-23T00:20:07.935Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d9/b8/8ccd9b766ad14c78386599708eb745f6b44f08400a5fd0ade7cf89b6fc93/scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6", upload-time = "2026-02-23T00:20:12.161Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/a0/3cb6f4d2fb3e17428ad2880333cac878909ad1a89f678527b5328b93c1d4/scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e", upload-time = "2026-02-23T00:20:17.208Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f3/c3/2d834a5ac7bf3a0c806ad1508efc02dda3c8c61472a56132d7894c312dea/scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475", upload-time = "2026-02-23T00:20:23.087Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4d/77/d3ed4becfdbd217c52062fafe35a72388d1bd82c2d0ba5ca19d6fcc93e11/scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50", upload-time = "2026-02-23T00:20:28.636Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bd/12/d19da97efde68ca1ee5538bb261d5d2c062f0c055575128f11a2730e3ac1/scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca", upload-time = "2026-02-23T00:20:34.743Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/06/1c/1172a88d507a4baaf72c5a09bb6c018fe2ae0ab622e5830b703a46cc9e44/scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c", upload-time = "2026-02-23T00:20:40.575Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/70/b0/eb757336e5a76dfa7911f63252e3b7d1de00935d7705cf772db5b45ec238/scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49", upload-time = "2026-02-23T00:20:45.313Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717", upload-time = "2026-02-23T00:21:01.015Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9", upload-time = "2026-02-23T00:21:05.888Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/db/7b/8624a203326675d7746a254083a187398090a179335b2e4a20e2ddc46e83/scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b", upload-time = "2026-02-23T00:21:09.904Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c9/35/2c342897c00775d688d8ff3987aced3426858fd89d5a0e26e020b660b301/scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866", upload-time = "2026-02-23T00:21:14.313Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ef/f2/7cdb8eb308a1a6ae1e19f945913c82c23c0c442a462a46480ce487fdc0ac/scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350", upload-time = "2026-02-23T00:21:19.663Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118", upload-time = "2026-02-23T00:21:25.278Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d9/77/5b8509d03b77f093a0d52e606d3c4f79e8b06d1d38c441dacb1e26cacf46/scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068", upload-time = "2026-02-23T00:21:31.358Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/df/18f80fb99df40b4070328d5ae5c596f2f00fffb50167e31439e932f29e7d/scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118", upload-time = "2026-02-23T00:21:37.247Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19", upload-time = "2026-02-23T00:22:35.023Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7c/56/fe201e3b0f93d1a8bcf75d3379affd228a63d7e2d80ab45467a74b494947/scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293", upload-time = "2026-02-23T00:22:39.798Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/96/ad/f8c414e121f82e02d76f310f16db9899c4fcde36710329502a6b2a3c0392/scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6", upload-time = "2026-02-23T00:21:42.289Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7c/b0/c741e8865d61b67c81e255f4f0a832846c064e426636cd7de84e74d209be/scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1", upload-time = "2026-02-23T00:21:47.706Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ed/1b/3985219c6177866628fa7c2595bfd23f193ceebbe472c98a08824b9466ff/scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39", upload-time = "2026-02-23T00:21:52.039Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/19/2a04aa25050d656d6f7b9e7b685cc83d6957fb101665bfd9369ca6534563/scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca", upload-time = "2026-02-23T00:21:56.185Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/f1/3383beb9b5d0dbddd030335bf8a8b32d4317185efe495374f134d8be6cce/scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad", upload-time = "2026-02-23T00:22:01.404Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/41/68/8f21e8a65a5a03f25a79165ec9d2b28c00e66dc80546cf5eb803aeeff35b/scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a", upload-time = "2026-02-23T00:22:07.024Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/84/8d/c8a5e19479554007a5632ed7529e665c315ae7492b4f946b0deb39870e39/scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4", upload-time = "2026-02-23T00:22:12.585Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/52/52/e57eceff0e342a1f50e274264ed47497b59e6a4e3118808ee58ddda7b74a/scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2", upload-time = "2026-02-23T00:22:18.513Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/11/2f/b29eafe4a3fbc3d6de9662b36e028d5f039e72d345e05c250e121a230dd4/scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484", upload-time = "2026-02-23T00:22:24.442Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", upload-time = "2026-02-23T00:22:29.563Z" }, +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" }, + { url = "https://files.pythonhosted.org/packages/76/27/07ee1b57b65e92645f219b37148a7e7928b82e2b5dbeccecb4dff7c64f0b/scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c", size = 31590199, upload-time = "2026-02-23T00:19:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/ec/ae/db19f8ab842e9b724bf5dbb7db29302a91f1e55bc4d04b1025d6d605a2c5/scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f", size = 28154001, upload-time = "2026-02-23T00:19:22.241Z" }, + { url = "https://files.pythonhosted.org/packages/5b/58/3ce96251560107b381cbd6e8413c483bbb1228a6b919fa8652b0d4090e7f/scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d", size = 20325719, upload-time = "2026-02-23T00:19:26.329Z" }, + { url = "https://files.pythonhosted.org/packages/b2/83/15087d945e0e4d48ce2377498abf5ad171ae013232ae31d06f336e64c999/scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b", size = 22683595, upload-time = "2026-02-23T00:19:30.304Z" }, + { url = "https://files.pythonhosted.org/packages/b4/e0/e58fbde4a1a594c8be8114eb4aac1a55bcd6587047efc18a61eb1f5c0d30/scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6", size = 32896429, upload-time = "2026-02-23T00:19:35.536Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5f/f17563f28ff03c7b6799c50d01d5d856a1d55f2676f537ca8d28c7f627cd/scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464", size = 35203952, upload-time = "2026-02-23T00:19:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a5/9afd17de24f657fdfe4df9a3f1ea049b39aef7c06000c13db1530d81ccca/scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950", size = 34979063, upload-time = "2026-02-23T00:19:47.547Z" }, + { url = "https://files.pythonhosted.org/packages/8b/13/88b1d2384b424bf7c924f2038c1c409f8d88bb2a8d49d097861dd64a57b2/scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369", size = 37598449, upload-time = "2026-02-23T00:19:53.238Z" }, + { url = "https://files.pythonhosted.org/packages/35/e5/d6d0e51fc888f692a35134336866341c08655d92614f492c6860dc45bb2c/scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448", size = 36510943, upload-time = "2026-02-23T00:20:50.89Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fd/3be73c564e2a01e690e19cc618811540ba5354c67c8680dce3281123fb79/scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87", size = 24545621, upload-time = "2026-02-23T00:20:55.871Z" }, + { url = "https://files.pythonhosted.org/packages/6f/6b/17787db8b8114933a66f9dcc479a8272e4b4da75fe03b0c282f7b0ade8cd/scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a", size = 31936708, upload-time = "2026-02-23T00:19:58.694Z" }, + { url = "https://files.pythonhosted.org/packages/38/2e/524405c2b6392765ab1e2b722a41d5da33dc5c7b7278184a8ad29b6cb206/scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0", size = 28570135, upload-time = "2026-02-23T00:20:03.934Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c3/5bd7199f4ea8556c0c8e39f04ccb014ac37d1468e6cfa6a95c6b3562b76e/scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce", size = 20741977, upload-time = "2026-02-23T00:20:07.935Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b8/8ccd9b766ad14c78386599708eb745f6b44f08400a5fd0ade7cf89b6fc93/scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6", size = 23029601, upload-time = "2026-02-23T00:20:12.161Z" }, + { url = "https://files.pythonhosted.org/packages/6d/a0/3cb6f4d2fb3e17428ad2880333cac878909ad1a89f678527b5328b93c1d4/scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e", size = 33019667, upload-time = "2026-02-23T00:20:17.208Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c3/2d834a5ac7bf3a0c806ad1508efc02dda3c8c61472a56132d7894c312dea/scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475", size = 35264159, upload-time = "2026-02-23T00:20:23.087Z" }, + { url = "https://files.pythonhosted.org/packages/4d/77/d3ed4becfdbd217c52062fafe35a72388d1bd82c2d0ba5ca19d6fcc93e11/scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50", size = 35102771, upload-time = "2026-02-23T00:20:28.636Z" }, + { url = "https://files.pythonhosted.org/packages/bd/12/d19da97efde68ca1ee5538bb261d5d2c062f0c055575128f11a2730e3ac1/scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca", size = 37665910, upload-time = "2026-02-23T00:20:34.743Z" }, + { url = "https://files.pythonhosted.org/packages/06/1c/1172a88d507a4baaf72c5a09bb6c018fe2ae0ab622e5830b703a46cc9e44/scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c", size = 36562980, upload-time = "2026-02-23T00:20:40.575Z" }, + { url = "https://files.pythonhosted.org/packages/70/b0/eb757336e5a76dfa7911f63252e3b7d1de00935d7705cf772db5b45ec238/scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49", size = 24856543, upload-time = "2026-02-23T00:20:45.313Z" }, + { url = "https://files.pythonhosted.org/packages/cf/83/333afb452af6f0fd70414dc04f898647ee1423979ce02efa75c3b0f2c28e/scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717", size = 31584510, upload-time = "2026-02-23T00:21:01.015Z" }, + { url = "https://files.pythonhosted.org/packages/ed/a6/d05a85fd51daeb2e4ea71d102f15b34fedca8e931af02594193ae4fd25f7/scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9", size = 28170131, upload-time = "2026-02-23T00:21:05.888Z" }, + { url = "https://files.pythonhosted.org/packages/db/7b/8624a203326675d7746a254083a187398090a179335b2e4a20e2ddc46e83/scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b", size = 20342032, upload-time = "2026-02-23T00:21:09.904Z" }, + { url = "https://files.pythonhosted.org/packages/c9/35/2c342897c00775d688d8ff3987aced3426858fd89d5a0e26e020b660b301/scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866", size = 22678766, upload-time = "2026-02-23T00:21:14.313Z" }, + { url = "https://files.pythonhosted.org/packages/ef/f2/7cdb8eb308a1a6ae1e19f945913c82c23c0c442a462a46480ce487fdc0ac/scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350", size = 32957007, upload-time = "2026-02-23T00:21:19.663Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2e/7eea398450457ecb54e18e9d10110993fa65561c4f3add5e8eccd2b9cd41/scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118", size = 35221333, upload-time = "2026-02-23T00:21:25.278Z" }, + { url = "https://files.pythonhosted.org/packages/d9/77/5b8509d03b77f093a0d52e606d3c4f79e8b06d1d38c441dacb1e26cacf46/scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068", size = 35042066, upload-time = "2026-02-23T00:21:31.358Z" }, + { url = "https://files.pythonhosted.org/packages/f9/df/18f80fb99df40b4070328d5ae5c596f2f00fffb50167e31439e932f29e7d/scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118", size = 37612763, upload-time = "2026-02-23T00:21:37.247Z" }, + { url = "https://files.pythonhosted.org/packages/4b/39/f0e8ea762a764a9dc52aa7dabcfad51a354819de1f0d4652b6a1122424d6/scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19", size = 37290984, upload-time = "2026-02-23T00:22:35.023Z" }, + { url = "https://files.pythonhosted.org/packages/7c/56/fe201e3b0f93d1a8bcf75d3379affd228a63d7e2d80ab45467a74b494947/scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293", size = 25192877, upload-time = "2026-02-23T00:22:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/96/ad/f8c414e121f82e02d76f310f16db9899c4fcde36710329502a6b2a3c0392/scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6", size = 31949750, upload-time = "2026-02-23T00:21:42.289Z" }, + { url = "https://files.pythonhosted.org/packages/7c/b0/c741e8865d61b67c81e255f4f0a832846c064e426636cd7de84e74d209be/scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1", size = 28585858, upload-time = "2026-02-23T00:21:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1b/3985219c6177866628fa7c2595bfd23f193ceebbe472c98a08824b9466ff/scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39", size = 20757723, upload-time = "2026-02-23T00:21:52.039Z" }, + { url = "https://files.pythonhosted.org/packages/c0/19/2a04aa25050d656d6f7b9e7b685cc83d6957fb101665bfd9369ca6534563/scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca", size = 23043098, upload-time = "2026-02-23T00:21:56.185Z" }, + { url = "https://files.pythonhosted.org/packages/86/f1/3383beb9b5d0dbddd030335bf8a8b32d4317185efe495374f134d8be6cce/scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad", size = 33030397, upload-time = "2026-02-23T00:22:01.404Z" }, + { url = "https://files.pythonhosted.org/packages/41/68/8f21e8a65a5a03f25a79165ec9d2b28c00e66dc80546cf5eb803aeeff35b/scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a", size = 35281163, upload-time = "2026-02-23T00:22:07.024Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/c8a5e19479554007a5632ed7529e665c315ae7492b4f946b0deb39870e39/scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4", size = 35116291, upload-time = "2026-02-23T00:22:12.585Z" }, + { url = "https://files.pythonhosted.org/packages/52/52/e57eceff0e342a1f50e274264ed47497b59e6a4e3118808ee58ddda7b74a/scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2", size = 37682317, upload-time = "2026-02-23T00:22:18.513Z" }, + { url = "https://files.pythonhosted.org/packages/11/2f/b29eafe4a3fbc3d6de9662b36e028d5f039e72d345e05c250e121a230dd4/scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484", size = 37345327, upload-time = "2026-02-23T00:22:24.442Z" }, + { url = "https://files.pythonhosted.org/packages/07/39/338d9219c4e87f3e708f18857ecd24d22a0c3094752393319553096b98af/scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21", size = 25489165, upload-time = "2026-02-23T00:22:29.563Z" }, ] [[package]] @@ -5462,9 +5458,9 @@ dependencies = [ { name = "cryptography" }, { name = "jeepney" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", upload-time = "2025-11-23T19:02:53.191Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", upload-time = "2025-11-23T19:02:51.545Z" }, + { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] [[package]] @@ -5484,36 +5480,36 @@ dependencies = [ { name = "transformers" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/4d/68/7f98c221940ce783b492ad6140384daf2e2918cd7175009d6a362c22b9ee/sentence_transformers-5.4.1.tar.gz", hash = "sha256:436bcb1182a0ff42a8fb2b1c43498a70d0a75b688d182f2cd0d1dd115af61ddc", upload-time = "2026-04-14T13:34:59.006Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/68/7f98c221940ce783b492ad6140384daf2e2918cd7175009d6a362c22b9ee/sentence_transformers-5.4.1.tar.gz", hash = "sha256:436bcb1182a0ff42a8fb2b1c43498a70d0a75b688d182f2cd0d1dd115af61ddc", size = 428910, upload-time = "2026-04-14T13:34:59.006Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c5/d9/3a9b6f2ccdedc9dc00fe37b2fc58f58f8efbff44565cf4bf39d8568bb13a/sentence_transformers-5.4.1-py3-none-any.whl", hash = "sha256:a6d640fc363849b63affb8e140e9d328feabab86f83d58ac3e16b1c28140b790", upload-time = "2026-04-14T13:34:57.731Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d9/3a9b6f2ccdedc9dc00fe37b2fc58f58f8efbff44565cf4bf39d8568bb13a/sentence_transformers-5.4.1-py3-none-any.whl", hash = "sha256:a6d640fc363849b63affb8e140e9d328feabab86f83d58ac3e16b1c28140b790", size = 571311, upload-time = "2026-04-14T13:34:57.731Z" }, ] [[package]] name = "setuptools" version = "81.0.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/0d/1c/73e719955c59b8e424d015ab450f51c0af856ae46ea2da83eba51cc88de1/setuptools-81.0.0.tar.gz", hash = "sha256:487b53915f52501f0a79ccfd0c02c165ffe06631443a886740b91af4b7a5845a", upload-time = "2026-02-06T21:10:39.601Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/1c/73e719955c59b8e424d015ab450f51c0af856ae46ea2da83eba51cc88de1/setuptools-81.0.0.tar.gz", hash = "sha256:487b53915f52501f0a79ccfd0c02c165ffe06631443a886740b91af4b7a5845a", size = 1198299, upload-time = "2026-02-06T21:10:39.601Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/e1/e3/c164c88b2e5ce7b24d667b9bd83589cf4f3520d97cad01534cd3c4f55fdb/setuptools-81.0.0-py3-none-any.whl", hash = "sha256:fdd925d5c5d9f62e4b74b30d6dd7828ce236fd6ed998a08d81de62ce5a6310d6", upload-time = "2026-02-06T21:10:37.175Z" }, + { url = "https://files.pythonhosted.org/packages/e1/e3/c164c88b2e5ce7b24d667b9bd83589cf4f3520d97cad01534cd3c4f55fdb/setuptools-81.0.0-py3-none-any.whl", hash = "sha256:fdd925d5c5d9f62e4b74b30d6dd7828ce236fd6ed998a08d81de62ce5a6310d6", size = 1062021, upload-time = "2026-02-06T21:10:37.175Z" }, ] [[package]] name = "shellingham" version = "1.5.4" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", upload-time = "2023-10-24T04:13:40.426Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", upload-time = "2023-10-24T04:13:38.866Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, ] [[package]] name = "six" version = "1.17.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", upload-time = "2024-12-04T17:35:28.174Z" } +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://pypi-proxy.dev.databricks.com/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", upload-time = "2024-12-04T17:35:26.475Z" }, + { 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]] @@ -5530,36 +5526,36 @@ dependencies = [ { name = "scipy", version = "1.15.3", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version < '3.11'" }, { name = "scipy", version = "1.17.1", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version >= '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b5/0c/5ec987633e077dd0076178ea6ade2d6e57780b34afea0b497fb507d7a1ed/skops-0.13.0.tar.gz", hash = "sha256:66949fd3c95cbb5c80270fbe40293c0fe1e46cb4a921860e42584dd9c20ebeb1", upload-time = "2025-08-06T09:48:14.916Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/0c/5ec987633e077dd0076178ea6ade2d6e57780b34afea0b497fb507d7a1ed/skops-0.13.0.tar.gz", hash = "sha256:66949fd3c95cbb5c80270fbe40293c0fe1e46cb4a921860e42584dd9c20ebeb1", size = 581312, upload-time = "2025-08-06T09:48:14.916Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/04/e8/6a2b2030f0689f894432b9c2f0357f2f3286b2a00474827e04b8fe9eea13/skops-0.13.0-py3-none-any.whl", hash = "sha256:55e2cccb18c86f5916e4cfe5acf55ed7b0eecddf08a151906414c092fa5926dc", upload-time = "2025-08-06T09:48:13.356Z" }, + { url = "https://files.pythonhosted.org/packages/04/e8/6a2b2030f0689f894432b9c2f0357f2f3286b2a00474827e04b8fe9eea13/skops-0.13.0-py3-none-any.whl", hash = "sha256:55e2cccb18c86f5916e4cfe5acf55ed7b0eecddf08a151906414c092fa5926dc", size = 131200, upload-time = "2025-08-06T09:48:13.356Z" }, ] [[package]] name = "smmap" version = "5.0.2" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", upload-time = "2025-01-02T07:14:40.909Z" } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329, upload-time = "2025-01-02T07:14:40.909Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", upload-time = "2025-01-02T07:14:38.724Z" }, + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303, upload-time = "2025-01-02T07:14:38.724Z" }, ] [[package]] name = "snowballstemmer" version = "3.0.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", upload-time = "2025-05-09T16:34:51.843Z" } +sdist = { url = "https://files.pythonhosted.org/packages/75/a7/9810d872919697c9d01295633f5d574fb416d47e535f258272ca1f01f447/snowballstemmer-3.0.1.tar.gz", hash = "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895", size = 105575, upload-time = "2025-05-09T16:34:51.843Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", upload-time = "2025-05-09T16:34:50.371Z" }, + { url = "https://files.pythonhosted.org/packages/c8/78/3565d011c61f5a43488987ee32b6f3f656e7f107ac2782dd57bdd7d91d9a/snowballstemmer-3.0.1-py3-none-any.whl", hash = "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", size = 103274, upload-time = "2025-05-09T16:34:50.371Z" }, ] [[package]] name = "sortedcontainers" version = "2.4.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", upload-time = "2021-05-16T22:03:42.897Z" } +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://pypi-proxy.dev.databricks.com/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", upload-time = "2021-05-16T22:03:41.177Z" }, + { 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]] @@ -5588,9 +5584,9 @@ dependencies = [ { name = "sphinxcontrib-serializinghtml", marker = "python_full_version < '3.11'" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", upload-time = "2024-10-13T20:27:13.93Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/be0b61178fe2cdcb67e2a92fc9ebb488e3c51c4f74a36a7824c0adf23425/sphinx-8.1.3.tar.gz", hash = "sha256:43c1911eecb0d3e161ad78611bc905d1ad0e523e4ddc202a58a821773dc4c927", size = 8184611, upload-time = "2024-10-13T20:27:13.93Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", upload-time = "2024-10-13T20:27:10.448Z" }, + { url = "https://files.pythonhosted.org/packages/26/60/1ddff83a56d33aaf6f10ec8ce84b4c007d9368b21008876fceda7e7381ef/sphinx-8.1.3-py3-none-any.whl", hash = "sha256:09719015511837b76bf6e03e42eb7595ac8c2e41eeb9c29c5b755c6b677992a2", size = 3487125, upload-time = "2024-10-13T20:27:10.448Z" }, ] [[package]] @@ -5619,9 +5615,9 @@ dependencies = [ { name = "sphinxcontrib-qthelp", marker = "python_full_version == '3.11.*'" }, { name = "sphinxcontrib-serializinghtml", marker = "python_full_version == '3.11.*'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", upload-time = "2025-12-04T07:45:27.343Z" } +sdist = { url = "https://files.pythonhosted.org/packages/42/50/a8c6ccc36d5eacdfd7913ddccd15a9cee03ecafc5ee2bc40e1f168d85022/sphinx-9.0.4.tar.gz", hash = "sha256:594ef59d042972abbc581d8baa577404abe4e6c3b04ef61bd7fc2acbd51f3fa3", size = 8710502, upload-time = "2025-12-04T07:45:27.343Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c6/3f/4bbd76424c393caead2e1eb89777f575dee5c8653e2d4b6afd7a564f5974/sphinx-9.0.4-py3-none-any.whl", hash = "sha256:5bebc595a5e943ea248b99c13814c1c5e10b3ece718976824ffa7959ff95fffb", upload-time = "2025-12-04T07:45:24.944Z" }, + { url = "https://files.pythonhosted.org/packages/c6/3f/4bbd76424c393caead2e1eb89777f575dee5c8653e2d4b6afd7a564f5974/sphinx-9.0.4-py3-none-any.whl", hash = "sha256:5bebc595a5e943ea248b99c13814c1c5e10b3ece718976824ffa7959ff95fffb", size = 3917713, upload-time = "2025-12-04T07:45:24.944Z" }, ] [[package]] @@ -5653,63 +5649,63 @@ dependencies = [ { name = "sphinxcontrib-qthelp", marker = "python_full_version >= '3.12'" }, { name = "sphinxcontrib-serializinghtml", marker = "python_full_version >= '3.12'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", upload-time = "2025-12-31T15:09:27.646Z" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz", hash = "sha256:7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb", size = 8718324, upload-time = "2025-12-31T15:09:27.646Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/73/f7/b1884cb3188ab181fc81fa00c266699dab600f927a964df02ec3d5d1916a/sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978", upload-time = "2025-12-31T15:09:25.561Z" }, + { url = "https://files.pythonhosted.org/packages/73/f7/b1884cb3188ab181fc81fa00c266699dab600f927a964df02ec3d5d1916a/sphinx-9.1.0-py3-none-any.whl", hash = "sha256:c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978", size = 3921742, upload-time = "2025-12-31T15:09:25.561Z" }, ] [[package]] name = "sphinxcontrib-applehelp" version = "2.0.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", upload-time = "2024-07-29T01:09:00.465Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz", hash = "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", size = 20053, upload-time = "2024-07-29T01:09:00.465Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", upload-time = "2024-07-29T01:08:58.99Z" }, + { url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl", hash = "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5", size = 119300, upload-time = "2024-07-29T01:08:58.99Z" }, ] [[package]] name = "sphinxcontrib-devhelp" version = "2.0.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", upload-time = "2024-07-29T01:09:23.417Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz", hash = "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", size = 12967, upload-time = "2024-07-29T01:09:23.417Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", upload-time = "2024-07-29T01:09:21.945Z" }, + { url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl", hash = "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2", size = 82530, upload-time = "2024-07-29T01:09:21.945Z" }, ] [[package]] name = "sphinxcontrib-htmlhelp" version = "2.1.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", upload-time = "2024-07-29T01:09:37.889Z" } +sdist = { url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz", hash = "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9", size = 22617, upload-time = "2024-07-29T01:09:37.889Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", upload-time = "2024-07-29T01:09:36.407Z" }, + { url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl", hash = "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", size = 98705, upload-time = "2024-07-29T01:09:36.407Z" }, ] [[package]] name = "sphinxcontrib-jsmath" version = "1.0.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", upload-time = "2019-01-21T16:10:16.347Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8", size = 5787, upload-time = "2019-01-21T16:10:16.347Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", upload-time = "2019-01-21T16:10:14.333Z" }, + { url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", size = 5071, upload-time = "2019-01-21T16:10:14.333Z" }, ] [[package]] name = "sphinxcontrib-qthelp" version = "2.0.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", upload-time = "2024-07-29T01:09:56.435Z" } +sdist = { url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz", hash = "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", size = 17165, upload-time = "2024-07-29T01:09:56.435Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", upload-time = "2024-07-29T01:09:54.885Z" }, + { url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl", hash = "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb", size = 88743, upload-time = "2024-07-29T01:09:54.885Z" }, ] [[package]] name = "sphinxcontrib-serializinghtml" version = "2.0.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", upload-time = "2024-07-29T01:10:09.332Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz", hash = "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d", size = 16080, upload-time = "2024-07-29T01:10:09.332Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", upload-time = "2024-07-29T01:10:08.203Z" }, + { url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl", hash = "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", size = 92072, upload-time = "2024-07-29T01:10:08.203Z" }, ] [[package]] @@ -5720,65 +5716,65 @@ 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://pypi-proxy.dev.databricks.com/packages/1f/73/b4a9737255583b5fa858e0bb8e116eb94b88c910164ed2ed719147bde3de/sqlalchemy-2.0.48.tar.gz", hash = "sha256:5ca74f37f3369b45e1f6b7b06afb182af1fd5dde009e4ffd831830d98cbe5fe7", upload-time = "2026-03-02T15:28:51.474Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/9a/67/1235676e93dd3b742a4a8eddfae49eea46c85e3eed29f0da446a8dd57500/sqlalchemy-2.0.48-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7001dc9d5f6bb4deb756d5928eaefe1930f6f4179da3924cbd95ee0e9f4dce89", upload-time = "2026-03-02T15:38:26.781Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4d/d7/fa728b856daa18c10e1390e76f26f64ac890c947008284387451d56ca3d0/sqlalchemy-2.0.48-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1a89ce07ad2d4b8cfc30bd5889ec40613e028ed80ef47da7d9dd2ce969ad30e0", upload-time = "2026-03-02T15:58:53.53Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5c/ad/6c4395649a212a6c603a72c5b9ab5dce3135a1546cfdffa3c427e71fd535/sqlalchemy-2.0.48-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10853a53a4a00417a00913d270dddda75815fcb80675874285f41051c094d7dd", upload-time = "2026-03-02T15:52:25.654Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/01/f4/58f845e511ac0509765a6f85eb24924c1ef0d54fb50de9d15b28c3601458/sqlalchemy-2.0.48-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fac0fa4e4f55f118fd87177dacb1c6522fe39c28d498d259014020fec9164c29", upload-time = "2026-03-02T15:58:55.193Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3f/f9/6dcc7bfa5f5794c3a095e78cd1de8269dfb5584dfd4c2c00a50d3c1ade44/sqlalchemy-2.0.48-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3713e21ea67bca727eecd4a24bf68bcd414c403faae4989442be60994301ded0", upload-time = "2026-03-02T15:52:27.407Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d7/5a/b632875ab35874d42657f079529f0745410604645c269a8c21fb4272ff7a/sqlalchemy-2.0.48-cp310-cp310-win32.whl", hash = "sha256:d404dc897ce10e565d647795861762aa2d06ca3f4a728c5e9a835096c7059018", upload-time = "2026-03-02T15:46:51.389Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/de/03/9752eb2a41afdd8568e41ac3c3128e32a0a73eada5ab80483083604a56d1/sqlalchemy-2.0.48-cp310-cp310-win_amd64.whl", hash = "sha256:841a94c66577661c1f088ac958cd767d7c9bf507698f45afffe7a4017049de76", upload-time = "2026-03-02T15:46:52.992Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d7/6d/b8b78b5b80f3c3ab3f7fa90faa195ec3401f6d884b60221260fd4d51864c/sqlalchemy-2.0.48-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b4c575df7368b3b13e0cebf01d4679f9a28ed2ae6c1cd0b1d5beffb6b2007dc", upload-time = "2026-03-02T15:38:28.161Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/21/4b/4f3d4a43743ab58b95b9ddf5580a265b593d017693df9e08bd55780af5bb/sqlalchemy-2.0.48-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e83e3f959aaa1c9df95c22c528096d94848a1bc819f5d0ebf7ee3df0ca63db6c", upload-time = "2026-03-02T15:58:57.21Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/21/dd/3b7c53f1dbbf736fd27041aee68f8ac52226b610f914085b1652c2323442/sqlalchemy-2.0.48-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f7b7243850edd0b8b97043f04748f31de50cf426e939def5c16bedb540698f7", upload-time = "2026-03-02T15:52:29.366Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d9/cc/3e600a90ae64047f33313d7d32e5ad025417f09d2ded487e8284b5e21a15/sqlalchemy-2.0.48-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:82745b03b4043e04600a6b665cb98697c4339b24e34d74b0a2ac0a2488b6f94d", upload-time = "2026-03-02T15:58:59.096Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/19/780138dacfe3f5024f4cf96e4005e91edf6653d53d3673be4844578faf1d/sqlalchemy-2.0.48-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e5e088bf43f6ee6fec7dbf1ef7ff7774a616c236b5c0cb3e00662dd71a56b571", upload-time = "2026-03-02T15:52:31.569Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/fd/f32ced124f01a23151f4777e4c705f3a470adc7bd241d9f36a7c941a33bf/sqlalchemy-2.0.48-cp311-cp311-win32.whl", hash = "sha256:9c7d0a77e36b5f4b01ca398482230ab792061d243d715299b44a0b55c89fe617", upload-time = "2026-03-02T15:46:54.535Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/d5/dd767277f6feef12d05651538f280277e661698f617fa4d086cce6055416/sqlalchemy-2.0.48-cp311-cp311-win_amd64.whl", hash = "sha256:583849c743e0e3c9bb7446f5b5addeacedc168d657a69b418063dfdb2d90081c", upload-time = "2026-03-02T15:46:55.849Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ef/91/a42ae716f8925e9659df2da21ba941f158686856107a61cc97a95e7647a3/sqlalchemy-2.0.48-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:348174f228b99f33ca1f773e85510e08927620caa59ffe7803b37170df30332b", upload-time = "2026-03-02T15:49:13.207Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b9/52/f75f516a1f3888f027c1cfb5d22d4376f4b46236f2e8669dcb0cddc60275/sqlalchemy-2.0.48-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53667b5f668991e279d21f94ccfa6e45b4e3f4500e7591ae59a8012d0f010dcb", upload-time = "2026-03-02T15:50:34.547Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/37/9a/0c28b6371e0cdcb14f8f1930778cb3123acfcbd2c95bb9cf6b4a2ba0cce3/sqlalchemy-2.0.48-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34634e196f620c7a61d18d5cf7dc841ca6daa7961aed75d532b7e58b309ac894", upload-time = "2026-03-02T15:53:25.542Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1c/46/0aee8f3ff20b1dcbceb46ca2d87fcc3d48b407925a383ff668218509d132/sqlalchemy-2.0.48-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:546572a1793cc35857a2ffa1fe0e58571af1779bcc1ffa7c9fb0839885ed69a9", upload-time = "2026-03-02T15:50:36.277Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ce/8c/a957bc91293b49181350bfd55e6dfc6e30b7f7d83dc6792d72043274a390/sqlalchemy-2.0.48-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:07edba08061bc277bfdc772dd2a1a43978f5a45994dd3ede26391b405c15221e", upload-time = "2026-03-02T15:53:27.519Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/44/1d257d9f9556661e7bdc83667cc414ba210acfc110c82938cb3611eea58f/sqlalchemy-2.0.48-cp312-cp312-win32.whl", hash = "sha256:908a3fa6908716f803b86896a09a2c4dde5f5ce2bb07aacc71ffebb57986ce99", upload-time = "2026-03-02T15:54:31.591Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/af/c3c7e1f3a2b383155a16454df62ae8c62a30dd238e42e68c24cebebbfae6/sqlalchemy-2.0.48-cp312-cp312-win_amd64.whl", hash = "sha256:68549c403f79a8e25984376480959975212a670405e3913830614432b5daa07a", upload-time = "2026-03-02T15:54:34.072Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/c6/569dc8bf3cd375abc5907e82235923e986799f301cd79a903f784b996fca/sqlalchemy-2.0.48-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e3070c03701037aa418b55d36532ecb8f8446ed0135acb71c678dbdf12f5b6e4", upload-time = "2026-03-02T15:49:14.41Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/ff/f4e04a4bd5a24304f38cb0d4aa2ad4c0fb34999f8b884c656535e1b2b74c/sqlalchemy-2.0.48-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2645b7d8a738763b664a12a1542c89c940daa55196e8d73e55b169cc5c99f65f", upload-time = "2026-03-02T15:50:38.269Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/88/cb59509e4668d8001818d7355d9995be90c321313078c912420603a7cb95/sqlalchemy-2.0.48-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b19151e76620a412c2ac1c6f977ab1b9fa7ad43140178345136456d5265b32ed", upload-time = "2026-03-02T15:53:29.366Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/87/dc/1609a4442aefd750ea2f32629559394ec92e89ac1d621a7f462b70f736ff/sqlalchemy-2.0.48-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b193a7e29fd9fa56e502920dca47dffe60f97c863494946bd698c6058a55658", upload-time = "2026-03-02T15:50:39.802Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/37/c3/6ae2ab5ea2fa989fbac4e674de01224b7a9d744becaf59bb967d62e99bed/sqlalchemy-2.0.48-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:36ac4ddc3d33e852da9cb00ffb08cea62ca05c39711dc67062ca2bb1fae35fd8", upload-time = "2026-03-02T15:53:31.421Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/82/ea4665d1bb98c50c19666e672f21b81356bd6077c4574e3d2bbb84541f53/sqlalchemy-2.0.48-cp313-cp313-win32.whl", hash = "sha256:389b984139278f97757ea9b08993e7b9d1142912e046ab7d82b3fbaeb0209131", upload-time = "2026-03-02T15:54:35.825Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/2b/b9040bec58c58225f073f5b0c1870defe1940835549dafec680cbd58c3c3/sqlalchemy-2.0.48-cp313-cp313-win_amd64.whl", hash = "sha256:d612c976cbc2d17edfcc4c006874b764e85e990c29ce9bd411f926bbfb02b9a2", upload-time = "2026-03-02T15:54:37.079Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f4/f4/7b17bd50244b78a49d22cc63c969d71dc4de54567dc152a9b46f6fae40ce/sqlalchemy-2.0.48-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69f5bc24904d3bc3640961cddd2523e361257ef68585d6e364166dfbe8c78fae", upload-time = "2026-03-02T15:57:48.607Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/20/0d/213668e9aca61d370f7d2a6449ea4ec699747fac67d4bda1bb3d129025be/sqlalchemy-2.0.48-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd08b90d211c086181caed76931ecfa2bdfc83eea3cfccdb0f82abc6c4b876cb", upload-time = "2026-03-02T16:04:38.058Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/85/d7/a84edf412979e7d59c69b89a5871f90a49228360594680e667cb2c46a828/sqlalchemy-2.0.48-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1ccd42229aaac2df431562117ac7e667d702e8e44afdb6cf0e50fa3f18160f0b", upload-time = "2026-03-02T15:57:50.759Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/55/42404ce5770f6be26a2b0607e7866c31b9a4176c819e9a7a5e0a055770be/sqlalchemy-2.0.48-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0dcbc588cd5b725162c076eb9119342f6579c7f7f55057bb7e3c6ff27e13121", upload-time = "2026-03-02T16:04:40.092Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ae/ae/29b87775fadc43e627cf582fe3bda4d02e300f6b8f2747c764950d13784c/sqlalchemy-2.0.48-cp313-cp313t-win32.whl", hash = "sha256:9764014ef5e58aab76220c5664abb5d47d5bc858d9debf821e55cfdd0f128485", upload-time = "2026-03-02T15:52:51.518Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/91/44/f39d063c90f2443e5b46ec4819abd3d8de653893aae92df42a5c4f5843de/sqlalchemy-2.0.48-cp313-cp313t-win_amd64.whl", hash = "sha256:e2f35b4cccd9ed286ad62e0a3c3ac21e06c02abc60e20aa51a3e305a30f5fa79", upload-time = "2026-03-02T15:52:52.79Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f7/b3/f437eaa1cf028bb3c927172c7272366393e73ccd104dcf5b6963f4ab5318/sqlalchemy-2.0.48-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e2d0d88686e3d35a76f3e15a34e8c12d73fc94c1dea1cd55782e695cc14086dd", upload-time = "2026-03-02T15:49:17.24Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6c/1c/b3abdf0f402aa3f60f0df6ea53d92a162b458fca2321d8f1f00278506402/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49b7bddc1eebf011ea5ab722fdbe67a401caa34a350d278cc7733c0e88fecb1f", upload-time = "2026-03-02T15:50:41.489Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:426c5ca86415d9b8945c7073597e10de9644802e2ff502b8e1f11a7a2642856b", upload-time = "2026-03-02T15:53:32.962Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/ca/ece73c81a918add0965b76b868b7b5359e068380b90ef1656ee995940c02/sqlalchemy-2.0.48-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:288937433bd44e3990e7da2402fabc44a3c6c25d3704da066b85b89a85474ae0", upload-time = "2026-03-02T15:50:42.996Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/88/11/fbaf1ae91fa4ee43f4fe79661cead6358644824419c26adb004941bdce7c/sqlalchemy-2.0.48-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8183dc57ae7d9edc1346e007e840a9f3d6aa7b7f165203a99e16f447150140d2", upload-time = "2026-03-02T15:53:34.937Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fa/a8/5fb0deb13930b4f2f698c5541ae076c18981173e27dd00376dbaea7a9c82/sqlalchemy-2.0.48-cp314-cp314-win32.whl", hash = "sha256:1182437cb2d97988cfea04cf6cdc0b0bb9c74f4d56ec3d08b81e23d621a28cc6", upload-time = "2026-03-02T15:54:38.321Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/95/7e/e83615cb63f80047f18e61e31e8e32257d39458426c23006deeaf48f463b/sqlalchemy-2.0.48-cp314-cp314-win_amd64.whl", hash = "sha256:144921da96c08feb9e2b052c5c5c1d0d151a292c6135623c6b2c041f2a45f9e0", upload-time = "2026-03-02T15:54:39.831Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/83/e3/69d8711b3f2c5135e9cde5f063bc1605860f0b2c53086d40c04017eb1f77/sqlalchemy-2.0.48-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5aee45fd2c6c0f2b9cdddf48c48535e7471e42d6fb81adfde801da0bd5b93241", upload-time = "2026-03-02T15:57:52.387Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/4f/a7cce98facca73c149ea4578981594aaa5fd841e956834931de503359336/sqlalchemy-2.0.48-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7cddca31edf8b0653090cbb54562ca027c421c58ddde2c0685f49ff56a1690e0", upload-time = "2026-03-02T16:04:42.097Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cd/7d/5936c7a03a0b0cb0fa0cc425998821c6029756b0855a8f7ee70fba1de955/sqlalchemy-2.0.48-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7a936f1bb23d370b7c8cc079d5fce4c7d18da87a33c6744e51a93b0f9e97e9b3", upload-time = "2026-03-02T15:57:54.423Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f4/33/cea7dfc31b52904efe3dcdc169eb4514078887dff1f5ae28a7f4c5d54b3c/sqlalchemy-2.0.48-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e004aa9248e8cb0a5f9b96d003ca7c1c0a5da8decd1066e7b53f59eb8ce7c62b", upload-time = "2026-03-02T16:04:44.584Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c8/95/32107c4d13be077a9cae61e9ae49966a35dc4bf442a8852dd871db31f62e/sqlalchemy-2.0.48-cp314-cp314t-win32.whl", hash = "sha256:b8438ec5594980d405251451c5b7ea9aa58dda38eb7ac35fb7e4c696712ee24f", upload-time = "2026-03-02T15:52:54.274Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/d7/1e073da7a4bc645eb83c76067284a0374e643bc4be57f14cc6414656f92c/sqlalchemy-2.0.48-cp314-cp314t-win_amd64.whl", hash = "sha256:d854b3970067297f3a7fbd7a4683587134aa9b3877ee15aa29eea478dc68f933", upload-time = "2026-03-02T15:52:55.606Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/46/2c/9664130905f03db57961b8980b05cab624afd114bf2be2576628a9f22da4/sqlalchemy-2.0.48-py3-none-any.whl", hash = "sha256:a66fe406437dd65cacd96a72689a3aaaecaebbcd62d81c5ac1c0fdbeac835096", upload-time = "2026-03-02T15:52:43.285Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/1f/73/b4a9737255583b5fa858e0bb8e116eb94b88c910164ed2ed719147bde3de/sqlalchemy-2.0.48.tar.gz", hash = "sha256:5ca74f37f3369b45e1f6b7b06afb182af1fd5dde009e4ffd831830d98cbe5fe7", size = 9886075, upload-time = "2026-03-02T15:28:51.474Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/67/1235676e93dd3b742a4a8eddfae49eea46c85e3eed29f0da446a8dd57500/sqlalchemy-2.0.48-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7001dc9d5f6bb4deb756d5928eaefe1930f6f4179da3924cbd95ee0e9f4dce89", size = 2157384, upload-time = "2026-03-02T15:38:26.781Z" }, + { url = "https://files.pythonhosted.org/packages/4d/d7/fa728b856daa18c10e1390e76f26f64ac890c947008284387451d56ca3d0/sqlalchemy-2.0.48-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1a89ce07ad2d4b8cfc30bd5889ec40613e028ed80ef47da7d9dd2ce969ad30e0", size = 3236981, upload-time = "2026-03-02T15:58:53.53Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ad/6c4395649a212a6c603a72c5b9ab5dce3135a1546cfdffa3c427e71fd535/sqlalchemy-2.0.48-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10853a53a4a00417a00913d270dddda75815fcb80675874285f41051c094d7dd", size = 3235232, upload-time = "2026-03-02T15:52:25.654Z" }, + { url = "https://files.pythonhosted.org/packages/01/f4/58f845e511ac0509765a6f85eb24924c1ef0d54fb50de9d15b28c3601458/sqlalchemy-2.0.48-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:fac0fa4e4f55f118fd87177dacb1c6522fe39c28d498d259014020fec9164c29", size = 3188106, upload-time = "2026-03-02T15:58:55.193Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f9/6dcc7bfa5f5794c3a095e78cd1de8269dfb5584dfd4c2c00a50d3c1ade44/sqlalchemy-2.0.48-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3713e21ea67bca727eecd4a24bf68bcd414c403faae4989442be60994301ded0", size = 3209522, upload-time = "2026-03-02T15:52:27.407Z" }, + { url = "https://files.pythonhosted.org/packages/d7/5a/b632875ab35874d42657f079529f0745410604645c269a8c21fb4272ff7a/sqlalchemy-2.0.48-cp310-cp310-win32.whl", hash = "sha256:d404dc897ce10e565d647795861762aa2d06ca3f4a728c5e9a835096c7059018", size = 2117695, upload-time = "2026-03-02T15:46:51.389Z" }, + { url = "https://files.pythonhosted.org/packages/de/03/9752eb2a41afdd8568e41ac3c3128e32a0a73eada5ab80483083604a56d1/sqlalchemy-2.0.48-cp310-cp310-win_amd64.whl", hash = "sha256:841a94c66577661c1f088ac958cd767d7c9bf507698f45afffe7a4017049de76", size = 2140928, upload-time = "2026-03-02T15:46:52.992Z" }, + { url = "https://files.pythonhosted.org/packages/d7/6d/b8b78b5b80f3c3ab3f7fa90faa195ec3401f6d884b60221260fd4d51864c/sqlalchemy-2.0.48-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b4c575df7368b3b13e0cebf01d4679f9a28ed2ae6c1cd0b1d5beffb6b2007dc", size = 2157184, upload-time = "2026-03-02T15:38:28.161Z" }, + { url = "https://files.pythonhosted.org/packages/21/4b/4f3d4a43743ab58b95b9ddf5580a265b593d017693df9e08bd55780af5bb/sqlalchemy-2.0.48-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e83e3f959aaa1c9df95c22c528096d94848a1bc819f5d0ebf7ee3df0ca63db6c", size = 3313555, upload-time = "2026-03-02T15:58:57.21Z" }, + { url = "https://files.pythonhosted.org/packages/21/dd/3b7c53f1dbbf736fd27041aee68f8ac52226b610f914085b1652c2323442/sqlalchemy-2.0.48-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f7b7243850edd0b8b97043f04748f31de50cf426e939def5c16bedb540698f7", size = 3313057, upload-time = "2026-03-02T15:52:29.366Z" }, + { url = "https://files.pythonhosted.org/packages/d9/cc/3e600a90ae64047f33313d7d32e5ad025417f09d2ded487e8284b5e21a15/sqlalchemy-2.0.48-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:82745b03b4043e04600a6b665cb98697c4339b24e34d74b0a2ac0a2488b6f94d", size = 3265431, upload-time = "2026-03-02T15:58:59.096Z" }, + { url = "https://files.pythonhosted.org/packages/8b/19/780138dacfe3f5024f4cf96e4005e91edf6653d53d3673be4844578faf1d/sqlalchemy-2.0.48-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e5e088bf43f6ee6fec7dbf1ef7ff7774a616c236b5c0cb3e00662dd71a56b571", size = 3287646, upload-time = "2026-03-02T15:52:31.569Z" }, + { url = "https://files.pythonhosted.org/packages/40/fd/f32ced124f01a23151f4777e4c705f3a470adc7bd241d9f36a7c941a33bf/sqlalchemy-2.0.48-cp311-cp311-win32.whl", hash = "sha256:9c7d0a77e36b5f4b01ca398482230ab792061d243d715299b44a0b55c89fe617", size = 2116956, upload-time = "2026-03-02T15:46:54.535Z" }, + { url = "https://files.pythonhosted.org/packages/58/d5/dd767277f6feef12d05651538f280277e661698f617fa4d086cce6055416/sqlalchemy-2.0.48-cp311-cp311-win_amd64.whl", hash = "sha256:583849c743e0e3c9bb7446f5b5addeacedc168d657a69b418063dfdb2d90081c", size = 2141627, upload-time = "2026-03-02T15:46:55.849Z" }, + { url = "https://files.pythonhosted.org/packages/ef/91/a42ae716f8925e9659df2da21ba941f158686856107a61cc97a95e7647a3/sqlalchemy-2.0.48-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:348174f228b99f33ca1f773e85510e08927620caa59ffe7803b37170df30332b", size = 2155737, upload-time = "2026-03-02T15:49:13.207Z" }, + { url = "https://files.pythonhosted.org/packages/b9/52/f75f516a1f3888f027c1cfb5d22d4376f4b46236f2e8669dcb0cddc60275/sqlalchemy-2.0.48-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53667b5f668991e279d21f94ccfa6e45b4e3f4500e7591ae59a8012d0f010dcb", size = 3337020, upload-time = "2026-03-02T15:50:34.547Z" }, + { url = "https://files.pythonhosted.org/packages/37/9a/0c28b6371e0cdcb14f8f1930778cb3123acfcbd2c95bb9cf6b4a2ba0cce3/sqlalchemy-2.0.48-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34634e196f620c7a61d18d5cf7dc841ca6daa7961aed75d532b7e58b309ac894", size = 3349983, upload-time = "2026-03-02T15:53:25.542Z" }, + { url = "https://files.pythonhosted.org/packages/1c/46/0aee8f3ff20b1dcbceb46ca2d87fcc3d48b407925a383ff668218509d132/sqlalchemy-2.0.48-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:546572a1793cc35857a2ffa1fe0e58571af1779bcc1ffa7c9fb0839885ed69a9", size = 3279690, upload-time = "2026-03-02T15:50:36.277Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8c/a957bc91293b49181350bfd55e6dfc6e30b7f7d83dc6792d72043274a390/sqlalchemy-2.0.48-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:07edba08061bc277bfdc772dd2a1a43978f5a45994dd3ede26391b405c15221e", size = 3314738, upload-time = "2026-03-02T15:53:27.519Z" }, + { url = "https://files.pythonhosted.org/packages/4b/44/1d257d9f9556661e7bdc83667cc414ba210acfc110c82938cb3611eea58f/sqlalchemy-2.0.48-cp312-cp312-win32.whl", hash = "sha256:908a3fa6908716f803b86896a09a2c4dde5f5ce2bb07aacc71ffebb57986ce99", size = 2115546, upload-time = "2026-03-02T15:54:31.591Z" }, + { url = "https://files.pythonhosted.org/packages/f2/af/c3c7e1f3a2b383155a16454df62ae8c62a30dd238e42e68c24cebebbfae6/sqlalchemy-2.0.48-cp312-cp312-win_amd64.whl", hash = "sha256:68549c403f79a8e25984376480959975212a670405e3913830614432b5daa07a", size = 2142484, upload-time = "2026-03-02T15:54:34.072Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c6/569dc8bf3cd375abc5907e82235923e986799f301cd79a903f784b996fca/sqlalchemy-2.0.48-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e3070c03701037aa418b55d36532ecb8f8446ed0135acb71c678dbdf12f5b6e4", size = 2152599, upload-time = "2026-03-02T15:49:14.41Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ff/f4e04a4bd5a24304f38cb0d4aa2ad4c0fb34999f8b884c656535e1b2b74c/sqlalchemy-2.0.48-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2645b7d8a738763b664a12a1542c89c940daa55196e8d73e55b169cc5c99f65f", size = 3278825, upload-time = "2026-03-02T15:50:38.269Z" }, + { url = "https://files.pythonhosted.org/packages/fe/88/cb59509e4668d8001818d7355d9995be90c321313078c912420603a7cb95/sqlalchemy-2.0.48-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b19151e76620a412c2ac1c6f977ab1b9fa7ad43140178345136456d5265b32ed", size = 3295200, upload-time = "2026-03-02T15:53:29.366Z" }, + { url = "https://files.pythonhosted.org/packages/87/dc/1609a4442aefd750ea2f32629559394ec92e89ac1d621a7f462b70f736ff/sqlalchemy-2.0.48-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5b193a7e29fd9fa56e502920dca47dffe60f97c863494946bd698c6058a55658", size = 3226876, upload-time = "2026-03-02T15:50:39.802Z" }, + { url = "https://files.pythonhosted.org/packages/37/c3/6ae2ab5ea2fa989fbac4e674de01224b7a9d744becaf59bb967d62e99bed/sqlalchemy-2.0.48-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:36ac4ddc3d33e852da9cb00ffb08cea62ca05c39711dc67062ca2bb1fae35fd8", size = 3265045, upload-time = "2026-03-02T15:53:31.421Z" }, + { url = "https://files.pythonhosted.org/packages/6f/82/ea4665d1bb98c50c19666e672f21b81356bd6077c4574e3d2bbb84541f53/sqlalchemy-2.0.48-cp313-cp313-win32.whl", hash = "sha256:389b984139278f97757ea9b08993e7b9d1142912e046ab7d82b3fbaeb0209131", size = 2113700, upload-time = "2026-03-02T15:54:35.825Z" }, + { url = "https://files.pythonhosted.org/packages/b7/2b/b9040bec58c58225f073f5b0c1870defe1940835549dafec680cbd58c3c3/sqlalchemy-2.0.48-cp313-cp313-win_amd64.whl", hash = "sha256:d612c976cbc2d17edfcc4c006874b764e85e990c29ce9bd411f926bbfb02b9a2", size = 2139487, upload-time = "2026-03-02T15:54:37.079Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/7b17bd50244b78a49d22cc63c969d71dc4de54567dc152a9b46f6fae40ce/sqlalchemy-2.0.48-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69f5bc24904d3bc3640961cddd2523e361257ef68585d6e364166dfbe8c78fae", size = 3558851, upload-time = "2026-03-02T15:57:48.607Z" }, + { url = "https://files.pythonhosted.org/packages/20/0d/213668e9aca61d370f7d2a6449ea4ec699747fac67d4bda1bb3d129025be/sqlalchemy-2.0.48-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd08b90d211c086181caed76931ecfa2bdfc83eea3cfccdb0f82abc6c4b876cb", size = 3525525, upload-time = "2026-03-02T16:04:38.058Z" }, + { url = "https://files.pythonhosted.org/packages/85/d7/a84edf412979e7d59c69b89a5871f90a49228360594680e667cb2c46a828/sqlalchemy-2.0.48-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:1ccd42229aaac2df431562117ac7e667d702e8e44afdb6cf0e50fa3f18160f0b", size = 3466611, upload-time = "2026-03-02T15:57:50.759Z" }, + { url = "https://files.pythonhosted.org/packages/86/55/42404ce5770f6be26a2b0607e7866c31b9a4176c819e9a7a5e0a055770be/sqlalchemy-2.0.48-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f0dcbc588cd5b725162c076eb9119342f6579c7f7f55057bb7e3c6ff27e13121", size = 3475812, upload-time = "2026-03-02T16:04:40.092Z" }, + { url = "https://files.pythonhosted.org/packages/ae/ae/29b87775fadc43e627cf582fe3bda4d02e300f6b8f2747c764950d13784c/sqlalchemy-2.0.48-cp313-cp313t-win32.whl", hash = "sha256:9764014ef5e58aab76220c5664abb5d47d5bc858d9debf821e55cfdd0f128485", size = 2141335, upload-time = "2026-03-02T15:52:51.518Z" }, + { url = "https://files.pythonhosted.org/packages/91/44/f39d063c90f2443e5b46ec4819abd3d8de653893aae92df42a5c4f5843de/sqlalchemy-2.0.48-cp313-cp313t-win_amd64.whl", hash = "sha256:e2f35b4cccd9ed286ad62e0a3c3ac21e06c02abc60e20aa51a3e305a30f5fa79", size = 2173095, upload-time = "2026-03-02T15:52:52.79Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b3/f437eaa1cf028bb3c927172c7272366393e73ccd104dcf5b6963f4ab5318/sqlalchemy-2.0.48-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e2d0d88686e3d35a76f3e15a34e8c12d73fc94c1dea1cd55782e695cc14086dd", size = 2154401, upload-time = "2026-03-02T15:49:17.24Z" }, + { url = "https://files.pythonhosted.org/packages/6c/1c/b3abdf0f402aa3f60f0df6ea53d92a162b458fca2321d8f1f00278506402/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49b7bddc1eebf011ea5ab722fdbe67a401caa34a350d278cc7733c0e88fecb1f", size = 3274528, upload-time = "2026-03-02T15:50:41.489Z" }, + { url = "https://files.pythonhosted.org/packages/f2/5e/327428a034407651a048f5e624361adf3f9fbac9d0fa98e981e9c6ff2f5e/sqlalchemy-2.0.48-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:426c5ca86415d9b8945c7073597e10de9644802e2ff502b8e1f11a7a2642856b", size = 3279523, upload-time = "2026-03-02T15:53:32.962Z" }, + { url = "https://files.pythonhosted.org/packages/2a/ca/ece73c81a918add0965b76b868b7b5359e068380b90ef1656ee995940c02/sqlalchemy-2.0.48-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:288937433bd44e3990e7da2402fabc44a3c6c25d3704da066b85b89a85474ae0", size = 3224312, upload-time = "2026-03-02T15:50:42.996Z" }, + { url = "https://files.pythonhosted.org/packages/88/11/fbaf1ae91fa4ee43f4fe79661cead6358644824419c26adb004941bdce7c/sqlalchemy-2.0.48-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8183dc57ae7d9edc1346e007e840a9f3d6aa7b7f165203a99e16f447150140d2", size = 3246304, upload-time = "2026-03-02T15:53:34.937Z" }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5fb0deb13930b4f2f698c5541ae076c18981173e27dd00376dbaea7a9c82/sqlalchemy-2.0.48-cp314-cp314-win32.whl", hash = "sha256:1182437cb2d97988cfea04cf6cdc0b0bb9c74f4d56ec3d08b81e23d621a28cc6", size = 2116565, upload-time = "2026-03-02T15:54:38.321Z" }, + { url = "https://files.pythonhosted.org/packages/95/7e/e83615cb63f80047f18e61e31e8e32257d39458426c23006deeaf48f463b/sqlalchemy-2.0.48-cp314-cp314-win_amd64.whl", hash = "sha256:144921da96c08feb9e2b052c5c5c1d0d151a292c6135623c6b2c041f2a45f9e0", size = 2142205, upload-time = "2026-03-02T15:54:39.831Z" }, + { url = "https://files.pythonhosted.org/packages/83/e3/69d8711b3f2c5135e9cde5f063bc1605860f0b2c53086d40c04017eb1f77/sqlalchemy-2.0.48-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5aee45fd2c6c0f2b9cdddf48c48535e7471e42d6fb81adfde801da0bd5b93241", size = 3563519, upload-time = "2026-03-02T15:57:52.387Z" }, + { url = "https://files.pythonhosted.org/packages/f8/4f/a7cce98facca73c149ea4578981594aaa5fd841e956834931de503359336/sqlalchemy-2.0.48-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7cddca31edf8b0653090cbb54562ca027c421c58ddde2c0685f49ff56a1690e0", size = 3528611, upload-time = "2026-03-02T16:04:42.097Z" }, + { url = "https://files.pythonhosted.org/packages/cd/7d/5936c7a03a0b0cb0fa0cc425998821c6029756b0855a8f7ee70fba1de955/sqlalchemy-2.0.48-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7a936f1bb23d370b7c8cc079d5fce4c7d18da87a33c6744e51a93b0f9e97e9b3", size = 3472326, upload-time = "2026-03-02T15:57:54.423Z" }, + { url = "https://files.pythonhosted.org/packages/f4/33/cea7dfc31b52904efe3dcdc169eb4514078887dff1f5ae28a7f4c5d54b3c/sqlalchemy-2.0.48-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e004aa9248e8cb0a5f9b96d003ca7c1c0a5da8decd1066e7b53f59eb8ce7c62b", size = 3478453, upload-time = "2026-03-02T16:04:44.584Z" }, + { url = "https://files.pythonhosted.org/packages/c8/95/32107c4d13be077a9cae61e9ae49966a35dc4bf442a8852dd871db31f62e/sqlalchemy-2.0.48-cp314-cp314t-win32.whl", hash = "sha256:b8438ec5594980d405251451c5b7ea9aa58dda38eb7ac35fb7e4c696712ee24f", size = 2147209, upload-time = "2026-03-02T15:52:54.274Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d7/1e073da7a4bc645eb83c76067284a0374e643bc4be57f14cc6414656f92c/sqlalchemy-2.0.48-cp314-cp314t-win_amd64.whl", hash = "sha256:d854b3970067297f3a7fbd7a4683587134aa9b3877ee15aa29eea478dc68f933", size = 2182198, upload-time = "2026-03-02T15:52:55.606Z" }, + { url = "https://files.pythonhosted.org/packages/46/2c/9664130905f03db57961b8980b05cab624afd114bf2be2576628a9f22da4/sqlalchemy-2.0.48-py3-none-any.whl", hash = "sha256:a66fe406437dd65cacd96a72689a3aaaecaebbcd62d81c5ac1c0fdbeac835096", size = 1940202, upload-time = "2026-03-02T15:52:43.285Z" }, ] [[package]] name = "sqlparse" version = "0.5.5" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", upload-time = "2025-12-19T07:17:45.073Z" } +sdist = { url = "https://files.pythonhosted.org/packages/90/76/437d71068094df0726366574cf3432a4ed754217b436eb7429415cf2d480/sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e", size = 120815, upload-time = "2025-12-19T07:17:45.073Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", upload-time = "2025-12-19T07:17:46.573Z" }, + { url = "https://files.pythonhosted.org/packages/49/4b/359f28a903c13438ef59ebeee215fb25da53066db67b305c125f1c6d2a25/sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba", size = 46138, upload-time = "2025-12-19T07:17:46.573Z" }, ] [[package]] @@ -5789,22 +5785,22 @@ dependencies = [ { name = "anyio" }, { name = "starlette" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/f7/2b/58abc2d1fd397e7dde08e947e05c884d8ef2f78d5e2588c17a12d42d6994/sse_starlette-3.4.4.tar.gz", hash = "sha256:07e0fa0460138baf25cdd5fb28683472c3995dc1642225191b3832d62526bcb0", upload-time = "2026-05-12T17:37:17.019Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/2b/58abc2d1fd397e7dde08e947e05c884d8ef2f78d5e2588c17a12d42d6994/sse_starlette-3.4.4.tar.gz", hash = "sha256:07e0fa0460138baf25cdd5fb28683472c3995dc1642225191b3832d62526bcb0", size = 31819, upload-time = "2026-05-12T17:37:17.019Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/dc/67/805710444ea8cc75fbf70b920ed431a560c4bf9c57f7d5a3117213189399/sse_starlette-3.4.4-py3-none-any.whl", hash = "sha256:3f4dd50d8aed2771a091f3a83000323fc3844541c16b4fe585ae2420cc6df973", upload-time = "2026-05-12T17:37:15.601Z" }, + { url = "https://files.pythonhosted.org/packages/dc/67/805710444ea8cc75fbf70b920ed431a560c4bf9c57f7d5a3117213189399/sse_starlette-3.4.4-py3-none-any.whl", hash = "sha256:3f4dd50d8aed2771a091f3a83000323fc3844541c16b4fe585ae2420cc6df973", size = 16514, upload-time = "2026-05-12T17:37:15.601Z" }, ] [[package]] name = "starlette" -version = "1.3.0" +version = "1.2.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "anyio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/c1/37/cc24e33974e1439cf5ca62b0735b63026eabb768f472d8775f52d5851ed9/starlette-1.3.0.tar.gz", hash = "sha256:bb58cbb7a699da4ee4be9ed4cdfe4bc5b0390aa6dac1d1ac714ebebe8dc3c8df", upload-time = "2026-06-11T06:27:41.869Z" } +sdist = { url = "https://files.pythonhosted.org/packages/25/44/ec35f1b6e83094b997da438a02c8c9b0ade2b1e84cfc48bd4656780760a6/starlette-1.2.1.tar.gz", hash = "sha256:9b9b5ebb992e67d6093741e63c2f59e4f6fff986f81163c087867bd7b924b3f6", size = 2701854, upload-time = "2026-05-31T01:07:51.847Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/16/42/56d31c5ee52dab0ad893d67d4f9c00f5ba2b4c5d87f392eca2c3fdce01cf/starlette-1.3.0-py3-none-any.whl", hash = "sha256:ff4ca1bc23de6a45cdfbbeb9b3caaea524c9221cdd8a6684ad7a4f651a83890b", upload-time = "2026-06-11T06:27:40.444Z" }, + { url = "https://files.pythonhosted.org/packages/1c/54/196d0c1db10af76baa4f64894448505d60d3cdf70ef92cbb35f46a4e4c71/starlette-1.2.1-py3-none-any.whl", hash = "sha256:4de0082d08c8f6764a85a54cf1120d6939507a19905c7768acad2a9f875d2b89", size = 73350, upload-time = "2026-05-31T01:07:50.09Z" }, ] [[package]] @@ -5818,9 +5814,9 @@ dependencies = [ { name = "python-dateutil" }, { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/cf/09/f189fd3c70544322eeba0398ccaa980d17857894c0a66d447aa0b5704686/strawberry_graphql-0.316.0.tar.gz", hash = "sha256:bee5ce0e20d522325bd1ed2db186c812c03c2ea7db29f997b35e7d694649820c", upload-time = "2026-05-19T17:06:10.443Z" } +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://pypi-proxy.dev.databricks.com/packages/0b/dd/b2cf54803cbd0d37e3ce73c7274bdb144ba83743bc83351b5790eb2a5fad/strawberry_graphql-0.316.0-py3-none-any.whl", hash = "sha256:222e16fbbf953f5a1fa75f62bf9a8e95f274180f928f70bec459b566053aa2cb", upload-time = "2026-05-19T17:06:07.844Z" }, + { 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.optional-dependencies] @@ -5836,9 +5832,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "mpmath" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", upload-time = "2025-04-27T18:05:01.611Z" } +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", upload-time = "2025-04-27T18:04:59.103Z" }, + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, ] [[package]] @@ -5848,9 +5844,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "pytest" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/33/7e/a4793801683d32132d9683be8364e93f6bca2f277bfbe81647eba46b8cfd/syrupy-5.2.0.tar.gz", hash = "sha256:0e6b7abf1e04f060f6c797bed8bca96f2468954168328041e02634a68fc11ff0", upload-time = "2026-05-16T21:11:37.367Z" } +sdist = { url = "https://files.pythonhosted.org/packages/33/7e/a4793801683d32132d9683be8364e93f6bca2f277bfbe81647eba46b8cfd/syrupy-5.2.0.tar.gz", hash = "sha256:0e6b7abf1e04f060f6c797bed8bca96f2468954168328041e02634a68fc11ff0", size = 50223, upload-time = "2026-05-16T21:11:37.367Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/4e/18/dc99a152bea18a898a8ac387bfeb9ec0829e0f5bed11cfec2e2ca189c5a2/syrupy-5.2.0-py3-none-any.whl", hash = "sha256:798cb493a6e20f4839e58ea8f10eb1b0d85684c676442f79786e219bf32618e6", upload-time = "2026-05-16T21:11:34.984Z" }, + { url = "https://files.pythonhosted.org/packages/4e/18/dc99a152bea18a898a8ac387bfeb9ec0829e0f5bed11cfec2e2ca189c5a2/syrupy-5.2.0-py3-none-any.whl", hash = "sha256:798cb493a6e20f4839e58ea8f10eb1b0d85684c676442f79786e219bf32618e6", size = 51828, upload-time = "2026-05-16T21:11:34.984Z" }, ] [[package]] @@ -5864,18 +5860,18 @@ dependencies = [ { name = "urllib3" }, { name = "wrapt" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/ca/ac/a597c3a0e02b26cbed6dd07df68be1e57684766fd1c381dee9b170a99690/testcontainers-4.14.2.tar.gz", hash = "sha256:1340ccf16fe3acd9389a6c9e1d9ab21d9fe99a8afdf8165f89c3e69c1967d239", upload-time = "2026-03-18T05:19:16.696Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ca/ac/a597c3a0e02b26cbed6dd07df68be1e57684766fd1c381dee9b170a99690/testcontainers-4.14.2.tar.gz", hash = "sha256:1340ccf16fe3acd9389a6c9e1d9ab21d9fe99a8afdf8165f89c3e69c1967d239", size = 166841, upload-time = "2026-03-18T05:19:16.696Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/13/2d/26b8b30067d94339afee62c3edc9b803a6eb9332f521ba77d8aaab5de873/testcontainers-4.14.2-py3-none-any.whl", hash = "sha256:0d0522c3cd8f8d9627cda41f7a6b51b639fa57bdc492923c045117933c668d68", upload-time = "2026-03-18T05:19:15.29Z" }, + { url = "https://files.pythonhosted.org/packages/13/2d/26b8b30067d94339afee62c3edc9b803a6eb9332f521ba77d8aaab5de873/testcontainers-4.14.2-py3-none-any.whl", hash = "sha256:0d0522c3cd8f8d9627cda41f7a6b51b639fa57bdc492923c045117933c668d68", size = 125712, upload-time = "2026-03-18T05:19:15.29Z" }, ] [[package]] name = "threadpoolctl" version = "3.6.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", upload-time = "2025-03-13T13:49:23.031Z" } +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://pypi-proxy.dev.databricks.com/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", upload-time = "2025-03-13T13:49:21.846Z" }, + { 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]] @@ -5885,7 +5881,7 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/3c/2d/8946864f716ac82dcc88d290ed613cba7a80ec75df4f553ec3ff275f486e/thrift-0.20.0.tar.gz", hash = "sha256:4dd662eadf6b8aebe8a41729527bd69adf6ceaa2a8681cbef64d1273b3e8feba", upload-time = "2024-03-22T22:53:08.228Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/2d/8946864f716ac82dcc88d290ed613cba7a80ec75df4f553ec3ff275f486e/thrift-0.20.0.tar.gz", hash = "sha256:4dd662eadf6b8aebe8a41729527bd69adf6ceaa2a8681cbef64d1273b3e8feba", size = 62295, upload-time = "2024-03-22T22:53:08.228Z" } [[package]] name = "tokenizers" @@ -5894,85 +5890,85 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "huggingface-hub" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/73/6f/f80cfef4a312e1fb34baf7d85c72d4411afde10978d4657f8cdd811d3ccc/tokenizers-0.22.2.tar.gz", hash = "sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917", upload-time = "2026-01-05T10:45:15.988Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/92/97/5dbfabf04c7e348e655e907ed27913e03db0923abb5dfdd120d7b25630e1/tokenizers-0.22.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:544dd704ae7238755d790de45ba8da072e9af3eea688f698b137915ae959281c", upload-time = "2026-01-05T10:41:02.158Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2e/47/174dca0502ef88b28f1c9e06b73ce33500eedfac7a7692108aec220464e7/tokenizers-0.22.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001", upload-time = "2026-01-05T10:41:00.276Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d6/84/7990e799f1309a8b87af6b948f31edaa12a3ed22d11b352eaf4f4b2e5753/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249487018adec45d6e3554c71d46eb39fa8ea67156c640f7513eb26f318cec7", upload-time = "2026-01-05T10:40:32.165Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/78/59/09d0d9ba94dcd5f4f1368d4858d24546b4bdc0231c2354aa31d6199f0399/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b85325d0815e86e0bac263506dd114578953b7b53d7de09a6485e4a160a7dd", upload-time = "2026-01-05T10:40:38.847Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/47/50/b3ebb4243e7160bda8d34b731e54dd8ab8b133e50775872e7a434e524c28/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb88f22a209ff7b40a576d5324bf8286b519d7358663db21d6246fb17eea2d5", upload-time = "2026-01-05T10:40:56.614Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/fa/89f4cb9e08df770b57adb96f8cbb7e22695a4cb6c2bd5f0c4f0ebcf33b66/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c774b1276f71e1ef716e5486f21e76333464f47bece56bbd554485982a9e03e", upload-time = "2026-01-05T10:40:44.507Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/64/04/ca2363f0bfbe3b3d36e95bf67e56a4c88c8e3362b658e616d1ac185d47f2/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df6c4265b289083bf710dff49bc51ef252f9d5be33a45ee2bed151114a56207b", upload-time = "2026-01-05T10:40:51.139Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2e/76/932be4b50ef6ccedf9d3c6639b056a967a86258c6d9200643f01269211ca/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67", upload-time = "2026-01-05T10:40:58.331Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1d/28/5f9f5a4cc211b69e89420980e483831bcc29dade307955cc9dc858a40f01/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:29c30b83d8dcd061078b05ae0cb94d3c710555fbb44861139f9f83dcca3dc3e4", upload-time = "2026-01-05T10:41:04.053Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6c/fb/66e2da4704d6aadebf8cb39f1d6d1957df667ab24cff2326b77cda0dcb85/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:37ae80a28c1d3265bb1f22464c856bd23c02a05bb211e56d0c5301a435be6c1a", upload-time = "2026-01-05T10:45:10.673Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/16/04/fed398b05caa87ce9b1a1bb5166645e38196081b225059a6edaff6440fac/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:791135ee325f2336f498590eb2f11dc5c295232f288e75c99a36c5dbce63088a", upload-time = "2026-01-05T10:45:12.559Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/05/a1/d62dfe7376beaaf1394917e0f8e93ee5f67fea8fcf4107501db35996586b/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5", upload-time = "2026-01-05T10:45:14.333Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/18/a545c4ea42af3df6effd7d13d250ba77a0a86fb20393143bbb9a92e434d4/tokenizers-0.22.2-cp39-abi3-win32.whl", hash = "sha256:a6bf3f88c554a2b653af81f3204491c818ae2ac6fbc09e76ef4773351292bc92", upload-time = "2026-01-05T10:45:20.593Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/65/71/0670843133a43d43070abeb1949abfdef12a86d490bea9cd9e18e37c5ff7/tokenizers-0.22.2-cp39-abi3-win_amd64.whl", hash = "sha256:c9ea31edff2968b44a88f97d784c2f16dc0729b8b143ed004699ebca91f05c48", upload-time = "2026-01-05T10:45:18.411Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/72/f4/0de46cfa12cdcbcd464cc59fde36912af405696f687e53a091fb432f694c/tokenizers-0.22.2-cp39-abi3-win_arm64.whl", hash = "sha256:9ce725d22864a1e965217204946f830c37876eee3b2ba6fc6255e8e903d5fcbc", upload-time = "2026-01-05T10:45:17.232Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/84/04/655b79dbcc9b3ac5f1479f18e931a344af67e5b7d3b251d2dcdcd7558592/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:753d47ebd4542742ef9261d9da92cd545b2cacbb48349a1225466745bb866ec4", upload-time = "2026-01-05T10:40:34.858Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/46/cd/e4851401f3d8f6f45d8480262ab6a5c8cb9c4302a790a35aa14eeed6d2fd/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e10bf9113d209be7cd046d40fbabbaf3278ff6d18eb4da4c500443185dc1896c", upload-time = "2026-01-05T10:40:40.737Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/6e/55553992a89982cd12d4a66dddb5e02126c58677ea3931efcbe601d419db/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64d94e84f6660764e64e7e0b22baa72f6cd942279fdbb21d46abd70d179f0195", upload-time = "2026-01-05T10:40:46.56Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/59/8c/b1c87148aa15e099243ec9f0cf9d0e970cc2234c3257d558c25a2c5304e6/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f01a9c019878532f98927d2bacb79bbb404b43d3437455522a00a30718cdedb5", upload-time = "2026-01-05T10:40:52.803Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/73/6f/f80cfef4a312e1fb34baf7d85c72d4411afde10978d4657f8cdd811d3ccc/tokenizers-0.22.2.tar.gz", hash = "sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917", size = 372115, upload-time = "2026-01-05T10:45:15.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/97/5dbfabf04c7e348e655e907ed27913e03db0923abb5dfdd120d7b25630e1/tokenizers-0.22.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:544dd704ae7238755d790de45ba8da072e9af3eea688f698b137915ae959281c", size = 3100275, upload-time = "2026-01-05T10:41:02.158Z" }, + { url = "https://files.pythonhosted.org/packages/2e/47/174dca0502ef88b28f1c9e06b73ce33500eedfac7a7692108aec220464e7/tokenizers-0.22.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001", size = 2981472, upload-time = "2026-01-05T10:41:00.276Z" }, + { url = "https://files.pythonhosted.org/packages/d6/84/7990e799f1309a8b87af6b948f31edaa12a3ed22d11b352eaf4f4b2e5753/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249487018adec45d6e3554c71d46eb39fa8ea67156c640f7513eb26f318cec7", size = 3290736, upload-time = "2026-01-05T10:40:32.165Z" }, + { url = "https://files.pythonhosted.org/packages/78/59/09d0d9ba94dcd5f4f1368d4858d24546b4bdc0231c2354aa31d6199f0399/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b85325d0815e86e0bac263506dd114578953b7b53d7de09a6485e4a160a7dd", size = 3168835, upload-time = "2026-01-05T10:40:38.847Z" }, + { url = "https://files.pythonhosted.org/packages/47/50/b3ebb4243e7160bda8d34b731e54dd8ab8b133e50775872e7a434e524c28/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb88f22a209ff7b40a576d5324bf8286b519d7358663db21d6246fb17eea2d5", size = 3521673, upload-time = "2026-01-05T10:40:56.614Z" }, + { url = "https://files.pythonhosted.org/packages/e0/fa/89f4cb9e08df770b57adb96f8cbb7e22695a4cb6c2bd5f0c4f0ebcf33b66/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c774b1276f71e1ef716e5486f21e76333464f47bece56bbd554485982a9e03e", size = 3724818, upload-time = "2026-01-05T10:40:44.507Z" }, + { url = "https://files.pythonhosted.org/packages/64/04/ca2363f0bfbe3b3d36e95bf67e56a4c88c8e3362b658e616d1ac185d47f2/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df6c4265b289083bf710dff49bc51ef252f9d5be33a45ee2bed151114a56207b", size = 3379195, upload-time = "2026-01-05T10:40:51.139Z" }, + { url = "https://files.pythonhosted.org/packages/2e/76/932be4b50ef6ccedf9d3c6639b056a967a86258c6d9200643f01269211ca/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67", size = 3274982, upload-time = "2026-01-05T10:40:58.331Z" }, + { url = "https://files.pythonhosted.org/packages/1d/28/5f9f5a4cc211b69e89420980e483831bcc29dade307955cc9dc858a40f01/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:29c30b83d8dcd061078b05ae0cb94d3c710555fbb44861139f9f83dcca3dc3e4", size = 9478245, upload-time = "2026-01-05T10:41:04.053Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fb/66e2da4704d6aadebf8cb39f1d6d1957df667ab24cff2326b77cda0dcb85/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:37ae80a28c1d3265bb1f22464c856bd23c02a05bb211e56d0c5301a435be6c1a", size = 9560069, upload-time = "2026-01-05T10:45:10.673Z" }, + { url = "https://files.pythonhosted.org/packages/16/04/fed398b05caa87ce9b1a1bb5166645e38196081b225059a6edaff6440fac/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:791135ee325f2336f498590eb2f11dc5c295232f288e75c99a36c5dbce63088a", size = 9899263, upload-time = "2026-01-05T10:45:12.559Z" }, + { url = "https://files.pythonhosted.org/packages/05/a1/d62dfe7376beaaf1394917e0f8e93ee5f67fea8fcf4107501db35996586b/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5", size = 10033429, upload-time = "2026-01-05T10:45:14.333Z" }, + { url = "https://files.pythonhosted.org/packages/fd/18/a545c4ea42af3df6effd7d13d250ba77a0a86fb20393143bbb9a92e434d4/tokenizers-0.22.2-cp39-abi3-win32.whl", hash = "sha256:a6bf3f88c554a2b653af81f3204491c818ae2ac6fbc09e76ef4773351292bc92", size = 2502363, upload-time = "2026-01-05T10:45:20.593Z" }, + { url = "https://files.pythonhosted.org/packages/65/71/0670843133a43d43070abeb1949abfdef12a86d490bea9cd9e18e37c5ff7/tokenizers-0.22.2-cp39-abi3-win_amd64.whl", hash = "sha256:c9ea31edff2968b44a88f97d784c2f16dc0729b8b143ed004699ebca91f05c48", size = 2747786, upload-time = "2026-01-05T10:45:18.411Z" }, + { url = "https://files.pythonhosted.org/packages/72/f4/0de46cfa12cdcbcd464cc59fde36912af405696f687e53a091fb432f694c/tokenizers-0.22.2-cp39-abi3-win_arm64.whl", hash = "sha256:9ce725d22864a1e965217204946f830c37876eee3b2ba6fc6255e8e903d5fcbc", size = 2612133, upload-time = "2026-01-05T10:45:17.232Z" }, + { url = "https://files.pythonhosted.org/packages/84/04/655b79dbcc9b3ac5f1479f18e931a344af67e5b7d3b251d2dcdcd7558592/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:753d47ebd4542742ef9261d9da92cd545b2cacbb48349a1225466745bb866ec4", size = 3282301, upload-time = "2026-01-05T10:40:34.858Z" }, + { url = "https://files.pythonhosted.org/packages/46/cd/e4851401f3d8f6f45d8480262ab6a5c8cb9c4302a790a35aa14eeed6d2fd/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e10bf9113d209be7cd046d40fbabbaf3278ff6d18eb4da4c500443185dc1896c", size = 3161308, upload-time = "2026-01-05T10:40:40.737Z" }, + { url = "https://files.pythonhosted.org/packages/6f/6e/55553992a89982cd12d4a66dddb5e02126c58677ea3931efcbe601d419db/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64d94e84f6660764e64e7e0b22baa72f6cd942279fdbb21d46abd70d179f0195", size = 3718964, upload-time = "2026-01-05T10:40:46.56Z" }, + { url = "https://files.pythonhosted.org/packages/59/8c/b1c87148aa15e099243ec9f0cf9d0e970cc2234c3257d558c25a2c5304e6/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f01a9c019878532f98927d2bacb79bbb404b43d3437455522a00a30718cdedb5", size = 3373542, upload-time = "2026-01-05T10:40:52.803Z" }, ] [[package]] name = "tomli" version = "2.3.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", upload-time = "2025-10-08T22:01:47.119Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/2e/299f62b401438d5fe1624119c723f5d877acc86a4c2492da405626665f12/tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45", upload-time = "2025-10-08T22:01:00.137Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/7f/d8fffe6a7aefdb61bced88fcb5e280cfd71e08939da5894161bd71bea022/tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba", upload-time = "2025-10-08T22:01:01.63Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/47/5c/24935fb6a2ee63e86d80e4d3b58b222dafaf438c416752c8b58537c8b89a/tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf", upload-time = "2025-10-08T22:01:02.543Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/da/75dfd804fc11e6612846758a23f13271b76d577e299592b4371a4ca4cd09/tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441", upload-time = "2025-10-08T22:01:03.836Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/70/8c/f48ac899f7b3ca7eb13af73bacbc93aec37f9c954df3c08ad96991c8c373/tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845", upload-time = "2025-10-08T22:01:04.834Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ba/28/72f8afd73f1d0e7829bfc093f4cb98ce0a40ffc0cc997009ee1ed94ba705/tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c", upload-time = "2025-10-08T22:01:05.84Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b6/eb/a7679c8ac85208706d27436e8d421dfa39d4c914dcf5fa8083a9305f58d9/tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456", upload-time = "2025-10-08T22:01:06.896Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/fe/3d3420c4cb1ad9cb462fb52967080575f15898da97e21cb6f1361d505383/tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be", upload-time = "2025-10-08T22:01:08.107Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", upload-time = "2025-10-08T22:01:09.082Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", upload-time = "2025-10-08T22:01:10.266Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", upload-time = "2025-10-08T22:01:11.332Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", upload-time = "2025-10-08T22:01:12.498Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", upload-time = "2025-10-08T22:01:13.551Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", upload-time = "2025-10-08T22:01:14.614Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", upload-time = "2025-10-08T22:01:15.629Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", upload-time = "2025-10-08T22:01:16.51Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", upload-time = "2025-10-08T22:01:17.964Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", upload-time = "2025-10-08T22:01:18.959Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", upload-time = "2025-10-08T22:01:20.106Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", upload-time = "2025-10-08T22:01:21.164Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", upload-time = "2025-10-08T22:01:22.417Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", upload-time = "2025-10-08T22:01:23.859Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", upload-time = "2025-10-08T22:01:24.893Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", upload-time = "2025-10-08T22:01:26.153Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", upload-time = "2025-10-08T22:01:27.06Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", upload-time = "2025-10-08T22:01:28.059Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", upload-time = "2025-10-08T22:01:29.066Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", upload-time = "2025-10-08T22:01:31.98Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", upload-time = "2025-10-08T22:01:32.989Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", upload-time = "2025-10-08T22:01:34.052Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", upload-time = "2025-10-08T22:01:35.082Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", upload-time = "2025-10-08T22:01:36.057Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", upload-time = "2025-10-08T22:01:37.27Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", upload-time = "2025-10-08T22:01:38.235Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", upload-time = "2025-10-08T22:01:39.712Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", upload-time = "2025-10-08T22:01:40.773Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", upload-time = "2025-10-08T22:01:41.824Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", upload-time = "2025-10-08T22:01:43.177Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", upload-time = "2025-10-08T22:01:44.233Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", upload-time = "2025-10-08T22:01:45.234Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", upload-time = "2025-10-08T22:01:46.04Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392, upload-time = "2025-10-08T22:01:47.119Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/2e/299f62b401438d5fe1624119c723f5d877acc86a4c2492da405626665f12/tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45", size = 153236, upload-time = "2025-10-08T22:01:00.137Z" }, + { url = "https://files.pythonhosted.org/packages/86/7f/d8fffe6a7aefdb61bced88fcb5e280cfd71e08939da5894161bd71bea022/tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba", size = 148084, upload-time = "2025-10-08T22:01:01.63Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/24935fb6a2ee63e86d80e4d3b58b222dafaf438c416752c8b58537c8b89a/tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf", size = 234832, upload-time = "2025-10-08T22:01:02.543Z" }, + { url = "https://files.pythonhosted.org/packages/89/da/75dfd804fc11e6612846758a23f13271b76d577e299592b4371a4ca4cd09/tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441", size = 242052, upload-time = "2025-10-08T22:01:03.836Z" }, + { url = "https://files.pythonhosted.org/packages/70/8c/f48ac899f7b3ca7eb13af73bacbc93aec37f9c954df3c08ad96991c8c373/tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845", size = 239555, upload-time = "2025-10-08T22:01:04.834Z" }, + { url = "https://files.pythonhosted.org/packages/ba/28/72f8afd73f1d0e7829bfc093f4cb98ce0a40ffc0cc997009ee1ed94ba705/tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c", size = 245128, upload-time = "2025-10-08T22:01:05.84Z" }, + { url = "https://files.pythonhosted.org/packages/b6/eb/a7679c8ac85208706d27436e8d421dfa39d4c914dcf5fa8083a9305f58d9/tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456", size = 96445, upload-time = "2025-10-08T22:01:06.896Z" }, + { url = "https://files.pythonhosted.org/packages/0a/fe/3d3420c4cb1ad9cb462fb52967080575f15898da97e21cb6f1361d505383/tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be", size = 107165, upload-time = "2025-10-08T22:01:08.107Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", size = 154891, upload-time = "2025-10-08T22:01:09.082Z" }, + { url = "https://files.pythonhosted.org/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", size = 148796, upload-time = "2025-10-08T22:01:10.266Z" }, + { url = "https://files.pythonhosted.org/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", size = 242121, upload-time = "2025-10-08T22:01:11.332Z" }, + { url = "https://files.pythonhosted.org/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", size = 250070, upload-time = "2025-10-08T22:01:12.498Z" }, + { url = "https://files.pythonhosted.org/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", size = 245859, upload-time = "2025-10-08T22:01:13.551Z" }, + { url = "https://files.pythonhosted.org/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", size = 250296, upload-time = "2025-10-08T22:01:14.614Z" }, + { url = "https://files.pythonhosted.org/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", size = 97124, upload-time = "2025-10-08T22:01:15.629Z" }, + { url = "https://files.pythonhosted.org/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", size = 107698, upload-time = "2025-10-08T22:01:16.51Z" }, + { url = "https://files.pythonhosted.org/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", size = 154819, upload-time = "2025-10-08T22:01:17.964Z" }, + { url = "https://files.pythonhosted.org/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", size = 148766, upload-time = "2025-10-08T22:01:18.959Z" }, + { url = "https://files.pythonhosted.org/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", size = 240771, upload-time = "2025-10-08T22:01:20.106Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", size = 248586, upload-time = "2025-10-08T22:01:21.164Z" }, + { url = "https://files.pythonhosted.org/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", size = 244792, upload-time = "2025-10-08T22:01:22.417Z" }, + { url = "https://files.pythonhosted.org/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", size = 248909, upload-time = "2025-10-08T22:01:23.859Z" }, + { url = "https://files.pythonhosted.org/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", size = 96946, upload-time = "2025-10-08T22:01:24.893Z" }, + { url = "https://files.pythonhosted.org/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", size = 107705, upload-time = "2025-10-08T22:01:26.153Z" }, + { url = "https://files.pythonhosted.org/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", size = 154244, upload-time = "2025-10-08T22:01:27.06Z" }, + { url = "https://files.pythonhosted.org/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", size = 148637, upload-time = "2025-10-08T22:01:28.059Z" }, + { url = "https://files.pythonhosted.org/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", size = 241925, upload-time = "2025-10-08T22:01:29.066Z" }, + { url = "https://files.pythonhosted.org/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", size = 249045, upload-time = "2025-10-08T22:01:31.98Z" }, + { url = "https://files.pythonhosted.org/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", size = 245835, upload-time = "2025-10-08T22:01:32.989Z" }, + { url = "https://files.pythonhosted.org/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", size = 253109, upload-time = "2025-10-08T22:01:34.052Z" }, + { url = "https://files.pythonhosted.org/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", size = 97930, upload-time = "2025-10-08T22:01:35.082Z" }, + { url = "https://files.pythonhosted.org/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", size = 107964, upload-time = "2025-10-08T22:01:36.057Z" }, + { url = "https://files.pythonhosted.org/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", size = 163065, upload-time = "2025-10-08T22:01:37.27Z" }, + { url = "https://files.pythonhosted.org/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", size = 159088, upload-time = "2025-10-08T22:01:38.235Z" }, + { url = "https://files.pythonhosted.org/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", size = 268193, upload-time = "2025-10-08T22:01:39.712Z" }, + { url = "https://files.pythonhosted.org/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", size = 275488, upload-time = "2025-10-08T22:01:40.773Z" }, + { url = "https://files.pythonhosted.org/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", size = 272669, upload-time = "2025-10-08T22:01:41.824Z" }, + { url = "https://files.pythonhosted.org/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", size = 279709, upload-time = "2025-10-08T22:01:43.177Z" }, + { url = "https://files.pythonhosted.org/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", size = 107563, upload-time = "2025-10-08T22:01:44.233Z" }, + { url = "https://files.pythonhosted.org/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", size = 119756, upload-time = "2025-10-08T22:01:45.234Z" }, + { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" }, ] [[package]] name = "tomli-w" version = "1.2.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/19/75/241269d1da26b624c0d5e110e8149093c759b7a286138f4efd61a60e75fe/tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021", upload-time = "2025-01-15T12:07:24.262Z" } +sdist = { url = "https://files.pythonhosted.org/packages/19/75/241269d1da26b624c0d5e110e8149093c759b7a286138f4efd61a60e75fe/tomli_w-1.2.0.tar.gz", hash = "sha256:2dd14fac5a47c27be9cd4c976af5a12d87fb1f0b4512f81d69cce3b35ae25021", size = 7184, upload-time = "2025-01-15T12:07:24.262Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", upload-time = "2025-01-15T12:07:22.074Z" }, + { url = "https://files.pythonhosted.org/packages/c7/18/c86eb8e0202e32dd3df50d43d7ff9854f8e0603945ff398974c1d91ac1ef/tomli_w-1.2.0-py3-none-any.whl", hash = "sha256:188306098d013b691fcadc011abd66727d3c414c571bb01b1a174ba8c983cf90", size = 6675, upload-time = "2025-01-15T12:07:22.074Z" }, ] [[package]] @@ -5997,34 +5993,34 @@ dependencies = [ { name = "typing-extensions" }, ] wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/ac/f2/c1690994afe461aae2d0cac62251e6802a703dec0a6c549c02ecd0de92a9/torch-2.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2c0d7fcfbc0c4e8bb5ebc3907cbc0c6a0da1b8f82b1fc6e14e914fa0b9baf74e", upload-time = "2026-03-23T18:12:06.86Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a4/f0/98ae802fa8c09d3149b0c8690741f3f5753c90e779bd28c9613257295945/torch-2.11.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:4cf8687f4aec3900f748d553483ef40e0ac38411c3c48d0a86a438f6d7a99b18", upload-time = "2026-03-23T18:11:43.774Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/1e/18a9b10b4bd34f12d4e561c52b0ae7158707b8193c6cfc0aad2b48167090/torch-2.11.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1b32ceda909818a03b112006709b02be1877240c31750a8d9c6b7bf5f2d8a6e5", upload-time = "2026-03-23T18:11:23.756Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/35/40/2d532e8c0e23705be9d1debce5bc37b68d59a39bda7584c26fe9668076fe/torch-2.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:b3c712ae6fb8e7a949051a953fc412fe0a6940337336c3b6f905e905dac5157f", upload-time = "2026-03-23T18:11:58.281Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ae/0d/98b410492609e34a155fa8b121b55c7dca229f39636851c3a9ec20edea21/torch-2.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7b6a60d48062809f58595509c524b88e6ddec3ebe25833d6462eeab81e5f2ce4", upload-time = "2026-03-23T18:12:02.608Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/84/03/acea680005f098f79fd70c1d9d5ccc0cb4296ec2af539a0450108232fc0c/torch-2.11.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:d91aac77f24082809d2c5a93f52a5f085032740a1ebc9252a7b052ef5a4fddc6", upload-time = "2026-03-23T18:10:46.675Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8c/8b/d7be22fbec9ffee6cff31a39f8750d4b3a65d349a286cf4aec74c2375662/torch-2.11.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:7aa2f9bbc6d4595ba72138026b2074be1233186150e9292865e04b7a63b8c67a", upload-time = "2026-03-23T18:10:03.569Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d1/bd/9912d30b68845256aabbb4a40aeefeef3c3b20db5211ccda653544ada4b6/torch-2.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:73e24aaf8f36ab90d95cd1761208b2eb70841c2a9ca1a3f9061b39fc5331b708", upload-time = "2026-03-23T18:11:52.995Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/8b/69e3008d78e5cee2b30183340cc425081b78afc5eff3d080daab0adda9aa/torch-2.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b5866312ee6e52ea625cd211dcb97d6a2cdc1131a5f15cc0d87eec948f6dd34", upload-time = "2026-03-23T18:11:34.781Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/13/16/42e5915ebe4868caa6bac83a8ed59db57f12e9a61b7d749d584776ed53d5/torch-2.11.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f99924682ef0aa6a4ab3b1b76f40dc6e273fca09f367d15a524266db100a723f", upload-time = "2026-03-23T18:11:06.944Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1a/c9/82638ef24d7877510f83baf821f5619a61b45568ce21c0a87a91576510aa/torch-2.11.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:0f68f4ac6d95d12e896c3b7a912b5871619542ec54d3649cf48cc1edd4dd2756", upload-time = "2026-03-23T18:10:31.481Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1c/ff/6756f1c7ee302f6d202120e0f4f05b432b839908f9071157302cedfc5232/torch-2.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:fbf39280699d1b869f55eac536deceaa1b60bd6788ba74f399cc67e60a5fab10", upload-time = "2026-03-23T18:10:55.931Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/87/89/5ea6722763acee56b045435fb84258db7375c48165ec8be7880ab2b281c5/torch-2.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6debd97ccd3205bbb37eb806a9d8219e1139d15419982c09e23ef7d4369d18", upload-time = "2026-03-23T18:10:18.649Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/32/d1/8ed2173589cbfe744ed54e5a73efc107c0085ba5777ee93a5f4c1ab90553/torch-2.11.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:63a68fa59de8f87acc7e85a5478bb2dddbb3392b7593ec3e78827c793c4b73fd", upload-time = "2026-03-23T18:08:30.835Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/e1/b73f7c575a4b8f87a5928f50a1e35416b5e27295d8be9397d5293e7e8d4c/torch-2.11.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:cc89b9b173d9adfab59fd227f0ab5e5516d9a52b658ae41d64e59d2e55a418db", upload-time = "2026-03-23T18:08:47.213Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/82/3e3fcdd388fbe54e29fd3f991f36846ff4ac90b0d0181e9c8f7236565f82/torch-2.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:4dda3b3f52d121063a731ddb835f010dc137b920d7fec2778e52f60d8e4bf0cd", upload-time = "2026-03-23T18:09:52.111Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/db/38/8ac78069621b8c2b4979c2f96dc8409ef5e9c4189f6aac629189a78677ca/torch-2.11.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8b394322f49af4362d4f80e424bcaca7efcd049619af03a4cf4501520bdf0fb4", upload-time = "2026-03-23T18:10:14.214Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/6c/56bfb37073e7136e6dd86bfc6af7339946dd684e0ecf2155ac0eee687ae1/torch-2.11.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:2658f34ce7e2dabf4ec73b45e2ca68aedad7a5be87ea756ad656eaf32bf1e1ea", upload-time = "2026-03-23T18:09:36.604Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/07/f4/1b666b6d61d3394cca306ea543ed03a64aad0a201b6cd159f1d41010aeb1/torch-2.11.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:98bb213c3084cfe176302949bdc360074b18a9da7ab59ef2edc9d9f742504778", upload-time = "2026-03-23T18:09:20.842Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/48/6b/30d1459fa7e4b67e9e3fe1685ca1d8bb4ce7c62ef436c3a615963c6c866c/torch-2.11.0-cp313-cp313t-win_amd64.whl", hash = "sha256:a97b94bbf62992949b4730c6cd2cc9aee7b335921ee8dc207d930f2ed09ae2db", upload-time = "2026-03-23T18:09:47.304Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/26/0d/8603382f61abd0db35841148ddc1ffd607bf3100b11c6e1dab6d2fc44e72/torch-2.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:01018087326984a33b64e04c8cb5c2795f9120e0d775ada1f6638840227b04d7", upload-time = "2026-03-23T18:09:10.117Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/86/7cd7c66cb9cec6be330fff36db5bd0eef386d80c031b581ec81be1d4b26c/torch-2.11.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:2bb3cc54bd0dea126b0060bb1ec9de0f9c7f7342d93d436646516b0330cd5be7", upload-time = "2026-03-23T18:07:33.77Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/47/e8/b98ca2d39b2e0e4730c0ee52537e488e7008025bc77ca89552ff91021f7c/torch-2.11.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:4dc8b3809469b6c30b411bb8c4cad3828efd26236153d9beb6a3ec500f211a60", upload-time = "2026-03-23T18:07:50.02Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/78/88/d4a4cda8362f8a30d1ed428564878c3cafb0d87971fbd3947d4c84552095/torch-2.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:2b4e811728bd0cc58fb2b0948fe939a1ee2bf1422f6025be2fca4c7bd9d79718", upload-time = "2026-03-23T18:09:05.617Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/46/4419098ed6d801750f26567b478fc185c3432e11e2cad712bc6b4c2ab0d0/torch-2.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8245477871c3700d4370352ffec94b103cfcb737229445cf9946cddb7b2ca7cd", upload-time = "2026-03-23T18:09:00.818Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fd/66/54a56a4a6ceaffb567231994a9745821d3af922a854ed33b0b3a278e0a99/torch-2.11.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:ab9a8482f475f9ba20e12db84b0e55e2f58784bdca43a854a6ccd3fd4b9f75e6", upload-time = "2026-03-23T18:07:18.974Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b1/e7/0b6665f533aa9e337662dc190425abc0af1fe3234088f4454c52393ded61/torch-2.11.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:563ed3d25542d7e7bbc5b235ccfacfeb97fb470c7fee257eae599adb8005c8a2", upload-time = "2026-03-23T18:08:07.014Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/bf/c8d12a2c86dbfd7f40fb2f56fbf5a505ccf2d9ce131eb559dfc7c51e1a04/torch-2.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b2a43985ff5ef6ddd923bbcf99943e5f58059805787c5c9a2622bf05ca2965b0", upload-time = "2026-03-23T18:08:19.216Z" }, + { url = "https://files.pythonhosted.org/packages/ac/f2/c1690994afe461aae2d0cac62251e6802a703dec0a6c549c02ecd0de92a9/torch-2.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2c0d7fcfbc0c4e8bb5ebc3907cbc0c6a0da1b8f82b1fc6e14e914fa0b9baf74e", size = 80526521, upload-time = "2026-03-23T18:12:06.86Z" }, + { url = "https://files.pythonhosted.org/packages/a4/f0/98ae802fa8c09d3149b0c8690741f3f5753c90e779bd28c9613257295945/torch-2.11.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:4cf8687f4aec3900f748d553483ef40e0ac38411c3c48d0a86a438f6d7a99b18", size = 419723025, upload-time = "2026-03-23T18:11:43.774Z" }, + { url = "https://files.pythonhosted.org/packages/f9/1e/18a9b10b4bd34f12d4e561c52b0ae7158707b8193c6cfc0aad2b48167090/torch-2.11.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:1b32ceda909818a03b112006709b02be1877240c31750a8d9c6b7bf5f2d8a6e5", size = 530589207, upload-time = "2026-03-23T18:11:23.756Z" }, + { url = "https://files.pythonhosted.org/packages/35/40/2d532e8c0e23705be9d1debce5bc37b68d59a39bda7584c26fe9668076fe/torch-2.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:b3c712ae6fb8e7a949051a953fc412fe0a6940337336c3b6f905e905dac5157f", size = 114518313, upload-time = "2026-03-23T18:11:58.281Z" }, + { url = "https://files.pythonhosted.org/packages/ae/0d/98b410492609e34a155fa8b121b55c7dca229f39636851c3a9ec20edea21/torch-2.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7b6a60d48062809f58595509c524b88e6ddec3ebe25833d6462eeab81e5f2ce4", size = 80529712, upload-time = "2026-03-23T18:12:02.608Z" }, + { url = "https://files.pythonhosted.org/packages/84/03/acea680005f098f79fd70c1d9d5ccc0cb4296ec2af539a0450108232fc0c/torch-2.11.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:d91aac77f24082809d2c5a93f52a5f085032740a1ebc9252a7b052ef5a4fddc6", size = 419718178, upload-time = "2026-03-23T18:10:46.675Z" }, + { url = "https://files.pythonhosted.org/packages/8c/8b/d7be22fbec9ffee6cff31a39f8750d4b3a65d349a286cf4aec74c2375662/torch-2.11.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:7aa2f9bbc6d4595ba72138026b2074be1233186150e9292865e04b7a63b8c67a", size = 530604548, upload-time = "2026-03-23T18:10:03.569Z" }, + { url = "https://files.pythonhosted.org/packages/d1/bd/9912d30b68845256aabbb4a40aeefeef3c3b20db5211ccda653544ada4b6/torch-2.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:73e24aaf8f36ab90d95cd1761208b2eb70841c2a9ca1a3f9061b39fc5331b708", size = 114519675, upload-time = "2026-03-23T18:11:52.995Z" }, + { url = "https://files.pythonhosted.org/packages/6f/8b/69e3008d78e5cee2b30183340cc425081b78afc5eff3d080daab0adda9aa/torch-2.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b5866312ee6e52ea625cd211dcb97d6a2cdc1131a5f15cc0d87eec948f6dd34", size = 80606338, upload-time = "2026-03-23T18:11:34.781Z" }, + { url = "https://files.pythonhosted.org/packages/13/16/42e5915ebe4868caa6bac83a8ed59db57f12e9a61b7d749d584776ed53d5/torch-2.11.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f99924682ef0aa6a4ab3b1b76f40dc6e273fca09f367d15a524266db100a723f", size = 419731115, upload-time = "2026-03-23T18:11:06.944Z" }, + { url = "https://files.pythonhosted.org/packages/1a/c9/82638ef24d7877510f83baf821f5619a61b45568ce21c0a87a91576510aa/torch-2.11.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:0f68f4ac6d95d12e896c3b7a912b5871619542ec54d3649cf48cc1edd4dd2756", size = 530712279, upload-time = "2026-03-23T18:10:31.481Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ff/6756f1c7ee302f6d202120e0f4f05b432b839908f9071157302cedfc5232/torch-2.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:fbf39280699d1b869f55eac536deceaa1b60bd6788ba74f399cc67e60a5fab10", size = 114556047, upload-time = "2026-03-23T18:10:55.931Z" }, + { url = "https://files.pythonhosted.org/packages/87/89/5ea6722763acee56b045435fb84258db7375c48165ec8be7880ab2b281c5/torch-2.11.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6debd97ccd3205bbb37eb806a9d8219e1139d15419982c09e23ef7d4369d18", size = 80606801, upload-time = "2026-03-23T18:10:18.649Z" }, + { url = "https://files.pythonhosted.org/packages/32/d1/8ed2173589cbfe744ed54e5a73efc107c0085ba5777ee93a5f4c1ab90553/torch-2.11.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:63a68fa59de8f87acc7e85a5478bb2dddbb3392b7593ec3e78827c793c4b73fd", size = 419732382, upload-time = "2026-03-23T18:08:30.835Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e1/b73f7c575a4b8f87a5928f50a1e35416b5e27295d8be9397d5293e7e8d4c/torch-2.11.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:cc89b9b173d9adfab59fd227f0ab5e5516d9a52b658ae41d64e59d2e55a418db", size = 530711509, upload-time = "2026-03-23T18:08:47.213Z" }, + { url = "https://files.pythonhosted.org/packages/66/82/3e3fcdd388fbe54e29fd3f991f36846ff4ac90b0d0181e9c8f7236565f82/torch-2.11.0-cp313-cp313-win_amd64.whl", hash = "sha256:4dda3b3f52d121063a731ddb835f010dc137b920d7fec2778e52f60d8e4bf0cd", size = 114555842, upload-time = "2026-03-23T18:09:52.111Z" }, + { url = "https://files.pythonhosted.org/packages/db/38/8ac78069621b8c2b4979c2f96dc8409ef5e9c4189f6aac629189a78677ca/torch-2.11.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8b394322f49af4362d4f80e424bcaca7efcd049619af03a4cf4501520bdf0fb4", size = 80959574, upload-time = "2026-03-23T18:10:14.214Z" }, + { url = "https://files.pythonhosted.org/packages/6d/6c/56bfb37073e7136e6dd86bfc6af7339946dd684e0ecf2155ac0eee687ae1/torch-2.11.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:2658f34ce7e2dabf4ec73b45e2ca68aedad7a5be87ea756ad656eaf32bf1e1ea", size = 419732324, upload-time = "2026-03-23T18:09:36.604Z" }, + { url = "https://files.pythonhosted.org/packages/07/f4/1b666b6d61d3394cca306ea543ed03a64aad0a201b6cd159f1d41010aeb1/torch-2.11.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:98bb213c3084cfe176302949bdc360074b18a9da7ab59ef2edc9d9f742504778", size = 530596026, upload-time = "2026-03-23T18:09:20.842Z" }, + { url = "https://files.pythonhosted.org/packages/48/6b/30d1459fa7e4b67e9e3fe1685ca1d8bb4ce7c62ef436c3a615963c6c866c/torch-2.11.0-cp313-cp313t-win_amd64.whl", hash = "sha256:a97b94bbf62992949b4730c6cd2cc9aee7b335921ee8dc207d930f2ed09ae2db", size = 114793702, upload-time = "2026-03-23T18:09:47.304Z" }, + { url = "https://files.pythonhosted.org/packages/26/0d/8603382f61abd0db35841148ddc1ffd607bf3100b11c6e1dab6d2fc44e72/torch-2.11.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:01018087326984a33b64e04c8cb5c2795f9120e0d775ada1f6638840227b04d7", size = 80573442, upload-time = "2026-03-23T18:09:10.117Z" }, + { url = "https://files.pythonhosted.org/packages/c7/86/7cd7c66cb9cec6be330fff36db5bd0eef386d80c031b581ec81be1d4b26c/torch-2.11.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:2bb3cc54bd0dea126b0060bb1ec9de0f9c7f7342d93d436646516b0330cd5be7", size = 419749385, upload-time = "2026-03-23T18:07:33.77Z" }, + { url = "https://files.pythonhosted.org/packages/47/e8/b98ca2d39b2e0e4730c0ee52537e488e7008025bc77ca89552ff91021f7c/torch-2.11.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:4dc8b3809469b6c30b411bb8c4cad3828efd26236153d9beb6a3ec500f211a60", size = 530716756, upload-time = "2026-03-23T18:07:50.02Z" }, + { url = "https://files.pythonhosted.org/packages/78/88/d4a4cda8362f8a30d1ed428564878c3cafb0d87971fbd3947d4c84552095/torch-2.11.0-cp314-cp314-win_amd64.whl", hash = "sha256:2b4e811728bd0cc58fb2b0948fe939a1ee2bf1422f6025be2fca4c7bd9d79718", size = 114552300, upload-time = "2026-03-23T18:09:05.617Z" }, + { url = "https://files.pythonhosted.org/packages/bf/46/4419098ed6d801750f26567b478fc185c3432e11e2cad712bc6b4c2ab0d0/torch-2.11.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8245477871c3700d4370352ffec94b103cfcb737229445cf9946cddb7b2ca7cd", size = 80959460, upload-time = "2026-03-23T18:09:00.818Z" }, + { url = "https://files.pythonhosted.org/packages/fd/66/54a56a4a6ceaffb567231994a9745821d3af922a854ed33b0b3a278e0a99/torch-2.11.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:ab9a8482f475f9ba20e12db84b0e55e2f58784bdca43a854a6ccd3fd4b9f75e6", size = 419735835, upload-time = "2026-03-23T18:07:18.974Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e7/0b6665f533aa9e337662dc190425abc0af1fe3234088f4454c52393ded61/torch-2.11.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:563ed3d25542d7e7bbc5b235ccfacfeb97fb470c7fee257eae599adb8005c8a2", size = 530613405, upload-time = "2026-03-23T18:08:07.014Z" }, + { url = "https://files.pythonhosted.org/packages/cf/bf/c8d12a2c86dbfd7f40fb2f56fbf5a505ccf2d9ce131eb559dfc7c51e1a04/torch-2.11.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b2a43985ff5ef6ddd923bbcf99943e5f58059805787c5c9a2622bf05ca2965b0", size = 114792991, upload-time = "2026-03-23T18:08:19.216Z" }, ] [[package]] @@ -6034,9 +6030,9 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", upload-time = "2026-02-03T17:35:53.048Z" } +sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", upload-time = "2026-02-03T17:35:50.982Z" }, + { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" }, ] [[package]] @@ -6055,9 +6051,9 @@ dependencies = [ { name = "tqdm" }, { name = "typer" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/f2/36/390075693b76d4fb4a2bea360fb6080347763bd1f1147c49ed0ed938778c/transformers-5.8.0.tar.gz", hash = "sha256:6cc9a1f0291d16b1c1b735bad775e78ebefff7722701d4e28f98aaaa2bd6fb91", upload-time = "2026-05-05T16:50:04.778Z" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/36/390075693b76d4fb4a2bea360fb6080347763bd1f1147c49ed0ed938778c/transformers-5.8.0.tar.gz", hash = "sha256:6cc9a1f0291d16b1c1b735bad775e78ebefff7722701d4e28f98aaaa2bd6fb91", size = 8528141, upload-time = "2026-05-05T16:50:04.778Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/97/7b/5621d08b34ac35deb9fa14b58d27d124d21ef125ee1c64bc724ca47dfb63/transformers-5.8.0-py3-none-any.whl", hash = "sha256:e9d2cae6d195a7e1e05164c5ebf26142a7044e4dc4267274f4809204f92827e4", upload-time = "2026-05-05T16:50:01.026Z" }, + { url = "https://files.pythonhosted.org/packages/97/7b/5621d08b34ac35deb9fa14b58d27d124d21ef125ee1c64bc724ca47dfb63/transformers-5.8.0-py3-none-any.whl", hash = "sha256:e9d2cae6d195a7e1e05164c5ebf26142a7044e4dc4267274f4809204f92827e4", size = 10630279, upload-time = "2026-05-05T16:50:01.026Z" }, ] [[package]] @@ -6065,20 +6061,20 @@ name = "triton" version = "3.6.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/44/ba/b1b04f4b291a3205d95ebd24465de0e5bf010a2df27a4e58a9b5f039d8f2/triton-3.6.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c723cfb12f6842a0ae94ac307dba7e7a44741d720a40cf0e270ed4a4e3be781", upload-time = "2026-01-20T16:15:53.664Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8c/f7/f1c9d3424ab199ac53c2da567b859bcddbb9c9e7154805119f8bd95ec36f/triton-3.6.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6550fae429e0667e397e5de64b332d1e5695b73650ee75a6146e2e902770bea", upload-time = "2026-01-20T16:00:29.272Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0f/2c/96f92f3c60387e14cc45aed49487f3486f89ea27106c1b1376913c62abe4/triton-3.6.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49df5ef37379c0c2b5c0012286f80174fcf0e073e5ade1ca9a86c36814553651", upload-time = "2026-01-20T16:16:00.523Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/12/b05ba554d2c623bffa59922b94b0775673de251f468a9609bc9e45de95e9/triton-3.6.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8e323d608e3a9bfcc2d9efcc90ceefb764a82b99dea12a86d643c72539ad5d3", upload-time = "2026-01-20T16:00:35.869Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/17/5d/08201db32823bdf77a0e2b9039540080b2e5c23a20706ddba942924ebcd6/triton-3.6.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:374f52c11a711fd062b4bfbb201fd9ac0a5febd28a96fb41b4a0f51dde3157f4", upload-time = "2026-01-20T16:16:07.857Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ab/a8/cdf8b3e4c98132f965f88c2313a4b493266832ad47fb52f23d14d4f86bb5/triton-3.6.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74caf5e34b66d9f3a429af689c1c7128daba1d8208df60e81106b115c00d6fca", upload-time = "2026-01-20T16:00:43.041Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3c/12/34d71b350e89a204c2c7777a9bba0dcf2f19a5bfdd70b57c4dbc5ffd7154/triton-3.6.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:448e02fe6dc898e9e5aa89cf0ee5c371e99df5aa5e8ad976a80b93334f3494fd", upload-time = "2026-01-20T16:16:13.321Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/0b/37d991d8c130ce81a8728ae3c25b6e60935838e9be1b58791f5997b24a54/triton-3.6.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10c7f76c6e72d2ef08df639e3d0d30729112f47a56b0c81672edc05ee5116ac9", upload-time = "2026-01-20T16:00:49.136Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ce/4e/41b0c8033b503fd3cfcd12392cdd256945026a91ff02452bef40ec34bee7/triton-3.6.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1722e172d34e32abc3eb7711d0025bb69d7959ebea84e3b7f7a341cd7ed694d6", upload-time = "2026-01-20T16:16:18.989Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/35/f8/9c66bfc55361ec6d0e4040a0337fb5924ceb23de4648b8a81ae9d33b2b38/triton-3.6.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d002e07d7180fd65e622134fbd980c9a3d4211fb85224b56a0a0efbd422ab72f", upload-time = "2026-01-20T16:00:56.042Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/55/5ecf0dcaa0f2fbbd4420f7ef227ee3cb172e91e5fede9d0ecaddc43363b4/triton-3.6.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5523241e7d1abca00f1d240949eebdd7c673b005edbbce0aca95b8191f1d43", upload-time = "2026-01-20T16:16:25.426Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/3d/9e7eee57b37c80cec63322c0231bb6da3cfe535a91d7a4d64896fcb89357/triton-3.6.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a17a5d5985f0ac494ed8a8e54568f092f7057ef60e1b0fa09d3fd1512064e803", upload-time = "2026-01-20T16:01:07.278Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/48/db/56ee649cab5eaff4757541325aca81f52d02d4a7cd3506776cad2451e060/triton-3.6.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b3a97e8ed304dfa9bd23bb41ca04cdf6b2e617d5e782a8653d616037a5d537d", upload-time = "2026-01-20T16:16:31.528Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f6/56/6113c23ff46c00aae423333eb58b3e60bdfe9179d542781955a5e1514cb3/triton-3.6.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:46bd1c1af4b6704e554cad2eeb3b0a6513a980d470ccfa63189737340c7746a7", upload-time = "2026-01-20T16:01:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/44/ba/b1b04f4b291a3205d95ebd24465de0e5bf010a2df27a4e58a9b5f039d8f2/triton-3.6.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c723cfb12f6842a0ae94ac307dba7e7a44741d720a40cf0e270ed4a4e3be781", size = 175972180, upload-time = "2026-01-20T16:15:53.664Z" }, + { url = "https://files.pythonhosted.org/packages/8c/f7/f1c9d3424ab199ac53c2da567b859bcddbb9c9e7154805119f8bd95ec36f/triton-3.6.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6550fae429e0667e397e5de64b332d1e5695b73650ee75a6146e2e902770bea", size = 188105201, upload-time = "2026-01-20T16:00:29.272Z" }, + { url = "https://files.pythonhosted.org/packages/0f/2c/96f92f3c60387e14cc45aed49487f3486f89ea27106c1b1376913c62abe4/triton-3.6.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49df5ef37379c0c2b5c0012286f80174fcf0e073e5ade1ca9a86c36814553651", size = 176081190, upload-time = "2026-01-20T16:16:00.523Z" }, + { url = "https://files.pythonhosted.org/packages/e0/12/b05ba554d2c623bffa59922b94b0775673de251f468a9609bc9e45de95e9/triton-3.6.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8e323d608e3a9bfcc2d9efcc90ceefb764a82b99dea12a86d643c72539ad5d3", size = 188214640, upload-time = "2026-01-20T16:00:35.869Z" }, + { url = "https://files.pythonhosted.org/packages/17/5d/08201db32823bdf77a0e2b9039540080b2e5c23a20706ddba942924ebcd6/triton-3.6.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:374f52c11a711fd062b4bfbb201fd9ac0a5febd28a96fb41b4a0f51dde3157f4", size = 176128243, upload-time = "2026-01-20T16:16:07.857Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a8/cdf8b3e4c98132f965f88c2313a4b493266832ad47fb52f23d14d4f86bb5/triton-3.6.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74caf5e34b66d9f3a429af689c1c7128daba1d8208df60e81106b115c00d6fca", size = 188266850, upload-time = "2026-01-20T16:00:43.041Z" }, + { url = "https://files.pythonhosted.org/packages/3c/12/34d71b350e89a204c2c7777a9bba0dcf2f19a5bfdd70b57c4dbc5ffd7154/triton-3.6.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:448e02fe6dc898e9e5aa89cf0ee5c371e99df5aa5e8ad976a80b93334f3494fd", size = 176133521, upload-time = "2026-01-20T16:16:13.321Z" }, + { url = "https://files.pythonhosted.org/packages/f9/0b/37d991d8c130ce81a8728ae3c25b6e60935838e9be1b58791f5997b24a54/triton-3.6.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10c7f76c6e72d2ef08df639e3d0d30729112f47a56b0c81672edc05ee5116ac9", size = 188289450, upload-time = "2026-01-20T16:00:49.136Z" }, + { url = "https://files.pythonhosted.org/packages/ce/4e/41b0c8033b503fd3cfcd12392cdd256945026a91ff02452bef40ec34bee7/triton-3.6.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1722e172d34e32abc3eb7711d0025bb69d7959ebea84e3b7f7a341cd7ed694d6", size = 176276087, upload-time = "2026-01-20T16:16:18.989Z" }, + { url = "https://files.pythonhosted.org/packages/35/f8/9c66bfc55361ec6d0e4040a0337fb5924ceb23de4648b8a81ae9d33b2b38/triton-3.6.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d002e07d7180fd65e622134fbd980c9a3d4211fb85224b56a0a0efbd422ab72f", size = 188400296, upload-time = "2026-01-20T16:00:56.042Z" }, + { url = "https://files.pythonhosted.org/packages/49/55/5ecf0dcaa0f2fbbd4420f7ef227ee3cb172e91e5fede9d0ecaddc43363b4/triton-3.6.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef5523241e7d1abca00f1d240949eebdd7c673b005edbbce0aca95b8191f1d43", size = 176138577, upload-time = "2026-01-20T16:16:25.426Z" }, + { url = "https://files.pythonhosted.org/packages/df/3d/9e7eee57b37c80cec63322c0231bb6da3cfe535a91d7a4d64896fcb89357/triton-3.6.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a17a5d5985f0ac494ed8a8e54568f092f7057ef60e1b0fa09d3fd1512064e803", size = 188273063, upload-time = "2026-01-20T16:01:07.278Z" }, + { url = "https://files.pythonhosted.org/packages/48/db/56ee649cab5eaff4757541325aca81f52d02d4a7cd3506776cad2451e060/triton-3.6.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b3a97e8ed304dfa9bd23bb41ca04cdf6b2e617d5e782a8653d616037a5d537d", size = 176274804, upload-time = "2026-01-20T16:16:31.528Z" }, + { url = "https://files.pythonhosted.org/packages/f6/56/6113c23ff46c00aae423333eb58b3e60bdfe9179d542781955a5e1514cb3/triton-3.6.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:46bd1c1af4b6704e554cad2eeb3b0a6513a980d470ccfa63189737340c7746a7", size = 188397994, upload-time = "2026-01-20T16:01:14.236Z" }, ] [[package]] @@ -6091,18 +6087,18 @@ dependencies = [ { name = "rich" }, { name = "shellingham" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/e4/51/9aed62104cea109b820bbd6c14245af756112017d309da813ef107d42e7e/typer-0.25.1.tar.gz", hash = "sha256:9616eb8853a09ffeabab1698952f33c6f29ffdbceb4eaeecf571880e8d7664cc", upload-time = "2026-04-30T19:32:16.964Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e4/51/9aed62104cea109b820bbd6c14245af756112017d309da813ef107d42e7e/typer-0.25.1.tar.gz", hash = "sha256:9616eb8853a09ffeabab1698952f33c6f29ffdbceb4eaeecf571880e8d7664cc", size = 122276, upload-time = "2026-04-30T19:32:16.964Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/3f/f9/2b3ff4e56e5fa7debfaf9eb135d0da96f3e9a1d5b27222223c7296336e5f/typer-0.25.1-py3-none-any.whl", hash = "sha256:75caa44ed46a03fb2dab8808753ffacdbfea88495e74c85a28c5eefcf5f39c89", upload-time = "2026-04-30T19:32:18.271Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f9/2b3ff4e56e5fa7debfaf9eb135d0da96f3e9a1d5b27222223c7296336e5f/typer-0.25.1-py3-none-any.whl", hash = "sha256:75caa44ed46a03fb2dab8808753ffacdbfea88495e74c85a28c5eefcf5f39c89", size = 58409, upload-time = "2026-04-30T19:32:18.271Z" }, ] [[package]] name = "typing-extensions" version = "4.15.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", upload-time = "2025-08-25T13:49:26.313Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", upload-time = "2025-08-25T13:49:24.86Z" }, + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] [[package]] @@ -6112,18 +6108,18 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", upload-time = "2025-10-01T02:14:41.687Z" } +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://pypi-proxy.dev.databricks.com/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", upload-time = "2025-10-01T02:14:40.154Z" }, + { 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 = "2025.3" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", upload-time = "2025-12-13T17:45:35.667Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", upload-time = "2025-12-13T17:45:33.889Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, ] [[package]] @@ -6133,27 +6129,27 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "tzdata", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", upload-time = "2025-03-05T21:17:41.549Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8b/2e/c14812d3d4d9cd1773c6be938f89e5735a1f11a9f184ac3639b93cef35d5/tzlocal-5.3.1.tar.gz", hash = "sha256:cceffc7edecefea1f595541dbd6e990cb1ea3d19bf01b2809f362a03dd7921fd", size = 30761, upload-time = "2025-03-05T21:17:41.549Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", upload-time = "2025-03-05T21:17:39.857Z" }, + { url = "https://files.pythonhosted.org/packages/c2/14/e2a54fabd4f08cd7af1c07030603c3356b74da07f7cc056e600436edfa17/tzlocal-5.3.1-py3-none-any.whl", hash = "sha256:eb1a66c3ef5847adf7a834f1be0800581b683b5608e74f86ecbcef8ab91bb85d", size = 18026, upload-time = "2025-03-05T21:17:39.857Z" }, ] [[package]] name = "uncalled-for" version = "0.3.2" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b5/82/345cc927f7fbdae6065e7768759932fcc827fc20b29b45dfbafa2f1f7da4/uncalled_for-0.3.2.tar.gz", hash = "sha256:89f5dbcd71e2b8f47c030b1fa302e6cce2ec795d1ac565eeb6525c5fe55cb8a2", upload-time = "2026-05-06T13:38:25.204Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b5/82/345cc927f7fbdae6065e7768759932fcc827fc20b29b45dfbafa2f1f7da4/uncalled_for-0.3.2.tar.gz", hash = "sha256:89f5dbcd71e2b8f47c030b1fa302e6cce2ec795d1ac565eeb6525c5fe55cb8a2", size = 50032, upload-time = "2026-05-06T13:38:25.204Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/3b/25/2c87754f3a9e692315f7b811244090e68f362979fc8886b3fbd2985a1d8c/uncalled_for-0.3.2-py3-none-any.whl", hash = "sha256:0ff60b142c7d1f8070bde9d42afaa70aedc77dcc10998c227687e9c15713418e", upload-time = "2026-05-06T13:38:24.025Z" }, + { url = "https://files.pythonhosted.org/packages/3b/25/2c87754f3a9e692315f7b811244090e68f362979fc8886b3fbd2985a1d8c/uncalled_for-0.3.2-py3-none-any.whl", hash = "sha256:0ff60b142c7d1f8070bde9d42afaa70aedc77dcc10998c227687e9c15713418e", size = 11444, upload-time = "2026-05-06T13:38:24.025Z" }, ] [[package]] name = "urllib3" version = "2.7.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", upload-time = "2026-05-07T16:13:18.596Z" } +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://pypi-proxy.dev.databricks.com/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", upload-time = "2026-05-07T16:13:17.151Z" }, + { 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]] @@ -6165,9 +6161,9 @@ dependencies = [ { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/c3/d1/8f3c683c9561a4e6689dd3b1d345c815f10f86acd044ee1fb9a4dcd0b8c5/uvicorn-0.40.0.tar.gz", hash = "sha256:839676675e87e73694518b5574fd0f24c9d97b46bea16df7b8c05ea1a51071ea", upload-time = "2025-12-21T14:16:22.45Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/d1/8f3c683c9561a4e6689dd3b1d345c815f10f86acd044ee1fb9a4dcd0b8c5/uvicorn-0.40.0.tar.gz", hash = "sha256:839676675e87e73694518b5574fd0f24c9d97b46bea16df7b8c05ea1a51071ea", size = 81761, upload-time = "2025-12-21T14:16:22.45Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/d8/2083a1daa7439a66f3a48589a57d576aa117726762618f6bb09fe3798796/uvicorn-0.40.0-py3-none-any.whl", hash = "sha256:c6c8f55bc8bf13eb6fa9ff87ad62308bbbc33d0b67f84293151efe87e0d5f2ee", upload-time = "2025-12-21T14:16:21.041Z" }, + { url = "https://files.pythonhosted.org/packages/3d/d8/2083a1daa7439a66f3a48589a57d576aa117726762618f6bb09fe3798796/uvicorn-0.40.0-py3-none-any.whl", hash = "sha256:c6c8f55bc8bf13eb6fa9ff87ad62308bbbc33d0b67f84293151efe87e0d5f2ee", size = 68502, upload-time = "2025-12-21T14:16:21.041Z" }, ] [package.optional-dependencies] @@ -6185,53 +6181,53 @@ standard = [ name = "uvloop" version = "0.22.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", upload-time = "2025-10-16T22:17:19.342Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/eb/14/ecceb239b65adaaf7fde510aa8bd534075695d1e5f8dadfa32b5723d9cfb/uvloop-0.22.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ef6f0d4cc8a9fa1f6a910230cd53545d9a14479311e87e3cb225495952eb672c", upload-time = "2025-10-16T22:16:11.43Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ba/ae/6f6f9af7f590b319c94532b9567409ba11f4fa71af1148cab1bf48a07048/uvloop-0.22.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7cd375a12b71d33d46af85a3343b35d98e8116134ba404bd657b3b1d15988792", upload-time = "2025-10-16T22:16:12.979Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/09/bd/3667151ad0702282a1f4d5d29288fce8a13c8b6858bf0978c219cd52b231/uvloop-0.22.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac33ed96229b7790eb729702751c0e93ac5bc3bcf52ae9eccbff30da09194b86", upload-time = "2025-10-16T22:16:14.451Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-10-16T22:16:16.272Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/09/e0/604f61d004ded805f24974c87ddd8374ef675644f476f01f1df90e4cdf72/uvloop-0.22.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a592b043a47ad17911add5fbd087c76716d7c9ccc1d64ec9249ceafd735f03c2", upload-time = "2025-10-16T22:16:18.07Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bb/ce/8491fd370b0230deb5eac69c7aae35b3be527e25a911c0acdffb922dc1cd/uvloop-0.22.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1489cf791aa7b6e8c8be1c5a080bae3a672791fcb4e9e12249b05862a2ca9cec", upload-time = "2025-10-16T22:16:19.596Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", upload-time = "2025-10-16T22:16:21.187Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", upload-time = "2025-10-16T22:16:22.558Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", upload-time = "2025-10-16T22:16:23.903Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-10-16T22:16:25.246Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", upload-time = "2025-10-16T22:16:26.819Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", upload-time = "2025-10-16T22:16:28.252Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", upload-time = "2025-10-16T22:16:29.436Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", upload-time = "2025-10-16T22:16:30.493Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", upload-time = "2025-10-16T22:16:31.644Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-10-16T22:16:32.917Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/90/60/97362554ac21e20e81bcef1150cb2a7e4ffdaf8ea1e5b2e8bf7a053caa18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2", upload-time = "2025-10-16T22:16:34.015Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/99/39/6b3f7d234ba3964c428a6e40006340f53ba37993f46ed6e111c6e9141d18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0", upload-time = "2025-10-16T22:16:35.149Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", upload-time = "2025-10-16T22:16:36.833Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", upload-time = "2025-10-16T22:16:38.275Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", upload-time = "2025-10-16T22:16:39.375Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", upload-time = "2025-10-16T22:16:40.547Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", upload-time = "2025-10-16T22:16:41.694Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", upload-time = "2025-10-16T22:16:43.224Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", upload-time = "2025-10-16T22:16:44.503Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", upload-time = "2025-10-16T22:16:45.968Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", upload-time = "2025-10-16T22:16:47.451Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", upload-time = "2025-10-16T22:16:49.318Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", upload-time = "2025-10-16T22:16:50.517Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", upload-time = "2025-10-16T22:16:52.646Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", upload-time = "2025-10-16T22:16:54.355Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", upload-time = "2025-10-16T22:16:55.906Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", upload-time = "2025-10-16T22:16:57.008Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", upload-time = "2025-10-16T22:16:58.206Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", upload-time = "2025-10-16T22:16:59.36Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", upload-time = "2025-10-16T22:17:00.744Z" }, +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" }, + { url = "https://files.pythonhosted.org/packages/89/8c/182a2a593195bfd39842ea68ebc084e20c850806117213f5a299dfc513d9/uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705", size = 1358611, upload-time = "2025-10-16T22:16:36.833Z" }, + { url = "https://files.pythonhosted.org/packages/d2/14/e301ee96a6dc95224b6f1162cd3312f6d1217be3907b79173b06785f2fe7/uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8", size = 751811, upload-time = "2025-10-16T22:16:38.275Z" }, + { url = "https://files.pythonhosted.org/packages/b7/02/654426ce265ac19e2980bfd9ea6590ca96a56f10c76e63801a2df01c0486/uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d", size = 4288562, upload-time = "2025-10-16T22:16:39.375Z" }, + { url = "https://files.pythonhosted.org/packages/15/c0/0be24758891ef825f2065cd5db8741aaddabe3e248ee6acc5e8a80f04005/uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e", size = 4366890, upload-time = "2025-10-16T22:16:40.547Z" }, + { url = "https://files.pythonhosted.org/packages/d2/53/8369e5219a5855869bcee5f4d317f6da0e2c669aecf0ef7d371e3d084449/uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e", size = 4119472, upload-time = "2025-10-16T22:16:41.694Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ba/d69adbe699b768f6b29a5eec7b47dd610bd17a69de51b251126a801369ea/uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad", size = 4239051, upload-time = "2025-10-16T22:16:43.224Z" }, + { url = "https://files.pythonhosted.org/packages/90/cd/b62bdeaa429758aee8de8b00ac0dd26593a9de93d302bff3d21439e9791d/uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142", size = 1362067, upload-time = "2025-10-16T22:16:44.503Z" }, + { url = "https://files.pythonhosted.org/packages/0d/f8/a132124dfda0777e489ca86732e85e69afcd1ff7686647000050ba670689/uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74", size = 752423, upload-time = "2025-10-16T22:16:45.968Z" }, + { url = "https://files.pythonhosted.org/packages/a3/94/94af78c156f88da4b3a733773ad5ba0b164393e357cc4bd0ab2e2677a7d6/uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35", size = 4272437, upload-time = "2025-10-16T22:16:47.451Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/60249e9fd07b32c665192cec7af29e06c7cd96fa1d08b84f012a56a0b38e/uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25", size = 4292101, upload-time = "2025-10-16T22:16:49.318Z" }, + { url = "https://files.pythonhosted.org/packages/02/62/67d382dfcb25d0a98ce73c11ed1a6fba5037a1a1d533dcbb7cab033a2636/uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6", size = 4114158, upload-time = "2025-10-16T22:16:50.517Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/f1171b4a882a5d13c8b7576f348acfe6074d72eaf52cccef752f748d4a9f/uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079", size = 4177360, upload-time = "2025-10-16T22:16:52.646Z" }, + { url = "https://files.pythonhosted.org/packages/79/7b/b01414f31546caf0919da80ad57cbfe24c56b151d12af68cee1b04922ca8/uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289", size = 1454790, upload-time = "2025-10-16T22:16:54.355Z" }, + { url = "https://files.pythonhosted.org/packages/d4/31/0bb232318dd838cad3fa8fb0c68c8b40e1145b32025581975e18b11fab40/uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3", size = 796783, upload-time = "2025-10-16T22:16:55.906Z" }, + { url = "https://files.pythonhosted.org/packages/42/38/c9b09f3271a7a723a5de69f8e237ab8e7803183131bc57c890db0b6bb872/uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c", size = 4647548, upload-time = "2025-10-16T22:16:57.008Z" }, + { url = "https://files.pythonhosted.org/packages/c1/37/945b4ca0ac27e3dc4952642d4c900edd030b3da6c9634875af6e13ae80e5/uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21", size = 4467065, upload-time = "2025-10-16T22:16:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/97/cc/48d232f33d60e2e2e0b42f4e73455b146b76ebe216487e862700457fbf3c/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88", size = 4328384, upload-time = "2025-10-16T22:16:59.36Z" }, + { url = "https://files.pythonhosted.org/packages/e4/16/c1fd27e9549f3c4baf1dc9c20c456cd2f822dbf8de9f463824b0c0357e06/uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e", size = 4296730, upload-time = "2025-10-16T22:17:00.744Z" }, ] [[package]] name = "waitress" version = "3.0.2" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/bf/cb/04ddb054f45faa306a230769e868c28b8065ea196891f09004ebace5b184/waitress-3.0.2.tar.gz", hash = "sha256:682aaaf2af0c44ada4abfb70ded36393f0e307f4ab9456a215ce0020baefc31f", upload-time = "2024-11-16T20:02:35.195Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/cb/04ddb054f45faa306a230769e868c28b8065ea196891f09004ebace5b184/waitress-3.0.2.tar.gz", hash = "sha256:682aaaf2af0c44ada4abfb70ded36393f0e307f4ab9456a215ce0020baefc31f", size = 179901, upload-time = "2024-11-16T20:02:35.195Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/8d/57/a27182528c90ef38d82b636a11f606b0cbb0e17588ed205435f8affe3368/waitress-3.0.2-py3-none-any.whl", hash = "sha256:c56d67fd6e87c2ee598b76abdd4e96cfad1f24cacdea5078d382b1f9d7b5ed2e", upload-time = "2024-11-16T20:02:33.858Z" }, + { url = "https://files.pythonhosted.org/packages/8d/57/a27182528c90ef38d82b636a11f606b0cbb0e17588ed205435f8affe3368/waitress-3.0.2-py3-none-any.whl", hash = "sha256:c56d67fd6e87c2ee598b76abdd4e96cfad1f24cacdea5078d382b1f9d7b5ed2e", size = 56232, upload-time = "2024-11-16T20:02:33.858Z" }, ] [[package]] @@ -6241,177 +6237,177 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", upload-time = "2025-10-14T15:06:21.08Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/a7/1a/206e8cf2dd86fddf939165a57b4df61607a1e0add2785f170a3f616b7d9f/watchfiles-1.1.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:eef58232d32daf2ac67f42dea51a2c80f0d03379075d44a587051e63cc2e368c", upload-time = "2025-10-14T15:04:18.753Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b3/0f/abaf5262b9c496b5dad4ed3c0e799cbecb1f8ea512ecb6ddd46646a9fca3/watchfiles-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03fa0f5237118a0c5e496185cafa92878568b652a2e9a9382a5151b1a0380a43", upload-time = "2025-10-14T15:04:20.297Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b1/04/9cc0ba88697b34b755371f5ace8d3a4d9a15719c07bdc7bd13d7d8c6a341/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca65483439f9c791897f7db49202301deb6e15fe9f8fe2fed555bf986d10c31", upload-time = "2025-10-14T15:04:21.527Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/9c/eda4615863cd8621e89aed4df680d8c3ec3da6a4cf1da113c17decd87c7f/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0ab1c1af0cb38e3f598244c17919fb1a84d1629cc08355b0074b6d7f53138ac", upload-time = "2025-10-14T15:04:22.795Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/84/13/f28b3f340157d03cbc8197629bc109d1098764abe1e60874622a0be5c112/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bc570d6c01c206c46deb6e935a260be44f186a2f05179f52f7fcd2be086a94d", upload-time = "2025-10-14T15:04:24.138Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/93/cfa597fa9389e122488f7ffdbd6db505b3b915ca7435ecd7542e855898c2/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e84087b432b6ac94778de547e08611266f1f8ffad28c0ee4c82e028b0fc5966d", upload-time = "2025-10-14T15:04:25.057Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/57/1e/68c1ed5652b48d89fc24d6af905d88ee4f82fa8bc491e2666004e307ded1/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:620bae625f4cb18427b1bb1a2d9426dc0dd5a5ba74c7c2cdb9de405f7b129863", upload-time = "2025-10-14T15:04:26.497Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/dc/1a680b7458ffa3b14bb64878112aefc8f2e4f73c5af763cbf0bd43100658/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:544364b2b51a9b0c7000a4b4b02f90e9423d97fbbf7e06689236443ebcad81ab", upload-time = "2025-10-14T15:04:27.539Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/61/a5/3d782a666512e01eaa6541a72ebac1d3aae191ff4a31274a66b8dd85760c/watchfiles-1.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bbe1ef33d45bc71cf21364df962af171f96ecaeca06bd9e3d0b583efb12aec82", upload-time = "2025-10-14T15:04:28.495Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9b/73/bb5f38590e34687b2a9c47a244aa4dd50c56a825969c92c9c5fc7387cea1/watchfiles-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a0bb430adb19ef49389e1ad368450193a90038b5b752f4ac089ec6942c4dff4", upload-time = "2025-10-14T15:04:29.491Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f1/ac/c9bb0ec696e07a20bd58af5399aeadaef195fb2c73d26baf55180fe4a942/watchfiles-1.1.1-cp310-cp310-win32.whl", hash = "sha256:3f6d37644155fb5beca5378feb8c1708d5783145f2a0f1c4d5a061a210254844", upload-time = "2025-10-14T15:04:30.435Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/11/a0/a60c5a7c2ec59fa062d9a9c61d02e3b6abd94d32aac2d8344c4bdd033326/watchfiles-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:a36d8efe0f290835fd0f33da35042a1bb5dc0e83cbc092dcf69bce442579e88e", upload-time = "2025-10-14T15:04:31.53Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", upload-time = "2025-10-14T15:04:32.899Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", upload-time = "2025-10-14T15:04:33.761Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", upload-time = "2025-10-14T15:04:34.679Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4a/24/33e71113b320030011c8e4316ccca04194bf0cbbaeee207f00cbc7d6b9f5/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b", upload-time = "2025-10-14T15:04:35.963Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f4/c3/3c9a55f255aa57b91579ae9e98c88704955fa9dac3e5614fb378291155df/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14", upload-time = "2025-10-14T15:04:37.091Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/36/506447b73eb46c120169dc1717fe2eff07c234bb3232a7200b5f5bd816e9/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d", upload-time = "2025-10-14T15:04:38.39Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/82/ab/5f39e752a9838ec4d52e9b87c1e80f1ee3ccdbe92e183c15b6577ab9de16/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff", upload-time = "2025-10-14T15:04:39.666Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", upload-time = "2025-10-14T15:04:40.643Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", upload-time = "2025-10-14T15:04:41.789Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", upload-time = "2025-10-14T15:04:42.718Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/46/ef/f2ecb9a0f342b4bfad13a2787155c6ee7ce792140eac63a34676a2feeef2/watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849", upload-time = "2025-10-14T15:04:43.624Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/94/bc/f42d71125f19731ea435c3948cad148d31a64fccde3867e5ba4edee901f9/watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4", upload-time = "2025-10-14T15:04:44.516Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/57/c9/a30f897351f95bbbfb6abcadafbaca711ce1162f4db95fc908c98a9165f3/watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e", upload-time = "2025-10-14T15:04:45.883Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", upload-time = "2025-10-14T15:04:46.731Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", upload-time = "2025-10-14T15:04:48.003Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", upload-time = "2025-10-14T15:04:49.179Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", upload-time = "2025-10-14T15:04:50.155Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", upload-time = "2025-10-14T15:04:51.059Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", upload-time = "2025-10-14T15:04:52.031Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", upload-time = "2025-10-14T15:04:53.064Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", upload-time = "2025-10-14T15:04:55.174Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", upload-time = "2025-10-14T15:04:56.22Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", upload-time = "2025-10-14T15:04:57.521Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/bf/95895e78dd75efe9a7f31733607f384b42eb5feb54bd2eb6ed57cc2e94f4/watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9", upload-time = "2025-10-14T15:04:59.046Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/87/0a/90eb755f568de2688cb220171c4191df932232c20946966c27a59c400850/watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9", upload-time = "2025-10-14T15:05:00.081Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/36/76/f322701530586922fbd6723c4f91ace21364924822a8772c549483abed13/watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404", upload-time = "2025-10-14T15:05:01.168Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", upload-time = "2025-10-14T15:05:02.063Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", upload-time = "2025-10-14T15:05:03.052Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", upload-time = "2025-10-14T15:05:04.004Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", upload-time = "2025-10-14T15:05:04.942Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", upload-time = "2025-10-14T15:05:05.905Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", upload-time = "2025-10-14T15:05:06.906Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", upload-time = "2025-10-14T15:05:07.906Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", upload-time = "2025-10-14T15:05:09.138Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", upload-time = "2025-10-14T15:05:10.117Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", upload-time = "2025-10-14T15:05:11.146Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", upload-time = "2025-10-14T15:05:12.156Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", upload-time = "2025-10-14T15:05:13.208Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", upload-time = "2025-10-14T15:05:14.49Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", upload-time = "2025-10-14T15:05:15.777Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", upload-time = "2025-10-14T15:05:16.85Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", upload-time = "2025-10-14T15:05:17.876Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", upload-time = "2025-10-14T15:05:18.962Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", upload-time = "2025-10-14T15:05:20.094Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", upload-time = "2025-10-14T15:05:21.134Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", upload-time = "2025-10-14T15:05:22.306Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", upload-time = "2025-10-14T15:05:23.348Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", upload-time = "2025-10-14T15:05:24.398Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", upload-time = "2025-10-14T15:05:25.45Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", upload-time = "2025-10-14T15:05:26.501Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", upload-time = "2025-10-14T15:05:27.649Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", upload-time = "2025-10-14T15:05:28.701Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", upload-time = "2025-10-14T15:05:30.064Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", upload-time = "2025-10-14T15:05:31.064Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", upload-time = "2025-10-14T15:05:32.074Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", upload-time = "2025-10-14T15:05:33.209Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", upload-time = "2025-10-14T15:05:34.189Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", upload-time = "2025-10-14T15:05:35.216Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", upload-time = "2025-10-14T15:05:36.259Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1d/ce/d8acdc8de545de995c339be67711e474c77d643555a9bb74a9334252bd55/watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b", upload-time = "2025-10-14T15:05:37.63Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c4/c9/a74487f72d0451524be827e8edec251da0cc1fcf111646a511ae752e1a3d/watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a", upload-time = "2025-10-14T15:05:38.95Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/b8/8ac000702cdd496cdce998c6f4ee0ca1f15977bba51bdf07d872ebdfc34c/watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02", upload-time = "2025-10-14T15:05:39.954Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", upload-time = "2025-10-14T15:05:40.932Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", upload-time = "2025-10-14T15:05:41.945Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", upload-time = "2025-10-14T15:05:43.385Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", upload-time = "2025-10-14T15:05:44.404Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", upload-time = "2025-10-14T15:05:45.398Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", upload-time = "2025-10-14T15:05:46.502Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", upload-time = "2025-10-14T15:05:47.484Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", upload-time = "2025-10-14T15:05:48.928Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", upload-time = "2025-10-14T15:05:49.908Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", upload-time = "2025-10-14T15:05:50.941Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ba/4c/a888c91e2e326872fa4705095d64acd8aa2fb9c1f7b9bd0588f33850516c/watchfiles-1.1.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:17ef139237dfced9da49fb7f2232c86ca9421f666d78c264c7ffca6601d154c3", upload-time = "2025-10-14T15:06:05.809Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1e/c7/5420d1943c8e3ce1a21c0a9330bcf7edafb6aa65d26b21dbb3267c9e8112/watchfiles-1.1.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:672b8adf25b1a0d35c96b5888b7b18699d27d4194bac8beeae75be4b7a3fc9b2", upload-time = "2025-10-14T15:06:07.035Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/e5/0072cef3804ce8d3aaddbfe7788aadff6b3d3f98a286fdbee9fd74ca59a7/watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77a13aea58bc2b90173bc69f2a90de8e282648939a00a602e1dc4ee23e26b66d", upload-time = "2025-10-14T15:06:08.072Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/83/4e/b87b71cbdfad81ad7e83358b3e447fedd281b880a03d64a760fe0a11fc2e/watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b495de0bb386df6a12b18335a0285dda90260f51bdb505503c02bcd1ce27a8b", upload-time = "2025-10-14T15:06:09.209Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", upload-time = "2025-10-14T15:06:10.264Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", upload-time = "2025-10-14T15:06:11.28Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", upload-time = "2025-10-14T15:06:12.321Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", upload-time = "2025-10-14T15:06:13.372Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/c2/c9/8869df9b2a2d6c59d79220a4db37679e74f807c559ffe5265e08b227a210/watchfiles-1.1.1.tar.gz", hash = "sha256:a173cb5c16c4f40ab19cecf48a534c409f7ea983ab8fed0741304a1c0a31b3f2", size = 94440, upload-time = "2025-10-14T15:06:21.08Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/1a/206e8cf2dd86fddf939165a57b4df61607a1e0add2785f170a3f616b7d9f/watchfiles-1.1.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:eef58232d32daf2ac67f42dea51a2c80f0d03379075d44a587051e63cc2e368c", size = 407318, upload-time = "2025-10-14T15:04:18.753Z" }, + { url = "https://files.pythonhosted.org/packages/b3/0f/abaf5262b9c496b5dad4ed3c0e799cbecb1f8ea512ecb6ddd46646a9fca3/watchfiles-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:03fa0f5237118a0c5e496185cafa92878568b652a2e9a9382a5151b1a0380a43", size = 394478, upload-time = "2025-10-14T15:04:20.297Z" }, + { url = "https://files.pythonhosted.org/packages/b1/04/9cc0ba88697b34b755371f5ace8d3a4d9a15719c07bdc7bd13d7d8c6a341/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ca65483439f9c791897f7db49202301deb6e15fe9f8fe2fed555bf986d10c31", size = 449894, upload-time = "2025-10-14T15:04:21.527Z" }, + { url = "https://files.pythonhosted.org/packages/d2/9c/eda4615863cd8621e89aed4df680d8c3ec3da6a4cf1da113c17decd87c7f/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0ab1c1af0cb38e3f598244c17919fb1a84d1629cc08355b0074b6d7f53138ac", size = 459065, upload-time = "2025-10-14T15:04:22.795Z" }, + { url = "https://files.pythonhosted.org/packages/84/13/f28b3f340157d03cbc8197629bc109d1098764abe1e60874622a0be5c112/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bc570d6c01c206c46deb6e935a260be44f186a2f05179f52f7fcd2be086a94d", size = 488377, upload-time = "2025-10-14T15:04:24.138Z" }, + { url = "https://files.pythonhosted.org/packages/86/93/cfa597fa9389e122488f7ffdbd6db505b3b915ca7435ecd7542e855898c2/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e84087b432b6ac94778de547e08611266f1f8ffad28c0ee4c82e028b0fc5966d", size = 595837, upload-time = "2025-10-14T15:04:25.057Z" }, + { url = "https://files.pythonhosted.org/packages/57/1e/68c1ed5652b48d89fc24d6af905d88ee4f82fa8bc491e2666004e307ded1/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:620bae625f4cb18427b1bb1a2d9426dc0dd5a5ba74c7c2cdb9de405f7b129863", size = 473456, upload-time = "2025-10-14T15:04:26.497Z" }, + { url = "https://files.pythonhosted.org/packages/d5/dc/1a680b7458ffa3b14bb64878112aefc8f2e4f73c5af763cbf0bd43100658/watchfiles-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:544364b2b51a9b0c7000a4b4b02f90e9423d97fbbf7e06689236443ebcad81ab", size = 455614, upload-time = "2025-10-14T15:04:27.539Z" }, + { url = "https://files.pythonhosted.org/packages/61/a5/3d782a666512e01eaa6541a72ebac1d3aae191ff4a31274a66b8dd85760c/watchfiles-1.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bbe1ef33d45bc71cf21364df962af171f96ecaeca06bd9e3d0b583efb12aec82", size = 630690, upload-time = "2025-10-14T15:04:28.495Z" }, + { url = "https://files.pythonhosted.org/packages/9b/73/bb5f38590e34687b2a9c47a244aa4dd50c56a825969c92c9c5fc7387cea1/watchfiles-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1a0bb430adb19ef49389e1ad368450193a90038b5b752f4ac089ec6942c4dff4", size = 622459, upload-time = "2025-10-14T15:04:29.491Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ac/c9bb0ec696e07a20bd58af5399aeadaef195fb2c73d26baf55180fe4a942/watchfiles-1.1.1-cp310-cp310-win32.whl", hash = "sha256:3f6d37644155fb5beca5378feb8c1708d5783145f2a0f1c4d5a061a210254844", size = 272663, upload-time = "2025-10-14T15:04:30.435Z" }, + { url = "https://files.pythonhosted.org/packages/11/a0/a60c5a7c2ec59fa062d9a9c61d02e3b6abd94d32aac2d8344c4bdd033326/watchfiles-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:a36d8efe0f290835fd0f33da35042a1bb5dc0e83cbc092dcf69bce442579e88e", size = 287453, upload-time = "2025-10-14T15:04:31.53Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f8/2c5f479fb531ce2f0564eda479faecf253d886b1ab3630a39b7bf7362d46/watchfiles-1.1.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f57b396167a2565a4e8b5e56a5a1c537571733992b226f4f1197d79e94cf0ae5", size = 406529, upload-time = "2025-10-14T15:04:32.899Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cd/f515660b1f32f65df671ddf6f85bfaca621aee177712874dc30a97397977/watchfiles-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:421e29339983e1bebc281fab40d812742268ad057db4aee8c4d2bce0af43b741", size = 394384, upload-time = "2025-10-14T15:04:33.761Z" }, + { url = "https://files.pythonhosted.org/packages/7b/c3/28b7dc99733eab43fca2d10f55c86e03bd6ab11ca31b802abac26b23d161/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e43d39a741e972bab5d8100b5cdacf69db64e34eb19b6e9af162bccf63c5cc6", size = 448789, upload-time = "2025-10-14T15:04:34.679Z" }, + { url = "https://files.pythonhosted.org/packages/4a/24/33e71113b320030011c8e4316ccca04194bf0cbbaeee207f00cbc7d6b9f5/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f537afb3276d12814082a2e9b242bdcf416c2e8fd9f799a737990a1dbe906e5b", size = 460521, upload-time = "2025-10-14T15:04:35.963Z" }, + { url = "https://files.pythonhosted.org/packages/f4/c3/3c9a55f255aa57b91579ae9e98c88704955fa9dac3e5614fb378291155df/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2cd9e04277e756a2e2d2543d65d1e2166d6fd4c9b183f8808634fda23f17b14", size = 488722, upload-time = "2025-10-14T15:04:37.091Z" }, + { url = "https://files.pythonhosted.org/packages/49/36/506447b73eb46c120169dc1717fe2eff07c234bb3232a7200b5f5bd816e9/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f3f58818dc0b07f7d9aa7fe9eb1037aecb9700e63e1f6acfed13e9fef648f5d", size = 596088, upload-time = "2025-10-14T15:04:38.39Z" }, + { url = "https://files.pythonhosted.org/packages/82/ab/5f39e752a9838ec4d52e9b87c1e80f1ee3ccdbe92e183c15b6577ab9de16/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb9f66367023ae783551042d31b1d7fd422e8289eedd91f26754a66f44d5cff", size = 472923, upload-time = "2025-10-14T15:04:39.666Z" }, + { url = "https://files.pythonhosted.org/packages/af/b9/a419292f05e302dea372fa7e6fda5178a92998411f8581b9830d28fb9edb/watchfiles-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aebfd0861a83e6c3d1110b78ad54704486555246e542be3e2bb94195eabb2606", size = 456080, upload-time = "2025-10-14T15:04:40.643Z" }, + { url = "https://files.pythonhosted.org/packages/b0/c3/d5932fd62bde1a30c36e10c409dc5d54506726f08cb3e1d8d0ba5e2bc8db/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5fac835b4ab3c6487b5dbad78c4b3724e26bcc468e886f8ba8cc4306f68f6701", size = 629432, upload-time = "2025-10-14T15:04:41.789Z" }, + { url = "https://files.pythonhosted.org/packages/f7/77/16bddd9779fafb795f1a94319dc965209c5641db5bf1edbbccace6d1b3c0/watchfiles-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:399600947b170270e80134ac854e21b3ccdefa11a9529a3decc1327088180f10", size = 623046, upload-time = "2025-10-14T15:04:42.718Z" }, + { url = "https://files.pythonhosted.org/packages/46/ef/f2ecb9a0f342b4bfad13a2787155c6ee7ce792140eac63a34676a2feeef2/watchfiles-1.1.1-cp311-cp311-win32.whl", hash = "sha256:de6da501c883f58ad50db3a32ad397b09ad29865b5f26f64c24d3e3281685849", size = 271473, upload-time = "2025-10-14T15:04:43.624Z" }, + { url = "https://files.pythonhosted.org/packages/94/bc/f42d71125f19731ea435c3948cad148d31a64fccde3867e5ba4edee901f9/watchfiles-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:35c53bd62a0b885bf653ebf6b700d1bf05debb78ad9292cf2a942b23513dc4c4", size = 287598, upload-time = "2025-10-14T15:04:44.516Z" }, + { url = "https://files.pythonhosted.org/packages/57/c9/a30f897351f95bbbfb6abcadafbaca711ce1162f4db95fc908c98a9165f3/watchfiles-1.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:57ca5281a8b5e27593cb7d82c2ac927ad88a96ed406aa446f6344e4328208e9e", size = 277210, upload-time = "2025-10-14T15:04:45.883Z" }, + { url = "https://files.pythonhosted.org/packages/74/d5/f039e7e3c639d9b1d09b07ea412a6806d38123f0508e5f9b48a87b0a76cc/watchfiles-1.1.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8c89f9f2f740a6b7dcc753140dd5e1ab9215966f7a3530d0c0705c83b401bd7d", size = 404745, upload-time = "2025-10-14T15:04:46.731Z" }, + { url = "https://files.pythonhosted.org/packages/a5/96/a881a13aa1349827490dab2d363c8039527060cfcc2c92cc6d13d1b1049e/watchfiles-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bd404be08018c37350f0d6e34676bd1e2889990117a2b90070b3007f172d0610", size = 391769, upload-time = "2025-10-14T15:04:48.003Z" }, + { url = "https://files.pythonhosted.org/packages/4b/5b/d3b460364aeb8da471c1989238ea0e56bec24b6042a68046adf3d9ddb01c/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8526e8f916bb5b9a0a777c8317c23ce65de259422bba5b31325a6fa6029d33af", size = 449374, upload-time = "2025-10-14T15:04:49.179Z" }, + { url = "https://files.pythonhosted.org/packages/b9/44/5769cb62d4ed055cb17417c0a109a92f007114a4e07f30812a73a4efdb11/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2edc3553362b1c38d9f06242416a5d8e9fe235c204a4072e988ce2e5bb1f69f6", size = 459485, upload-time = "2025-10-14T15:04:50.155Z" }, + { url = "https://files.pythonhosted.org/packages/19/0c/286b6301ded2eccd4ffd0041a1b726afda999926cf720aab63adb68a1e36/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30f7da3fb3f2844259cba4720c3fc7138eb0f7b659c38f3bfa65084c7fc7abce", size = 488813, upload-time = "2025-10-14T15:04:51.059Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2b/8530ed41112dd4a22f4dcfdb5ccf6a1baad1ff6eed8dc5a5f09e7e8c41c7/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8979280bdafff686ba5e4d8f97840f929a87ed9cdf133cbbd42f7766774d2aa", size = 594816, upload-time = "2025-10-14T15:04:52.031Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d2/f5f9fb49489f184f18470d4f99f4e862a4b3e9ac2865688eb2099e3d837a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dcc5c24523771db3a294c77d94771abcfcb82a0e0ee8efd910c37c59ec1b31bb", size = 475186, upload-time = "2025-10-14T15:04:53.064Z" }, + { url = "https://files.pythonhosted.org/packages/cf/68/5707da262a119fb06fbe214d82dd1fe4a6f4af32d2d14de368d0349eb52a/watchfiles-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1db5d7ae38ff20153d542460752ff397fcf5c96090c1230803713cf3147a6803", size = 456812, upload-time = "2025-10-14T15:04:55.174Z" }, + { url = "https://files.pythonhosted.org/packages/66/ab/3cbb8756323e8f9b6f9acb9ef4ec26d42b2109bce830cc1f3468df20511d/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:28475ddbde92df1874b6c5c8aaeb24ad5be47a11f87cde5a28ef3835932e3e94", size = 630196, upload-time = "2025-10-14T15:04:56.22Z" }, + { url = "https://files.pythonhosted.org/packages/78/46/7152ec29b8335f80167928944a94955015a345440f524d2dfe63fc2f437b/watchfiles-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:36193ed342f5b9842edd3532729a2ad55c4160ffcfa3700e0d54be496b70dd43", size = 622657, upload-time = "2025-10-14T15:04:57.521Z" }, + { url = "https://files.pythonhosted.org/packages/0a/bf/95895e78dd75efe9a7f31733607f384b42eb5feb54bd2eb6ed57cc2e94f4/watchfiles-1.1.1-cp312-cp312-win32.whl", hash = "sha256:859e43a1951717cc8de7f4c77674a6d389b106361585951d9e69572823f311d9", size = 272042, upload-time = "2025-10-14T15:04:59.046Z" }, + { url = "https://files.pythonhosted.org/packages/87/0a/90eb755f568de2688cb220171c4191df932232c20946966c27a59c400850/watchfiles-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:91d4c9a823a8c987cce8fa2690923b069966dabb196dd8d137ea2cede885fde9", size = 288410, upload-time = "2025-10-14T15:05:00.081Z" }, + { url = "https://files.pythonhosted.org/packages/36/76/f322701530586922fbd6723c4f91ace21364924822a8772c549483abed13/watchfiles-1.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:a625815d4a2bdca61953dbba5a39d60164451ef34c88d751f6c368c3ea73d404", size = 278209, upload-time = "2025-10-14T15:05:01.168Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/f750b29225fe77139f7ae5de89d4949f5a99f934c65a1f1c0b248f26f747/watchfiles-1.1.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:130e4876309e8686a5e37dba7d5e9bc77e6ed908266996ca26572437a5271e18", size = 404321, upload-time = "2025-10-14T15:05:02.063Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/f07a295cde762644aa4c4bb0f88921d2d141af45e735b965fb2e87858328/watchfiles-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5f3bde70f157f84ece3765b42b4a52c6ac1a50334903c6eaf765362f6ccca88a", size = 391783, upload-time = "2025-10-14T15:05:03.052Z" }, + { url = "https://files.pythonhosted.org/packages/bc/11/fc2502457e0bea39a5c958d86d2cb69e407a4d00b85735ca724bfa6e0d1a/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e0b1fe858430fc0251737ef3824c54027bedb8c37c38114488b8e131cf8219", size = 449279, upload-time = "2025-10-14T15:05:04.004Z" }, + { url = "https://files.pythonhosted.org/packages/e3/1f/d66bc15ea0b728df3ed96a539c777acfcad0eb78555ad9efcaa1274688f0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f27db948078f3823a6bb3b465180db8ebecf26dd5dae6f6180bd87383b6b4428", size = 459405, upload-time = "2025-10-14T15:05:04.942Z" }, + { url = "https://files.pythonhosted.org/packages/be/90/9f4a65c0aec3ccf032703e6db02d89a157462fbb2cf20dd415128251cac0/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:059098c3a429f62fc98e8ec62b982230ef2c8df68c79e826e37b895bc359a9c0", size = 488976, upload-time = "2025-10-14T15:05:05.905Z" }, + { url = "https://files.pythonhosted.org/packages/37/57/ee347af605d867f712be7029bb94c8c071732a4b44792e3176fa3c612d39/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfb5862016acc9b869bb57284e6cb35fdf8e22fe59f7548858e2f971d045f150", size = 595506, upload-time = "2025-10-14T15:05:06.906Z" }, + { url = "https://files.pythonhosted.org/packages/a8/78/cc5ab0b86c122047f75e8fc471c67a04dee395daf847d3e59381996c8707/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:319b27255aacd9923b8a276bb14d21a5f7ff82564c744235fc5eae58d95422ae", size = 474936, upload-time = "2025-10-14T15:05:07.906Z" }, + { url = "https://files.pythonhosted.org/packages/62/da/def65b170a3815af7bd40a3e7010bf6ab53089ef1b75d05dd5385b87cf08/watchfiles-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c755367e51db90e75b19454b680903631d41f9e3607fbd941d296a020c2d752d", size = 456147, upload-time = "2025-10-14T15:05:09.138Z" }, + { url = "https://files.pythonhosted.org/packages/57/99/da6573ba71166e82d288d4df0839128004c67d2778d3b566c138695f5c0b/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c22c776292a23bfc7237a98f791b9ad3144b02116ff10d820829ce62dff46d0b", size = 630007, upload-time = "2025-10-14T15:05:10.117Z" }, + { url = "https://files.pythonhosted.org/packages/a8/51/7439c4dd39511368849eb1e53279cd3454b4a4dbace80bab88feeb83c6b5/watchfiles-1.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:3a476189be23c3686bc2f4321dd501cb329c0a0469e77b7b534ee10129ae6374", size = 622280, upload-time = "2025-10-14T15:05:11.146Z" }, + { url = "https://files.pythonhosted.org/packages/95/9c/8ed97d4bba5db6fdcdb2b298d3898f2dd5c20f6b73aee04eabe56c59677e/watchfiles-1.1.1-cp313-cp313-win32.whl", hash = "sha256:bf0a91bfb5574a2f7fc223cf95eeea79abfefa404bf1ea5e339c0c1560ae99a0", size = 272056, upload-time = "2025-10-14T15:05:12.156Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f3/c14e28429f744a260d8ceae18bf58c1d5fa56b50d006a7a9f80e1882cb0d/watchfiles-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:52e06553899e11e8074503c8e716d574adeeb7e68913115c4b3653c53f9bae42", size = 288162, upload-time = "2025-10-14T15:05:13.208Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/fe0e56c40d5cd29523e398d31153218718c5786b5e636d9ae8ae79453d27/watchfiles-1.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac3cc5759570cd02662b15fbcd9d917f7ecd47efe0d6b40474eafd246f91ea18", size = 277909, upload-time = "2025-10-14T15:05:14.49Z" }, + { url = "https://files.pythonhosted.org/packages/79/42/e0a7d749626f1e28c7108a99fb9bf524b501bbbeb9b261ceecde644d5a07/watchfiles-1.1.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:563b116874a9a7ce6f96f87cd0b94f7faf92d08d0021e837796f0a14318ef8da", size = 403389, upload-time = "2025-10-14T15:05:15.777Z" }, + { url = "https://files.pythonhosted.org/packages/15/49/08732f90ce0fbbc13913f9f215c689cfc9ced345fb1bcd8829a50007cc8d/watchfiles-1.1.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3ad9fe1dae4ab4212d8c91e80b832425e24f421703b5a42ef2e4a1e215aff051", size = 389964, upload-time = "2025-10-14T15:05:16.85Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/7c315d4bd5f2538910491a0393c56bf70d333d51bc5b34bee8e68e8cea19/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce70f96a46b894b36eba678f153f052967a0d06d5b5a19b336ab0dbbd029f73e", size = 448114, upload-time = "2025-10-14T15:05:17.876Z" }, + { url = "https://files.pythonhosted.org/packages/c3/24/9e096de47a4d11bc4df41e9d1e61776393eac4cb6eb11b3e23315b78b2cc/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb467c999c2eff23a6417e58d75e5828716f42ed8289fe6b77a7e5a91036ca70", size = 460264, upload-time = "2025-10-14T15:05:18.962Z" }, + { url = "https://files.pythonhosted.org/packages/cc/0f/e8dea6375f1d3ba5fcb0b3583e2b493e77379834c74fd5a22d66d85d6540/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:836398932192dae4146c8f6f737d74baeac8b70ce14831a239bdb1ca882fc261", size = 487877, upload-time = "2025-10-14T15:05:20.094Z" }, + { url = "https://files.pythonhosted.org/packages/ac/5b/df24cfc6424a12deb41503b64d42fbea6b8cb357ec62ca84a5a3476f654a/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:743185e7372b7bc7c389e1badcc606931a827112fbbd37f14c537320fca08620", size = 595176, upload-time = "2025-10-14T15:05:21.134Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b5/853b6757f7347de4e9b37e8cc3289283fb983cba1ab4d2d7144694871d9c/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afaeff7696e0ad9f02cbb8f56365ff4686ab205fcf9c4c5b6fdfaaa16549dd04", size = 473577, upload-time = "2025-10-14T15:05:22.306Z" }, + { url = "https://files.pythonhosted.org/packages/e1/f7/0a4467be0a56e80447c8529c9fce5b38eab4f513cb3d9bf82e7392a5696b/watchfiles-1.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f7eb7da0eb23aa2ba036d4f616d46906013a68caf61b7fdbe42fc8b25132e77", size = 455425, upload-time = "2025-10-14T15:05:23.348Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e0/82583485ea00137ddf69bc84a2db88bd92ab4a6e3c405e5fb878ead8d0e7/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:831a62658609f0e5c64178211c942ace999517f5770fe9436be4c2faeba0c0ef", size = 628826, upload-time = "2025-10-14T15:05:24.398Z" }, + { url = "https://files.pythonhosted.org/packages/28/9a/a785356fccf9fae84c0cc90570f11702ae9571036fb25932f1242c82191c/watchfiles-1.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f9a2ae5c91cecc9edd47e041a930490c31c3afb1f5e6d71de3dc671bfaca02bf", size = 622208, upload-time = "2025-10-14T15:05:25.45Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f4/0872229324ef69b2c3edec35e84bd57a1289e7d3fe74588048ed8947a323/watchfiles-1.1.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:d1715143123baeeaeadec0528bb7441103979a1d5f6fd0e1f915383fea7ea6d5", size = 404315, upload-time = "2025-10-14T15:05:26.501Z" }, + { url = "https://files.pythonhosted.org/packages/7b/22/16d5331eaed1cb107b873f6ae1b69e9ced582fcf0c59a50cd84f403b1c32/watchfiles-1.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:39574d6370c4579d7f5d0ad940ce5b20db0e4117444e39b6d8f99db5676c52fd", size = 390869, upload-time = "2025-10-14T15:05:27.649Z" }, + { url = "https://files.pythonhosted.org/packages/b2/7e/5643bfff5acb6539b18483128fdc0ef2cccc94a5b8fbda130c823e8ed636/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7365b92c2e69ee952902e8f70f3ba6360d0d596d9299d55d7d386df84b6941fb", size = 449919, upload-time = "2025-10-14T15:05:28.701Z" }, + { url = "https://files.pythonhosted.org/packages/51/2e/c410993ba5025a9f9357c376f48976ef0e1b1aefb73b97a5ae01a5972755/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bfff9740c69c0e4ed32416f013f3c45e2ae42ccedd1167ef2d805c000b6c71a5", size = 460845, upload-time = "2025-10-14T15:05:30.064Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a4/2df3b404469122e8680f0fcd06079317e48db58a2da2950fb45020947734/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b27cf2eb1dda37b2089e3907d8ea92922b673c0c427886d4edc6b94d8dfe5db3", size = 489027, upload-time = "2025-10-14T15:05:31.064Z" }, + { url = "https://files.pythonhosted.org/packages/ea/84/4587ba5b1f267167ee715b7f66e6382cca6938e0a4b870adad93e44747e6/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526e86aced14a65a5b0ec50827c745597c782ff46b571dbfe46192ab9e0b3c33", size = 595615, upload-time = "2025-10-14T15:05:32.074Z" }, + { url = "https://files.pythonhosted.org/packages/6a/0f/c6988c91d06e93cd0bb3d4a808bcf32375ca1904609835c3031799e3ecae/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04e78dd0b6352db95507fd8cb46f39d185cf8c74e4cf1e4fbad1d3df96faf510", size = 474836, upload-time = "2025-10-14T15:05:33.209Z" }, + { url = "https://files.pythonhosted.org/packages/b4/36/ded8aebea91919485b7bbabbd14f5f359326cb5ec218cd67074d1e426d74/watchfiles-1.1.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c85794a4cfa094714fb9c08d4a218375b2b95b8ed1666e8677c349906246c05", size = 455099, upload-time = "2025-10-14T15:05:34.189Z" }, + { url = "https://files.pythonhosted.org/packages/98/e0/8c9bdba88af756a2fce230dd365fab2baf927ba42cd47521ee7498fd5211/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:74d5012b7630714b66be7b7b7a78855ef7ad58e8650c73afc4c076a1f480a8d6", size = 630626, upload-time = "2025-10-14T15:05:35.216Z" }, + { url = "https://files.pythonhosted.org/packages/2a/84/a95db05354bf2d19e438520d92a8ca475e578c647f78f53197f5a2f17aaf/watchfiles-1.1.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:8fbe85cb3201c7d380d3d0b90e63d520f15d6afe217165d7f98c9c649654db81", size = 622519, upload-time = "2025-10-14T15:05:36.259Z" }, + { url = "https://files.pythonhosted.org/packages/1d/ce/d8acdc8de545de995c339be67711e474c77d643555a9bb74a9334252bd55/watchfiles-1.1.1-cp314-cp314-win32.whl", hash = "sha256:3fa0b59c92278b5a7800d3ee7733da9d096d4aabcfabb9a928918bd276ef9b9b", size = 272078, upload-time = "2025-10-14T15:05:37.63Z" }, + { url = "https://files.pythonhosted.org/packages/c4/c9/a74487f72d0451524be827e8edec251da0cc1fcf111646a511ae752e1a3d/watchfiles-1.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:c2047d0b6cea13b3316bdbafbfa0c4228ae593d995030fda39089d36e64fc03a", size = 287664, upload-time = "2025-10-14T15:05:38.95Z" }, + { url = "https://files.pythonhosted.org/packages/df/b8/8ac000702cdd496cdce998c6f4ee0ca1f15977bba51bdf07d872ebdfc34c/watchfiles-1.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:842178b126593addc05acf6fce960d28bc5fae7afbaa2c6c1b3a7b9460e5be02", size = 277154, upload-time = "2025-10-14T15:05:39.954Z" }, + { url = "https://files.pythonhosted.org/packages/47/a8/e3af2184707c29f0f14b1963c0aace6529f9d1b8582d5b99f31bbf42f59e/watchfiles-1.1.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:88863fbbc1a7312972f1c511f202eb30866370ebb8493aef2812b9ff28156a21", size = 403820, upload-time = "2025-10-14T15:05:40.932Z" }, + { url = "https://files.pythonhosted.org/packages/c0/ec/e47e307c2f4bd75f9f9e8afbe3876679b18e1bcec449beca132a1c5ffb2d/watchfiles-1.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:55c7475190662e202c08c6c0f4d9e345a29367438cf8e8037f3155e10a88d5a5", size = 390510, upload-time = "2025-10-14T15:05:41.945Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a0/ad235642118090f66e7b2f18fd5c42082418404a79205cdfca50b6309c13/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f53fa183d53a1d7a8852277c92b967ae99c2d4dcee2bfacff8868e6e30b15f7", size = 448408, upload-time = "2025-10-14T15:05:43.385Z" }, + { url = "https://files.pythonhosted.org/packages/df/85/97fa10fd5ff3332ae17e7e40e20784e419e28521549780869f1413742e9d/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6aae418a8b323732fa89721d86f39ec8f092fc2af67f4217a2b07fd3e93c6101", size = 458968, upload-time = "2025-10-14T15:05:44.404Z" }, + { url = "https://files.pythonhosted.org/packages/47/c2/9059c2e8966ea5ce678166617a7f75ecba6164375f3b288e50a40dc6d489/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f096076119da54a6080e8920cbdaac3dbee667eb91dcc5e5b78840b87415bd44", size = 488096, upload-time = "2025-10-14T15:05:45.398Z" }, + { url = "https://files.pythonhosted.org/packages/94/44/d90a9ec8ac309bc26db808a13e7bfc0e4e78b6fc051078a554e132e80160/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00485f441d183717038ed2e887a7c868154f216877653121068107b227a2f64c", size = 596040, upload-time = "2025-10-14T15:05:46.502Z" }, + { url = "https://files.pythonhosted.org/packages/95/68/4e3479b20ca305cfc561db3ed207a8a1c745ee32bf24f2026a129d0ddb6e/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a55f3e9e493158d7bfdb60a1165035f1cf7d320914e7b7ea83fe22c6023b58fc", size = 473847, upload-time = "2025-10-14T15:05:47.484Z" }, + { url = "https://files.pythonhosted.org/packages/4f/55/2af26693fd15165c4ff7857e38330e1b61ab8c37d15dc79118cdba115b7a/watchfiles-1.1.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c91ed27800188c2ae96d16e3149f199d62f86c7af5f5f4d2c61a3ed8cd3666c", size = 455072, upload-time = "2025-10-14T15:05:48.928Z" }, + { url = "https://files.pythonhosted.org/packages/66/1d/d0d200b10c9311ec25d2273f8aad8c3ef7cc7ea11808022501811208a750/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:311ff15a0bae3714ffb603e6ba6dbfba4065ab60865d15a6ec544133bdb21099", size = 629104, upload-time = "2025-10-14T15:05:49.908Z" }, + { url = "https://files.pythonhosted.org/packages/e3/bd/fa9bb053192491b3867ba07d2343d9f2252e00811567d30ae8d0f78136fe/watchfiles-1.1.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:a916a2932da8f8ab582f242c065f5c81bed3462849ca79ee357dd9551b0e9b01", size = 622112, upload-time = "2025-10-14T15:05:50.941Z" }, + { url = "https://files.pythonhosted.org/packages/ba/4c/a888c91e2e326872fa4705095d64acd8aa2fb9c1f7b9bd0588f33850516c/watchfiles-1.1.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:17ef139237dfced9da49fb7f2232c86ca9421f666d78c264c7ffca6601d154c3", size = 409611, upload-time = "2025-10-14T15:06:05.809Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c7/5420d1943c8e3ce1a21c0a9330bcf7edafb6aa65d26b21dbb3267c9e8112/watchfiles-1.1.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:672b8adf25b1a0d35c96b5888b7b18699d27d4194bac8beeae75be4b7a3fc9b2", size = 396889, upload-time = "2025-10-14T15:06:07.035Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e5/0072cef3804ce8d3aaddbfe7788aadff6b3d3f98a286fdbee9fd74ca59a7/watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77a13aea58bc2b90173bc69f2a90de8e282648939a00a602e1dc4ee23e26b66d", size = 451616, upload-time = "2025-10-14T15:06:08.072Z" }, + { url = "https://files.pythonhosted.org/packages/83/4e/b87b71cbdfad81ad7e83358b3e447fedd281b880a03d64a760fe0a11fc2e/watchfiles-1.1.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b495de0bb386df6a12b18335a0285dda90260f51bdb505503c02bcd1ce27a8b", size = 458413, upload-time = "2025-10-14T15:06:09.209Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8e/e500f8b0b77be4ff753ac94dc06b33d8f0d839377fee1b78e8c8d8f031bf/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:db476ab59b6765134de1d4fe96a1a9c96ddf091683599be0f26147ea1b2e4b88", size = 408250, upload-time = "2025-10-14T15:06:10.264Z" }, + { url = "https://files.pythonhosted.org/packages/bd/95/615e72cd27b85b61eec764a5ca51bd94d40b5adea5ff47567d9ebc4d275a/watchfiles-1.1.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:89eef07eee5e9d1fda06e38822ad167a044153457e6fd997f8a858ab7564a336", size = 396117, upload-time = "2025-10-14T15:06:11.28Z" }, + { url = "https://files.pythonhosted.org/packages/c9/81/e7fe958ce8a7fb5c73cc9fb07f5aeaf755e6aa72498c57d760af760c91f8/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce19e06cbda693e9e7686358af9cd6f5d61312ab8b00488bc36f5aabbaf77e24", size = 450493, upload-time = "2025-10-14T15:06:12.321Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d4/ed38dd3b1767193de971e694aa544356e63353c33a85d948166b5ff58b9e/watchfiles-1.1.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e6f39af2eab0118338902798b5aa6664f46ff66bc0280de76fca67a7f262a49", size = 457546, upload-time = "2025-10-14T15:06:13.372Z" }, ] [[package]] name = "wcwidth" version = "0.6.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", upload-time = "2026-02-06T19:19:40.919Z" } +sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", upload-time = "2026-02-06T19:19:39.646Z" }, + { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, ] [[package]] name = "websockets" version = "16.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", upload-time = "2026-01-10T09:23:47.181Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/20/74/221f58decd852f4b59cc3354cccaf87e8ef695fede361d03dc9a7396573b/websockets-16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04cdd5d2d1dacbad0a7bf36ccbcd3ccd5a30ee188f2560b7a62a30d14107b31a", upload-time = "2026-01-10T09:22:21.28Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/0f/22ef6107ee52ab7f0b710d55d36f5a5d3ef19e8a205541a6d7ffa7994e5a/websockets-16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8ff32bb86522a9e5e31439a58addbb0166f0204d64066fb955265c4e214160f0", upload-time = "2026-01-10T09:22:22.696Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/10/40/904a4cb30d9b61c0e278899bf36342e9b0208eb3c470324a9ecbaac2a30f/websockets-16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:583b7c42688636f930688d712885cf1531326ee05effd982028212ccc13e5957", upload-time = "2026-01-10T09:22:23.94Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-01-10T09:22:25.469Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/26/d40eaa2a46d4302becec8d15b0fc5e45bdde05191e7628405a19cf491ccd/websockets-16.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df57afc692e517a85e65b72e165356ed1df12386ecb879ad5693be08fac65dde", upload-time = "2026-01-10T09:22:27.101Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/ba/6500a0efc94f7373ee8fefa8c271acdfd4dca8bd49a90d4be7ccabfc397e/websockets-16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2b9f1e0d69bc60a4a87349d50c09a037a2607918746f07de04df9e43252c77a3", upload-time = "2026-01-10T09:22:28.293Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/04/b4/96bf2cee7c8d8102389374a2616200574f5f01128d1082f44102140344cc/websockets-16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:335c23addf3d5e6a8633f9f8eda77efad001671e80b95c491dd0924587ece0b3", upload-time = "2026-01-10T09:22:30.394Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/02/8e/81f40fb00fd125357814e8c3025738fc4ffc3da4b6b4a4472a82ba304b41/websockets-16.0-cp310-cp310-win32.whl", hash = "sha256:37b31c1623c6605e4c00d466c9d633f9b812ea430c11c8a278774a1fde1acfa9", upload-time = "2026-01-10T09:22:32.083Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b4/5f/7e40efe8df57db9b91c88a43690ac66f7b7aa73a11aa6a66b927e44f26fa/websockets-16.0-cp310-cp310-win_amd64.whl", hash = "sha256:8e1dab317b6e77424356e11e99a432b7cb2f3ec8c5ab4dabbcee6add48f72b35", upload-time = "2026-01-10T09:22:33.345Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/db/de907251b4ff46ae804ad0409809504153b3f30984daf82a1d84a9875830/websockets-16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8", upload-time = "2026-01-10T09:22:34.539Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f3/fa/abe89019d8d8815c8781e90d697dec52523fb8ebe308bf11664e8de1877e/websockets-16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:417b28978cdccab24f46400586d128366313e8a96312e4b9362a4af504f3bbad", upload-time = "2026-01-10T09:22:36.332Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/5d/88ea17ed1ded2079358b40d31d48abe90a73c9e5819dbcde1606e991e2ad/websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d", upload-time = "2026-01-10T09:22:37.602Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-01-10T09:22:38.789Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c8/c5/27178df583b6c5b31b29f526ba2da5e2f864ecc79c99dae630a85d68c304/websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b", upload-time = "2026-01-10T09:22:39.893Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/87/05/536652aa84ddc1c018dbb7e2c4cbcd0db884580bf8e95aece7593fde526f/websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5", upload-time = "2026-01-10T09:22:41.016Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6d/e2/d5332c90da12b1e01f06fb1b85c50cfc489783076547415bf9f0a659ec19/websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64", upload-time = "2026-01-10T09:22:42.442Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/fb/d3f9576691cae9253b51555f841bc6600bf0a983a461c79500ace5a5b364/websockets-16.0-cp311-cp311-win32.whl", hash = "sha256:5f451484aeb5cafee1ccf789b1b66f535409d038c56966d6101740c1614b86c6", upload-time = "2026-01-10T09:22:43.654Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/54/67/eaff76b3dbaf18dcddabc3b8c1dba50b483761cccff67793897945b37408/websockets-16.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7f0659570eefb578dacde98e24fb60af35350193e4f56e11190787bee77dac", upload-time = "2026-01-10T09:22:44.941Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/84/7b/bac442e6b96c9d25092695578dda82403c77936104b5682307bd4deb1ad4/websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00", upload-time = "2026-01-10T09:22:46.787Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b0/fe/136ccece61bd690d9c1f715baaeefd953bb2360134de73519d5df19d29ca/websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79", upload-time = "2026-01-10T09:22:47.999Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", upload-time = "2026-01-10T09:22:49.809Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-01-10T09:22:51.071Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", upload-time = "2026-01-10T09:22:52.224Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", upload-time = "2026-01-10T09:22:53.443Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", upload-time = "2026-01-10T09:22:55.033Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/91/d6/7d4553ad4bf1c0421e1ebd4b18de5d9098383b5caa1d937b63df8d04b565/websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89", upload-time = "2026-01-10T09:22:56.251Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c3/f0/f3a17365441ed1c27f850a80b2bc680a0fa9505d733fe152fdf5e98c1c0b/websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea", upload-time = "2026-01-10T09:22:57.478Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", upload-time = "2026-01-10T09:22:59.333Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7e/0c/8811fc53e9bcff68fe7de2bcbe75116a8d959ac699a3200f4847a8925210/websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230", upload-time = "2026-01-10T09:23:01.171Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", upload-time = "2026-01-10T09:23:02.341Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", upload-time = "2026-01-10T09:23:03.756Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", upload-time = "2026-01-10T09:23:05.01Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", upload-time = "2026-01-10T09:23:06.301Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", upload-time = "2026-01-10T09:23:07.492Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3c/a1/3d6ccdcd125b0a42a311bcd15a7f705d688f73b2a22d8cf1c0875d35d34a/websockets-16.0-cp313-cp313-win32.whl", hash = "sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a", upload-time = "2026-01-10T09:23:09.245Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6b/ae/90366304d7c2ce80f9b826096a9e9048b4bb760e44d3b873bb272cba696b/websockets-16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156", upload-time = "2026-01-10T09:23:10.483Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f3/1d/e88022630271f5bd349ed82417136281931e558d628dd52c4d8621b4a0b2/websockets-16.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8cc451a50f2aee53042ac52d2d053d08bf89bcb31ae799cb4487587661c038a0", upload-time = "2026-01-10T09:23:12.178Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f2/78/e63be1bf0724eeb4616efb1ae1c9044f7c3953b7957799abb5915bffd38e/websockets-16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:daa3b6ff70a9241cf6c7fc9e949d41232d9d7d26fd3522b1ad2b4d62487e9904", upload-time = "2026-01-10T09:23:13.511Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fd3cb4adb94a2a6e2b7c0d8d05cb94e6f1c81a0cf9dc2694fb65c7e8d94c42e4", upload-time = "2026-01-10T09:23:14.727Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/63/bc/d3e208028de777087e6fb2b122051a6ff7bbcca0d6df9d9c2bf1dd869ae9/websockets-16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:781caf5e8eee67f663126490c2f96f40906594cb86b408a703630f95550a8c3e", upload-time = "2026-01-10T09:23:15.939Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ad/6e/9a0927ac24bd33a0a9af834d89e0abc7cfd8e13bed17a86407a66773cc0e/websockets-16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caab51a72c51973ca21fa8a18bd8165e1a0183f1ac7066a182ff27107b71e1a4", upload-time = "2026-01-10T09:23:17.148Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b9/ca/bf1c68440d7a868180e11be653c85959502efd3a709323230314fda6e0b3/websockets-16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19c4dc84098e523fd63711e563077d39e90ec6702aff4b5d9e344a60cb3c0cb1", upload-time = "2026-01-10T09:23:18.372Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c4/f8/fdc34643a989561f217bb477cbc47a3a07212cbda91c0e4389c43c296ebf/websockets-16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5e18a238a2b2249c9a9235466b90e96ae4795672598a58772dd806edc7ac6d3", upload-time = "2026-01-10T09:23:19.652Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dd/d1/574fa27e233764dbac9c52730d63fcf2823b16f0856b3329fc6268d6ae4f/websockets-16.0-cp314-cp314-win32.whl", hash = "sha256:a069d734c4a043182729edd3e9f247c3b2a4035415a9172fd0f1b71658a320a8", upload-time = "2026-01-10T09:23:21.458Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8a/f1/ae6b937bf3126b5134ce1f482365fde31a357c784ac51852978768b5eff4/websockets-16.0-cp314-cp314-win_amd64.whl", hash = "sha256:c0ee0e63f23914732c6d7e0cce24915c48f3f1512ec1d079ed01fc629dab269d", upload-time = "2026-01-10T09:23:22.715Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/06/9b/f791d1db48403e1f0a27577a6beb37afae94254a8c6f08be4a23e4930bc0/websockets-16.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a35539cacc3febb22b8f4d4a99cc79b104226a756aa7400adc722e83b0d03244", upload-time = "2026-01-10T09:23:24.523Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bd/40/53ad02341fa33b3ce489023f635367a4ac98b73570102ad2cdd770dacc9a/websockets-16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b784ca5de850f4ce93ec85d3269d24d4c82f22b7212023c974c401d4980ebc5e", upload-time = "2026-01-10T09:23:25.781Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/74/9b/6158d4e459b984f949dcbbb0c5d270154c7618e11c01029b9bbd1bb4c4f9/websockets-16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:569d01a4e7fba956c5ae4fc988f0d4e187900f5497ce46339c996dbf24f17641", upload-time = "2026-01-10T09:23:27.033Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/2d/7583b30208b639c8090206f95073646c2c9ffd66f44df967981a64f849ad/websockets-16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50f23cdd8343b984957e4077839841146f67a3d31ab0d00e6b824e74c5b2f6e8", upload-time = "2026-01-10T09:23:28.259Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/45/b0/cce3784eb519b7b5ad680d14b9673a31ab8dcb7aad8b64d81709d2430aa8/websockets-16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:152284a83a00c59b759697b7f9e9cddf4e3c7861dd0d964b472b70f78f89e80e", upload-time = "2026-01-10T09:23:29.449Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/60/b8ebe4c7e89fb5f6cdf080623c9d92789a53636950f7abacfc33fe2b3135/websockets-16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc59589ab64b0022385f429b94697348a6a234e8ce22544e3681b2e9331b5944", upload-time = "2026-01-10T09:23:31.368Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/88/a8/a080593f89b0138b6cba1b28f8df5673b5506f72879322288b031337c0b8/websockets-16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32da954ffa2814258030e5a57bc73a3635463238e797c7375dc8091327434206", upload-time = "2026-01-10T09:23:32.627Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/b6/b9afed2afadddaf5ebb2afa801abf4b0868f42f8539bfe4b071b5266c9fe/websockets-16.0-cp314-cp314t-win32.whl", hash = "sha256:5a4b4cc550cb665dd8a47f868c8d04c8230f857363ad3c9caf7a0c3bf8c61ca6", upload-time = "2026-01-10T09:23:33.816Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/3e/28135a24e384493fa804216b79a6a6759a38cc4ff59118787b9fb693df93/websockets-16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd", upload-time = "2026-01-10T09:23:35.016Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/72/07/c98a68571dcf256e74f1f816b8cc5eae6eb2d3d5cfa44d37f801619d9166/websockets-16.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:349f83cd6c9a415428ee1005cadb5c2c56f4389bc06a9af16103c3bc3dcc8b7d", upload-time = "2026-01-10T09:23:36.166Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7e/52/93e166a81e0305b33fe416338be92ae863563fe7bce446b0f687b9df5aea/websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03", upload-time = "2026-01-10T09:23:37.409Z" }, - { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-01-10T09:23:39.158Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a5/8f/aea9c71cc92bf9b6cc0f7f70df8f0b420636b6c96ef4feee1e16f80f75dd/websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c", upload-time = "2026-01-10T09:23:41.031Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9a/3f/f70e03f40ffc9a30d817eef7da1be72ee4956ba8d7255c399a01b135902a/websockets-16.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a653aea902e0324b52f1613332ddf50b00c06fdaf7e92624fbf8c77c78fa5767", upload-time = "2026-01-10T09:23:42.259Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", upload-time = "2026-01-10T09:23:45.395Z" }, +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/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", size = 177364, upload-time = "2026-01-10T09:22:59.333Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0c/8811fc53e9bcff68fe7de2bcbe75116a8d959ac699a3200f4847a8925210/websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230", size = 175039, upload-time = "2026-01-10T09:23:01.171Z" }, + { url = "https://files.pythonhosted.org/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", size = 175323, upload-time = "2026-01-10T09:23:02.341Z" }, + { url = "https://files.pythonhosted.org/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", size = 184975, upload-time = "2026-01-10T09:23:03.756Z" }, + { url = "https://files.pythonhosted.org/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", size = 186203, upload-time = "2026-01-10T09:23:05.01Z" }, + { url = "https://files.pythonhosted.org/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", size = 185653, upload-time = "2026-01-10T09:23:06.301Z" }, + { url = "https://files.pythonhosted.org/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", size = 184920, upload-time = "2026-01-10T09:23:07.492Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a1/3d6ccdcd125b0a42a311bcd15a7f705d688f73b2a22d8cf1c0875d35d34a/websockets-16.0-cp313-cp313-win32.whl", hash = "sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a", size = 178255, upload-time = "2026-01-10T09:23:09.245Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ae/90366304d7c2ce80f9b826096a9e9048b4bb760e44d3b873bb272cba696b/websockets-16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156", size = 178689, upload-time = "2026-01-10T09:23:10.483Z" }, + { url = "https://files.pythonhosted.org/packages/f3/1d/e88022630271f5bd349ed82417136281931e558d628dd52c4d8621b4a0b2/websockets-16.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8cc451a50f2aee53042ac52d2d053d08bf89bcb31ae799cb4487587661c038a0", size = 177406, upload-time = "2026-01-10T09:23:12.178Z" }, + { url = "https://files.pythonhosted.org/packages/f2/78/e63be1bf0724eeb4616efb1ae1c9044f7c3953b7957799abb5915bffd38e/websockets-16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:daa3b6ff70a9241cf6c7fc9e949d41232d9d7d26fd3522b1ad2b4d62487e9904", size = 175085, upload-time = "2026-01-10T09:23:13.511Z" }, + { url = "https://files.pythonhosted.org/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fd3cb4adb94a2a6e2b7c0d8d05cb94e6f1c81a0cf9dc2694fb65c7e8d94c42e4", size = 175328, upload-time = "2026-01-10T09:23:14.727Z" }, + { url = "https://files.pythonhosted.org/packages/63/bc/d3e208028de777087e6fb2b122051a6ff7bbcca0d6df9d9c2bf1dd869ae9/websockets-16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:781caf5e8eee67f663126490c2f96f40906594cb86b408a703630f95550a8c3e", size = 185044, upload-time = "2026-01-10T09:23:15.939Z" }, + { url = "https://files.pythonhosted.org/packages/ad/6e/9a0927ac24bd33a0a9af834d89e0abc7cfd8e13bed17a86407a66773cc0e/websockets-16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caab51a72c51973ca21fa8a18bd8165e1a0183f1ac7066a182ff27107b71e1a4", size = 186279, upload-time = "2026-01-10T09:23:17.148Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ca/bf1c68440d7a868180e11be653c85959502efd3a709323230314fda6e0b3/websockets-16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19c4dc84098e523fd63711e563077d39e90ec6702aff4b5d9e344a60cb3c0cb1", size = 185711, upload-time = "2026-01-10T09:23:18.372Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f8/fdc34643a989561f217bb477cbc47a3a07212cbda91c0e4389c43c296ebf/websockets-16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5e18a238a2b2249c9a9235466b90e96ae4795672598a58772dd806edc7ac6d3", size = 184982, upload-time = "2026-01-10T09:23:19.652Z" }, + { url = "https://files.pythonhosted.org/packages/dd/d1/574fa27e233764dbac9c52730d63fcf2823b16f0856b3329fc6268d6ae4f/websockets-16.0-cp314-cp314-win32.whl", hash = "sha256:a069d734c4a043182729edd3e9f247c3b2a4035415a9172fd0f1b71658a320a8", size = 177915, upload-time = "2026-01-10T09:23:21.458Z" }, + { url = "https://files.pythonhosted.org/packages/8a/f1/ae6b937bf3126b5134ce1f482365fde31a357c784ac51852978768b5eff4/websockets-16.0-cp314-cp314-win_amd64.whl", hash = "sha256:c0ee0e63f23914732c6d7e0cce24915c48f3f1512ec1d079ed01fc629dab269d", size = 178381, upload-time = "2026-01-10T09:23:22.715Z" }, + { url = "https://files.pythonhosted.org/packages/06/9b/f791d1db48403e1f0a27577a6beb37afae94254a8c6f08be4a23e4930bc0/websockets-16.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a35539cacc3febb22b8f4d4a99cc79b104226a756aa7400adc722e83b0d03244", size = 177737, upload-time = "2026-01-10T09:23:24.523Z" }, + { url = "https://files.pythonhosted.org/packages/bd/40/53ad02341fa33b3ce489023f635367a4ac98b73570102ad2cdd770dacc9a/websockets-16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b784ca5de850f4ce93ec85d3269d24d4c82f22b7212023c974c401d4980ebc5e", size = 175268, upload-time = "2026-01-10T09:23:25.781Z" }, + { url = "https://files.pythonhosted.org/packages/74/9b/6158d4e459b984f949dcbbb0c5d270154c7618e11c01029b9bbd1bb4c4f9/websockets-16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:569d01a4e7fba956c5ae4fc988f0d4e187900f5497ce46339c996dbf24f17641", size = 175486, upload-time = "2026-01-10T09:23:27.033Z" }, + { url = "https://files.pythonhosted.org/packages/e5/2d/7583b30208b639c8090206f95073646c2c9ffd66f44df967981a64f849ad/websockets-16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50f23cdd8343b984957e4077839841146f67a3d31ab0d00e6b824e74c5b2f6e8", size = 185331, upload-time = "2026-01-10T09:23:28.259Z" }, + { url = "https://files.pythonhosted.org/packages/45/b0/cce3784eb519b7b5ad680d14b9673a31ab8dcb7aad8b64d81709d2430aa8/websockets-16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:152284a83a00c59b759697b7f9e9cddf4e3c7861dd0d964b472b70f78f89e80e", size = 186501, upload-time = "2026-01-10T09:23:29.449Z" }, + { url = "https://files.pythonhosted.org/packages/19/60/b8ebe4c7e89fb5f6cdf080623c9d92789a53636950f7abacfc33fe2b3135/websockets-16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc59589ab64b0022385f429b94697348a6a234e8ce22544e3681b2e9331b5944", size = 186062, upload-time = "2026-01-10T09:23:31.368Z" }, + { url = "https://files.pythonhosted.org/packages/88/a8/a080593f89b0138b6cba1b28f8df5673b5506f72879322288b031337c0b8/websockets-16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32da954ffa2814258030e5a57bc73a3635463238e797c7375dc8091327434206", size = 185356, upload-time = "2026-01-10T09:23:32.627Z" }, + { url = "https://files.pythonhosted.org/packages/c2/b6/b9afed2afadddaf5ebb2afa801abf4b0868f42f8539bfe4b071b5266c9fe/websockets-16.0-cp314-cp314t-win32.whl", hash = "sha256:5a4b4cc550cb665dd8a47f868c8d04c8230f857363ad3c9caf7a0c3bf8c61ca6", size = 178085, upload-time = "2026-01-10T09:23:33.816Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3e/28135a24e384493fa804216b79a6a6759a38cc4ff59118787b9fb693df93/websockets-16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd", size = 178531, upload-time = "2026-01-10T09:23:35.016Z" }, + { 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]] @@ -6421,95 +6417,95 @@ source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/61/f1/ee81806690a87dab5f5653c1f146c92bc066d7f4cebc603ef88eb9e13957/werkzeug-3.1.6.tar.gz", hash = "sha256:210c6bede5a420a913956b4791a7f4d6843a43b6fcee4dfa08a65e93007d0d25", upload-time = "2026-02-19T15:17:18.884Z" } +sdist = { url = "https://files.pythonhosted.org/packages/61/f1/ee81806690a87dab5f5653c1f146c92bc066d7f4cebc603ef88eb9e13957/werkzeug-3.1.6.tar.gz", hash = "sha256:210c6bede5a420a913956b4791a7f4d6843a43b6fcee4dfa08a65e93007d0d25", size = 864736, upload-time = "2026-02-19T15:17:18.884Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/4d/ec/d58832f89ede95652fd01f4f24236af7d32b70cab2196dfcc2d2fd13c5c2/werkzeug-3.1.6-py3-none-any.whl", hash = "sha256:7ddf3357bb9564e407607f988f683d72038551200c704012bb9a4c523d42f131", upload-time = "2026-02-19T15:17:17.475Z" }, + { url = "https://files.pythonhosted.org/packages/4d/ec/d58832f89ede95652fd01f4f24236af7d32b70cab2196dfcc2d2fd13c5c2/werkzeug-3.1.6-py3-none-any.whl", hash = "sha256:7ddf3357bb9564e407607f988f683d72038551200c704012bb9a4c523d42f131", size = 225166, upload-time = "2026-02-19T15:17:17.475Z" }, ] [[package]] name = "wrapt" version = "2.2.1" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/2d/9f/06263fcd8ad6c405f05a3905fd7a84dd3176eb5ad46e44bccc0cd16348bb/wrapt-2.2.1.tar.gz", hash = "sha256:6744f504375775d7609c82c8d3d94af1c9a6f05586984536905908ba905277b9", upload-time = "2026-05-22T14:49:43.056Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/b4/8b/84bc1ea68b620fe0e2696a8cff07e82f4b962d952ab14efee8955997bb70/wrapt-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0f68f478004475d97906686e702ddbddeaf717c0b68ad2794384308f2dc713ae", upload-time = "2026-05-22T14:47:27.074Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f3/8f/64ec81194a0bc708d9720174c998c8a32116e82b5b32c04e20a7fe01176c/wrapt-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e422b2d647a65d6b080cad5accd09055d3809bdff00c76fba8dca00ca935572a", upload-time = "2026-05-22T14:47:29.062Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/94/c2/3d186944aae923631d1def58f4c4ff8f0b6309906afc0b6978de3e69b3e0/wrapt-2.2.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:036dfb40128819a751c6f451c6b9c10172c49e4c401aebcdb8ecf2aec1683598", upload-time = "2026-05-22T14:47:30.583Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/01/d1/6b3d0ea995b867d2862aad5619bd5e17de09a9d64a821f46832dcd272d40/wrapt-2.2.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09ac16c081bebfd15d8e4dfa5bdc805990bbd52249ecff22530da7a129d6120b", upload-time = "2026-05-22T14:47:32.175Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f9/4b/37ecb90a8c3753e580327fb40731a984b754e3df65d2ef932bf359fe4adc/wrapt-2.2.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:07be671fa8875971222b0ba9059ed8b4dc738631122feba17c93aa36b4213e9a", upload-time = "2026-05-22T14:47:34.021Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e7/d0/918884d9dfa84d0d135b42a51c00910f5c5447fe7a5e211a8e16ac324dd4/wrapt-2.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93fc2bf40cd7f4a0256010dce073d44eeb4a351b9bca94d0477ce2b6e62532b3", upload-time = "2026-05-22T14:47:35.722Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4c/00/382299d8ced610b29b59b099a89eda821e8c489aa152b7183748ac83f32a/wrapt-2.2.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ba519b2d765df9871a25879e6f7fa78948ea59a2a31f9c1a257e34b651994afc", upload-time = "2026-05-22T14:47:37.052Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6c/46/62a79b79e35bbebb1207ca5d15b81192f37f20cc5659cf4e3ce955b7fcc8/wrapt-2.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9011395be8db1827d106c6449b4bb6dd17e331ff6ec521f227e4588f1c78e46f", upload-time = "2026-05-22T14:47:38.713Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a1/db/95c152151d206d4b430516c89725306e92484072f38e65492afde63f6d19/wrapt-2.2.1-cp310-cp310-win32.whl", hash = "sha256:a8f7176b83664af44567e9cc06e0d3827823fcc1a5e52307ebb8ac3aa95860b9", upload-time = "2026-05-22T14:47:40.061Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/13/d3/882d50452c6fbd13f24fe5d2644b97cdad2565a7e1522cbb6312de8a52cf/wrapt-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:d7f513d3185e6fec82d0c3518f2e6365d8b4e49f5f45f29640d5162d56a23b54", upload-time = "2026-05-22T14:47:41.194Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/0f/148376523b4e370692286a9ba14d5715cf3c5b86da3bd3630926367b6b73/wrapt-2.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:44255c84bc57554fed822e83e70036b51afa9edb56fc7ca56c54410ece7898c9", upload-time = "2026-05-22T14:47:42.835Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5f/ac/4370bde262c0e633e6c4f0e56d55095710024cf9a5cecc20c59a10de483c/wrapt-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd57607acc85678925940bd5df0385ff8332083a32fa8d7a43f8767f4997263c", upload-time = "2026-05-22T14:47:43.996Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/eb/79/b8ff3a61e71babf58a8cf4c0d63358e8bad383e15bf7f35e62d2f6b6e4a4/wrapt-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ae574d65c9fa8e86f64f6a7c2668f9fcd507b183e0e577619f504b883cb0a6c", upload-time = "2026-05-22T14:47:45.243Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6e/fd/c0cac1f77c9c4f6fe58a920ca632ce379bb8be928720e11e8d73de28a5e9/wrapt-2.2.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9a04c28c10ba7fd12842b109d2edb0678872a2fe65277ca4ff06a0d61edee245", upload-time = "2026-05-22T14:47:47.176Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d9/4f/744132a7b2fbefa6b81118ec5942eca5fc2e9a129f9055a0c5e46885a549/wrapt-2.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e2f02472a1cbbf3884b365714a810b5947134a95ad6952b554cb8cce9d492b0", upload-time = "2026-05-22T14:47:49.04Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d6/95/b7cd9a22a06cf93e6482904ee6afc956248983553593fd1009296d1b3b31/wrapt-2.2.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac2745950b2bff80219c15ebf2fa9d8427eba7e249739f97e55c9d169e47e9e1", upload-time = "2026-05-22T14:47:50.386Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/4c/4a/eb79423192015f46f0db2872e7e04a3dde8d359b83411e8959e7c9287eaa/wrapt-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:67a97e5b6c457f0cd3cfc19ebb2d84463e60c3ece754cc831e4281a3ca29bb18", upload-time = "2026-05-22T14:47:51.753Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ec/dc/435015b58ce33c6fc4104158fa91ddb0e809ab03a5751fb7465d1d461456/wrapt-2.2.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:c803a3d331796255af51ba2c79ed0ac8275865b516c09e61f248d1e7aff31ce9", upload-time = "2026-05-22T14:47:53.214Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/ac/5d203f98df8fd136b95c5227139aea02d34505e18baf812d0c005df61963/wrapt-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9b984d1eb252145d6302c1dbd5e87fc6d404d45531447c84eadec04bf1fcb027", upload-time = "2026-05-22T14:47:54.982Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/52/2f/a92427dbdc74e54c1674abbed27e61b2cb5e7a94441b8c1270c70671d928/wrapt-2.2.1-cp311-cp311-win32.whl", hash = "sha256:8a983a603a18c8708f024f7f6991b2e66159219abbf894634c5056243c55f3cd", upload-time = "2026-05-22T14:47:56.275Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c8/56/987b9c13b3e1c1a3c6de71284076f996b79caec90e75a87c044a40c23db9/wrapt-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:9c210a6994b21aa9b29e81c8d11560e8fdab54c117e9cff37870d0a27bde1343", upload-time = "2026-05-22T14:47:57.854Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7e/25/d01f560888d99d94a959c85533de349ce68d71ace3f2591d6ea8f632cfed/wrapt-2.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:401229e9d63ca09f9b8891ecf83798d26c11bbb445d11ed9f1836b6d4585b38a", upload-time = "2026-05-22T14:47:59.089Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/89/0c/bfae7b9401583b6d05938cd16dedc43857d96da2f8a3d50d78cc515bf6ff/wrapt-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ffad790d9d11d8ecf9f17c4bb671a5b4089e4d8b575c46c5129597f41f836b0", upload-time = "2026-05-22T14:48:00.313Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/26/58/80f6a6599f933f4caecc1cb3ee88a04faf81e8b9bddbd6109c688dd63e0f/wrapt-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:628f5220c7a904d5fc78f7075c8d7871433eb6d035c94728a22fdf85f193d2a8", upload-time = "2026-05-22T14:48:01.49Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/17/93/fb357cc7847c58a8ae790be718903afa81a28d23e642c843dc4129e8a0b2/wrapt-2.2.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:61acce4257a9883669703c525447c5b4c392edf0f987ae77ec32668440158f0e", upload-time = "2026-05-22T14:48:02.791Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/0b/76b601ee309a8bd556af0eecb184394c20b3c49aa9c8e085aa1ffacc2568/wrapt-2.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727ab4244622cd6ad2390f322642090c877d2e83a608d2653a7643ae5368d926", upload-time = "2026-05-22T14:48:04.22Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cd/87/ee3f32d5658e3e26d3e0e457922b47a36dd3bfbdfee7f97bb3e802344a66/wrapt-2.2.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03df9ebed4c73ab93fa8c07e3d41d818dfca1852b15731a3de59457b27814624", upload-time = "2026-05-22T14:48:05.553Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b1/d0/ae2fd64277a67f5d7bffcf2d05eea1e476263fb2a072baf0b0129ab85984/wrapt-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0d9ff006f420b2ec8296aa56ade43ea7da3e997e85769f0aafc5e0661aacb710", upload-time = "2026-05-22T14:48:07.132Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b1/f3/2d541a060c5bbafb9400bca4917e4d78bfd1f239f404782c86831a8f6b29/wrapt-2.2.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:844c858fc3bb7eacc0ba8efa904935d16aac6a4470948ad1e7e55c9f5a2a665f", upload-time = "2026-05-22T14:48:08.629Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1d/68/8d92c8800c57e93cb116ae9e9d6cbafc34fade5ee9f9107b6f203fb4dc35/wrapt-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87bacdaf225117a342a20d9c03438d701c02112f6e3f351ce9b7f32354f14797", upload-time = "2026-05-22T14:48:10.042Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/30/72/83ea3790ea352439442349388e29ff07b76e0686265f9088bbb505d1608d/wrapt-2.2.1-cp312-cp312-win32.whl", hash = "sha256:2f8c90c8afde51969487be4e1343ae049b268854877d415c2510baf833775052", upload-time = "2026-05-22T14:48:11.782Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ef/cb/99450668dd3502d62a54a1c8aa56e44f34cb8c1261b381cfe2e7926c3b75/wrapt-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ce32763ac31ce94fe9aada947e479b1975012bff166da409b4b9e4e376cf7e5", upload-time = "2026-05-22T14:48:13.046Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e6/3a/87512881be64e743f9ee4c66f4cbe8e884974bef2a5989af71f999653ac7/wrapt-2.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d1b4d0e0c2119587a31f5c029abd547e0c81d93b89d394566fe1588659eb579", upload-time = "2026-05-22T14:48:14.323Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/88/d1/a1b08f8f4fac8cbb156fa51cf64ee2c7f7f74f9875ba3cf70b3c58368694/wrapt-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d2beb1c7cab10603aecdc42f8edd6ff013f9a32e4543474e38e6b77ce9975aeb", upload-time = "2026-05-22T14:48:15.598Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/54/ce/57890814991446a845e09b3445ce8b694f27eb0577004f2c2a36a9772ed4/wrapt-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e0cb7e4dd71f4c32e5e84843cd3c4cd65dda034314004bbe1d7f99af2426ab80", upload-time = "2026-05-22T14:48:17.071Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/38/65/08d7a6c76ac4493bdb668205ee9c1de1bd5daca61717c3e9aa49b4c01499/wrapt-2.2.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95821352042722cd9f1108874579a47989d0a7e12a37d87d2fc4af20fd99ab8a", upload-time = "2026-05-22T14:48:18.303Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/62/ce/f1ccbee7a1bfe5cdc6b3da6bab4b45713d628b9294da32a39f563d648140/wrapt-2.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abd621552ede77c4c69be7fac44ba911225b0c812b6ba604e5964cf98085b474", upload-time = "2026-05-22T14:48:19.768Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/2a/f85d48d1cd4869aee6704028d257d740a47c1c467b457ce396b4b5b55d07/wrapt-2.2.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e3677c7146ce694874941ba82b57092cc4875445aadf29d72807351023105143", upload-time = "2026-05-22T14:48:21.96Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/5c/93939ad11d4a12358ab1aab219a2ef5efa5612e0db6b9fc65af8af1a891b/wrapt-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9a5934eaea872e17936b5f45501eba5ab0bce9a74122e172b663d7c28c459c4a", upload-time = "2026-05-22T14:48:23.373Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/22/b8c2aa89862ff58605934d7abf4b70e6a5a1c33df96656f49035ccdf1c8a/wrapt-2.2.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f5b9daf6b629fce418e0cc3dd0436eac045188fa35deadb7a7f3941d5b8203f9", upload-time = "2026-05-22T14:48:24.767Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5d/78/bf00a7b02239c12bb02ddcc3c0b971bfcc36e578c5a44f1ccfef5b458545/wrapt-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f53ac9f3ef573326d009ed809beff4efcac6451931c2b8132586da4b9e53ff31", upload-time = "2026-05-22T14:48:26.83Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/93/6390ca9c5b787683cef588d04f57c8d41b9a2323b5597a65f18638c90ef2/wrapt-2.2.1-cp313-cp313-win32.whl", hash = "sha256:1ffa9cfd4bdb581539951b14ae661ff20ed0c3599b3e911a131ee0ec5ac11337", upload-time = "2026-05-22T14:48:28.221Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/97/73/ce10f0e71c0cfaa1a65faadb8efd4852028b3bb9ba28932b8889df769d38/wrapt-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:368eac1e20fd0bb03dd3cc42bf9887154c3861b60989389ccb5fac032617d215", upload-time = "2026-05-22T14:48:30.139Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/4c/89f4a6818fafbbd840330e4fa3873073e1bfc166133a64cac7f8fde7a5e3/wrapt-2.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:c754dafdf5aaf0b401b644a90a30046929a0dd1a536e0ff0ec959a59155d9c7f", upload-time = "2026-05-22T14:48:31.405Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/f2/9a8741c46f8c208ac0a45b25ba170bcb4fb72a2781d5fb97dbd7b6be73cb/wrapt-2.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ed928d0fda15fc0adc8d13305c8b3c0f2fba5b0669950c9e6d019d9162a3b3e8", upload-time = "2026-05-22T14:48:33.307Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/0d/e9c855716a3705eef1416456bdf062b60620726fdc59428ff670fc3c60dc/wrapt-2.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fafb4e739e43544d12cb4abd1605fd4683b6ca6a9ad682b7fd8f4d21973eafa8", upload-time = "2026-05-22T14:48:34.593Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/3b/d6/a88f1c13112b7831adac75cea65d8310e0d696d570c8961844c90a57b865/wrapt-2.2.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:74d6a0c31472fe5d814917266b9f46495d7c61ed890af08b468acea92fb89a8d", upload-time = "2026-05-22T14:48:35.859Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/42/65/e29d54aef06a4d898a5b8a25589a0b3769bde454f922fad8f6f89fbfb650/wrapt-2.2.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab5be648d5a0b86b7438864f8df3c705a65cef35a2fd3e5561e3e203167e0f27", upload-time = "2026-05-22T14:48:38.153Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2a/91/e4454263516cf0e12640912fbca9a83654e424f0a6ddb79f5cd7ce14bf33/wrapt-2.2.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9d8f204c8e3a8bf9ece17e0a83d137fd807440977f8a5e762d59306795011440", upload-time = "2026-05-22T14:48:39.69Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/de/d0/fe0ee202286afdf4a7f77dd29f195703145764d572aec209c5086e57d924/wrapt-2.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d047f6498c973874ba08ac3f97c69a2c4b2211c8de6f4c205f75cb1c9522596e", upload-time = "2026-05-22T14:48:43.456Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/23/b6/87d860dfc6460c246af70b1fd5c8b76df77571b42a493459423ded94fd7d/wrapt-2.2.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:7a4fdb9326aab4a5a477a1640e5ad786a8495901009d7e7b038371edd23a9d2b", upload-time = "2026-05-22T14:48:44.858Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/df/46/3eea8cde077d985f239a38c0257087b8064fd9ee9b1a99e282d2c86da4ef/wrapt-2.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c8cc5094b08abeae52da9c73c8a32003623be691a5193df2f4e3eac3d557c394", upload-time = "2026-05-22T14:48:46.319Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/dc/b927ee9c7fc67adc3a5658f246a0d275425eb840ba36e7b702e70f18bde8/wrapt-2.2.1-cp313-cp313t-win32.whl", hash = "sha256:9907a4402ab6db12b7077a0ea5d7a4d028ecb22c8eee2b53527080d347cd1562", upload-time = "2026-05-22T14:48:47.901Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ec/b3/fd30b473fe498c70e6b9a5f328b8d3fbaf1b8c3c481465f59724bba8eb70/wrapt-2.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:5590d63f5243251641cf543009b4c9314a79d0598fdb8a8e4cfc918494536c53", upload-time = "2026-05-22T14:48:49.201Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ee/f3/96c39153a8737a6e9aa85adef254ac4195bea3f2d24efc60472ccc3c9e2e/wrapt-2.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:c318a64b53d97b841d7b5e637517e50a27be64bc695128422953d4b21710954e", upload-time = "2026-05-22T14:48:50.479Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/a3/11d7f34ebbf3231bc907a3e6d5ee051b14d034c1bc7b65a97d5cc00516df/wrapt-2.2.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6f56a647e4eaf5f0ca40330fb070f566bdf9f7b0db89a1af20d71c28dcd7a0ab", upload-time = "2026-05-22T14:48:51.802Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/13/3c/b74cfd984cef560b900fb1a727af20352d89e1f06bf2e1114dd3f00f5f5a/wrapt-2.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:64b7deeda4b70408e382328d8bbe52a256fe9bc63ae3db86d804608367e5422c", upload-time = "2026-05-22T14:48:53.18Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/15/a3/7c8f704b8dc07dfe0a5d01c2edbfd88317aa8e5e3fa7c743eb7a085ae767/wrapt-2.2.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b9cf53ba90717db2e292401de290776c498d4bbfb0d4a559ca2895db8b9dcb5c", upload-time = "2026-05-22T14:48:54.562Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/85/a34d1888d97247da6c2ff6118c3a721c73ed8cc4dd198c00208bb73b6f80/wrapt-2.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cf3638274ab9d9b724c9baa0b4c04e132cd6faefb78b4dd3dd1a02a4bdaad41e", upload-time = "2026-05-22T14:48:56.065Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e9/d7/72ffaeb01eebc704afe3fb99e840480f4bda45f0fa66e3381b6a39251c8f/wrapt-2.2.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aed9658797d0b45d6c49adcfc6b41f66e6f2d0c6de3ec79e16cf4b1855df240f", upload-time = "2026-05-22T14:48:57.924Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/5b/36f5d6b024e4edfdd90b140742d11ebcf7836daf5c9daf326c55c24db412/wrapt-2.2.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1d676ee388bc42a04d56dd7deb5605244dac2e35cc2fadbb43c9fa25bbd93508", upload-time = "2026-05-22T14:48:59.384Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/81/06/9296d9e97bfdef5483dfcc859d57b095b257144b2bc5300ab521e06f4bc7/wrapt-2.2.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e395f7bc31851ef9b612050368cb446e9bc14cd7454b025018980349caf25ae5", upload-time = "2026-05-22T14:49:00.921Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/53/37/16953929ed6776175720e58fc966e779926d8d71e2c7b2273230590ca71f/wrapt-2.2.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5f1845c2a8cc1180ccccfa45785dd06f562730d19ef75be180334254012b6283", upload-time = "2026-05-22T14:49:02.332Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b9/73/20ee58c0612dae7c31131a7095345812ed2c7b389019e175f68cde34e5b4/wrapt-2.2.1-cp314-cp314-win32.whl", hash = "sha256:436addbc4bb4fc0a88c702577f51195d7d73683a7f3e0e5b253d8404d7847243", upload-time = "2026-05-22T14:49:03.722Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/22/b3/ef7c3295d02e0448a71c639a36a057f46d524d057c9486291a7a3039e65c/wrapt-2.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:50972a1d974ea07725a7f6b1cec5f8759008afd030a0024843ebe7d52de47f2b", upload-time = "2026-05-22T14:49:05.093Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ac/dc/7bdf336953f99f4ceb0a584bb8870e42c8f26f93ea10c87834dad62f1668/wrapt-2.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:1c9934ea5d92957e3cd0adbc0845539dccfd62710ebe16195a8c66c53954db36", upload-time = "2026-05-22T14:49:06.413Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6a/6d/6dfae80150ff1919c356d1dd528f049bcdfaae29b4d284bc957e022caef4/wrapt-2.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17de18fc12cea55b8a9587314cb830573e37fb33b247a7515696350863714188", upload-time = "2026-05-22T14:49:07.925Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/82/7b/4e34766a7d7804ffce9e71befe47e9b3225dc350c49c94493c4ab39fd3a5/wrapt-2.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a9dec1aca52dddde7df94818310fa2fe79739c8f385b2014c4cb1035f5508199", upload-time = "2026-05-22T14:49:09.257Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9d/57/0b34db3e8de44ccfece62d7b337abd1631dd810f5adc5f3db571727836b5/wrapt-2.2.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:69f2e9244542cb34dd59c7f073445b9e54ad9f3fce8d93606c368a1b499fc413", upload-time = "2026-05-22T14:49:10.572Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/45/ac0c459f154b99d92789a6cba7ca727185b83513b986f8ec7fe2aacddcbf/wrapt-2.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d83966dc7f4f45e8b97b5933685ac2e6e67fc0e19246ea314bceb9a8970c956", upload-time = "2026-05-22T14:49:12.229Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/e4/77e37ff33ad018fa81ade52c25fa327b80b56f81d734279a63614fcb4cbc/wrapt-2.2.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:78b0aa6bfb7be8deed0ab23e7aa028cc5210c29bc2d32a04d52b50e517a7307e", upload-time = "2026-05-22T14:49:14.139Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dd/9d/7ea651d1ab032fc5fa222fbec91d0f8a1397f6ae04ebb93fa7219aa921d7/wrapt-2.2.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:05d5cb74d1b232ec8cfa130a8f900708699ff2491d97b8f85a4cdc5996294b85", upload-time = "2026-05-22T14:49:15.714Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/09/af/8e88031a701275b9085c54e64bc88c0b1cd55c77eadd400691c371cd76c4/wrapt-2.2.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f6518b94edb9150452e9aba08027d4cc293433753ec1fbefb4629a21cbc74181", upload-time = "2026-05-22T14:49:17.283Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bf/a8/e657ca876b06710194f243d81c4b0896ade646e244bdbec2d87c8c56a8bd/wrapt-2.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ed55af48b3eb28f43228ca2306788892bcb629eb2b5c4876e2a3659872c2f17a", upload-time = "2026-05-22T14:49:18.785Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c8/59/822efe4ea722a3961331bfa35b7d90937790d2c20f0616de1997ccc3aebd/wrapt-2.2.1-cp314-cp314t-win32.whl", hash = "sha256:2e08688ab16525897da6589d56d0aebaf417bbe91c2d8e3b96203b1efa596e85", upload-time = "2026-05-22T14:49:20.264Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ab/31/2a7dc5f6abb2fca0b6e1610e120419f603650aceb4f1d3ac4cae0354e162/wrapt-2.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:fd0135d34387f5fd087d9be368ea77ea89cf2451dc1cd1c622d35021bcb3ab50", upload-time = "2026-05-22T14:49:21.634Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9f/c0/782b86e28d1ceebeb74cccea12d2cd3d2ba0bd68e3dec20b1bc5873f6127/wrapt-2.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:f70db64e8266d7c45d3b735f2e08eeb434b5e03da9a479ae42b2e2e486a21a00", upload-time = "2026-05-22T14:49:23.59Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/53/46/29ac9daf11a86c22a8c38cd9236c62928ccae83f7ceb06bd3b0467cf9d05/wrapt-2.2.1-py3-none-any.whl", hash = "sha256:3aafea2975caef8ca49400640dde02cc7426e798f24870ed01f490bc3cffd32f", upload-time = "2026-05-22T14:49:41.593Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/2d/9f/06263fcd8ad6c405f05a3905fd7a84dd3176eb5ad46e44bccc0cd16348bb/wrapt-2.2.1.tar.gz", hash = "sha256:6744f504375775d7609c82c8d3d94af1c9a6f05586984536905908ba905277b9", size = 127620, upload-time = "2026-05-22T14:49:43.056Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/8b/84bc1ea68b620fe0e2696a8cff07e82f4b962d952ab14efee8955997bb70/wrapt-2.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0f68f478004475d97906686e702ddbddeaf717c0b68ad2794384308f2dc713ae", size = 80093, upload-time = "2026-05-22T14:47:27.074Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8f/64ec81194a0bc708d9720174c998c8a32116e82b5b32c04e20a7fe01176c/wrapt-2.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e422b2d647a65d6b080cad5accd09055d3809bdff00c76fba8dca00ca935572a", size = 81183, upload-time = "2026-05-22T14:47:29.062Z" }, + { url = "https://files.pythonhosted.org/packages/94/c2/3d186944aae923631d1def58f4c4ff8f0b6309906afc0b6978de3e69b3e0/wrapt-2.2.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:036dfb40128819a751c6f451c6b9c10172c49e4c401aebcdb8ecf2aec1683598", size = 152494, upload-time = "2026-05-22T14:47:30.583Z" }, + { url = "https://files.pythonhosted.org/packages/01/d1/6b3d0ea995b867d2862aad5619bd5e17de09a9d64a821f46832dcd272d40/wrapt-2.2.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09ac16c081bebfd15d8e4dfa5bdc805990bbd52249ecff22530da7a129d6120b", size = 154310, upload-time = "2026-05-22T14:47:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/f9/4b/37ecb90a8c3753e580327fb40731a984b754e3df65d2ef932bf359fe4adc/wrapt-2.2.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:07be671fa8875971222b0ba9059ed8b4dc738631122feba17c93aa36b4213e9a", size = 149002, upload-time = "2026-05-22T14:47:34.021Z" }, + { url = "https://files.pythonhosted.org/packages/e7/d0/918884d9dfa84d0d135b42a51c00910f5c5447fe7a5e211a8e16ac324dd4/wrapt-2.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93fc2bf40cd7f4a0256010dce073d44eeb4a351b9bca94d0477ce2b6e62532b3", size = 153185, upload-time = "2026-05-22T14:47:35.722Z" }, + { url = "https://files.pythonhosted.org/packages/4c/00/382299d8ced610b29b59b099a89eda821e8c489aa152b7183748ac83f32a/wrapt-2.2.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ba519b2d765df9871a25879e6f7fa78948ea59a2a31f9c1a257e34b651994afc", size = 148040, upload-time = "2026-05-22T14:47:37.052Z" }, + { url = "https://files.pythonhosted.org/packages/6c/46/62a79b79e35bbebb1207ca5d15b81192f37f20cc5659cf4e3ce955b7fcc8/wrapt-2.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9011395be8db1827d106c6449b4bb6dd17e331ff6ec521f227e4588f1c78e46f", size = 151773, upload-time = "2026-05-22T14:47:38.713Z" }, + { url = "https://files.pythonhosted.org/packages/a1/db/95c152151d206d4b430516c89725306e92484072f38e65492afde63f6d19/wrapt-2.2.1-cp310-cp310-win32.whl", hash = "sha256:a8f7176b83664af44567e9cc06e0d3827823fcc1a5e52307ebb8ac3aa95860b9", size = 77393, upload-time = "2026-05-22T14:47:40.061Z" }, + { url = "https://files.pythonhosted.org/packages/13/d3/882d50452c6fbd13f24fe5d2644b97cdad2565a7e1522cbb6312de8a52cf/wrapt-2.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:d7f513d3185e6fec82d0c3518f2e6365d8b4e49f5f45f29640d5162d56a23b54", size = 80350, upload-time = "2026-05-22T14:47:41.194Z" }, + { url = "https://files.pythonhosted.org/packages/58/0f/148376523b4e370692286a9ba14d5715cf3c5b86da3bd3630926367b6b73/wrapt-2.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:44255c84bc57554fed822e83e70036b51afa9edb56fc7ca56c54410ece7898c9", size = 79149, upload-time = "2026-05-22T14:47:42.835Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ac/4370bde262c0e633e6c4f0e56d55095710024cf9a5cecc20c59a10de483c/wrapt-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd57607acc85678925940bd5df0385ff8332083a32fa8d7a43f8767f4997263c", size = 80321, upload-time = "2026-05-22T14:47:43.996Z" }, + { url = "https://files.pythonhosted.org/packages/eb/79/b8ff3a61e71babf58a8cf4c0d63358e8bad383e15bf7f35e62d2f6b6e4a4/wrapt-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1ae574d65c9fa8e86f64f6a7c2668f9fcd507b183e0e577619f504b883cb0a6c", size = 81216, upload-time = "2026-05-22T14:47:45.243Z" }, + { url = "https://files.pythonhosted.org/packages/6e/fd/c0cac1f77c9c4f6fe58a920ca632ce379bb8be928720e11e8d73de28a5e9/wrapt-2.2.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9a04c28c10ba7fd12842b109d2edb0678872a2fe65277ca4ff06a0d61edee245", size = 159208, upload-time = "2026-05-22T14:47:47.176Z" }, + { url = "https://files.pythonhosted.org/packages/d9/4f/744132a7b2fbefa6b81118ec5942eca5fc2e9a129f9055a0c5e46885a549/wrapt-2.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3e2f02472a1cbbf3884b365714a810b5947134a95ad6952b554cb8cce9d492b0", size = 160322, upload-time = "2026-05-22T14:47:49.04Z" }, + { url = "https://files.pythonhosted.org/packages/d6/95/b7cd9a22a06cf93e6482904ee6afc956248983553593fd1009296d1b3b31/wrapt-2.2.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac2745950b2bff80219c15ebf2fa9d8427eba7e249739f97e55c9d169e47e9e1", size = 153243, upload-time = "2026-05-22T14:47:50.386Z" }, + { url = "https://files.pythonhosted.org/packages/4c/4a/eb79423192015f46f0db2872e7e04a3dde8d359b83411e8959e7c9287eaa/wrapt-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:67a97e5b6c457f0cd3cfc19ebb2d84463e60c3ece754cc831e4281a3ca29bb18", size = 159231, upload-time = "2026-05-22T14:47:51.753Z" }, + { url = "https://files.pythonhosted.org/packages/ec/dc/435015b58ce33c6fc4104158fa91ddb0e809ab03a5751fb7465d1d461456/wrapt-2.2.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:c803a3d331796255af51ba2c79ed0ac8275865b516c09e61f248d1e7aff31ce9", size = 152351, upload-time = "2026-05-22T14:47:53.214Z" }, + { url = "https://files.pythonhosted.org/packages/77/ac/5d203f98df8fd136b95c5227139aea02d34505e18baf812d0c005df61963/wrapt-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9b984d1eb252145d6302c1dbd5e87fc6d404d45531447c84eadec04bf1fcb027", size = 158347, upload-time = "2026-05-22T14:47:54.982Z" }, + { url = "https://files.pythonhosted.org/packages/52/2f/a92427dbdc74e54c1674abbed27e61b2cb5e7a94441b8c1270c70671d928/wrapt-2.2.1-cp311-cp311-win32.whl", hash = "sha256:8a983a603a18c8708f024f7f6991b2e66159219abbf894634c5056243c55f3cd", size = 77562, upload-time = "2026-05-22T14:47:56.275Z" }, + { url = "https://files.pythonhosted.org/packages/c8/56/987b9c13b3e1c1a3c6de71284076f996b79caec90e75a87c044a40c23db9/wrapt-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:9c210a6994b21aa9b29e81c8d11560e8fdab54c117e9cff37870d0a27bde1343", size = 80616, upload-time = "2026-05-22T14:47:57.854Z" }, + { url = "https://files.pythonhosted.org/packages/7e/25/d01f560888d99d94a959c85533de349ce68d71ace3f2591d6ea8f632cfed/wrapt-2.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:401229e9d63ca09f9b8891ecf83798d26c11bbb445d11ed9f1836b6d4585b38a", size = 79025, upload-time = "2026-05-22T14:47:59.089Z" }, + { url = "https://files.pythonhosted.org/packages/89/0c/bfae7b9401583b6d05938cd16dedc43857d96da2f8a3d50d78cc515bf6ff/wrapt-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3ffad790d9d11d8ecf9f17c4bb671a5b4089e4d8b575c46c5129597f41f836b0", size = 81021, upload-time = "2026-05-22T14:48:00.313Z" }, + { url = "https://files.pythonhosted.org/packages/26/58/80f6a6599f933f4caecc1cb3ee88a04faf81e8b9bddbd6109c688dd63e0f/wrapt-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:628f5220c7a904d5fc78f7075c8d7871433eb6d035c94728a22fdf85f193d2a8", size = 81692, upload-time = "2026-05-22T14:48:01.49Z" }, + { url = "https://files.pythonhosted.org/packages/17/93/fb357cc7847c58a8ae790be718903afa81a28d23e642c843dc4129e8a0b2/wrapt-2.2.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:61acce4257a9883669703c525447c5b4c392edf0f987ae77ec32668440158f0e", size = 169364, upload-time = "2026-05-22T14:48:02.791Z" }, + { url = "https://files.pythonhosted.org/packages/aa/0b/76b601ee309a8bd556af0eecb184394c20b3c49aa9c8e085aa1ffacc2568/wrapt-2.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727ab4244622cd6ad2390f322642090c877d2e83a608d2653a7643ae5368d926", size = 171079, upload-time = "2026-05-22T14:48:04.22Z" }, + { url = "https://files.pythonhosted.org/packages/cd/87/ee3f32d5658e3e26d3e0e457922b47a36dd3bfbdfee7f97bb3e802344a66/wrapt-2.2.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03df9ebed4c73ab93fa8c07e3d41d818dfca1852b15731a3de59457b27814624", size = 160205, upload-time = "2026-05-22T14:48:05.553Z" }, + { url = "https://files.pythonhosted.org/packages/b1/d0/ae2fd64277a67f5d7bffcf2d05eea1e476263fb2a072baf0b0129ab85984/wrapt-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0d9ff006f420b2ec8296aa56ade43ea7da3e997e85769f0aafc5e0661aacb710", size = 168922, upload-time = "2026-05-22T14:48:07.132Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f3/2d541a060c5bbafb9400bca4917e4d78bfd1f239f404782c86831a8f6b29/wrapt-2.2.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:844c858fc3bb7eacc0ba8efa904935d16aac6a4470948ad1e7e55c9f5a2a665f", size = 158388, upload-time = "2026-05-22T14:48:08.629Z" }, + { url = "https://files.pythonhosted.org/packages/1d/68/8d92c8800c57e93cb116ae9e9d6cbafc34fade5ee9f9107b6f203fb4dc35/wrapt-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87bacdaf225117a342a20d9c03438d701c02112f6e3f351ce9b7f32354f14797", size = 167682, upload-time = "2026-05-22T14:48:10.042Z" }, + { url = "https://files.pythonhosted.org/packages/30/72/83ea3790ea352439442349388e29ff07b76e0686265f9088bbb505d1608d/wrapt-2.2.1-cp312-cp312-win32.whl", hash = "sha256:2f8c90c8afde51969487be4e1343ae049b268854877d415c2510baf833775052", size = 77857, upload-time = "2026-05-22T14:48:11.782Z" }, + { url = "https://files.pythonhosted.org/packages/ef/cb/99450668dd3502d62a54a1c8aa56e44f34cb8c1261b381cfe2e7926c3b75/wrapt-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ce32763ac31ce94fe9aada947e479b1975012bff166da409b4b9e4e376cf7e5", size = 80825, upload-time = "2026-05-22T14:48:13.046Z" }, + { url = "https://files.pythonhosted.org/packages/e6/3a/87512881be64e743f9ee4c66f4cbe8e884974bef2a5989af71f999653ac7/wrapt-2.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d1b4d0e0c2119587a31f5c029abd547e0c81d93b89d394566fe1588659eb579", size = 79087, upload-time = "2026-05-22T14:48:14.323Z" }, + { url = "https://files.pythonhosted.org/packages/88/d1/a1b08f8f4fac8cbb156fa51cf64ee2c7f7f74f9875ba3cf70b3c58368694/wrapt-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d2beb1c7cab10603aecdc42f8edd6ff013f9a32e4543474e38e6b77ce9975aeb", size = 80831, upload-time = "2026-05-22T14:48:15.598Z" }, + { url = "https://files.pythonhosted.org/packages/54/ce/57890814991446a845e09b3445ce8b694f27eb0577004f2c2a36a9772ed4/wrapt-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e0cb7e4dd71f4c32e5e84843cd3c4cd65dda034314004bbe1d7f99af2426ab80", size = 81375, upload-time = "2026-05-22T14:48:17.071Z" }, + { url = "https://files.pythonhosted.org/packages/38/65/08d7a6c76ac4493bdb668205ee9c1de1bd5daca61717c3e9aa49b4c01499/wrapt-2.2.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95821352042722cd9f1108874579a47989d0a7e12a37d87d2fc4af20fd99ab8a", size = 167417, upload-time = "2026-05-22T14:48:18.303Z" }, + { url = "https://files.pythonhosted.org/packages/62/ce/f1ccbee7a1bfe5cdc6b3da6bab4b45713d628b9294da32a39f563d648140/wrapt-2.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:abd621552ede77c4c69be7fac44ba911225b0c812b6ba604e5964cf98085b474", size = 166948, upload-time = "2026-05-22T14:48:19.768Z" }, + { url = "https://files.pythonhosted.org/packages/86/2a/f85d48d1cd4869aee6704028d257d740a47c1c467b457ce396b4b5b55d07/wrapt-2.2.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e3677c7146ce694874941ba82b57092cc4875445aadf29d72807351023105143", size = 158148, upload-time = "2026-05-22T14:48:21.96Z" }, + { url = "https://files.pythonhosted.org/packages/fe/5c/93939ad11d4a12358ab1aab219a2ef5efa5612e0db6b9fc65af8af1a891b/wrapt-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9a5934eaea872e17936b5f45501eba5ab0bce9a74122e172b663d7c28c459c4a", size = 165905, upload-time = "2026-05-22T14:48:23.373Z" }, + { url = "https://files.pythonhosted.org/packages/e0/22/b8c2aa89862ff58605934d7abf4b70e6a5a1c33df96656f49035ccdf1c8a/wrapt-2.2.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f5b9daf6b629fce418e0cc3dd0436eac045188fa35deadb7a7f3941d5b8203f9", size = 156712, upload-time = "2026-05-22T14:48:24.767Z" }, + { url = "https://files.pythonhosted.org/packages/5d/78/bf00a7b02239c12bb02ddcc3c0b971bfcc36e578c5a44f1ccfef5b458545/wrapt-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f53ac9f3ef573326d009ed809beff4efcac6451931c2b8132586da4b9e53ff31", size = 166560, upload-time = "2026-05-22T14:48:26.83Z" }, + { url = "https://files.pythonhosted.org/packages/fe/93/6390ca9c5b787683cef588d04f57c8d41b9a2323b5597a65f18638c90ef2/wrapt-2.2.1-cp313-cp313-win32.whl", hash = "sha256:1ffa9cfd4bdb581539951b14ae661ff20ed0c3599b3e911a131ee0ec5ac11337", size = 77817, upload-time = "2026-05-22T14:48:28.221Z" }, + { url = "https://files.pythonhosted.org/packages/97/73/ce10f0e71c0cfaa1a65faadb8efd4852028b3bb9ba28932b8889df769d38/wrapt-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:368eac1e20fd0bb03dd3cc42bf9887154c3861b60989389ccb5fac032617d215", size = 80736, upload-time = "2026-05-22T14:48:30.139Z" }, + { url = "https://files.pythonhosted.org/packages/c7/4c/89f4a6818fafbbd840330e4fa3873073e1bfc166133a64cac7f8fde7a5e3/wrapt-2.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:c754dafdf5aaf0b401b644a90a30046929a0dd1a536e0ff0ec959a59155d9c7f", size = 79099, upload-time = "2026-05-22T14:48:31.405Z" }, + { url = "https://files.pythonhosted.org/packages/bf/f2/9a8741c46f8c208ac0a45b25ba170bcb4fb72a2781d5fb97dbd7b6be73cb/wrapt-2.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ed928d0fda15fc0adc8d13305c8b3c0f2fba5b0669950c9e6d019d9162a3b3e8", size = 82802, upload-time = "2026-05-22T14:48:33.307Z" }, + { url = "https://files.pythonhosted.org/packages/9c/0d/e9c855716a3705eef1416456bdf062b60620726fdc59428ff670fc3c60dc/wrapt-2.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fafb4e739e43544d12cb4abd1605fd4683b6ca6a9ad682b7fd8f4d21973eafa8", size = 83329, upload-time = "2026-05-22T14:48:34.593Z" }, + { url = "https://files.pythonhosted.org/packages/3b/d6/a88f1c13112b7831adac75cea65d8310e0d696d570c8961844c90a57b865/wrapt-2.2.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:74d6a0c31472fe5d814917266b9f46495d7c61ed890af08b468acea92fb89a8d", size = 202937, upload-time = "2026-05-22T14:48:35.859Z" }, + { url = "https://files.pythonhosted.org/packages/42/65/e29d54aef06a4d898a5b8a25589a0b3769bde454f922fad8f6f89fbfb650/wrapt-2.2.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab5be648d5a0b86b7438864f8df3c705a65cef35a2fd3e5561e3e203167e0f27", size = 209997, upload-time = "2026-05-22T14:48:38.153Z" }, + { url = "https://files.pythonhosted.org/packages/2a/91/e4454263516cf0e12640912fbca9a83654e424f0a6ddb79f5cd7ce14bf33/wrapt-2.2.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9d8f204c8e3a8bf9ece17e0a83d137fd807440977f8a5e762d59306795011440", size = 194856, upload-time = "2026-05-22T14:48:39.69Z" }, + { url = "https://files.pythonhosted.org/packages/de/d0/fe0ee202286afdf4a7f77dd29f195703145764d572aec209c5086e57d924/wrapt-2.2.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d047f6498c973874ba08ac3f97c69a2c4b2211c8de6f4c205f75cb1c9522596e", size = 205654, upload-time = "2026-05-22T14:48:43.456Z" }, + { url = "https://files.pythonhosted.org/packages/23/b6/87d860dfc6460c246af70b1fd5c8b76df77571b42a493459423ded94fd7d/wrapt-2.2.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:7a4fdb9326aab4a5a477a1640e5ad786a8495901009d7e7b038371edd23a9d2b", size = 192206, upload-time = "2026-05-22T14:48:44.858Z" }, + { url = "https://files.pythonhosted.org/packages/df/46/3eea8cde077d985f239a38c0257087b8064fd9ee9b1a99e282d2c86da4ef/wrapt-2.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c8cc5094b08abeae52da9c73c8a32003623be691a5193df2f4e3eac3d557c394", size = 198428, upload-time = "2026-05-22T14:48:46.319Z" }, + { url = "https://files.pythonhosted.org/packages/18/dc/b927ee9c7fc67adc3a5658f246a0d275425eb840ba36e7b702e70f18bde8/wrapt-2.2.1-cp313-cp313t-win32.whl", hash = "sha256:9907a4402ab6db12b7077a0ea5d7a4d028ecb22c8eee2b53527080d347cd1562", size = 79448, upload-time = "2026-05-22T14:48:47.901Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b3/fd30b473fe498c70e6b9a5f328b8d3fbaf1b8c3c481465f59724bba8eb70/wrapt-2.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:5590d63f5243251641cf543009b4c9314a79d0598fdb8a8e4cfc918494536c53", size = 83021, upload-time = "2026-05-22T14:48:49.201Z" }, + { url = "https://files.pythonhosted.org/packages/ee/f3/96c39153a8737a6e9aa85adef254ac4195bea3f2d24efc60472ccc3c9e2e/wrapt-2.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:c318a64b53d97b841d7b5e637517e50a27be64bc695128422953d4b21710954e", size = 80295, upload-time = "2026-05-22T14:48:50.479Z" }, + { url = "https://files.pythonhosted.org/packages/0a/a3/11d7f34ebbf3231bc907a3e6d5ee051b14d034c1bc7b65a97d5cc00516df/wrapt-2.2.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:6f56a647e4eaf5f0ca40330fb070f566bdf9f7b0db89a1af20d71c28dcd7a0ab", size = 80879, upload-time = "2026-05-22T14:48:51.802Z" }, + { url = "https://files.pythonhosted.org/packages/13/3c/b74cfd984cef560b900fb1a727af20352d89e1f06bf2e1114dd3f00f5f5a/wrapt-2.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:64b7deeda4b70408e382328d8bbe52a256fe9bc63ae3db86d804608367e5422c", size = 81462, upload-time = "2026-05-22T14:48:53.18Z" }, + { url = "https://files.pythonhosted.org/packages/15/a3/7c8f704b8dc07dfe0a5d01c2edbfd88317aa8e5e3fa7c743eb7a085ae767/wrapt-2.2.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b9cf53ba90717db2e292401de290776c498d4bbfb0d4a559ca2895db8b9dcb5c", size = 167251, upload-time = "2026-05-22T14:48:54.562Z" }, + { url = "https://files.pythonhosted.org/packages/80/85/a34d1888d97247da6c2ff6118c3a721c73ed8cc4dd198c00208bb73b6f80/wrapt-2.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cf3638274ab9d9b724c9baa0b4c04e132cd6faefb78b4dd3dd1a02a4bdaad41e", size = 166316, upload-time = "2026-05-22T14:48:56.065Z" }, + { url = "https://files.pythonhosted.org/packages/e9/d7/72ffaeb01eebc704afe3fb99e840480f4bda45f0fa66e3381b6a39251c8f/wrapt-2.2.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aed9658797d0b45d6c49adcfc6b41f66e6f2d0c6de3ec79e16cf4b1855df240f", size = 157952, upload-time = "2026-05-22T14:48:57.924Z" }, + { url = "https://files.pythonhosted.org/packages/24/5b/36f5d6b024e4edfdd90b140742d11ebcf7836daf5c9daf326c55c24db412/wrapt-2.2.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1d676ee388bc42a04d56dd7deb5605244dac2e35cc2fadbb43c9fa25bbd93508", size = 166130, upload-time = "2026-05-22T14:48:59.384Z" }, + { url = "https://files.pythonhosted.org/packages/81/06/9296d9e97bfdef5483dfcc859d57b095b257144b2bc5300ab521e06f4bc7/wrapt-2.2.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e395f7bc31851ef9b612050368cb446e9bc14cd7454b025018980349caf25ae5", size = 156604, upload-time = "2026-05-22T14:49:00.921Z" }, + { url = "https://files.pythonhosted.org/packages/53/37/16953929ed6776175720e58fc966e779926d8d71e2c7b2273230590ca71f/wrapt-2.2.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5f1845c2a8cc1180ccccfa45785dd06f562730d19ef75be180334254012b6283", size = 166007, upload-time = "2026-05-22T14:49:02.332Z" }, + { url = "https://files.pythonhosted.org/packages/b9/73/20ee58c0612dae7c31131a7095345812ed2c7b389019e175f68cde34e5b4/wrapt-2.2.1-cp314-cp314-win32.whl", hash = "sha256:436addbc4bb4fc0a88c702577f51195d7d73683a7f3e0e5b253d8404d7847243", size = 78327, upload-time = "2026-05-22T14:49:03.722Z" }, + { url = "https://files.pythonhosted.org/packages/22/b3/ef7c3295d02e0448a71c639a36a057f46d524d057c9486291a7a3039e65c/wrapt-2.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:50972a1d974ea07725a7f6b1cec5f8759008afd030a0024843ebe7d52de47f2b", size = 81144, upload-time = "2026-05-22T14:49:05.093Z" }, + { url = "https://files.pythonhosted.org/packages/ac/dc/7bdf336953f99f4ceb0a584bb8870e42c8f26f93ea10c87834dad62f1668/wrapt-2.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:1c9934ea5d92957e3cd0adbc0845539dccfd62710ebe16195a8c66c53954db36", size = 79569, upload-time = "2026-05-22T14:49:06.413Z" }, + { url = "https://files.pythonhosted.org/packages/6a/6d/6dfae80150ff1919c356d1dd528f049bcdfaae29b4d284bc957e022caef4/wrapt-2.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17de18fc12cea55b8a9587314cb830573e37fb33b247a7515696350863714188", size = 82892, upload-time = "2026-05-22T14:49:07.925Z" }, + { url = "https://files.pythonhosted.org/packages/82/7b/4e34766a7d7804ffce9e71befe47e9b3225dc350c49c94493c4ab39fd3a5/wrapt-2.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a9dec1aca52dddde7df94818310fa2fe79739c8f385b2014c4cb1035f5508199", size = 83333, upload-time = "2026-05-22T14:49:09.257Z" }, + { url = "https://files.pythonhosted.org/packages/9d/57/0b34db3e8de44ccfece62d7b337abd1631dd810f5adc5f3db571727836b5/wrapt-2.2.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:69f2e9244542cb34dd59c7f073445b9e54ad9f3fce8d93606c368a1b499fc413", size = 202899, upload-time = "2026-05-22T14:49:10.572Z" }, + { url = "https://files.pythonhosted.org/packages/e5/45/ac0c459f154b99d92789a6cba7ca727185b83513b986f8ec7fe2aacddcbf/wrapt-2.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2d83966dc7f4f45e8b97b5933685ac2e6e67fc0e19246ea314bceb9a8970c956", size = 209986, upload-time = "2026-05-22T14:49:12.229Z" }, + { url = "https://files.pythonhosted.org/packages/b7/e4/77e37ff33ad018fa81ade52c25fa327b80b56f81d734279a63614fcb4cbc/wrapt-2.2.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:78b0aa6bfb7be8deed0ab23e7aa028cc5210c29bc2d32a04d52b50e517a7307e", size = 194893, upload-time = "2026-05-22T14:49:14.139Z" }, + { url = "https://files.pythonhosted.org/packages/dd/9d/7ea651d1ab032fc5fa222fbec91d0f8a1397f6ae04ebb93fa7219aa921d7/wrapt-2.2.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:05d5cb74d1b232ec8cfa130a8f900708699ff2491d97b8f85a4cdc5996294b85", size = 205636, upload-time = "2026-05-22T14:49:15.714Z" }, + { url = "https://files.pythonhosted.org/packages/09/af/8e88031a701275b9085c54e64bc88c0b1cd55c77eadd400691c371cd76c4/wrapt-2.2.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f6518b94edb9150452e9aba08027d4cc293433753ec1fbefb4629a21cbc74181", size = 192267, upload-time = "2026-05-22T14:49:17.283Z" }, + { url = "https://files.pythonhosted.org/packages/bf/a8/e657ca876b06710194f243d81c4b0896ade646e244bdbec2d87c8c56a8bd/wrapt-2.2.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ed55af48b3eb28f43228ca2306788892bcb629eb2b5c4876e2a3659872c2f17a", size = 198378, upload-time = "2026-05-22T14:49:18.785Z" }, + { url = "https://files.pythonhosted.org/packages/c8/59/822efe4ea722a3961331bfa35b7d90937790d2c20f0616de1997ccc3aebd/wrapt-2.2.1-cp314-cp314t-win32.whl", hash = "sha256:2e08688ab16525897da6589d56d0aebaf417bbe91c2d8e3b96203b1efa596e85", size = 80226, upload-time = "2026-05-22T14:49:20.264Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/2a7dc5f6abb2fca0b6e1610e120419f603650aceb4f1d3ac4cae0354e162/wrapt-2.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:fd0135d34387f5fd087d9be368ea77ea89cf2451dc1cd1c622d35021bcb3ab50", size = 83835, upload-time = "2026-05-22T14:49:21.634Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c0/782b86e28d1ceebeb74cccea12d2cd3d2ba0bd68e3dec20b1bc5873f6127/wrapt-2.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:f70db64e8266d7c45d3b735f2e08eeb434b5e03da9a479ae42b2e2e486a21a00", size = 80722, upload-time = "2026-05-22T14:49:23.59Z" }, + { url = "https://files.pythonhosted.org/packages/53/46/29ac9daf11a86c22a8c38cd9236c62928ccae83f7ceb06bd3b0467cf9d05/wrapt-2.2.1-py3-none-any.whl", hash = "sha256:3aafea2975caef8ca49400640dde02cc7426e798f24870ed01f490bc3cffd32f", size = 61000, upload-time = "2026-05-22T14:49:41.593Z" }, ] [[package]] @@ -6521,142 +6517,142 @@ dependencies = [ { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", upload-time = "2026-03-01T22:07:53.373Z" } -wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/8b/0d/9cc638702f6fc3c7a3685bcc8cf2a9ed7d6206e932a49f5242658047ef51/yarl-1.23.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cff6d44cb13d39db2663a22b22305d10855efa0fa8015ddeacc40bc59b9d8107", upload-time = "2026-03-01T22:04:09.7Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/35/5a553687c5793df5429cd1db45909d4f3af7eee90014888c208d086a44f0/yarl-1.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c53f8347cd4200f0d70a48ad059cabaf24f5adc6ba08622a23423bc7efa10d", upload-time = "2026-03-01T22:04:11.892Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/68/2e/c5a2234238f8ce37a8312b52801ee74117f576b1539eec8404a480434acc/yarl-1.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a6940a074fb3c48356ed0158a3ca5699c955ee4185b4d7d619be3c327143e05", upload-time = "2026-03-01T22:04:13.292Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/74/3f/bbd8ff36fb038622797ffbaf7db314918bb4d76f1cc8a4f9ca7a55fe5195/yarl-1.23.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ed5f69ce7be7902e5c70ea19eb72d20abf7d725ab5d49777d696e32d4fc1811d", upload-time = "2026-03-01T22:04:15.133Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/04/9516bc4e269d2a3ec9c6779fcdeac51ce5b3a9b0156f06ac7152e5bba864/yarl-1.23.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:389871e65468400d6283c0308e791a640b5ab5c83bcee02a2f51295f95e09748", upload-time = "2026-03-01T22:04:16.829Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c7/63/88802d1f6b1cb1fc67d67a58cd0cf8a1790de4ce7946e434240f1d60ab4a/yarl-1.23.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dda608c88cf709b1d406bdfcd84d8d63cff7c9e577a403c6108ce8ce9dcc8764", upload-time = "2026-03-01T22:04:18.519Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8e/db/4f9b838f4d8bdd6f0f385aed8bbf21c71ed11a0b9983305c302cbd557815/yarl-1.23.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c4fe09e0780c6c3bf2b7d4af02ee2394439d11a523bbcf095cf4747c2932007", upload-time = "2026-03-01T22:04:20.373Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/12/95a1d33f04a79c402664070d43b8b9f72dc18914e135b345b611b0b1f8cc/yarl-1.23.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31c9921eb8bd12633b41ad27686bbb0b1a2a9b8452bfdf221e34f311e9942ed4", upload-time = "2026-03-01T22:04:23.055Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/65/91a0285f51321369fd1a8308aa19207520c5f0587772cfc2e03fc2467e90/yarl-1.23.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5f10fd85e4b75967468af655228fbfd212bdf66db1c0d135065ce288982eda26", upload-time = "2026-03-01T22:04:25.031Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/58/80/c7c8244fc3e5bc483dc71a09560f43b619fab29301a0f0a8f936e42865c7/yarl-1.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dbf507e9ef5688bada447a24d68b4b58dd389ba93b7afc065a2ba892bea54769", upload-time = "2026-03-01T22:04:27.281Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/e7/71ca9cc9ca79c0b7d491216177d1aed559d632947b8ffb0ee60f7d8b23e3/yarl-1.23.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:85e9beda1f591bc73e77ea1c51965c68e98dafd0fec72cdd745f77d727466716", upload-time = "2026-03-01T22:04:28.554Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6a/3f/6c6c8a0fe29c26fb2db2e8d32195bb84ec1bfb8f1d32e7f73b787fcf349b/yarl-1.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1fdaa14ef51366d7757b45bde294e95f6c8c049194e793eedb8387c86d5993", upload-time = "2026-03-01T22:04:30.385Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/56/38/12730c05e5ad40a76374d440ed8b0899729a96c250516d91c620a6e38fc2/yarl-1.23.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:75e3026ab649bf48f9a10c0134512638725b521340293f202a69b567518d94e0", upload-time = "2026-03-01T22:04:31.752Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/34/92/6a7be9239f2347234e027284e7a5f74b1140cc86575e7b469d13fba1ebfe/yarl-1.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:80e6d33a3d42a7549b409f199857b4fb54e2103fc44fb87605b6663b7a7ff750", upload-time = "2026-03-01T22:04:33.844Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5e/81/4aebccfa9376bd98b9d8bfad20621a57d3e8cfc5b8631c1fa5f62cdd03f4/yarl-1.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5ec2f42d41ccbd5df0270d7df31618a8ee267bfa50997f5d720ddba86c4a83a6", upload-time = "2026-03-01T22:04:35.856Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/38/0f/0b4e3edcec794a86b853b0c6396c0a888d72dfce19b2d88c02ac289fb6c1/yarl-1.23.0-cp310-cp310-win32.whl", hash = "sha256:debe9c4f41c32990771be5c22b56f810659f9ddf3d63f67abfdcaa2c6c9c5c1d", upload-time = "2026-03-01T22:04:38.268Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a0/71/ad95c33da18897e4c636528bbc24a1dd23fe16797de8bc4ec667b8db0ba4/yarl-1.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f043cb8a2d71c981c09c510da013bc79fd661f5c60139f00dd3c3cc4f2ffb", upload-time = "2026-03-01T22:04:39.558Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/14/dfa369523c79bccf9c9c746b0a63eb31f65db9418ac01275f7950962e504/yarl-1.23.0-cp310-cp310-win_arm64.whl", hash = "sha256:263cd4f47159c09b8b685890af949195b51d1aa82ba451c5847ca9bc6413c220", upload-time = "2026-03-01T22:04:41.454Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a2/aa/60da938b8f0997ba3a911263c40d82b6f645a67902a490b46f3355e10fae/yarl-1.23.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b35d13d549077713e4414f927cdc388d62e543987c572baee613bf82f11a4b99", upload-time = "2026-03-01T22:04:42.841Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/84/e237607faf4e099dbb8a4f511cfd5efcb5f75918baad200ff7380635631b/yarl-1.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbb0fef01f0c6b38cb0f39b1f78fc90b807e0e3c86a7ff3ce74ad77ce5c7880c", upload-time = "2026-03-01T22:04:44.757Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b2/0d/71ceabc14c146ba8ee3804ca7b3d42b1664c8440439de5214d366fec7d3a/yarl-1.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc52310451fc7c629e13c4e061cbe2dd01684d91f2f8ee2821b083c58bd72432", upload-time = "2026-03-01T22:04:46.365Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8c/6c/4a90d59c572e46b270ca132aca66954f1175abd691f74c1ef4c6711828e2/yarl-1.23.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2c6b50c7b0464165472b56b42d4c76a7b864597007d9c085e8b63e185cf4a7a", upload-time = "2026-03-01T22:04:47.639Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/49/fb/c438fb5108047e629f6282a371e6e91cf3f97ee087c4fb748a1f32ceef55/yarl-1.23.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:aafe5dcfda86c8af00386d7781d4c2181b5011b7be3f2add5e99899ea925df05", upload-time = "2026-03-01T22:04:48.925Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d9/13/d269aa1aed3e4f50a5a103f96327210cc5fa5dd2d50882778f13c7a14606/yarl-1.23.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ee33b875f0b390564c1fb7bc528abf18c8ee6073b201c6ae8524aca778e2d83", upload-time = "2026-03-01T22:04:50.838Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/85/fb/115b16f22c37ea4437d323e472945bea97301c8ec6089868fa560abab590/yarl-1.23.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c41e021bc6d7affb3364dc1e1e5fa9582b470f283748784bd6ea0558f87f42c", upload-time = "2026-03-01T22:04:52.499Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9a/64/c53487d9f4968045b8afa51aed7ca44f58b2589e772f32745f3744476c82/yarl-1.23.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99c8a9ed30f4164bc4c14b37a90208836cbf50d4ce2a57c71d0f52c7fb4f7598", upload-time = "2026-03-01T22:04:55.176Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/85/59/cd98e556fbb2bf8fab29c1a722f67ad45c5f3447cac798ab85620d1e70af/yarl-1.23.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2af5c81a1f124609d5f33507082fc3f739959d4719b56877ab1ee7e7b3d602b", upload-time = "2026-03-01T22:04:56.588Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9e/c0/b39770b56d4a9f0bb5f77e2f1763cd2d75cc2f6c0131e3b4c360348fcd65/yarl-1.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6b41389c19b07c760c7e427a3462e8ab83c4bb087d127f0e854c706ce1b9215c", upload-time = "2026-03-01T22:04:58.492Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e7/64/6980f99ab00e1f0ff67cb84766c93d595b067eed07439cfccfc8fb28c1a6/yarl-1.23.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1dc702e42d0684f42d6519c8d581e49c96cefaaab16691f03566d30658ee8788", upload-time = "2026-03-01T22:05:00.268Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/38/69/912e6c5e146793e5d4b5fe39ff5b00f4d22463dfd5a162bec565ac757673/yarl-1.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0e40111274f340d32ebcc0a5668d54d2b552a6cca84c9475859d364b380e3222", upload-time = "2026-03-01T22:05:02.273Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/59/97/35ca6767524687ad64e5f5c31ad54bc76d585585a9fcb40f649e7e82ffed/yarl-1.23.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:4764a6a7588561a9aef92f65bda2c4fb58fe7c675c0883862e6df97559de0bfb", upload-time = "2026-03-01T22:05:03.597Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/1c/1a3387ee6d73589f6f2a220ae06f2984f6c20b40c734989b0a44f5987308/yarl-1.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:03214408cfa590df47728b84c679ae4ef00be2428e11630277be0727eba2d7cc", upload-time = "2026-03-01T22:05:04.986Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a4/b8/35c0750fcd5a3f781058bfd954515dd4b1eab45e218cbb85cf11132215f1/yarl-1.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:170e26584b060879e29fac213e4228ef063f39128723807a312e5c7fec28eff2", upload-time = "2026-03-01T22:05:06.397Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/1c/9a1979aec4a81896d597bcb2177827f2dbee3f5b7cc48b2d0dadb644b41d/yarl-1.23.0-cp311-cp311-win32.whl", hash = "sha256:51430653db848d258336cfa0244427b17d12db63d42603a55f0d4546f50f25b5", upload-time = "2026-03-01T22:05:08.444Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/93/22/b85eca6fa2ad9491af48c973e4c8cf6b103a73dbb271fe3346949449fca0/yarl-1.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf49a3ae946a87083ef3a34c8f677ae4243f5b824bfc4c69672e72b3d6719d46", upload-time = "2026-03-01T22:05:10.145Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/93/95/07e3553fe6f113e6864a20bdc53a78113cda3b9ced8784ee52a52c9f80d8/yarl-1.23.0-cp311-cp311-win_arm64.whl", hash = "sha256:b39cb32a6582750b6cc77bfb3c49c0f8760dc18dc96ec9fb55fbb0f04e08b928", upload-time = "2026-03-01T22:05:11.554Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/88/8a/94615bc31022f711add374097ad4144d569e95ff3c38d39215d07ac153a0/yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860", upload-time = "2026-03-01T22:05:12.897Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e3/6f/c6554045d59d64052698add01226bc867b52fe4a12373415d7991fdca95d/yarl-1.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:411225bae281f114067578891bc75534cfb3d92a3b4dfef7a6ca78ba354e6069", upload-time = "2026-03-01T22:05:14.376Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/2a/725ecc166d53438bc88f76822ed4b1e3b10756e790bafd7b523fe97c322d/yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25", upload-time = "2026-03-01T22:05:15.71Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/99/30/58260ed98e6ff7f90ba84442c1ddd758c9170d70327394a6227b310cd60f/yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8", upload-time = "2026-03-01T22:05:17.384Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/76/0a/8b08aac08b50682e65759f7f8dde98ae8168f72487e7357a5d684c581ef9/yarl-1.23.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53ad387048f6f09a8969631e4de3f1bf70c50e93545d64af4f751b2498755072", upload-time = "2026-03-01T22:05:18.804Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/52/07/0b7179101fe5f8385ec6c6bb5d0cb9f76bd9fb4a769591ab6fb5cdbfc69a/yarl-1.23.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4a59ba56f340334766f3a4442e0efd0af895fae9e2b204741ef885c446b3a1a8", upload-time = "2026-03-01T22:05:20.235Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d3/8a/36d82869ab5ec829ca8574dfcb92b51286fcfb1e9c7a73659616362dc880/yarl-1.23.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:803a3c3ce4acc62eaf01eaca1208dcf0783025ef27572c3336502b9c232005e7", upload-time = "2026-03-01T22:05:22.268Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/3e/868e5c3364b6cee19ff3e1a122194fa4ce51def02c61023970442162859e/yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51", upload-time = "2026-03-01T22:05:23.638Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cf/26/9c89acf82f08a52cb52d6d39454f8d18af15f9d386a23795389d1d423823/yarl-1.23.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c75eb09e8d55bceb4367e83496ff8ef2bc7ea6960efb38e978e8073ea59ecb67", upload-time = "2026-03-01T22:05:25.749Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/6f/54/5b0db00d2cb056922356104468019c0a132e89c8d3ab67d8ede9f4483d2a/yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7", upload-time = "2026-03-01T22:05:27.318Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f6/40/10fa93811fd439341fad7e0718a86aca0de9548023bbb403668d6555acab/yarl-1.23.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b5405bb8f0e783a988172993cfc627e4d9d00432d6bbac65a923041edacf997d", upload-time = "2026-03-01T22:05:28.738Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/bc/d2/8ae2e6cd77d0805f4526e30ec43b6f9a3dfc542d401ac4990d178e4bf0cf/yarl-1.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c3a3598a832590c5a3ce56ab5576361b5688c12cb1d39429cf5dba30b510760", upload-time = "2026-03-01T22:05:30.438Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2f/0c/b3ceacf82c3fe21183ce35fa2acf5320af003d52bc1fcf5915077681142e/yarl-1.23.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8419ebd326430d1cbb7efb5292330a2cf39114e82df5cc3d83c9a0d5ebeaf2f2", upload-time = "2026-03-01T22:05:31.835Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9d/e0/12900edd28bdab91a69bd2554b85ad7b151f64e8b521fe16f9ad2f56477a/yarl-1.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:be61f6fff406ca40e3b1d84716fde398fc08bc63dd96d15f3a14230a0973ed86", upload-time = "2026-03-01T22:05:33.358Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/15/61/74bb1182cf79c9bbe4eb6b1f14a57a22d7a0be5e9cedf8e2d5c2086474c3/yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34", upload-time = "2026-03-01T22:05:35.4Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/69/7f/cd5ef733f2550de6241bd8bd8c3febc78158b9d75f197d9c7baa113436af/yarl-1.23.0-cp312-cp312-win32.whl", hash = "sha256:fffc45637bcd6538de8b85f51e3df3223e4ad89bccbfca0481c08c7fc8b7ed7d", upload-time = "2026-03-01T22:05:36.811Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/f5/be/25216a49daeeb7af2bec0db22d5e7df08ed1d7c9f65d78b14f3b74fd72fc/yarl-1.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:f69f57305656a4852f2a7203efc661d8c042e6cc67f7acd97d8667fb448a426e", upload-time = "2026-03-01T22:05:38.171Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d2/35/aeab955d6c425b227d5b7247eafb24f2653fedc32f95373a001af5dfeb9e/yarl-1.23.0-cp312-cp312-win_arm64.whl", hash = "sha256:6e87a6e8735b44816e7db0b2fbc9686932df473c826b0d9743148432e10bb9b9", upload-time = "2026-03-01T22:05:40.006Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9a/4b/a0a6e5d0ee8a2f3a373ddef8a4097d74ac901ac363eea1440464ccbe0898/yarl-1.23.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:16c6994ac35c3e74fb0ae93323bf8b9c2a9088d55946109489667c510a7d010e", upload-time = "2026-03-01T22:05:41.412Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a42e651629dafb64fd5b0286a3580613702b5809ad3f24934ea87595804f2c5", upload-time = "2026-03-01T22:05:42.841Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b", upload-time = "2026-03-01T22:05:44.85Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c4/f4/4e30b250927ffdab4db70da08b9b8d2194d7c7b400167b8fbeca1e4701ca/yarl-1.23.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2569b67d616eab450d262ca7cb9f9e19d2f718c70a8b88712859359d0ab17035", upload-time = "2026-03-01T22:05:46.836Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/86/fc/4118c5671ea948208bdb1492d8b76bdf1453d3e73df051f939f563e7dcc5/yarl-1.23.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e9d9a4d06d3481eab79803beb4d9bd6f6a8e781ec078ac70d7ef2dcc29d1bea5", upload-time = "2026-03-01T22:05:48.316Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/56/11/1ed91d42bd9e73c13dc9e7eb0dd92298d75e7ac4dd7f046ad0c472e231cd/yarl-1.23.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f514f6474e04179d3d33175ed3f3e31434d3130d42ec153540d5b157deefd735", upload-time = "2026-03-01T22:05:50.028Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ce/c9/74e44e056a23fbc33aca71779ef450ca648a5bc472bdad7a82339918f818/yarl-1.23.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fda207c815b253e34f7e1909840fd14299567b1c0eb4908f8c2ce01a41265401", upload-time = "2026-03-01T22:05:51.416Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4", upload-time = "2026-03-01T22:05:52.872Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/72/59/c5b8d94b14e3d3c2a9c20cb100119fd534ab5a14b93673ab4cc4a4141ea5/yarl-1.23.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7504f2b476d21653e4d143f44a175f7f751cd41233525312696c76aa3dbb23f", upload-time = "2026-03-01T22:05:54.954Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/77/4f/96976cb54cbfc5c9fd73ed4c51804f92f209481d1fb190981c0f8a07a1d7/yarl-1.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:578110dd426f0d209d1509244e6d4a3f1a3e9077655d98c5f22583d63252a08a", upload-time = "2026-03-01T22:05:56.409Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/63/6e/904c4f476471afdbad6b7e5b70362fb5810e35cd7466529a97322b6f5556/yarl-1.23.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:609d3614d78d74ebe35f54953c5bbd2ac647a7ddb9c30a5d877580f5e86b22f2", upload-time = "2026-03-01T22:05:58.141Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9d/40/acfcdb3b5f9d68ef499e39e04d25e141fe90661f9d54114556cf83be8353/yarl-1.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4966242ec68afc74c122f8459abd597afd7d8a60dc93d695c1334c5fd25f762f", upload-time = "2026-03-01T22:06:00.286Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/5e/c6/31e28f3a6ba2869c43d124f37ea5260cac9c9281df803c354b31f4dd1f3c/yarl-1.23.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e0fd068364a6759bc794459f0a735ab151d11304346332489c7972bacbe9e72b", upload-time = "2026-03-01T22:06:01.712Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/08/1f/6f65f59e72d54aa467119b63fc0b0b1762eff0232db1f4720cd89e2f4a17/yarl-1.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:39004f0ad156da43e86aa71f44e033de68a44e5a31fc53507b36dd253970054a", upload-time = "2026-03-01T22:06:03.188Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a3/c4/18b178a69935f9e7a338127d5b77d868fdc0f0e49becd286d51b3a18c61d/yarl-1.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e5723c01a56c5028c807c701aa66722916d2747ad737a046853f6c46f4875543", upload-time = "2026-03-01T22:06:04.651Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8f/54/f5b870b5505663911dba950a8e4776a0dbd51c9c54c0ae88e823e4b874a0/yarl-1.23.0-cp313-cp313-win32.whl", hash = "sha256:1b6b572edd95b4fa8df75de10b04bc81acc87c1c7d16bcdd2035b09d30acc957", upload-time = "2026-03-01T22:06:06.04Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:baaf55442359053c7d62f6f8413a62adba3205119bcb6f49594894d8be47e5e3", upload-time = "2026-03-01T22:06:08.107Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/00/fd/7e1c66efad35e1649114fa13f17485f62881ad58edeeb7f49f8c5e748bf9/yarl-1.23.0-cp313-cp313-win_arm64.whl", hash = "sha256:fb4948814a2a98e3912505f09c9e7493b1506226afb1f881825368d6fb776ee3", upload-time = "2026-03-01T22:06:10.181Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9c/fc/119dd07004f17ea43bb91e3ece6587759edd7519d6b086d16bfbd3319982/yarl-1.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:aecfed0b41aa72b7881712c65cf764e39ce2ec352324f5e0837c7048d9e6daaa", upload-time = "2026-03-01T22:06:11.708Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e6/0d/9f2348502fbb3af409e8f47730282cd6bc80dec6630c1e06374d882d6eb2/yarl-1.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a41bcf68efd19073376eb8cf948b8d9be0af26256403e512bb18f3966f1f9120", upload-time = "2026-03-01T22:06:13.429Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/50/93/e88f3c80971b42cfc83f50a51b9d165a1dbf154b97005f2994a79f212a07/yarl-1.23.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cde9a2ecd91668bcb7f077c4966d8ceddb60af01b52e6e3e2680e4cf00ad1a59", upload-time = "2026-03-01T22:06:15.53Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/1c/07/61c9dd8ba8f86473263b4036f70fb594c09e99c0d9737a799dfd8bc85651/yarl-1.23.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5023346c4ee7992febc0068e7593de5fa2bf611848c08404b35ebbb76b1b0512", upload-time = "2026-03-01T22:06:17.553Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/9e/e9/f9ff8ceefba599eac6abddcfb0b3bee9b9e636e96dbf54342a8577252379/yarl-1.23.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1009abedb49ae95b136a8904a3f71b342f849ffeced2d3747bf29caeda218c4", upload-time = "2026-03-01T22:06:19.004Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/eb/78/0231bfcc5d4c8eec220bc2f9ef82cb4566192ea867a7c5b4148f44f6cbcd/yarl-1.23.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a8d00f29b42f534cc8aa3931cfe773b13b23e561e10d2b26f27a8d309b0e82a1", upload-time = "2026-03-01T22:06:21.203Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/cd/9b/30ea5239a61786f18fd25797151a17fbb3be176977187a48d541b5447dd4/yarl-1.23.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:95451e6ce06c3e104556d73b559f5da6c34a069b6b62946d3ad66afcd51642ea", upload-time = "2026-03-01T22:06:22.738Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/62/e2/a4980481071791bc83bce2b7a1a1f7adcabfa366007518b4b845e92eeee3/yarl-1.23.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531ef597132086b6cf96faa7c6c1dcd0361dd5f1694e5cc30375907b9b7d3ea9", upload-time = "2026-03-01T22:06:24.21Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/1e/304a00cf5f6100414c4b5a01fc7ff9ee724b62158a08df2f8170dfc72a2d/yarl-1.23.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88f9fb0116fbfcefcab70f85cf4b74a2b6ce5d199c41345296f49d974ddb4123", upload-time = "2026-03-01T22:06:25.697Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/68/03/093f4055ed4cae649ac53bca3d180bd37102e9e11d048588e9ab0c0108d0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e7b0460976dc75cb87ad9cc1f9899a4b97751e7d4e77ab840fc9b6d377b8fd24", upload-time = "2026-03-01T22:06:27.309Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b9/28/4c75ebb108f322aa8f917ae10a8ffa4f07cae10a8a627b64e578617df6a0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:115136c4a426f9da976187d238e84139ff6b51a20839aa6e3720cd1026d768de", upload-time = "2026-03-01T22:06:29.048Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/23/9c/42c2e2dd91c1a570402f51bdf066bfdb1241c2240ba001967bad778e77b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ead11956716a940c1abc816b7df3fa2b84d06eaed8832ca32f5c5e058c65506b", upload-time = "2026-03-01T22:06:30.525Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/74/05/1bcd60a8a0a914d462c305137246b6f9d167628d73568505fce3f1cb2e65/yarl-1.23.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:fe8f8f5e70e6dbdfca9882cd9deaac058729bcf323cf7a58660901e55c9c94f6", upload-time = "2026-03-01T22:06:32.692Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/90/b2/f52381aac396d6778ce516b7bc149c79e65bfc068b5de2857ab69eeea3b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a0e317df055958a0c1e79e5d2aa5a5eaa4a6d05a20d4b0c9c3f48918139c9fc6", upload-time = "2026-03-01T22:06:34.268Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e5/e8/638bae5bbf1113a659b2435d8895474598afe38b4a837103764f603aba56/yarl-1.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f0fd84de0c957b2d280143522c4f91a73aada1923caee763e24a2b3fda9f8a5", upload-time = "2026-03-01T22:06:35.864Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/80/25/a3892b46182c586c202629fc2159aa13975d3741d52ebd7347fd501d48d5/yarl-1.23.0-cp313-cp313t-win32.whl", hash = "sha256:93a784271881035ab4406a172edb0faecb6e7d00f4b53dc2f55919d6c9688595", upload-time = "2026-03-01T22:06:37.39Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/43/68/8c5b36aa5178900b37387937bc2c2fe0e9505537f713495472dcf6f6fccc/yarl-1.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dd00607bffbf30250fe108065f07453ec124dbf223420f57f5e749b04295e090", upload-time = "2026-03-01T22:06:39.579Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c6/cc/d79ba8292f51f81f4dc533a8ccfb9fc6992cabf0998ed3245de7589dc07c/yarl-1.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ac09d42f48f80c9ee1635b2fcaa819496a44502737660d3c0f2ade7526d29144", upload-time = "2026-03-01T22:06:41.988Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/90/98/b85a038d65d1b92c3903ab89444f48d3cee490a883477b716d7a24b1a78c/yarl-1.23.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:21d1b7305a71a15b4794b5ff22e8eef96ff4a6d7f9657155e5aa419444b28912", upload-time = "2026-03-01T22:06:43.615Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85610b4f27f69984932a7abbe52703688de3724d9f72bceb1cca667deff27474", upload-time = "2026-03-01T22:06:45.425Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23f371bd662cf44a7630d4d113101eafc0cfa7518a2760d20760b26021454719", upload-time = "2026-03-01T22:06:46.974Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ea/d8/d1cb2378c81dd729e98c716582b1ccb08357e8488e4c24714658cc6630e8/yarl-1.23.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a80f77dc1acaaa61f0934176fccca7096d9b1ff08c8ba9cddf5ae034a24319", upload-time = "2026-03-01T22:06:48.459Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/ff/7196790538f31debe3341283b5b0707e7feb947620fc5e8236ef28d44f72/yarl-1.23.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bd654fad46d8d9e823afbb4f87c79160b5a374ed1ff5bde24e542e6ba8f41434", upload-time = "2026-03-01T22:06:50.306Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c1/56/25d58c3eddde825890a5fe6aa1866228377354a3c39262235234ab5f616b/yarl-1.23.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:682bae25f0a0dd23a056739f23a134db9f52a63e2afd6bfb37ddc76292bbd723", upload-time = "2026-03-01T22:06:52.1Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/51/8a/882c0e7bc8277eb895b31bce0138f51a1ba551fc2e1ec6753ffc1e7c1377/yarl-1.23.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a82836cab5f197a0514235aaf7ffccdc886ccdaa2324bc0aafdd4ae898103039", upload-time = "2026-03-01T22:06:54.424Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c57676bdedc94cd3bc37724cf6f8cd2779f02f6aba48de45feca073e714fe52", upload-time = "2026-03-01T22:06:55.895Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/18/6a/530e16aebce27c5937920f3431c628a29a4b6b430fab3fd1c117b26ff3f6/yarl-1.23.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7f8dc16c498ff06497c015642333219871effba93e4a2e8604a06264aca5c5c", upload-time = "2026-03-01T22:06:58.21Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/88/08/93749219179a45e27b036e03260fda05190b911de8e18225c294ac95bbc9/yarl-1.23.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5ee586fb17ff8f90c91cf73c6108a434b02d69925f44f5f8e0d7f2f260607eae", upload-time = "2026-03-01T22:06:59.794Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/d9/cf/ea424a004969f5d81a362110a6ac1496d79efdc6d50c2c4b2e3ea0fc2519/yarl-1.23.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:17235362f580149742739cc3828b80e24029d08cbb9c4bda0242c7b5bc610a8e", upload-time = "2026-03-01T22:07:01.375Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e2/b7/14341481fe568e2b0408bcf1484c652accafe06a0ade9387b5d3fd9df446/yarl-1.23.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0793e2bd0cf14234983bbb371591e6bea9e876ddf6896cdcc93450996b0b5c85", upload-time = "2026-03-01T22:07:03.151Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0a/e6/5c744a9b54f4e8007ad35bce96fbc9218338e84812d36f3390cea616881a/yarl-1.23.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3650dc2480f94f7116c364096bc84b1d602f44224ef7d5c7208425915c0475dd", upload-time = "2026-03-01T22:07:04.701Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/23/e3bfc188d0b400f025bc49d99793d02c9abe15752138dcc27e4eaf0c4a9e/yarl-1.23.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f40e782d49630ad384db66d4d8b73ff4f1b8955dc12e26b09a3e3af064b3b9d6", upload-time = "2026-03-01T22:07:06.231Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/72/42/f0505f949a90b3f8b7a363d6cbdf398f6e6c58946d85c6d3a3bc70595b26/yarl-1.23.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94f8575fbdf81749008d980c17796097e645574a3b8c28ee313931068dad14fe", upload-time = "2026-03-01T22:07:08.4Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/65/b39290f1d892a9dd671d1c722014ca062a9c35d60885d57e5375db0404b5/yarl-1.23.0-cp314-cp314-win32.whl", hash = "sha256:c8aa34a5c864db1087d911a0b902d60d203ea3607d91f615acd3f3108ac32169", upload-time = "2026-03-01T22:07:09.968Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl", hash = "sha256:63e92247f383c85ab00dd0091e8c3fa331a96e865459f5ee80353c70a4a42d70", upload-time = "2026-03-01T22:07:11.501Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e0/7d/8a84dc9381fd4412d5e7ff04926f9865f6372b4c2fd91e10092e65d29eb8/yarl-1.23.0-cp314-cp314-win_arm64.whl", hash = "sha256:70efd20be968c76ece7baa8dafe04c5be06abc57f754d6f36f3741f7aa7a208e", upload-time = "2026-03-01T22:07:13.069Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/dd/8d/d2fad34b1c08aa161b74394183daa7d800141aaaee207317e82c790b418d/yarl-1.23.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9a18d6f9359e45722c064c97464ec883eb0e0366d33eda61cb19a244bf222679", upload-time = "2026-03-01T22:07:14.903Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/ff/33009a39d3ccf4b94d7d7880dfe17fb5816c5a4fe0096d9b56abceea9ac7/yarl-1.23.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2803ed8b21ca47a43da80a6fd1ed3019d30061f7061daa35ac54f63933409412", upload-time = "2026-03-01T22:07:17.372Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/0c/f1/dab7ac5e7306fb79c0190766a3c00b4cb8d09a1f390ded68c85a5934faf5/yarl-1.23.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:394906945aa8b19fc14a61cf69743a868bb8c465efe85eee687109cc540b98f4", upload-time = "2026-03-01T22:07:19.361Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/aa/b1/08e95f3caee1fad6e65017b9f26c1d79877b502622d60e517de01e72f95d/yarl-1.23.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71d006bee8397a4a89f469b8deb22469fe7508132d3c17fa6ed871e79832691c", upload-time = "2026-03-01T22:07:21.266Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c0/cc/6409f9018864a6aa186c61175b977131f373f1988e198e031236916e87e4/yarl-1.23.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:62694e275c93d54f7ccedcfef57d42761b2aad5234b6be1f3e3026cae4001cd4", upload-time = "2026-03-01T22:07:23.129Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/76/40/cc22d1d7714b717fde2006fad2ced5efe5580606cb059ae42117542122f3/yarl-1.23.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31de1613658308efdb21ada98cbc86a97c181aa050ba22a808120bb5be3ab94", upload-time = "2026-03-01T22:07:24.689Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/8f/0d/476c38e85ddb4c6ec6b20b815bdd779aa386a013f3d8b85516feee55c8dc/yarl-1.23.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb1e8b8d66c278b21d13b0a7ca22c41dd757a7c209c6b12c313e445c31dd3b28", upload-time = "2026-03-01T22:07:26.287Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/72/32/0abe4a76d59adf2081dcb0397168553ece4616ada1c54d1c49d8936c74f8/yarl-1.23.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50f9d8d531dfb767c565f348f33dd5139a6c43f5cbdf3f67da40d54241df93f6", upload-time = "2026-03-01T22:07:27.906Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/b7/35/7b30f4810fba112f60f5a43237545867504e15b1c7647a785fbaf588fac2/yarl-1.23.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575aa4405a656e61a540f4a80eaa5260f2a38fff7bfdc4b5f611840d76e9e277", upload-time = "2026-03-01T22:07:30.198Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/2d/86/ed7a73ab85ef00e8bb70b0cb5421d8a2a625b81a333941a469a6f4022828/yarl-1.23.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:041b1a4cefacf65840b4e295c6985f334ba83c30607441ae3cf206a0eed1a2e4", upload-time = "2026-03-01T22:07:32.132Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/19/90/d56967f61a29d8498efb7afb651e0b2b422a1e9b47b0ab5f4e40a19b699b/yarl-1.23.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d38c1e8231722c4ce40d7593f28d92b5fc72f3e9774fe73d7e800ec32299f63a", upload-time = "2026-03-01T22:07:34.404Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/72/00/8b8f76909259f56647adb1011d7ed8b321bcf97e464515c65016a47ecdf0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:d53834e23c015ee83a99377db6e5e37d8484f333edb03bd15b4bc312cc7254fb", upload-time = "2026-03-01T22:07:35.953Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/ac/e2/cab11b126fb7d440281b7df8e9ddbe4851e70a4dde47a202b6642586b8d9/yarl-1.23.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2e27c8841126e017dd2a054a95771569e6070b9ee1b133366d8b31beb5018a41", upload-time = "2026-03-01T22:07:37.594Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/c2/9b/2c893e16bfc50e6b2edf76c1a9eb6cb0c744346197e74c65e99ad8d634d0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:76855800ac56f878847a09ce6dba727c93ca2d89c9e9d63002d26b916810b0a2", upload-time = "2026-03-01T22:07:39.334Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/28/ec/5498c4e3a6d5f1003beb23405671c2eb9cdbf3067d1c80f15eeafe301010/yarl-1.23.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e09fd068c2e169a7070d83d3bde728a4d48de0549f975290be3c108c02e499b4", upload-time = "2026-03-01T22:07:41.717Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/fe/c3/cd737e2d45e70717907f83e146f6949f20cc23cd4bf7b2688727763aa458/yarl-1.23.0-cp314-cp314t-win32.whl", hash = "sha256:73309162a6a571d4cbd3b6a1dcc703c7311843ae0d1578df6f09be4e98df38d4", upload-time = "2026-03-01T22:07:43.433Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/e1/19/3774d162f6732d1cfb0b47b4140a942a35ca82bb19b6db1f80e9e7bdc8f8/yarl-1.23.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4503053d296bc6e4cbd1fad61cf3b6e33b939886c4f249ba7c78b602214fabe2", upload-time = "2026-03-01T22:07:45.773Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/51/47/3fa2286c3cb162c71cdb34c4224d5745a1ceceb391b2bd9b19b668a8d724/yarl-1.23.0-cp314-cp314t-win_arm64.whl", hash = "sha256:44bb7bef4ea409384e3f8bc36c063d77ea1b8d4a5b2706956c0d6695f07dcc25", upload-time = "2026-03-01T22:07:49.026Z" }, - { url = "https://pypi-proxy.dev.databricks.com/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", upload-time = "2026-03-01T22:07:51.388Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/0d/9cc638702f6fc3c7a3685bcc8cf2a9ed7d6206e932a49f5242658047ef51/yarl-1.23.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cff6d44cb13d39db2663a22b22305d10855efa0fa8015ddeacc40bc59b9d8107", size = 123764, upload-time = "2026-03-01T22:04:09.7Z" }, + { url = "https://files.pythonhosted.org/packages/7a/35/5a553687c5793df5429cd1db45909d4f3af7eee90014888c208d086a44f0/yarl-1.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c53f8347cd4200f0d70a48ad059cabaf24f5adc6ba08622a23423bc7efa10d", size = 86282, upload-time = "2026-03-01T22:04:11.892Z" }, + { url = "https://files.pythonhosted.org/packages/68/2e/c5a2234238f8ce37a8312b52801ee74117f576b1539eec8404a480434acc/yarl-1.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a6940a074fb3c48356ed0158a3ca5699c955ee4185b4d7d619be3c327143e05", size = 86053, upload-time = "2026-03-01T22:04:13.292Z" }, + { url = "https://files.pythonhosted.org/packages/74/3f/bbd8ff36fb038622797ffbaf7db314918bb4d76f1cc8a4f9ca7a55fe5195/yarl-1.23.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ed5f69ce7be7902e5c70ea19eb72d20abf7d725ab5d49777d696e32d4fc1811d", size = 99395, upload-time = "2026-03-01T22:04:15.133Z" }, + { url = "https://files.pythonhosted.org/packages/77/04/9516bc4e269d2a3ec9c6779fcdeac51ce5b3a9b0156f06ac7152e5bba864/yarl-1.23.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:389871e65468400d6283c0308e791a640b5ab5c83bcee02a2f51295f95e09748", size = 92143, upload-time = "2026-03-01T22:04:16.829Z" }, + { url = "https://files.pythonhosted.org/packages/c7/63/88802d1f6b1cb1fc67d67a58cd0cf8a1790de4ce7946e434240f1d60ab4a/yarl-1.23.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dda608c88cf709b1d406bdfcd84d8d63cff7c9e577a403c6108ce8ce9dcc8764", size = 107643, upload-time = "2026-03-01T22:04:18.519Z" }, + { url = "https://files.pythonhosted.org/packages/8e/db/4f9b838f4d8bdd6f0f385aed8bbf21c71ed11a0b9983305c302cbd557815/yarl-1.23.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c4fe09e0780c6c3bf2b7d4af02ee2394439d11a523bbcf095cf4747c2932007", size = 108700, upload-time = "2026-03-01T22:04:20.373Z" }, + { url = "https://files.pythonhosted.org/packages/50/12/95a1d33f04a79c402664070d43b8b9f72dc18914e135b345b611b0b1f8cc/yarl-1.23.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31c9921eb8bd12633b41ad27686bbb0b1a2a9b8452bfdf221e34f311e9942ed4", size = 102769, upload-time = "2026-03-01T22:04:23.055Z" }, + { url = "https://files.pythonhosted.org/packages/86/65/91a0285f51321369fd1a8308aa19207520c5f0587772cfc2e03fc2467e90/yarl-1.23.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5f10fd85e4b75967468af655228fbfd212bdf66db1c0d135065ce288982eda26", size = 101114, upload-time = "2026-03-01T22:04:25.031Z" }, + { url = "https://files.pythonhosted.org/packages/58/80/c7c8244fc3e5bc483dc71a09560f43b619fab29301a0f0a8f936e42865c7/yarl-1.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dbf507e9ef5688bada447a24d68b4b58dd389ba93b7afc065a2ba892bea54769", size = 98883, upload-time = "2026-03-01T22:04:27.281Z" }, + { url = "https://files.pythonhosted.org/packages/86/e7/71ca9cc9ca79c0b7d491216177d1aed559d632947b8ffb0ee60f7d8b23e3/yarl-1.23.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:85e9beda1f591bc73e77ea1c51965c68e98dafd0fec72cdd745f77d727466716", size = 94172, upload-time = "2026-03-01T22:04:28.554Z" }, + { url = "https://files.pythonhosted.org/packages/6a/3f/6c6c8a0fe29c26fb2db2e8d32195bb84ec1bfb8f1d32e7f73b787fcf349b/yarl-1.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1fdaa14ef51366d7757b45bde294e95f6c8c049194e793eedb8387c86d5993", size = 107010, upload-time = "2026-03-01T22:04:30.385Z" }, + { url = "https://files.pythonhosted.org/packages/56/38/12730c05e5ad40a76374d440ed8b0899729a96c250516d91c620a6e38fc2/yarl-1.23.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:75e3026ab649bf48f9a10c0134512638725b521340293f202a69b567518d94e0", size = 100285, upload-time = "2026-03-01T22:04:31.752Z" }, + { url = "https://files.pythonhosted.org/packages/34/92/6a7be9239f2347234e027284e7a5f74b1140cc86575e7b469d13fba1ebfe/yarl-1.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:80e6d33a3d42a7549b409f199857b4fb54e2103fc44fb87605b6663b7a7ff750", size = 108230, upload-time = "2026-03-01T22:04:33.844Z" }, + { url = "https://files.pythonhosted.org/packages/5e/81/4aebccfa9376bd98b9d8bfad20621a57d3e8cfc5b8631c1fa5f62cdd03f4/yarl-1.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5ec2f42d41ccbd5df0270d7df31618a8ee267bfa50997f5d720ddba86c4a83a6", size = 103008, upload-time = "2026-03-01T22:04:35.856Z" }, + { url = "https://files.pythonhosted.org/packages/38/0f/0b4e3edcec794a86b853b0c6396c0a888d72dfce19b2d88c02ac289fb6c1/yarl-1.23.0-cp310-cp310-win32.whl", hash = "sha256:debe9c4f41c32990771be5c22b56f810659f9ddf3d63f67abfdcaa2c6c9c5c1d", size = 83073, upload-time = "2026-03-01T22:04:38.268Z" }, + { url = "https://files.pythonhosted.org/packages/a0/71/ad95c33da18897e4c636528bbc24a1dd23fe16797de8bc4ec667b8db0ba4/yarl-1.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f043cb8a2d71c981c09c510da013bc79fd661f5c60139f00dd3c3cc4f2ffb", size = 87328, upload-time = "2026-03-01T22:04:39.558Z" }, + { url = "https://files.pythonhosted.org/packages/e2/14/dfa369523c79bccf9c9c746b0a63eb31f65db9418ac01275f7950962e504/yarl-1.23.0-cp310-cp310-win_arm64.whl", hash = "sha256:263cd4f47159c09b8b685890af949195b51d1aa82ba451c5847ca9bc6413c220", size = 82463, upload-time = "2026-03-01T22:04:41.454Z" }, + { url = "https://files.pythonhosted.org/packages/a2/aa/60da938b8f0997ba3a911263c40d82b6f645a67902a490b46f3355e10fae/yarl-1.23.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b35d13d549077713e4414f927cdc388d62e543987c572baee613bf82f11a4b99", size = 123641, upload-time = "2026-03-01T22:04:42.841Z" }, + { url = "https://files.pythonhosted.org/packages/24/84/e237607faf4e099dbb8a4f511cfd5efcb5f75918baad200ff7380635631b/yarl-1.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbb0fef01f0c6b38cb0f39b1f78fc90b807e0e3c86a7ff3ce74ad77ce5c7880c", size = 86248, upload-time = "2026-03-01T22:04:44.757Z" }, + { url = "https://files.pythonhosted.org/packages/b2/0d/71ceabc14c146ba8ee3804ca7b3d42b1664c8440439de5214d366fec7d3a/yarl-1.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc52310451fc7c629e13c4e061cbe2dd01684d91f2f8ee2821b083c58bd72432", size = 85988, upload-time = "2026-03-01T22:04:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/8c/6c/4a90d59c572e46b270ca132aca66954f1175abd691f74c1ef4c6711828e2/yarl-1.23.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2c6b50c7b0464165472b56b42d4c76a7b864597007d9c085e8b63e185cf4a7a", size = 100566, upload-time = "2026-03-01T22:04:47.639Z" }, + { url = "https://files.pythonhosted.org/packages/49/fb/c438fb5108047e629f6282a371e6e91cf3f97ee087c4fb748a1f32ceef55/yarl-1.23.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:aafe5dcfda86c8af00386d7781d4c2181b5011b7be3f2add5e99899ea925df05", size = 92079, upload-time = "2026-03-01T22:04:48.925Z" }, + { url = "https://files.pythonhosted.org/packages/d9/13/d269aa1aed3e4f50a5a103f96327210cc5fa5dd2d50882778f13c7a14606/yarl-1.23.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ee33b875f0b390564c1fb7bc528abf18c8ee6073b201c6ae8524aca778e2d83", size = 108741, upload-time = "2026-03-01T22:04:50.838Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/115b16f22c37ea4437d323e472945bea97301c8ec6089868fa560abab590/yarl-1.23.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c41e021bc6d7affb3364dc1e1e5fa9582b470f283748784bd6ea0558f87f42c", size = 108099, upload-time = "2026-03-01T22:04:52.499Z" }, + { url = "https://files.pythonhosted.org/packages/9a/64/c53487d9f4968045b8afa51aed7ca44f58b2589e772f32745f3744476c82/yarl-1.23.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99c8a9ed30f4164bc4c14b37a90208836cbf50d4ce2a57c71d0f52c7fb4f7598", size = 102678, upload-time = "2026-03-01T22:04:55.176Z" }, + { url = "https://files.pythonhosted.org/packages/85/59/cd98e556fbb2bf8fab29c1a722f67ad45c5f3447cac798ab85620d1e70af/yarl-1.23.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2af5c81a1f124609d5f33507082fc3f739959d4719b56877ab1ee7e7b3d602b", size = 100803, upload-time = "2026-03-01T22:04:56.588Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c0/b39770b56d4a9f0bb5f77e2f1763cd2d75cc2f6c0131e3b4c360348fcd65/yarl-1.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6b41389c19b07c760c7e427a3462e8ab83c4bb087d127f0e854c706ce1b9215c", size = 100163, upload-time = "2026-03-01T22:04:58.492Z" }, + { url = "https://files.pythonhosted.org/packages/e7/64/6980f99ab00e1f0ff67cb84766c93d595b067eed07439cfccfc8fb28c1a6/yarl-1.23.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1dc702e42d0684f42d6519c8d581e49c96cefaaab16691f03566d30658ee8788", size = 93859, upload-time = "2026-03-01T22:05:00.268Z" }, + { url = "https://files.pythonhosted.org/packages/38/69/912e6c5e146793e5d4b5fe39ff5b00f4d22463dfd5a162bec565ac757673/yarl-1.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0e40111274f340d32ebcc0a5668d54d2b552a6cca84c9475859d364b380e3222", size = 108202, upload-time = "2026-03-01T22:05:02.273Z" }, + { url = "https://files.pythonhosted.org/packages/59/97/35ca6767524687ad64e5f5c31ad54bc76d585585a9fcb40f649e7e82ffed/yarl-1.23.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:4764a6a7588561a9aef92f65bda2c4fb58fe7c675c0883862e6df97559de0bfb", size = 99866, upload-time = "2026-03-01T22:05:03.597Z" }, + { url = "https://files.pythonhosted.org/packages/d3/1c/1a3387ee6d73589f6f2a220ae06f2984f6c20b40c734989b0a44f5987308/yarl-1.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:03214408cfa590df47728b84c679ae4ef00be2428e11630277be0727eba2d7cc", size = 107852, upload-time = "2026-03-01T22:05:04.986Z" }, + { url = "https://files.pythonhosted.org/packages/a4/b8/35c0750fcd5a3f781058bfd954515dd4b1eab45e218cbb85cf11132215f1/yarl-1.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:170e26584b060879e29fac213e4228ef063f39128723807a312e5c7fec28eff2", size = 102919, upload-time = "2026-03-01T22:05:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/e5/1c/9a1979aec4a81896d597bcb2177827f2dbee3f5b7cc48b2d0dadb644b41d/yarl-1.23.0-cp311-cp311-win32.whl", hash = "sha256:51430653db848d258336cfa0244427b17d12db63d42603a55f0d4546f50f25b5", size = 82602, upload-time = "2026-03-01T22:05:08.444Z" }, + { url = "https://files.pythonhosted.org/packages/93/22/b85eca6fa2ad9491af48c973e4c8cf6b103a73dbb271fe3346949449fca0/yarl-1.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf49a3ae946a87083ef3a34c8f677ae4243f5b824bfc4c69672e72b3d6719d46", size = 87461, upload-time = "2026-03-01T22:05:10.145Z" }, + { url = "https://files.pythonhosted.org/packages/93/95/07e3553fe6f113e6864a20bdc53a78113cda3b9ced8784ee52a52c9f80d8/yarl-1.23.0-cp311-cp311-win_arm64.whl", hash = "sha256:b39cb32a6582750b6cc77bfb3c49c0f8760dc18dc96ec9fb55fbb0f04e08b928", size = 82336, upload-time = "2026-03-01T22:05:11.554Z" }, + { url = "https://files.pythonhosted.org/packages/88/8a/94615bc31022f711add374097ad4144d569e95ff3c38d39215d07ac153a0/yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860", size = 124737, upload-time = "2026-03-01T22:05:12.897Z" }, + { url = "https://files.pythonhosted.org/packages/e3/6f/c6554045d59d64052698add01226bc867b52fe4a12373415d7991fdca95d/yarl-1.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:411225bae281f114067578891bc75534cfb3d92a3b4dfef7a6ca78ba354e6069", size = 87029, upload-time = "2026-03-01T22:05:14.376Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/725ecc166d53438bc88f76822ed4b1e3b10756e790bafd7b523fe97c322d/yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25", size = 86310, upload-time = "2026-03-01T22:05:15.71Z" }, + { url = "https://files.pythonhosted.org/packages/99/30/58260ed98e6ff7f90ba84442c1ddd758c9170d70327394a6227b310cd60f/yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8", size = 97587, upload-time = "2026-03-01T22:05:17.384Z" }, + { url = "https://files.pythonhosted.org/packages/76/0a/8b08aac08b50682e65759f7f8dde98ae8168f72487e7357a5d684c581ef9/yarl-1.23.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53ad387048f6f09a8969631e4de3f1bf70c50e93545d64af4f751b2498755072", size = 92528, upload-time = "2026-03-01T22:05:18.804Z" }, + { url = "https://files.pythonhosted.org/packages/52/07/0b7179101fe5f8385ec6c6bb5d0cb9f76bd9fb4a769591ab6fb5cdbfc69a/yarl-1.23.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4a59ba56f340334766f3a4442e0efd0af895fae9e2b204741ef885c446b3a1a8", size = 105339, upload-time = "2026-03-01T22:05:20.235Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8a/36d82869ab5ec829ca8574dfcb92b51286fcfb1e9c7a73659616362dc880/yarl-1.23.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:803a3c3ce4acc62eaf01eaca1208dcf0783025ef27572c3336502b9c232005e7", size = 105061, upload-time = "2026-03-01T22:05:22.268Z" }, + { url = "https://files.pythonhosted.org/packages/66/3e/868e5c3364b6cee19ff3e1a122194fa4ce51def02c61023970442162859e/yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51", size = 100132, upload-time = "2026-03-01T22:05:23.638Z" }, + { url = "https://files.pythonhosted.org/packages/cf/26/9c89acf82f08a52cb52d6d39454f8d18af15f9d386a23795389d1d423823/yarl-1.23.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c75eb09e8d55bceb4367e83496ff8ef2bc7ea6960efb38e978e8073ea59ecb67", size = 99289, upload-time = "2026-03-01T22:05:25.749Z" }, + { url = "https://files.pythonhosted.org/packages/6f/54/5b0db00d2cb056922356104468019c0a132e89c8d3ab67d8ede9f4483d2a/yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7", size = 96950, upload-time = "2026-03-01T22:05:27.318Z" }, + { url = "https://files.pythonhosted.org/packages/f6/40/10fa93811fd439341fad7e0718a86aca0de9548023bbb403668d6555acab/yarl-1.23.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b5405bb8f0e783a988172993cfc627e4d9d00432d6bbac65a923041edacf997d", size = 93960, upload-time = "2026-03-01T22:05:28.738Z" }, + { url = "https://files.pythonhosted.org/packages/bc/d2/8ae2e6cd77d0805f4526e30ec43b6f9a3dfc542d401ac4990d178e4bf0cf/yarl-1.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c3a3598a832590c5a3ce56ab5576361b5688c12cb1d39429cf5dba30b510760", size = 104703, upload-time = "2026-03-01T22:05:30.438Z" }, + { url = "https://files.pythonhosted.org/packages/2f/0c/b3ceacf82c3fe21183ce35fa2acf5320af003d52bc1fcf5915077681142e/yarl-1.23.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8419ebd326430d1cbb7efb5292330a2cf39114e82df5cc3d83c9a0d5ebeaf2f2", size = 98325, upload-time = "2026-03-01T22:05:31.835Z" }, + { url = "https://files.pythonhosted.org/packages/9d/e0/12900edd28bdab91a69bd2554b85ad7b151f64e8b521fe16f9ad2f56477a/yarl-1.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:be61f6fff406ca40e3b1d84716fde398fc08bc63dd96d15f3a14230a0973ed86", size = 105067, upload-time = "2026-03-01T22:05:33.358Z" }, + { url = "https://files.pythonhosted.org/packages/15/61/74bb1182cf79c9bbe4eb6b1f14a57a22d7a0be5e9cedf8e2d5c2086474c3/yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34", size = 100285, upload-time = "2026-03-01T22:05:35.4Z" }, + { url = "https://files.pythonhosted.org/packages/69/7f/cd5ef733f2550de6241bd8bd8c3febc78158b9d75f197d9c7baa113436af/yarl-1.23.0-cp312-cp312-win32.whl", hash = "sha256:fffc45637bcd6538de8b85f51e3df3223e4ad89bccbfca0481c08c7fc8b7ed7d", size = 82359, upload-time = "2026-03-01T22:05:36.811Z" }, + { url = "https://files.pythonhosted.org/packages/f5/be/25216a49daeeb7af2bec0db22d5e7df08ed1d7c9f65d78b14f3b74fd72fc/yarl-1.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:f69f57305656a4852f2a7203efc661d8c042e6cc67f7acd97d8667fb448a426e", size = 87674, upload-time = "2026-03-01T22:05:38.171Z" }, + { url = "https://files.pythonhosted.org/packages/d2/35/aeab955d6c425b227d5b7247eafb24f2653fedc32f95373a001af5dfeb9e/yarl-1.23.0-cp312-cp312-win_arm64.whl", hash = "sha256:6e87a6e8735b44816e7db0b2fbc9686932df473c826b0d9743148432e10bb9b9", size = 81879, upload-time = "2026-03-01T22:05:40.006Z" }, + { url = "https://files.pythonhosted.org/packages/9a/4b/a0a6e5d0ee8a2f3a373ddef8a4097d74ac901ac363eea1440464ccbe0898/yarl-1.23.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:16c6994ac35c3e74fb0ae93323bf8b9c2a9088d55946109489667c510a7d010e", size = 123796, upload-time = "2026-03-01T22:05:41.412Z" }, + { url = "https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a42e651629dafb64fd5b0286a3580613702b5809ad3f24934ea87595804f2c5", size = 86547, upload-time = "2026-03-01T22:05:42.841Z" }, + { url = "https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b", size = 85854, upload-time = "2026-03-01T22:05:44.85Z" }, + { url = "https://files.pythonhosted.org/packages/c4/f4/4e30b250927ffdab4db70da08b9b8d2194d7c7b400167b8fbeca1e4701ca/yarl-1.23.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2569b67d616eab450d262ca7cb9f9e19d2f718c70a8b88712859359d0ab17035", size = 98351, upload-time = "2026-03-01T22:05:46.836Z" }, + { url = "https://files.pythonhosted.org/packages/86/fc/4118c5671ea948208bdb1492d8b76bdf1453d3e73df051f939f563e7dcc5/yarl-1.23.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e9d9a4d06d3481eab79803beb4d9bd6f6a8e781ec078ac70d7ef2dcc29d1bea5", size = 92711, upload-time = "2026-03-01T22:05:48.316Z" }, + { url = "https://files.pythonhosted.org/packages/56/11/1ed91d42bd9e73c13dc9e7eb0dd92298d75e7ac4dd7f046ad0c472e231cd/yarl-1.23.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f514f6474e04179d3d33175ed3f3e31434d3130d42ec153540d5b157deefd735", size = 106014, upload-time = "2026-03-01T22:05:50.028Z" }, + { url = "https://files.pythonhosted.org/packages/ce/c9/74e44e056a23fbc33aca71779ef450ca648a5bc472bdad7a82339918f818/yarl-1.23.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fda207c815b253e34f7e1909840fd14299567b1c0eb4908f8c2ce01a41265401", size = 105557, upload-time = "2026-03-01T22:05:51.416Z" }, + { url = "https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4", size = 101559, upload-time = "2026-03-01T22:05:52.872Z" }, + { url = "https://files.pythonhosted.org/packages/72/59/c5b8d94b14e3d3c2a9c20cb100119fd534ab5a14b93673ab4cc4a4141ea5/yarl-1.23.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7504f2b476d21653e4d143f44a175f7f751cd41233525312696c76aa3dbb23f", size = 100502, upload-time = "2026-03-01T22:05:54.954Z" }, + { url = "https://files.pythonhosted.org/packages/77/4f/96976cb54cbfc5c9fd73ed4c51804f92f209481d1fb190981c0f8a07a1d7/yarl-1.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:578110dd426f0d209d1509244e6d4a3f1a3e9077655d98c5f22583d63252a08a", size = 98027, upload-time = "2026-03-01T22:05:56.409Z" }, + { url = "https://files.pythonhosted.org/packages/63/6e/904c4f476471afdbad6b7e5b70362fb5810e35cd7466529a97322b6f5556/yarl-1.23.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:609d3614d78d74ebe35f54953c5bbd2ac647a7ddb9c30a5d877580f5e86b22f2", size = 95369, upload-time = "2026-03-01T22:05:58.141Z" }, + { url = "https://files.pythonhosted.org/packages/9d/40/acfcdb3b5f9d68ef499e39e04d25e141fe90661f9d54114556cf83be8353/yarl-1.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4966242ec68afc74c122f8459abd597afd7d8a60dc93d695c1334c5fd25f762f", size = 105565, upload-time = "2026-03-01T22:06:00.286Z" }, + { url = "https://files.pythonhosted.org/packages/5e/c6/31e28f3a6ba2869c43d124f37ea5260cac9c9281df803c354b31f4dd1f3c/yarl-1.23.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e0fd068364a6759bc794459f0a735ab151d11304346332489c7972bacbe9e72b", size = 99813, upload-time = "2026-03-01T22:06:01.712Z" }, + { url = "https://files.pythonhosted.org/packages/08/1f/6f65f59e72d54aa467119b63fc0b0b1762eff0232db1f4720cd89e2f4a17/yarl-1.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:39004f0ad156da43e86aa71f44e033de68a44e5a31fc53507b36dd253970054a", size = 105632, upload-time = "2026-03-01T22:06:03.188Z" }, + { url = "https://files.pythonhosted.org/packages/a3/c4/18b178a69935f9e7a338127d5b77d868fdc0f0e49becd286d51b3a18c61d/yarl-1.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e5723c01a56c5028c807c701aa66722916d2747ad737a046853f6c46f4875543", size = 101895, upload-time = "2026-03-01T22:06:04.651Z" }, + { url = "https://files.pythonhosted.org/packages/8f/54/f5b870b5505663911dba950a8e4776a0dbd51c9c54c0ae88e823e4b874a0/yarl-1.23.0-cp313-cp313-win32.whl", hash = "sha256:1b6b572edd95b4fa8df75de10b04bc81acc87c1c7d16bcdd2035b09d30acc957", size = 82356, upload-time = "2026-03-01T22:06:06.04Z" }, + { url = "https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:baaf55442359053c7d62f6f8413a62adba3205119bcb6f49594894d8be47e5e3", size = 87515, upload-time = "2026-03-01T22:06:08.107Z" }, + { url = "https://files.pythonhosted.org/packages/00/fd/7e1c66efad35e1649114fa13f17485f62881ad58edeeb7f49f8c5e748bf9/yarl-1.23.0-cp313-cp313-win_arm64.whl", hash = "sha256:fb4948814a2a98e3912505f09c9e7493b1506226afb1f881825368d6fb776ee3", size = 81785, upload-time = "2026-03-01T22:06:10.181Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fc/119dd07004f17ea43bb91e3ece6587759edd7519d6b086d16bfbd3319982/yarl-1.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:aecfed0b41aa72b7881712c65cf764e39ce2ec352324f5e0837c7048d9e6daaa", size = 130719, upload-time = "2026-03-01T22:06:11.708Z" }, + { url = "https://files.pythonhosted.org/packages/e6/0d/9f2348502fbb3af409e8f47730282cd6bc80dec6630c1e06374d882d6eb2/yarl-1.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a41bcf68efd19073376eb8cf948b8d9be0af26256403e512bb18f3966f1f9120", size = 89690, upload-time = "2026-03-01T22:06:13.429Z" }, + { url = "https://files.pythonhosted.org/packages/50/93/e88f3c80971b42cfc83f50a51b9d165a1dbf154b97005f2994a79f212a07/yarl-1.23.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cde9a2ecd91668bcb7f077c4966d8ceddb60af01b52e6e3e2680e4cf00ad1a59", size = 89851, upload-time = "2026-03-01T22:06:15.53Z" }, + { url = "https://files.pythonhosted.org/packages/1c/07/61c9dd8ba8f86473263b4036f70fb594c09e99c0d9737a799dfd8bc85651/yarl-1.23.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5023346c4ee7992febc0068e7593de5fa2bf611848c08404b35ebbb76b1b0512", size = 95874, upload-time = "2026-03-01T22:06:17.553Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e9/f9ff8ceefba599eac6abddcfb0b3bee9b9e636e96dbf54342a8577252379/yarl-1.23.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1009abedb49ae95b136a8904a3f71b342f849ffeced2d3747bf29caeda218c4", size = 88710, upload-time = "2026-03-01T22:06:19.004Z" }, + { url = "https://files.pythonhosted.org/packages/eb/78/0231bfcc5d4c8eec220bc2f9ef82cb4566192ea867a7c5b4148f44f6cbcd/yarl-1.23.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a8d00f29b42f534cc8aa3931cfe773b13b23e561e10d2b26f27a8d309b0e82a1", size = 101033, upload-time = "2026-03-01T22:06:21.203Z" }, + { url = "https://files.pythonhosted.org/packages/cd/9b/30ea5239a61786f18fd25797151a17fbb3be176977187a48d541b5447dd4/yarl-1.23.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:95451e6ce06c3e104556d73b559f5da6c34a069b6b62946d3ad66afcd51642ea", size = 100817, upload-time = "2026-03-01T22:06:22.738Z" }, + { url = "https://files.pythonhosted.org/packages/62/e2/a4980481071791bc83bce2b7a1a1f7adcabfa366007518b4b845e92eeee3/yarl-1.23.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531ef597132086b6cf96faa7c6c1dcd0361dd5f1694e5cc30375907b9b7d3ea9", size = 97482, upload-time = "2026-03-01T22:06:24.21Z" }, + { url = "https://files.pythonhosted.org/packages/e5/1e/304a00cf5f6100414c4b5a01fc7ff9ee724b62158a08df2f8170dfc72a2d/yarl-1.23.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88f9fb0116fbfcefcab70f85cf4b74a2b6ce5d199c41345296f49d974ddb4123", size = 95949, upload-time = "2026-03-01T22:06:25.697Z" }, + { url = "https://files.pythonhosted.org/packages/68/03/093f4055ed4cae649ac53bca3d180bd37102e9e11d048588e9ab0c0108d0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e7b0460976dc75cb87ad9cc1f9899a4b97751e7d4e77ab840fc9b6d377b8fd24", size = 95839, upload-time = "2026-03-01T22:06:27.309Z" }, + { url = "https://files.pythonhosted.org/packages/b9/28/4c75ebb108f322aa8f917ae10a8ffa4f07cae10a8a627b64e578617df6a0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:115136c4a426f9da976187d238e84139ff6b51a20839aa6e3720cd1026d768de", size = 90696, upload-time = "2026-03-01T22:06:29.048Z" }, + { url = "https://files.pythonhosted.org/packages/23/9c/42c2e2dd91c1a570402f51bdf066bfdb1241c2240ba001967bad778e77b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ead11956716a940c1abc816b7df3fa2b84d06eaed8832ca32f5c5e058c65506b", size = 100865, upload-time = "2026-03-01T22:06:30.525Z" }, + { url = "https://files.pythonhosted.org/packages/74/05/1bcd60a8a0a914d462c305137246b6f9d167628d73568505fce3f1cb2e65/yarl-1.23.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:fe8f8f5e70e6dbdfca9882cd9deaac058729bcf323cf7a58660901e55c9c94f6", size = 96234, upload-time = "2026-03-01T22:06:32.692Z" }, + { url = "https://files.pythonhosted.org/packages/90/b2/f52381aac396d6778ce516b7bc149c79e65bfc068b5de2857ab69eeea3b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a0e317df055958a0c1e79e5d2aa5a5eaa4a6d05a20d4b0c9c3f48918139c9fc6", size = 100295, upload-time = "2026-03-01T22:06:34.268Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/638bae5bbf1113a659b2435d8895474598afe38b4a837103764f603aba56/yarl-1.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f0fd84de0c957b2d280143522c4f91a73aada1923caee763e24a2b3fda9f8a5", size = 97784, upload-time = "2026-03-01T22:06:35.864Z" }, + { url = "https://files.pythonhosted.org/packages/80/25/a3892b46182c586c202629fc2159aa13975d3741d52ebd7347fd501d48d5/yarl-1.23.0-cp313-cp313t-win32.whl", hash = "sha256:93a784271881035ab4406a172edb0faecb6e7d00f4b53dc2f55919d6c9688595", size = 88313, upload-time = "2026-03-01T22:06:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/43/68/8c5b36aa5178900b37387937bc2c2fe0e9505537f713495472dcf6f6fccc/yarl-1.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dd00607bffbf30250fe108065f07453ec124dbf223420f57f5e749b04295e090", size = 94932, upload-time = "2026-03-01T22:06:39.579Z" }, + { url = "https://files.pythonhosted.org/packages/c6/cc/d79ba8292f51f81f4dc533a8ccfb9fc6992cabf0998ed3245de7589dc07c/yarl-1.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ac09d42f48f80c9ee1635b2fcaa819496a44502737660d3c0f2ade7526d29144", size = 84786, upload-time = "2026-03-01T22:06:41.988Z" }, + { url = "https://files.pythonhosted.org/packages/90/98/b85a038d65d1b92c3903ab89444f48d3cee490a883477b716d7a24b1a78c/yarl-1.23.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:21d1b7305a71a15b4794b5ff22e8eef96ff4a6d7f9657155e5aa419444b28912", size = 124455, upload-time = "2026-03-01T22:06:43.615Z" }, + { url = "https://files.pythonhosted.org/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85610b4f27f69984932a7abbe52703688de3724d9f72bceb1cca667deff27474", size = 86752, upload-time = "2026-03-01T22:06:45.425Z" }, + { url = "https://files.pythonhosted.org/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23f371bd662cf44a7630d4d113101eafc0cfa7518a2760d20760b26021454719", size = 86291, upload-time = "2026-03-01T22:06:46.974Z" }, + { url = "https://files.pythonhosted.org/packages/ea/d8/d1cb2378c81dd729e98c716582b1ccb08357e8488e4c24714658cc6630e8/yarl-1.23.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a80f77dc1acaaa61f0934176fccca7096d9b1ff08c8ba9cddf5ae034a24319", size = 99026, upload-time = "2026-03-01T22:06:48.459Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ff/7196790538f31debe3341283b5b0707e7feb947620fc5e8236ef28d44f72/yarl-1.23.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bd654fad46d8d9e823afbb4f87c79160b5a374ed1ff5bde24e542e6ba8f41434", size = 92355, upload-time = "2026-03-01T22:06:50.306Z" }, + { url = "https://files.pythonhosted.org/packages/c1/56/25d58c3eddde825890a5fe6aa1866228377354a3c39262235234ab5f616b/yarl-1.23.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:682bae25f0a0dd23a056739f23a134db9f52a63e2afd6bfb37ddc76292bbd723", size = 106417, upload-time = "2026-03-01T22:06:52.1Z" }, + { url = "https://files.pythonhosted.org/packages/51/8a/882c0e7bc8277eb895b31bce0138f51a1ba551fc2e1ec6753ffc1e7c1377/yarl-1.23.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a82836cab5f197a0514235aaf7ffccdc886ccdaa2324bc0aafdd4ae898103039", size = 106422, upload-time = "2026-03-01T22:06:54.424Z" }, + { url = "https://files.pythonhosted.org/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c57676bdedc94cd3bc37724cf6f8cd2779f02f6aba48de45feca073e714fe52", size = 101915, upload-time = "2026-03-01T22:06:55.895Z" }, + { url = "https://files.pythonhosted.org/packages/18/6a/530e16aebce27c5937920f3431c628a29a4b6b430fab3fd1c117b26ff3f6/yarl-1.23.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7f8dc16c498ff06497c015642333219871effba93e4a2e8604a06264aca5c5c", size = 100690, upload-time = "2026-03-01T22:06:58.21Z" }, + { url = "https://files.pythonhosted.org/packages/88/08/93749219179a45e27b036e03260fda05190b911de8e18225c294ac95bbc9/yarl-1.23.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5ee586fb17ff8f90c91cf73c6108a434b02d69925f44f5f8e0d7f2f260607eae", size = 98750, upload-time = "2026-03-01T22:06:59.794Z" }, + { url = "https://files.pythonhosted.org/packages/d9/cf/ea424a004969f5d81a362110a6ac1496d79efdc6d50c2c4b2e3ea0fc2519/yarl-1.23.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:17235362f580149742739cc3828b80e24029d08cbb9c4bda0242c7b5bc610a8e", size = 94685, upload-time = "2026-03-01T22:07:01.375Z" }, + { url = "https://files.pythonhosted.org/packages/e2/b7/14341481fe568e2b0408bcf1484c652accafe06a0ade9387b5d3fd9df446/yarl-1.23.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0793e2bd0cf14234983bbb371591e6bea9e876ddf6896cdcc93450996b0b5c85", size = 106009, upload-time = "2026-03-01T22:07:03.151Z" }, + { url = "https://files.pythonhosted.org/packages/0a/e6/5c744a9b54f4e8007ad35bce96fbc9218338e84812d36f3390cea616881a/yarl-1.23.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3650dc2480f94f7116c364096bc84b1d602f44224ef7d5c7208425915c0475dd", size = 100033, upload-time = "2026-03-01T22:07:04.701Z" }, + { url = "https://files.pythonhosted.org/packages/0c/23/e3bfc188d0b400f025bc49d99793d02c9abe15752138dcc27e4eaf0c4a9e/yarl-1.23.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f40e782d49630ad384db66d4d8b73ff4f1b8955dc12e26b09a3e3af064b3b9d6", size = 106483, upload-time = "2026-03-01T22:07:06.231Z" }, + { url = "https://files.pythonhosted.org/packages/72/42/f0505f949a90b3f8b7a363d6cbdf398f6e6c58946d85c6d3a3bc70595b26/yarl-1.23.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94f8575fbdf81749008d980c17796097e645574a3b8c28ee313931068dad14fe", size = 102175, upload-time = "2026-03-01T22:07:08.4Z" }, + { url = "https://files.pythonhosted.org/packages/aa/65/b39290f1d892a9dd671d1c722014ca062a9c35d60885d57e5375db0404b5/yarl-1.23.0-cp314-cp314-win32.whl", hash = "sha256:c8aa34a5c864db1087d911a0b902d60d203ea3607d91f615acd3f3108ac32169", size = 83871, upload-time = "2026-03-01T22:07:09.968Z" }, + { url = "https://files.pythonhosted.org/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl", hash = "sha256:63e92247f383c85ab00dd0091e8c3fa331a96e865459f5ee80353c70a4a42d70", size = 89093, upload-time = "2026-03-01T22:07:11.501Z" }, + { url = "https://files.pythonhosted.org/packages/e0/7d/8a84dc9381fd4412d5e7ff04926f9865f6372b4c2fd91e10092e65d29eb8/yarl-1.23.0-cp314-cp314-win_arm64.whl", hash = "sha256:70efd20be968c76ece7baa8dafe04c5be06abc57f754d6f36f3741f7aa7a208e", size = 83384, upload-time = "2026-03-01T22:07:13.069Z" }, + { url = "https://files.pythonhosted.org/packages/dd/8d/d2fad34b1c08aa161b74394183daa7d800141aaaee207317e82c790b418d/yarl-1.23.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9a18d6f9359e45722c064c97464ec883eb0e0366d33eda61cb19a244bf222679", size = 131019, upload-time = "2026-03-01T22:07:14.903Z" }, + { url = "https://files.pythonhosted.org/packages/19/ff/33009a39d3ccf4b94d7d7880dfe17fb5816c5a4fe0096d9b56abceea9ac7/yarl-1.23.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2803ed8b21ca47a43da80a6fd1ed3019d30061f7061daa35ac54f63933409412", size = 89894, upload-time = "2026-03-01T22:07:17.372Z" }, + { url = "https://files.pythonhosted.org/packages/0c/f1/dab7ac5e7306fb79c0190766a3c00b4cb8d09a1f390ded68c85a5934faf5/yarl-1.23.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:394906945aa8b19fc14a61cf69743a868bb8c465efe85eee687109cc540b98f4", size = 89979, upload-time = "2026-03-01T22:07:19.361Z" }, + { url = "https://files.pythonhosted.org/packages/aa/b1/08e95f3caee1fad6e65017b9f26c1d79877b502622d60e517de01e72f95d/yarl-1.23.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71d006bee8397a4a89f469b8deb22469fe7508132d3c17fa6ed871e79832691c", size = 95943, upload-time = "2026-03-01T22:07:21.266Z" }, + { url = "https://files.pythonhosted.org/packages/c0/cc/6409f9018864a6aa186c61175b977131f373f1988e198e031236916e87e4/yarl-1.23.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:62694e275c93d54f7ccedcfef57d42761b2aad5234b6be1f3e3026cae4001cd4", size = 88786, upload-time = "2026-03-01T22:07:23.129Z" }, + { url = "https://files.pythonhosted.org/packages/76/40/cc22d1d7714b717fde2006fad2ced5efe5580606cb059ae42117542122f3/yarl-1.23.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31de1613658308efdb21ada98cbc86a97c181aa050ba22a808120bb5be3ab94", size = 101307, upload-time = "2026-03-01T22:07:24.689Z" }, + { url = "https://files.pythonhosted.org/packages/8f/0d/476c38e85ddb4c6ec6b20b815bdd779aa386a013f3d8b85516feee55c8dc/yarl-1.23.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb1e8b8d66c278b21d13b0a7ca22c41dd757a7c209c6b12c313e445c31dd3b28", size = 100904, upload-time = "2026-03-01T22:07:26.287Z" }, + { url = "https://files.pythonhosted.org/packages/72/32/0abe4a76d59adf2081dcb0397168553ece4616ada1c54d1c49d8936c74f8/yarl-1.23.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50f9d8d531dfb767c565f348f33dd5139a6c43f5cbdf3f67da40d54241df93f6", size = 97728, upload-time = "2026-03-01T22:07:27.906Z" }, + { url = "https://files.pythonhosted.org/packages/b7/35/7b30f4810fba112f60f5a43237545867504e15b1c7647a785fbaf588fac2/yarl-1.23.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575aa4405a656e61a540f4a80eaa5260f2a38fff7bfdc4b5f611840d76e9e277", size = 95964, upload-time = "2026-03-01T22:07:30.198Z" }, + { url = "https://files.pythonhosted.org/packages/2d/86/ed7a73ab85ef00e8bb70b0cb5421d8a2a625b81a333941a469a6f4022828/yarl-1.23.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:041b1a4cefacf65840b4e295c6985f334ba83c30607441ae3cf206a0eed1a2e4", size = 95882, upload-time = "2026-03-01T22:07:32.132Z" }, + { url = "https://files.pythonhosted.org/packages/19/90/d56967f61a29d8498efb7afb651e0b2b422a1e9b47b0ab5f4e40a19b699b/yarl-1.23.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d38c1e8231722c4ce40d7593f28d92b5fc72f3e9774fe73d7e800ec32299f63a", size = 90797, upload-time = "2026-03-01T22:07:34.404Z" }, + { url = "https://files.pythonhosted.org/packages/72/00/8b8f76909259f56647adb1011d7ed8b321bcf97e464515c65016a47ecdf0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:d53834e23c015ee83a99377db6e5e37d8484f333edb03bd15b4bc312cc7254fb", size = 101023, upload-time = "2026-03-01T22:07:35.953Z" }, + { url = "https://files.pythonhosted.org/packages/ac/e2/cab11b126fb7d440281b7df8e9ddbe4851e70a4dde47a202b6642586b8d9/yarl-1.23.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2e27c8841126e017dd2a054a95771569e6070b9ee1b133366d8b31beb5018a41", size = 96227, upload-time = "2026-03-01T22:07:37.594Z" }, + { url = "https://files.pythonhosted.org/packages/c2/9b/2c893e16bfc50e6b2edf76c1a9eb6cb0c744346197e74c65e99ad8d634d0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:76855800ac56f878847a09ce6dba727c93ca2d89c9e9d63002d26b916810b0a2", size = 100302, upload-time = "2026-03-01T22:07:39.334Z" }, + { url = "https://files.pythonhosted.org/packages/28/ec/5498c4e3a6d5f1003beb23405671c2eb9cdbf3067d1c80f15eeafe301010/yarl-1.23.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e09fd068c2e169a7070d83d3bde728a4d48de0549f975290be3c108c02e499b4", size = 98202, upload-time = "2026-03-01T22:07:41.717Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c3/cd737e2d45e70717907f83e146f6949f20cc23cd4bf7b2688727763aa458/yarl-1.23.0-cp314-cp314t-win32.whl", hash = "sha256:73309162a6a571d4cbd3b6a1dcc703c7311843ae0d1578df6f09be4e98df38d4", size = 90558, upload-time = "2026-03-01T22:07:43.433Z" }, + { url = "https://files.pythonhosted.org/packages/e1/19/3774d162f6732d1cfb0b47b4140a942a35ca82bb19b6db1f80e9e7bdc8f8/yarl-1.23.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4503053d296bc6e4cbd1fad61cf3b6e33b939886c4f249ba7c78b602214fabe2", size = 97610, upload-time = "2026-03-01T22:07:45.773Z" }, + { url = "https://files.pythonhosted.org/packages/51/47/3fa2286c3cb162c71cdb34c4224d5745a1ceceb391b2bd9b19b668a8d724/yarl-1.23.0-cp314-cp314t-win_arm64.whl", hash = "sha256:44bb7bef4ea409384e3f8bc36c063d77ea1b8d4a5b2706956c0d6695f07dcc25", size = 86041, upload-time = "2026-03-01T22:07:49.026Z" }, + { url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" }, ] [[package]] name = "zipp" version = "3.23.0" source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } -sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", upload-time = "2025-06-08T17:06:39.4Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } wheels = [ - { url = "https://pypi-proxy.dev.databricks.com/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", upload-time = "2025-06-08T17:06:38.034Z" }, + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, ] From f13ff631c43636573b8dce8de5eeac0991af2675 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Fri, 19 Jun 2026 12:16:05 +0200 Subject: [PATCH 05/54] fix(workflow): interactive build never persisted last_build to registry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _BuildPipeline._complete_task() — the single success exit shared by both the UI Build button (build_kind=session) and the REST endpoint (build_kind=api) — never called write_version() after completing a build. Only the scheduled-build path (scheduler._persist_domain_metadata) wrote the domain_versions.last_build column. ReviewService.submit() reads that column; the Consistency-checks panel reads live triple-store state — so both indicators on the Validation page disagreed and Submit for Review remained permanently blocked. Fix: add _persist_last_build_to_registry() called from _complete_task() after _record_build_run(). Best-effort (exceptions are logged, never propagated). Also stamps last_build when empty for the API build path. Backport of the same fix applied to fix/v0.5.1. --- .../v0.6.0/benoitcayladbx_2026-06-19.log | 38 ++++++ .../objects/digitaltwin/_build_pipeline.py | 63 +++++++++ .../digitaltwin/test_build_pipeline_units.py | 129 +++++++++++++++++- 3 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 changelogs/v0.6.0/benoitcayladbx_2026-06-19.log diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log new file mode 100644 index 00000000..b0d63e73 --- /dev/null +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log @@ -0,0 +1,38 @@ +## Fix: Interactive Build Does Not Persist last_build to Registry + +### Context +Bug report: on the Validation page, "Submit for Review" was blocked with +"This version has never been built. Run a Digital Twin build first." even +after a successful interactive Digital Twin build. + +Root cause: `_BuildPipeline._complete_task()` (the shared completion path +for both interactive UI and external REST builds) never called +`store.write_version()` to flush `domain.last_build` to the +`domain_versions.last_build` DB column. Only the scheduled-build path +(`scheduler._persist_domain_metadata`) wrote that column. The +`ReviewService.submit()` gate reads the column; the Consistency-checks +panel reads live triple-store state — hence the two indicators disagreed. + +Backport of the fix originally applied to fix/v0.5.1. + +### Changes + +1. `src/back/objects/digitaltwin/_build_pipeline.py` + - Added `_BuildPipeline._persist_last_build_to_registry()`: best-effort + method that resolves folder/version (same logic as `_record_build_run`), + stamps `domain.last_build` when empty (API build path), and calls + `RegistryService.from_context()._store.write_version()`. + - `_complete_task()` now calls `_persist_last_build_to_registry()` after + `_record_build_run()`, covering both `build_kind="session"` (interactive + UI) and `build_kind="api"` (external REST). + +2. `tests/back/core/digitaltwin/test_build_pipeline_units.py` + - Added import for `patch` and `RegistryService`. + - Added `TestPersistLastBuildToRegistry` (6 tests). + +### Modified files +- src/back/objects/digitaltwin/_build_pipeline.py +- tests/back/core/digitaltwin/test_build_pipeline_units.py + +### Test results +22/22 passed in test_build_pipeline_units.py. diff --git a/src/back/objects/digitaltwin/_build_pipeline.py b/src/back/objects/digitaltwin/_build_pipeline.py index 3cd09763..8312a0e7 100644 --- a/src/back/objects/digitaltwin/_build_pipeline.py +++ b/src/back/objects/digitaltwin/_build_pipeline.py @@ -1257,6 +1257,68 @@ def _record_build_run( exc, ) + def _persist_last_build_to_registry(self) -> None: + """Write last_build to the registry domain_versions row. + + The session/UI build path stamps domain.last_build before the build + thread starts; the API path does not. In both cases the timestamp + must reach the DB column so ReviewService.submit() can unblock the + Submit-for-Review gate. Best-effort: a failure is logged but never + propagates. + """ + try: + from back.objects.registry.RegistryService import RegistryService + from back.objects.session import sanitize_domain_folder + + folder = getattr(self.domain, "uc_domain_folder", "") or ( + sanitize_domain_folder(self.domain_name) + ) + version = ( + getattr(self.domain_snap, "current_version", None) + or getattr(self.domain, "current_version", None) + or "" + ) + if not folder or not version: + logger.warning( + "[DT-BUILD %s] _persist_last_build_to_registry: " + "cannot resolve folder=%r version=%r — skipping", + self.task_id, + folder, + version, + ) + return + + # API build path never stamps last_build before starting; do it now. + if not getattr(self.domain, "last_build", None): + self.domain.last_build = datetime.now(timezone.utc).isoformat() + + svc = RegistryService.from_context(self.domain, self.settings) + domain_data = self.domain.export_for_save() + w_ok, w_msg = svc._store.write_version(folder, version, domain_data) + if w_ok: + logger.info( + "[DT-BUILD %s] persisted last_build=%s to registry " + "(folder=%s version=%s)", + self.task_id, + self.domain.last_build, + folder, + version, + ) + else: + logger.error( + "[DT-BUILD %s] write_version failed when persisting " + "last_build: %s", + self.task_id, + w_msg, + ) + except Exception as exc: # noqa: BLE001 + logger.warning( + "[DT-BUILD %s] could not persist last_build to registry " + "(non-fatal — Submit for Review gate may remain blocked): %s", + self.task_id, + exc, + ) + def _complete_task(self) -> None: duration = time.time() - self.start_time logger.info( @@ -1284,6 +1346,7 @@ def _complete_task(self) -> None: msg = f"Full rebuild: {self.triple_count} triples in {duration:.1f}s" self.tm.complete_task(self.task_id, result=result_data, message=msg) self._record_build_run("success", message=msg) + self._persist_last_build_to_registry() def _fail_unexpected(self, exc: Exception) -> None: duration = time.time() - self.start_time diff --git a/tests/back/core/digitaltwin/test_build_pipeline_units.py b/tests/back/core/digitaltwin/test_build_pipeline_units.py index d0e9faec..e5f6c7f2 100644 --- a/tests/back/core/digitaltwin/test_build_pipeline_units.py +++ b/tests/back/core/digitaltwin/test_build_pipeline_units.py @@ -10,6 +10,8 @@ - `__init__` derived state (`is_api`, `domain_name`, `parts`, `phase_times` initialization, lazy-state defaults). - `_log_phase` — records elapsed time on `self.phase_times` and logs. +- `_persist_last_build_to_registry` — registry write after a successful + build so the Submit-for-Review gate is unblocked. Behaviour-rich phases (the various ``_apply_*`` and ``_*_progress`` methods) are exercised end-to-end in higher tiers. @@ -20,11 +22,12 @@ import time from types import SimpleNamespace from typing import Any -from unittest.mock import MagicMock +from unittest.mock import MagicMock, patch import pytest from back.objects.digitaltwin._build_pipeline import _BuildPipeline +from back.objects.registry.RegistryService import RegistryService def _make_pipeline(**overrides: Any) -> _BuildPipeline: @@ -175,3 +178,127 @@ def test_same_phase_overwrites(self) -> None: pipe._log_phase("apply", now - 0.1) second = pipe.phase_times["apply"] assert second < first # The retry was faster than the first attempt. + + +# --- _persist_last_build_to_registry ------------------------------------ + + +def _make_domain( + *, + last_build: str = "2026-06-19T09:00:00+00:00", + current_version: str = "1", + uc_domain_folder: str = "supplychain", + name: str = "supplychain", +) -> SimpleNamespace: + """Create a minimal domain stand-in for persist tests.""" + return SimpleNamespace( + info={"name": name}, + last_build=last_build, + current_version=current_version, + uc_domain_folder=uc_domain_folder, + export_for_save=lambda: {"info": {"last_build": last_build}}, + ) + + +def _make_registry_svc(write_ok: bool = True, write_msg: str = "") -> MagicMock: + """Return a mock RegistryService whose _store.write_version returns (write_ok, write_msg).""" + svc = MagicMock() + svc._store.write_version.return_value = (write_ok, write_msg) + return svc + + +@pytest.mark.unit +class TestPersistLastBuildToRegistry: + """_persist_last_build_to_registry writes domain.last_build to the registry DB.""" + + def _make_pipe(self, domain=None, **overrides): + dom = domain or _make_domain() + snap = MagicMock() + snap.current_version = dom.current_version + return _make_pipeline(domain=dom, domain_snap=snap, **overrides) + + def test_calls_write_version_on_success(self) -> None: + """Happy path: write_version is called once with folder + version.""" + pipe = self._make_pipe() + svc = _make_registry_svc() + + with patch.object(RegistryService, "from_context", return_value=svc): + pipe._persist_last_build_to_registry() + + svc._store.write_version.assert_called_once() + call_args = svc._store.write_version.call_args + folder, version, _ = call_args.args + assert folder == "supplychain" + assert version == "1" + + def test_domain_data_includes_last_build(self) -> None: + """The domain_data passed to write_version carries last_build.""" + pipe = self._make_pipe() + svc = _make_registry_svc() + + with patch.object(RegistryService, "from_context", return_value=svc): + pipe._persist_last_build_to_registry() + + _, _, domain_data = svc._store.write_version.call_args.args + assert domain_data["info"]["last_build"] == "2026-06-19T09:00:00+00:00" + + def test_api_build_stamps_last_build_when_empty(self) -> None: + """API build path: domain.last_build is empty before the build; the method + stamps it so the registry write carries a non-empty timestamp.""" + dom = _make_domain(last_build="") + snap = MagicMock() + snap.current_version = dom.current_version + # export_for_save must reflect the updated last_build after stamping. + def _export(): + return {"info": {"last_build": dom.last_build}} + dom.export_for_save = _export + + pipe = _make_pipeline(domain=dom, domain_snap=snap, build_kind="api") + svc = _make_registry_svc() + + with patch.object(RegistryService, "from_context", return_value=svc): + pipe._persist_last_build_to_registry() + + assert dom.last_build # was stamped + _, _, domain_data = svc._store.write_version.call_args.args + assert domain_data["info"]["last_build"] + + def test_skips_when_folder_cannot_be_resolved(self) -> None: + """No folder available → method returns early without calling write_version.""" + snap = MagicMock() + snap.current_version = "" + pipe = _make_pipeline(domain=SimpleNamespace( + info={}, # name not set → sanitize_domain_folder returns "" + last_build="ts", + current_version="", + uc_domain_folder="", + export_for_save=lambda: {}, + ), domain_snap=snap) + svc = _make_registry_svc() + + with ( + patch.object(RegistryService, "from_context", return_value=svc), + patch("back.objects.session.sanitize_domain_folder", return_value=""), + ): + pipe._persist_last_build_to_registry() + + svc._store.write_version.assert_not_called() + + def test_handles_write_version_failure_gracefully(self) -> None: + """write_version returning (False, msg) is logged but does not raise.""" + pipe = self._make_pipe() + svc = _make_registry_svc(write_ok=False, write_msg="DB error") + + with patch.object(RegistryService, "from_context", return_value=svc): + pipe._persist_last_build_to_registry() # must not raise + + svc._store.write_version.assert_called_once() + + def test_handles_registry_service_exception_gracefully(self) -> None: + """An exception from RegistryService.from_context must not propagate.""" + pipe = self._make_pipe() + + with patch.object( + RegistryService, "from_context", side_effect=RuntimeError("connection refused") + ): + pipe._persist_last_build_to_registry() # must not raise From 79d8d2b33649d23c8420ebcdfbd729a4816bfd2a Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Fri, 19 Jun 2026 12:21:55 +0200 Subject: [PATCH 06/54] fix(workflow): interactive build never persisted last_build to registry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _BuildPipeline._complete_task() — the single success exit shared by both the UI Build button (build_kind=session) and the REST endpoint (build_kind=api) — never called write_version() after completing a build. Only the scheduled-build path (scheduler._persist_domain_metadata) wrote the domain_versions.last_build column. ReviewService.submit() reads that column; the Consistency-checks panel reads live triple-store state — so both indicators on the Validation page disagreed and Submit for Review remained permanently blocked. Fix: add _persist_last_build_to_registry() called from _complete_task() after _record_build_run(). Best-effort (exceptions are logged, never propagated). Also stamps last_build when empty for the API build path. Backport of the same fix applied to fix/v0.5.1 and develop. --- .../v0.6.0/benoitcayladbx_2026-06-19.log | 28 ++++ .../objects/digitaltwin/_build_pipeline.py | 63 +++++++++ .../digitaltwin/test_build_pipeline_units.py | 129 +++++++++++++++++- 3 files changed, 219 insertions(+), 1 deletion(-) diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log index 1ab9889a..de98dd07 100644 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log @@ -139,3 +139,31 @@ tests/units/mapping/test_mapping_service.py` → 63 passed. Full `pytest tests/units` → 2408 passed, 15 skipped, 4 failed; the 4 failures are the `TestLakebaseCollab` cases that need the optional `psycopg` extra (not installed in this env) — unrelated to this change. + +--- + +## Fix: Interactive Build Does Not Persist last_build to Registry + +**Context:** Backport from `fix/v0.5.1` / `develop`. On the Validation page, +"Submit for Review" was blocked with "This version has never been built." even +after a successful interactive Digital Twin build. Root cause: the shared build +completion path (`_BuildPipeline._complete_task`) never called `write_version()` +to flush `domain.last_build` to the `domain_versions.last_build` DB column. +Only the scheduled-build path did. The Submit gate reads that column; the +Consistency-checks panel reads live triple-store state — so both indicators +disagreed. + +**Changes:** +1. `src/back/objects/digitaltwin/_build_pipeline.py` — added + `_persist_last_build_to_registry()` (best-effort registry write); called + from `_complete_task()` after `_record_build_run()`, covering both + `build_kind="session"` (UI) and `build_kind="api"` (REST). +2. `tests/back/core/digitaltwin/test_build_pipeline_units.py` — added + `TestPersistLastBuildToRegistry` (6 regression tests). + +**Modified files:** +- `src/back/objects/digitaltwin/_build_pipeline.py` +- `tests/back/core/digitaltwin/test_build_pipeline_units.py` + +**Test result:** `pytest tests/back/core/digitaltwin/test_build_pipeline_units.py` +→ 22 passed. diff --git a/src/back/objects/digitaltwin/_build_pipeline.py b/src/back/objects/digitaltwin/_build_pipeline.py index 9cd3f307..c7834cfd 100644 --- a/src/back/objects/digitaltwin/_build_pipeline.py +++ b/src/back/objects/digitaltwin/_build_pipeline.py @@ -1275,6 +1275,68 @@ def _record_build_run( exc, ) + def _persist_last_build_to_registry(self) -> None: + """Write last_build to the registry domain_versions row. + + The session/UI build path stamps domain.last_build before the build + thread starts; the API path does not. In both cases the timestamp + must reach the DB column so ReviewService.submit() can unblock the + Submit-for-Review gate. Best-effort: a failure is logged but never + propagates. + """ + try: + from back.objects.registry.RegistryService import RegistryService + from back.objects.session import sanitize_domain_folder + + folder = getattr(self.domain, "uc_domain_folder", "") or ( + sanitize_domain_folder(self.domain_name) + ) + version = ( + getattr(self.domain_snap, "current_version", None) + or getattr(self.domain, "current_version", None) + or "" + ) + if not folder or not version: + logger.warning( + "[DT-BUILD %s] _persist_last_build_to_registry: " + "cannot resolve folder=%r version=%r — skipping", + self.task_id, + folder, + version, + ) + return + + # API build path never stamps last_build before starting; do it now. + if not getattr(self.domain, "last_build", None): + self.domain.last_build = datetime.now(timezone.utc).isoformat() + + svc = RegistryService.from_context(self.domain, self.settings) + domain_data = self.domain.export_for_save() + w_ok, w_msg = svc._store.write_version(folder, version, domain_data) + if w_ok: + logger.info( + "[DT-BUILD %s] persisted last_build=%s to registry " + "(folder=%s version=%s)", + self.task_id, + self.domain.last_build, + folder, + version, + ) + else: + logger.error( + "[DT-BUILD %s] write_version failed when persisting " + "last_build: %s", + self.task_id, + w_msg, + ) + except Exception as exc: # noqa: BLE001 + logger.warning( + "[DT-BUILD %s] could not persist last_build to registry " + "(non-fatal — Submit for Review gate may remain blocked): %s", + self.task_id, + exc, + ) + def _complete_task(self) -> None: duration = time.time() - self.start_time logger.info( @@ -1302,6 +1364,7 @@ def _complete_task(self) -> None: msg = f"Full rebuild: {self.triple_count} triples in {duration:.1f}s" self.tm.complete_task(self.task_id, result=result_data, message=msg) self._record_build_run("success", message=msg) + self._persist_last_build_to_registry() def _fail_unexpected(self, exc: Exception) -> None: duration = time.time() - self.start_time diff --git a/tests/back/core/digitaltwin/test_build_pipeline_units.py b/tests/back/core/digitaltwin/test_build_pipeline_units.py index d0e9faec..e5f6c7f2 100644 --- a/tests/back/core/digitaltwin/test_build_pipeline_units.py +++ b/tests/back/core/digitaltwin/test_build_pipeline_units.py @@ -10,6 +10,8 @@ - `__init__` derived state (`is_api`, `domain_name`, `parts`, `phase_times` initialization, lazy-state defaults). - `_log_phase` — records elapsed time on `self.phase_times` and logs. +- `_persist_last_build_to_registry` — registry write after a successful + build so the Submit-for-Review gate is unblocked. Behaviour-rich phases (the various ``_apply_*`` and ``_*_progress`` methods) are exercised end-to-end in higher tiers. @@ -20,11 +22,12 @@ import time from types import SimpleNamespace from typing import Any -from unittest.mock import MagicMock +from unittest.mock import MagicMock, patch import pytest from back.objects.digitaltwin._build_pipeline import _BuildPipeline +from back.objects.registry.RegistryService import RegistryService def _make_pipeline(**overrides: Any) -> _BuildPipeline: @@ -175,3 +178,127 @@ def test_same_phase_overwrites(self) -> None: pipe._log_phase("apply", now - 0.1) second = pipe.phase_times["apply"] assert second < first # The retry was faster than the first attempt. + + +# --- _persist_last_build_to_registry ------------------------------------ + + +def _make_domain( + *, + last_build: str = "2026-06-19T09:00:00+00:00", + current_version: str = "1", + uc_domain_folder: str = "supplychain", + name: str = "supplychain", +) -> SimpleNamespace: + """Create a minimal domain stand-in for persist tests.""" + return SimpleNamespace( + info={"name": name}, + last_build=last_build, + current_version=current_version, + uc_domain_folder=uc_domain_folder, + export_for_save=lambda: {"info": {"last_build": last_build}}, + ) + + +def _make_registry_svc(write_ok: bool = True, write_msg: str = "") -> MagicMock: + """Return a mock RegistryService whose _store.write_version returns (write_ok, write_msg).""" + svc = MagicMock() + svc._store.write_version.return_value = (write_ok, write_msg) + return svc + + +@pytest.mark.unit +class TestPersistLastBuildToRegistry: + """_persist_last_build_to_registry writes domain.last_build to the registry DB.""" + + def _make_pipe(self, domain=None, **overrides): + dom = domain or _make_domain() + snap = MagicMock() + snap.current_version = dom.current_version + return _make_pipeline(domain=dom, domain_snap=snap, **overrides) + + def test_calls_write_version_on_success(self) -> None: + """Happy path: write_version is called once with folder + version.""" + pipe = self._make_pipe() + svc = _make_registry_svc() + + with patch.object(RegistryService, "from_context", return_value=svc): + pipe._persist_last_build_to_registry() + + svc._store.write_version.assert_called_once() + call_args = svc._store.write_version.call_args + folder, version, _ = call_args.args + assert folder == "supplychain" + assert version == "1" + + def test_domain_data_includes_last_build(self) -> None: + """The domain_data passed to write_version carries last_build.""" + pipe = self._make_pipe() + svc = _make_registry_svc() + + with patch.object(RegistryService, "from_context", return_value=svc): + pipe._persist_last_build_to_registry() + + _, _, domain_data = svc._store.write_version.call_args.args + assert domain_data["info"]["last_build"] == "2026-06-19T09:00:00+00:00" + + def test_api_build_stamps_last_build_when_empty(self) -> None: + """API build path: domain.last_build is empty before the build; the method + stamps it so the registry write carries a non-empty timestamp.""" + dom = _make_domain(last_build="") + snap = MagicMock() + snap.current_version = dom.current_version + # export_for_save must reflect the updated last_build after stamping. + def _export(): + return {"info": {"last_build": dom.last_build}} + dom.export_for_save = _export + + pipe = _make_pipeline(domain=dom, domain_snap=snap, build_kind="api") + svc = _make_registry_svc() + + with patch.object(RegistryService, "from_context", return_value=svc): + pipe._persist_last_build_to_registry() + + assert dom.last_build # was stamped + _, _, domain_data = svc._store.write_version.call_args.args + assert domain_data["info"]["last_build"] + + def test_skips_when_folder_cannot_be_resolved(self) -> None: + """No folder available → method returns early without calling write_version.""" + snap = MagicMock() + snap.current_version = "" + pipe = _make_pipeline(domain=SimpleNamespace( + info={}, # name not set → sanitize_domain_folder returns "" + last_build="ts", + current_version="", + uc_domain_folder="", + export_for_save=lambda: {}, + ), domain_snap=snap) + svc = _make_registry_svc() + + with ( + patch.object(RegistryService, "from_context", return_value=svc), + patch("back.objects.session.sanitize_domain_folder", return_value=""), + ): + pipe._persist_last_build_to_registry() + + svc._store.write_version.assert_not_called() + + def test_handles_write_version_failure_gracefully(self) -> None: + """write_version returning (False, msg) is logged but does not raise.""" + pipe = self._make_pipe() + svc = _make_registry_svc(write_ok=False, write_msg="DB error") + + with patch.object(RegistryService, "from_context", return_value=svc): + pipe._persist_last_build_to_registry() # must not raise + + svc._store.write_version.assert_called_once() + + def test_handles_registry_service_exception_gracefully(self) -> None: + """An exception from RegistryService.from_context must not propagate.""" + pipe = self._make_pipe() + + with patch.object( + RegistryService, "from_context", side_effect=RuntimeError("connection refused") + ): + pipe._persist_last_build_to_registry() # must not raise From 33955a7ceb4622ee51c4f45fd2a3ba657dd1bee1 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Fri, 19 Jun 2026 12:23:44 +0200 Subject: [PATCH 07/54] Create benoitcayladbx_2026-06-19.log --- .../v0.5.1/benoitcayladbx_2026-06-19.log | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 changelogs/v0.5.1/benoitcayladbx_2026-06-19.log diff --git a/changelogs/v0.5.1/benoitcayladbx_2026-06-19.log b/changelogs/v0.5.1/benoitcayladbx_2026-06-19.log new file mode 100644 index 00000000..b723b5f0 --- /dev/null +++ b/changelogs/v0.5.1/benoitcayladbx_2026-06-19.log @@ -0,0 +1,44 @@ +## Fix: Interactive Build Does Not Persist last_build to Registry + +### Context +Bug report: on the Validation page, "Submit for Review" was blocked with +"This version has never been built. Run a Digital Twin build first." even +after a successful interactive Digital Twin build. + +Root cause: `_BuildPipeline._complete_task()` (the shared completion path +for both interactive UI and external REST builds) never called +`store.write_version()` to flush `domain.last_build` to the +`domain_versions.last_build` DB column. Only the scheduled-build path +(`scheduler._persist_domain_metadata`) wrote that column. The +`ReviewService.submit()` gate reads the column; the Consistency-checks +panel reads live triple-store state — hence the two indicators +disagreed. + +### Changes + +1. `src/back/objects/digitaltwin/_build_pipeline.py` + - Added `_BuildPipeline._persist_last_build_to_registry()`: best-effort + method that resolves folder/version (same logic as `_record_build_run`), + stamps `domain.last_build` when empty (API build path), and calls + `RegistryService.from_context().store.write_version()`. + - `_complete_task()` now calls `_persist_last_build_to_registry()` after + `_record_build_run()`, covering both `build_kind="session"` (interactive + UI) and `build_kind="api"` (external REST). + +2. `tests/back/core/digitaltwin/test_build_pipeline_units.py` + - Added import for `patch` and `RegistryService`. + - Added `TestPersistLastBuildToRegistry` (6 tests): + - happy path: `write_version` is called with correct folder + version + - domain_data carries `last_build` value + - API build path: empty `last_build` is stamped before persist + - early-return when folder/version cannot be resolved + - graceful handling of `write_version` failure (False return) + - graceful handling of `RegistryService.from_context` exception + +### Modified files +- src/back/objects/digitaltwin/_build_pipeline.py +- tests/back/core/digitaltwin/test_build_pipeline_units.py + +### Test results +2484 passed, 15 skipped, 1 pre-existing failure (pyshacl not installed, unrelated) +All 22 tests in test_build_pipeline_units.py pass. From c4f64e034bac058693d89fc41d2fc6ba3dc94389 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Fri, 19 Jun 2026 12:23:57 +0200 Subject: [PATCH 08/54] Create benoitcayladbx_2026-06-19.log --- .../v0.5.1/benoitcayladbx_2026-06-19.log | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 changelogs/v0.5.1/benoitcayladbx_2026-06-19.log diff --git a/changelogs/v0.5.1/benoitcayladbx_2026-06-19.log b/changelogs/v0.5.1/benoitcayladbx_2026-06-19.log new file mode 100644 index 00000000..b723b5f0 --- /dev/null +++ b/changelogs/v0.5.1/benoitcayladbx_2026-06-19.log @@ -0,0 +1,44 @@ +## Fix: Interactive Build Does Not Persist last_build to Registry + +### Context +Bug report: on the Validation page, "Submit for Review" was blocked with +"This version has never been built. Run a Digital Twin build first." even +after a successful interactive Digital Twin build. + +Root cause: `_BuildPipeline._complete_task()` (the shared completion path +for both interactive UI and external REST builds) never called +`store.write_version()` to flush `domain.last_build` to the +`domain_versions.last_build` DB column. Only the scheduled-build path +(`scheduler._persist_domain_metadata`) wrote that column. The +`ReviewService.submit()` gate reads the column; the Consistency-checks +panel reads live triple-store state — hence the two indicators +disagreed. + +### Changes + +1. `src/back/objects/digitaltwin/_build_pipeline.py` + - Added `_BuildPipeline._persist_last_build_to_registry()`: best-effort + method that resolves folder/version (same logic as `_record_build_run`), + stamps `domain.last_build` when empty (API build path), and calls + `RegistryService.from_context().store.write_version()`. + - `_complete_task()` now calls `_persist_last_build_to_registry()` after + `_record_build_run()`, covering both `build_kind="session"` (interactive + UI) and `build_kind="api"` (external REST). + +2. `tests/back/core/digitaltwin/test_build_pipeline_units.py` + - Added import for `patch` and `RegistryService`. + - Added `TestPersistLastBuildToRegistry` (6 tests): + - happy path: `write_version` is called with correct folder + version + - domain_data carries `last_build` value + - API build path: empty `last_build` is stamped before persist + - early-return when folder/version cannot be resolved + - graceful handling of `write_version` failure (False return) + - graceful handling of `RegistryService.from_context` exception + +### Modified files +- src/back/objects/digitaltwin/_build_pipeline.py +- tests/back/core/digitaltwin/test_build_pipeline_units.py + +### Test results +2484 passed, 15 skipped, 1 pre-existing failure (pyshacl not installed, unrelated) +All 22 tests in test_build_pipeline_units.py pass. From ebd422ad793ca319d1762aa9ab1d6858817e426a Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Fri, 19 Jun 2026 14:31:32 +0200 Subject: [PATCH 09/54] chore: restore CONTRIBUTORS.md and ReleaseNotes_V0.5.1.md from master Both files were present on master but absent from develop (dropped by the revert of PR #61). Synced back to keep the branches aligned. --- CONTRIBUTORS.md | 19 ++++++ releases/ReleaseNotes_V0.5.1.md | 115 ++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 CONTRIBUTORS.md create mode 100644 releases/ReleaseNotes_V0.5.1.md diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md new file mode 100644 index 00000000..a781c638 --- /dev/null +++ b/CONTRIBUTORS.md @@ -0,0 +1,19 @@ +# Contributors + +Thank you to everyone who has contributed to OntoBricks! + +## Core Team + +| Name | GitHub | Role | +|------|--------|------| +| Benoit Cayla | [@benoitcayladbx](https://github.com/benoitcayladbx) | Creator & Lead Maintainer | +| Dermot Smyth | [@dermotsmyth-db](https://github.com/dermotsmyth-db) | Contributor | +| hourdays | [@hourdays](https://github.com/hourdays) | Contributor | + +## How to Contribute + +See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines on how to get involved. + +--- + +*This list is maintained manually. If you've contributed and are not listed, please open a PR.* diff --git a/releases/ReleaseNotes_V0.5.1.md b/releases/ReleaseNotes_V0.5.1.md new file mode 100644 index 00000000..c52b8dca --- /dev/null +++ b/releases/ReleaseNotes_V0.5.1.md @@ -0,0 +1,115 @@ +# OntoBricks — Release Notes V0.5.1 + +**Release date:** 2026-06-19 +**Type:** Patch — single bug fix +**Test status:** 2484 passing, 15 skipped on the unit tier; 6 new regression tests added. + +--- + +## Summary + +v0.5.1 is a targeted patch that fixes a blocker introduced with the v0.5.0 review workflow: the **"Submit for Review"** action on the Validation page was permanently blocked even after a successful Digital Twin build, when that build was triggered interactively (via the Build button in the UI or the external REST endpoint `POST /dtwin/build`). + +No schema changes. No configuration changes. No migration scripts required for new deploys. + +--- + +## Bug Fixed + +### Submit for Review blocked despite a built Digital Twin + +**Symptom:** On the Validation page (`/domain/validate`), the banner *"This version has never been built. Run a Digital Twin build first."* appeared and the **Submit for Review** button was disabled — even though the Consistency-checks panel showed a green **"Digital Twin built"** tick. + +**Root cause:** The two indicators on the same page read from different sources: + +| Indicator | Source | +|-----------|--------| +| Consistency-checks "Digital Twin built" ✅ | Live triple-store state (view exists + has triples) | +| Submit-for-Review gate | `domain_versions.last_build` column in the registry DB | + +The interactive build path (`_BuildPipeline._complete_task`) never wrote `domain.last_build` to the `domain_versions` table. Only the **scheduled** build path (`scheduler._persist_domain_metadata`) performed that write. The Submit gate reads the registry column, found it empty, and blocked. + +**Fix:** `_BuildPipeline._complete_task()` — the single success exit shared by both the UI build (`build_kind="session"`) and the REST build (`build_kind="api"`) — now calls a new `_persist_last_build_to_registry()` method immediately after recording the build run. This method: + +1. Resolves the domain folder and version (same logic already used for build-run tracing). +2. Stamps `domain.last_build` with the current UTC timestamp when it is empty (API path). +3. Calls `RegistryService.from_context(domain, settings)._store.write_version(folder, version, domain_data)` to flush the value to `domain_versions.last_build`. +4. Is **best-effort**: any exception is logged as a warning and never propagates — a registry hiccup cannot break a build that otherwise succeeded. + +**File changed:** `src/back/objects/digitaltwin/_build_pipeline.py` +**Tests added:** `tests/back/core/digitaltwin/test_build_pipeline_units.py::TestPersistLastBuildToRegistry` (6 cases) + +--- + +## Upgrade Notes + +### New deploys (v0.5.1 from scratch) + +No action required. The fix is code-only; the `domain_versions` schema and `last_build` column are unchanged from v0.5.0. + +### Upgrading from v0.5.0 + +No schema migration needed. However, any domain version that was built interactively while running v0.5.0 will have an empty `domain_versions.last_build` and will still be blocked at Submit for Review after the upgrade. + +**Two options to unblock existing affected versions:** + +**Option A — Re-run the build (recommended, zero SQL)** + +On the Validation page for the affected domain + version, click the **Build** button again. The build re-populates the triple-store (idempotent — full rebuild) and now also writes `last_build` to the registry. Once the build completes, the Submit for Review button becomes available immediately. + +**Option B — Direct SQL patch (no rebuild needed)** + +If you want to unblock Submit for Review without re-running the build (e.g. the triple-store is already healthy and you do not want to re-build), connect to the registry Lakebase database and run: + +```sql +-- Replace 'your_schema' with your registry schema (e.g. ontobricks_app_demo). +-- Replace 'supplychain' and '1' with your actual domain folder and version. +UPDATE your_schema.domain_versions dv +SET last_build = NOW()::text, + updated_at = NOW() +FROM your_schema.domains d +WHERE dv.domain_id = d.id + AND d.folder = 'supplychain' -- domain folder (sanitised name) + AND dv.version = '1' -- version string + AND dv.last_build = ''; -- only patch truly empty rows +``` + +To patch **all** versions that have a healthy build artifact but a missing `last_build` in one shot: + +```sql +-- Patches every version whose last_build is empty but whose status is not DRAFT +-- (i.e. it was previously submitted or published via a scheduled build workaround). +-- Review the SELECT before running the UPDATE. +SELECT d.folder, dv.version, dv.status, dv.last_build +FROM your_schema.domain_versions dv +JOIN your_schema.domains d ON d.id = dv.domain_id +WHERE dv.last_build = ''; + +-- Once satisfied, run: +UPDATE your_schema.domain_versions dv +SET last_build = NOW()::text, + updated_at = NOW() +FROM your_schema.domains d +WHERE dv.domain_id = d.id + AND dv.last_build = ''; +``` + +After the SQL update, reload the Validation page — no app restart is needed. + +--- + +## Changes + +| Area | File | Change | +|------|------|--------| +| Core fix | `src/back/objects/digitaltwin/_build_pipeline.py` | Added `_persist_last_build_to_registry()`; called from `_complete_task()` | +| Tests | `tests/back/core/digitaltwin/test_build_pipeline_units.py` | Added `TestPersistLastBuildToRegistry` — 6 regression tests | + +--- + +## What is NOT changed + +- `domain_versions` schema — no DDL. +- Scheduled build path — `scheduler._persist_domain_metadata` is untouched and still the authoritative write for scheduled runs. +- Consistency-checks panel — continues to read live triple-store state (unchanged behaviour). +- All other v0.5.0 features — fully intact. From 9a2326f35883d4ec564d6f10dc74e5e39902c861 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Fri, 19 Jun 2026 15:30:28 +0200 Subject: [PATCH 10/54] feat(collab): remove AI Agent task capability from discussion & tasks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Drops the experimental route→plan→clarify→dispatch loop introduced in feat/Collaborative-Comments-Tasks (agent_task_runner, agent_task_planner, agent_task_router, agents/registry) before the v0.6 merge. - Deleted: 8 source files + 3 test files + 2 design docs - CommentService: removed AI-Agent assignee, kickoff block, start_agent_task call, _maybe_resume_agent - Mapping: removed apply_agent_mappings() - Frontend: removed all AI-Agent JS state/polling/UI and CSS rules - Docs: removed AI Agent task assignment section from architecture.md - Tests: 2132 passed (1 pre-existing lakebase skip) --- .../v0.6.0/benoitcayladbx_2026-06-19.log | 68 ++ docs/architecture.md | 70 -- ...026-06-18-ai-agent-clarifying-questions.md | 994 ------------------ ...18-ai-agent-clarifying-questions-design.md | 170 --- src/agents/agent_task_planner/__init__.py | 3 - src/agents/agent_task_planner/engine.py | 182 ---- src/agents/agent_task_planner/tools.py | 7 - src/agents/agent_task_router/__init__.py | 15 - src/agents/agent_task_router/engine.py | 192 ---- src/agents/agent_task_router/tools.py | 13 - src/agents/registry.py | 121 --- src/back/objects/mapping/Mapping.py | 24 - src/back/objects/registry/CommentService.py | 107 +- .../objects/registry/agent_task_runner.py | 718 ------------- src/front/static/global/css/review-modals.css | 71 -- src/front/static/global/js/comments-panel.js | 266 +---- src/front/static/mapping/js/mapping-init.js | 21 - src/front/static/ontology/js/ontology-init.js | 26 - tests/units/agents/test_agent_task_planner.py | 67 -- tests/units/agents/test_agent_task_router.py | 132 --- .../units/api/test_discussion_panel_assets.py | 84 +- tests/units/mapping/test_mapping_service.py | 39 - .../units/registry/test_agent_task_runner.py | 479 --------- tests/units/registry/test_comment_service.py | 124 +-- 24 files changed, 87 insertions(+), 3906 deletions(-) delete mode 100644 docs/superpowers/plans/2026-06-18-ai-agent-clarifying-questions.md delete mode 100644 docs/superpowers/specs/2026-06-18-ai-agent-clarifying-questions-design.md delete mode 100644 src/agents/agent_task_planner/__init__.py delete mode 100644 src/agents/agent_task_planner/engine.py delete mode 100644 src/agents/agent_task_planner/tools.py delete mode 100644 src/agents/agent_task_router/__init__.py delete mode 100644 src/agents/agent_task_router/engine.py delete mode 100644 src/agents/agent_task_router/tools.py delete mode 100644 src/agents/registry.py delete mode 100644 src/back/objects/registry/agent_task_runner.py delete mode 100644 tests/units/agents/test_agent_task_planner.py delete mode 100644 tests/units/agents/test_agent_task_router.py delete mode 100644 tests/units/registry/test_agent_task_runner.py diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log index de98dd07..9d210b07 100644 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log @@ -167,3 +167,71 @@ disagreed. **Test result:** `pytest tests/back/core/digitaltwin/test_build_pipeline_units.py` → 22 passed. + +--- + +## Change: Remove AI Agent task capability (discussion & tasks) + +**Context:** The `feat/Collaborative-Comments-Tasks` branch introduced +an experimental feature that allowed collaborative tasks to be assigned to a +virtual "AI Agent" (`agent://router`). The feature included a route → +plan → clarify → dispatch loop backed by `agent_task_runner.py`, +`agent_task_planner/`, and `agent_task_router/`. The decision was made to drop +this capability before the v0.6 merge to keep the feature surface focused. + +**Changes:** + +1. `src/agents/agent_task_planner/` (3 files) — deleted entirely. +2. `src/agents/agent_task_router/` (3 files) — deleted entirely. +3. `src/agents/registry.py` — deleted (only used by the two modules above). +4. `src/back/objects/registry/agent_task_runner.py` — deleted. +5. `src/back/objects/registry/CommentService.py` — removed import of + agent_task_runner constants; removed AI Agent entry from `list_assignees`; + removed kickoff-comment block and `start_agent_task` call from + `create_task`; removed `_maybe_resume_agent` method and its call from + `add_comment`. +6. `src/back/objects/mapping/Mapping.py` — removed `apply_agent_mappings()` + method (session-less counterpart used only by the runner). +7. `src/front/static/global/js/comments-panel.js` — removed all AI-Agent + state variables, live-status functions (`loadAiTasks`, `loadAgentRuns`, + `renderAgentStrip`, `ensureAgentTracking`, `announceAgentCompletions`, + `panelPollTick`, `agentChipHtml`, `agentAnswerHtml`), agent thread CSS + classes, polling timer, and `data-agent-send` handler; simplified + `taskFormHtml` and `syncDueVisibility`; simplified `listSignature`. +8. `src/front/static/ontology/js/ontology-init.js` — removed + `ontobricks:design-updated` event listener. +9. `src/front/static/mapping/js/mapping-init.js` — removed + `ontobricks:design-updated` event listener. +10. `src/front/static/global/css/review-modals.css` — removed all + `.oc-agent-*` and `.oc-thread-agent` rules and the `@keyframes oc-agent-spin` block. +11. `tests/units/agents/test_agent_task_planner.py` — deleted. +12. `tests/units/agents/test_agent_task_router.py` — deleted. +13. `tests/units/registry/test_agent_task_runner.py` — deleted. +14. `tests/units/registry/test_comment_service.py` — removed 7 AI-agent test + functions; updated `test_list_assignees_returns_domain_holders_sorted` to + no longer expect the AI Agent as first entry. +15. `tests/units/mapping/test_mapping_service.py` — removed + `TestApplyAgentMappings` class (4 tests). +16. `tests/units/api/test_discussion_panel_assets.py` — removed + `TestDiscussionAgentStatus`, `TestAnswerTheAgent`, `TestDesignUpdatedRefresh` + classes; updated module docstring. +17. `docs/architecture.md` — removed `registry.py`, `agent_task_router/`, + `agent_task_planner/` from the tree; removed the `task_router` row from + the task-type table; removed the entire "AI Agent task assignment" section. +18. `docs/superpowers/plans/2026-06-18-ai-agent-clarifying-questions.md` — deleted. +19. `docs/superpowers/specs/2026-06-18-ai-agent-clarifying-questions-design.md` — deleted. + +**Modified files:** +- `src/back/objects/registry/CommentService.py` +- `src/back/objects/mapping/Mapping.py` +- `src/front/static/global/js/comments-panel.js` +- `src/front/static/ontology/js/ontology-init.js` +- `src/front/static/mapping/js/mapping-init.js` +- `src/front/static/global/css/review-modals.css` +- `docs/architecture.md` +- `tests/units/registry/test_comment_service.py` +- `tests/units/mapping/test_mapping_service.py` +- `tests/units/api/test_discussion_panel_assets.py` + +**Test result:** `pytest tests/units tests/back -q` → 2132 passed, 15 skipped, +1 pre-existing lakebase/psycopg failure unrelated to these changes. diff --git a/docs/architecture.md b/docs/architecture.md index 4f64aefc..efa54b63 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -446,13 +446,10 @@ src/ │ ├── llm_utils.py # Shared LLM call with retry (429/503 backoff) │ ├── serialization.py # Agent serialization utilities │ ├── tracing.py # MLflow tracing setup & decorators -│ ├── registry.py # Static registry of router-dispatchable agents │ ├── tools/ # Shared agent tools (ontology, mapping, metadata, SQL, etc.) │ ├── agent_owl_generator/ # OWL ontology generation agent │ ├── agent_auto_assignment/ # Entity/relationship → SQL mapping agent │ ├── agent_auto_icon_assign/ # Emoji icon mapping agent -│ ├── agent_task_router/ # Routes an AI-Agent task to the right agent -│ ├── agent_task_planner/ # Gates an AI-Agent task: ask clarifying questions vs. run │ └── agent_ontology_assistant/ # Conversational assistant + ResponsesAgent wrapper │ └── mcp-server/ # MCP Server (separate Databricks App) @@ -598,8 +595,6 @@ Long-running operations use the **TaskManager** pattern (`src/back/core/task_man | `triplestore_sync` | Digital Twin → Build | Generates and writes triples to Delta and the configured Graph DB engine (Lakebase) | | `quality_checks` | Digital Twin → Quality | Runs all quality checks sequentially with per-check progress | | `auto_assign` | Mapping → Auto-Map | Batch-maps entities and relationships via LLM; splits large jobs into chunks of `AUTO_ASSIGN_CHUNK_SIZE` with cooldown between chunks to avoid rate limits | -| `task_router` | Collaborative task assigned to the **AI Agent** | Routes the task, then confirms scope with the assignee (clarifying questions) before dispatching the chosen agent against the task's domain (see [AI Agent task assignment](#ai-agent-task-assignment)) | - **How it works:** 1. Frontend sends a `POST` to start the task; backend creates a `TaskManager` task and spawns a `threading.Thread` 2. Frontend stores the `task_id` in `sessionStorage` and polls `/tasks/{task_id}` for progress @@ -607,71 +602,6 @@ Long-running operations use the **TaskManager** pattern (`src/back/core/task_man 4. On completion, the task result is returned to the frontend, which saves mappings and updates the UI 5. If the user navigates away and returns, the frontend resumes monitoring from `sessionStorage` -### AI Agent task assignment - -Collaborative tasks (created from the comments panel) can be assigned to a -virtual **AI Agent** instead of a human teammate. The AI Agent is a sentinel -principal (`agent://router`, defined in -`src/back/objects/registry/agent_task_runner.py`) that `CommentService.list_assignees` -always offers first in the assignee picker. - -When a task is created with this assignee, `CommentService.create_task` launches -a `task_router` background job. To keep the AI Agent from acting on a vague -request, it **always confirms scope before running** — the job runs a -clarify-then-run loop driven by the task's Discussion thread: - -1. **Route** — `agents/agent_task_router` (a single-shot LLM classifier) reads - the task title/description and the static registry of dispatchable agents - (`src/agents/registry.py`) and returns the best-matching agent key. The router - runs at temperature 0, so re-running it on each pass yields the same agent - (the route is effectively *locked*; no key is persisted). -2. **Plan** — the orchestrator marks the `domain_tasks` row `in_progress`, - reconstructs the clarification Q&A from the task's comment thread, and runs - `agents/agent_task_planner`. The planner returns `ready` only once the - assignee has replied with enough to proceed; on the first pass (no replies) - it always posts a short plan + clarifying question and the job parks, leaving - the task `in_progress`. -3. **Resume** — when the assignee replies on the thread, - `CommentService.add_comment` calls `resume_agent_task`, which relaunches the - same worker. It re-plans against the now-richer thread and either asks another - question (multi-round) or proceeds. -4. **Run** — once the planner is `ready`, the chosen agent runs against the - task's domain session (the **Ontology Assistant** edits and *saves* the - ontology in place; the others produce proposals via the existing domain - bridges). The task is marked `done` and the outcome is posted to the thread. - Failures leave the task with an explanatory comment. - -Linkage uses the thread root: every AI-Agent task has a `comment_id` (the -originating comment, or a **kickoff comment** created for standalone tasks). An -in-process guard (`_ACTIVE_TASKS` + a lock) prevents a reply from starting a -second concurrent run for the same task. - -**Discussion pane UI** (`comments-panel.js`): while the offcanvas is open it -polls `/comments/{f}/{v}/tasks` and `/tasks/` (every 4s, only while AI work is in -flight) so the agent's question and outcome appear live. An AI-Agent task thread -shows a status chip — *working…* / **waiting for your reply** / *queued* / -*done* — driven by the `domain_tasks` status plus any active `task_router` -background run. A top-of-panel progress strip mirrors the header task-tracker -(animated bar + current step) for the active run. When a task is parked, the -thread renders a prominent **"Answer the AI Agent"** box; sending it posts a -reply that triggers `resume_agent_task`. Re-renders are change-detected and -deferred while the user is typing so an open answer box is never lost. - -When the panel observes an AI-Agent task transition to `done`, it dispatches a -global `ontobricks:design-updated` event (transition-guarded so it never fires -on initial paint). Design-consuming pages subscribe and pull the agent's saved -changes live: the **ontology page** (`ontology-init.js`) re-runs -`loadOntologyFromSession()` and re-initialises the active section -(`_initSectionByName`), so the designer/map reflect the new model; the -**mapping page** (`mapping-init.js`) re-fetches the loaded ontology into -`MappingState` and redraws. This is the mechanism that keeps the *Ontology -Assistant*'s in-place edits visible without a manual reload. - -Dispatchable agents: `ontology_assistant` (in-place ontology edits, applied), -`owl_generator`, `business_rules_generator`, `icon_assign`, `auto_assignment`. -Interactive chat agents (dtwin chat, cohort) are excluded because they need a -live conversation rather than a one-shot task. - ### Scheduled Builds (BuildScheduler) The **BuildScheduler** (`src/back/objects/registry/scheduler.py`) provides per-domain scheduled triple store builds using APScheduler's `BackgroundScheduler`. Schedule definitions are persisted in `.global_config.json` on the UC Volume alongside other instance-level settings. diff --git a/docs/superpowers/plans/2026-06-18-ai-agent-clarifying-questions.md b/docs/superpowers/plans/2026-06-18-ai-agent-clarifying-questions.md deleted file mode 100644 index 61fa7319..00000000 --- a/docs/superpowers/plans/2026-06-18-ai-agent-clarifying-questions.md +++ /dev/null @@ -1,994 +0,0 @@ -# AI Agent Clarifying Questions Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Make an AI-Agent task post a plan + clarifying questions in its Discussion thread, park itself, and resume automatically when the assignee replies, iterating until confident before running the chosen specialized agent. - -**Architecture:** A new single-shot `agent_task_planner` LLM decides "ready vs ask". The `agent_task_runner` background worker does route -> reconstruct thread history -> plan -> branch (ask again, or dispatch the agent). A resume hook in `CommentService.add_comment` relaunches the worker when a human replies on a parked AI-Agent task thread. Zero schema change: the parked state reuses `in_progress`, linkage uses the existing `comment_id` (a kickoff comment is created for standalone tasks), and the deterministic router is re-run on each pass. - -**Tech Stack:** Python 3.11, FastAPI, the OntoBricks agent engine (`agents.engine_base.call_serving_endpoint`), `TaskManager` background jobs, pytest. - ---- - -## File structure - -| File | Responsibility | -|------|----------------| -| `src/agents/agent_task_planner/engine.py` (new) | Single-shot LLM: given task + chosen agent + Q&A history, return `PlanResult{ready, message}` | -| `src/agents/agent_task_planner/__init__.py` (new) | Re-export `run_agent`, `PlanResult` | -| `src/agents/agent_task_planner/tools.py` (new) | Empty tool tables (consistency with other agents) | -| `src/back/objects/registry/agent_task_runner.py` (modify) | Plan-or-run worker, thread-history reconstruction, `resume_agent_task`, concurrency guard, answer fold-in | -| `src/back/objects/registry/CommentService.py` (modify) | Kickoff comment for standalone AI tasks; resume hook in `add_comment` | -| `tests/units/agents/test_agent_task_planner.py` (new) | Planner ready/ask + degradation | -| `tests/units/registry/test_agent_task_runner.py` (modify) | Plan/park/resume/run + history reconstruction + guard | -| `tests/units/registry/test_comment_service.py` (modify) | Kickoff comment + resume-hook trigger conditions | - ---- - -### Task 1: `agent_task_planner` agent - -Mirrors `src/agents/agent_task_router/` (single-shot, JSON in/out). Decides whether the AI Agent has enough to act, or must ask the assignee more. - -**Files:** -- Create: `src/agents/agent_task_planner/engine.py` -- Create: `src/agents/agent_task_planner/__init__.py` -- Create: `src/agents/agent_task_planner/tools.py` -- Test: `tests/units/agents/test_agent_task_planner.py` - -- [ ] **Step 1: Write the failing test** - -```python -# tests/units/agents/test_agent_task_planner.py -"""Unit tests for the task-planner agent (ready vs. ask decision).""" -from __future__ import annotations - -from unittest.mock import patch - -from agents.agent_task_planner import PlanResult, run_agent -from agents.registry import get_agent - - -def _spec(): - return get_agent("ontology_assistant") - - -def _llm(content: str): - return {"choices": [{"message": {"content": content}}], "usage": {}} - - -def test_first_turn_asks_when_no_answers(): - with patch( - "agents.agent_task_planner.engine.call_serving_endpoint", - return_value=_llm('{"ready": false, "message": "Plan: remove Person? Confirm scope."}'), - ): - res = run_agent( - "h", "t", "ep", - task_title="Is Person needed?", - task_description="", - agent=_spec(), - history=[], - ) - assert isinstance(res, PlanResult) - assert res.success is True - assert res.ready is False - assert "Plan" in res.message - - -def test_ready_when_user_approved(): - history = [ - {"role": "assistant", "text": "Shall I remove Person?"}, - {"role": "user", "text": "yes go ahead"}, - ] - with patch( - "agents.agent_task_planner.engine.call_serving_endpoint", - return_value=_llm('{"ready": true, "message": "Running now."}'), - ): - res = run_agent( - "h", "t", "ep", - task_title="Is Person needed?", - task_description="", - agent=_spec(), - history=history, - ) - assert res.success is True - assert res.ready is True - - -def test_unparseable_response_degrades_to_ask(): - with patch( - "agents.agent_task_planner.engine.call_serving_endpoint", - return_value=_llm("not json at all"), - ): - res = run_agent( - "h", "t", "ep", - task_title="x", task_description="", agent=_spec(), history=[], - ) - # Degrade safe: never auto-run on a parse failure. - assert res.ready is False - assert res.error -``` - -- [ ] **Step 2: Run test to verify it fails** - -Run: `python -m pytest tests/units/agents/test_agent_task_planner.py -q` -Expected: FAIL with `ModuleNotFoundError: No module named 'agents.agent_task_planner'` - -- [ ] **Step 3: Write `tools.py`** - -```python -# src/agents/agent_task_planner/tools.py -"""The planner is single-shot and uses no tools (kept for package symmetry).""" -from __future__ import annotations - -from typing import Callable, Dict, List - -TOOL_DEFINITIONS: List[dict] = [] -TOOL_HANDLERS: Dict[str, Callable] = {} -``` - -- [ ] **Step 4: Write `engine.py`** - -```python -# src/agents/agent_task_planner/engine.py -""" -Task Planner agent engine. - -Single-shot gate that runs BEFORE a specialized agent does any work. Given the -task, the agent already chosen by the router, and the clarification Q&A so far -(reconstructed from the Discussion thread), the LLM decides whether it has -enough to act confidently (``ready=true``) or must ask the assignee more -(``ready=false`` + a short plan/question ``message``). JSON in / JSON out. -""" -from __future__ import annotations - -import json -import re -from dataclasses import dataclass, field -from typing import Callable, Dict, List, Optional - -from agents.engine_base import ( - AgentStep, - accumulate_usage, - call_serving_endpoint, - extract_message_content, -) -from agents.registry import AgentSpec -from agents.tracing import trace_agent -from back.core.logging import get_logger - -logger = get_logger(__name__) - -LLM_TIMEOUT = 60 -_TRACE_NAME = "task_planner" - - -@dataclass -class PlanResult: - """Outcome of a single planning turn.""" - - success: bool - ready: bool = False - message: str = "" - steps: List[AgentStep] = field(default_factory=list) - iterations: int = 0 - error: str = "" - usage: Dict[str, int] = field(default_factory=dict) - - -_SYSTEM_PROMPT = """\ -You are the Task Planner for OntoBricks. A teammate assigned a work item to the -"AI Agent", and a specialized agent has already been selected to carry it out. -Before that agent runs, you confirm scope with the teammate. - -You are given: the task, the selected agent's purpose, and the conversation so -far (your earlier questions and the teammate's replies, if any). - -RULES -- On the FIRST turn (no teammate replies yet) you are NOT ready: briefly state - what you will do and ask any clarifying question(s) needed to act safely. -- Mark ready=true ONLY once the teammate has replied with enough to proceed - (an approval or the missing detail). When unsure, ask one more focused - question rather than guessing. -- Keep messages short and concrete. No code fences. -- Reply with ONLY a JSON object: - {"ready": , "message": ""} -""" - - -def _build_user_prompt( - task_title: str, - task_description: str, - agent: AgentSpec, - history: List[dict], -) -> str: - lines = [ - f"SELECTED AGENT: {agent.label} — {agent.description}", - "", - f"TASK TITLE: {task_title}", - ] - if task_description: - lines.append(f"TASK DESCRIPTION: {task_description}") - lines.append("") - if history: - lines.append("CONVERSATION SO FAR:") - for turn in history: - who = "AI Agent" if turn.get("role") == "assistant" else "Teammate" - lines.append(f"- {who}: {turn.get('text', '')}") - else: - lines.append("CONVERSATION SO FAR: (none yet — this is the first turn)") - lines.append("") - lines.append('Respond with the JSON object: {"ready": ..., "message": "..."}') - return "\n".join(lines) - - -def _parse_plan(text: str) -> Optional[dict]: - """Extract the ``{"ready": ..., "message": ...}`` object from LLM text.""" - cleaned = (text or "").strip() - fence = re.search(r"```(?:json)?\s*([\s\S]*?)```", cleaned) - if fence: - cleaned = fence.group(1).strip() - for candidate in (cleaned, None): - if candidate is None: - brace = re.search(r"\{[\s\S]*\}", cleaned) - candidate = brace.group(0) if brace else None - if not candidate: - continue - try: - obj = json.loads(candidate) - if isinstance(obj, dict): - return obj - except json.JSONDecodeError: - continue - return None - - -@trace_agent(name="task_planner") -def run_agent( - host: str, - token: str, - endpoint_name: str, - *, - task_title: str, - task_description: str, - agent: AgentSpec, - history: List[dict], - on_step: Optional[Callable[[str], None]] = None, -) -> PlanResult: - """Decide whether to run the selected agent now or ask the teammate more. - - ``history`` is the ordered clarification Q&A: ``[{"role": "assistant"|"user", - "text": str}, ...]``. ``success`` is ``True`` when the LLM replied parseably; - ``ready`` gates the actual run. On any failure ``ready`` stays ``False`` so - the agent never runs without a confident go-ahead. - """ - result = PlanResult(success=False) - - if on_step: - on_step("Reviewing the task scope...") - - messages = [ - {"role": "system", "content": _SYSTEM_PROMPT}, - { - "role": "user", - "content": _build_user_prompt( - task_title, task_description, agent, history - ), - }, - ] - - result.iterations = 1 - try: - llm_response = call_serving_endpoint( - host, - token, - endpoint_name, - messages, - max_tokens=512, - temperature=0.0, - timeout=LLM_TIMEOUT, - trace_name=_TRACE_NAME, - ) - except Exception as exc: # noqa: BLE001 - result.error = f"Planner LLM request failed: {exc}" - logger.error("task_planner: %s", result.error) - return result - - accumulate_usage(result.usage, llm_response.get("usage", {})) - content = extract_message_content(llm_response) - result.steps.append(AgentStep(step_type="output", content=content[:500])) - - plan = _parse_plan(content) - if not plan: - result.error = "Planner returned an unparseable response" - result.message = ( - "I need a bit more detail before I proceed — could you clarify the " - "scope of this task?" - ) - logger.warning("task_planner: unparseable response: %s", content[:200]) - return result - - result.success = True - result.ready = bool(plan.get("ready", False)) - result.message = str(plan.get("message", "")).strip() - logger.info("task_planner: ready=%s", result.ready) - return result -``` - -- [ ] **Step 5: Write `__init__.py`** - -```python -# src/agents/agent_task_planner/__init__.py -from agents.agent_task_planner.engine import PlanResult, run_agent # noqa: F401 - -__all__ = ["run_agent", "PlanResult"] -``` - -- [ ] **Step 6: Run tests to verify they pass** - -Run: `python -m pytest tests/units/agents/test_agent_task_planner.py -q` -Expected: PASS (3 passed) - -- [ ] **Step 7: Commit** - -```bash -git add src/agents/agent_task_planner tests/units/agents/test_agent_task_planner.py -git commit -m "feat(agents): add task-planner agent (ready vs. ask gate)" -``` - ---- - -### Task 2: Plan-or-run worker + resume in `agent_task_runner` - -Rework the background worker so it routes, reconstructs the thread Q&A, calls the planner, and either parks (posts a question, stays `in_progress`) or runs the chosen agent. Add `resume_agent_task` (same worker, relaunched on a reply) and an in-process guard so a reply can't start a second concurrent run. - -**Files:** -- Modify: `src/back/objects/registry/agent_task_runner.py` -- Test: `tests/units/registry/test_agent_task_runner.py` - -- [ ] **Step 1: Write the failing tests** (append to the existing test module) - -```python -# tests/units/registry/test_agent_task_runner.py (additions) -def _svc_with_thread(thread): - """Service double whose list_comments returns *thread* (list of dicts).""" - svc, statuses, comments = _fake_svc() - svc.list_comments.return_value = thread - return svc, statuses, comments - - -def test_first_pass_parks_with_plan_and_stays_in_progress(monkeypatch): - svc, statuses, comments = _svc_with_thread( - [{"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "Is Person needed?", "created_at": "t0", - "anchor_type": "domain", "anchor_ref": ""}] - ) - router_res = SimpleNamespace(success=True, chosen_agent_key="ontology_assistant", - reasoning="edit", error="") - plan_res = SimpleNamespace(success=True, ready=False, - message="Plan: remove Person? Confirm.", error="") - monkeypatch.setattr("agents.agent_task_router.run_agent", lambda *a, **k: router_res) - monkeypatch.setattr("agents.agent_task_planner.run_agent", lambda *a, **k: plan_res) - dispatched = [] - monkeypatch.setattr(runner, "_dispatch_agent", - lambda *a, **k: dispatched.append(k) or ("s", "r", {})) - - runner._run_for_task( - svc=svc, domain=MagicMock(), host="h", token="t", llm_endpoint="ep", - warehouse_id="", folder="d", version="v", domain_task_id="T1", - title="Is Person needed?", description="", comment_id="root", - on_step=lambda m: None, tm=None, tm_task_id=None, - ) - - assert dispatched == [] # agent did NOT run - assert "in_progress" in statuses # parked - assert any("Plan: remove Person?" in c for c in comments) - - -def test_resume_runs_agent_when_planner_ready(monkeypatch): - svc, statuses, comments = _svc_with_thread([ - {"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "Is Person needed?", "created_at": "t0", - "anchor_type": "domain", "anchor_ref": ""}, - {"id": "q1", "parent_id": "root", "author": "AI Agent", - "body": "Remove Person?", "created_at": "t1", - "anchor_type": "domain", "anchor_ref": ""}, - {"id": "a1", "parent_id": "root", "author": "alice@x.io", - "body": "yes remove it", "created_at": "t2", - "anchor_type": "domain", "anchor_ref": ""}, - ]) - router_res = SimpleNamespace(success=True, chosen_agent_key="ontology_assistant", - reasoning="edit", error="") - plan_res = SimpleNamespace(success=True, ready=True, message="Running now.", error="") - monkeypatch.setattr("agents.agent_task_router.run_agent", lambda *a, **k: router_res) - monkeypatch.setattr("agents.agent_task_planner.run_agent", lambda *a, **k: plan_res) - captured = {} - monkeypatch.setattr( - runner, "_dispatch_agent", - lambda key, **k: captured.update(k) or ("updated", "Removed Person.", {}), - ) - - runner._run_for_task( - svc=svc, domain=MagicMock(), host="h", token="t", llm_endpoint="ep", - warehouse_id="", folder="d", version="v", domain_task_id="T1", - title="Is Person needed?", description="", comment_id="root", - on_step=lambda m: None, tm=None, tm_task_id=None, - ) - - assert statuses[-1] == "done" # solved - assert "yes remove it" in captured["task_text"] # answer folded in - assert any("Removed Person." in c for c in comments) - - -def test_thread_history_maps_authors_to_roles(): - svc, _, _ = _svc_with_thread([ - {"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "do X", "created_at": "t0"}, - {"id": "q1", "parent_id": "root", "author": "AI Agent", - "body": "clarify?", "created_at": "t1"}, - {"id": "a1", "parent_id": "root", "author": "alice@x.io", - "body": "answer", "created_at": "t2"}, - {"id": "other", "parent_id": "elsewhere", "author": "bob@x.io", - "body": "unrelated", "created_at": "t3"}, - ]) - hist = runner._thread_history(svc, "d", "v", "root") - assert [h["role"] for h in hist] == ["user", "assistant", "user"] - assert hist[1]["text"] == "clarify?" - assert all(h["text"] != "unrelated" for h in hist) # other thread excluded - - -def test_resume_skips_when_already_running(monkeypatch): - runner._ACTIVE_TASKS.add("T1") - try: - started = runner.resume_agent_task( - svc=MagicMock(), domain=MagicMock(), settings=MagicMock(), - folder="d", version="v", task={"id": "T1", "comment_id": "root", - "title": "x", "description": ""}, - ) - finally: - runner._ACTIVE_TASKS.discard("T1") - assert started is None -``` - -- [ ] **Step 2: Run tests to verify they fail** - -Run: `python -m pytest tests/units/registry/test_agent_task_runner.py -q` -Expected: FAIL with `AttributeError: module ... has no attribute '_run_for_task'` (and `_thread_history`, `resume_agent_task`, `_ACTIVE_TASKS`). - -- [ ] **Step 3: Add the module-level guard + imports** (top of `agent_task_runner.py`, after `AI_AGENT_LABEL`) - -```python -# In-process guard: domain_task ids with a background pass currently running. -# Prevents a reply from launching a second concurrent run for the same task. -# (Single-process app; reset on restart, which is fine — a stale entry only -# delays one resume.) -_ACTIVE_TASKS: set[str] = set() -``` - -- [ ] **Step 4: Replace the `_run` worker with route -> history -> plan -> branch** - -Replace the entire body of `_run(...)` (the `try/except` block) so it delegates to a shared `_run_for_task`, and add `_run_for_task`, `_thread_history`, and `_fold_answers`: - -```python -def _run( - task: Any, - *, - svc: Any, - domain: Any, - host: str, - token: str, - llm_endpoint: str, - warehouse_id: str, - folder: str, - version: str, - domain_task_id: str, - title: str, - description: str, - comment_id: str, -) -> None: - """TaskManager entry point: delegate to the shared plan-or-run worker.""" - from back.core.task_manager import get_task_manager - - tm = get_task_manager() - try: - _run_for_task( - svc=svc, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - folder=folder, version=version, domain_task_id=domain_task_id, - title=title, description=description, comment_id=comment_id, - on_step=lambda m: tm.update_progress(task.id, task.progress, m), - tm=tm, tm_task_id=task.id, - ) - finally: - _ACTIVE_TASKS.discard(domain_task_id) - - -def _run_for_task( - *, - svc: Any, - domain: Any, - host: str, - token: str, - llm_endpoint: str, - warehouse_id: str, - folder: str, - version: str, - domain_task_id: str, - title: str, - description: str, - comment_id: str, - on_step: Callable[[str], None], - tm: Any, - tm_task_id: Optional[str], -) -> None: - """Route, reconstruct the thread Q&A, plan, then ask-again or run the agent. - - ``tm``/``tm_task_id`` are the optional TaskManager handle for progress; the - worker is fully functional without them (used directly in tests). - """ - from agents.agent_task_planner import run_agent as run_planner - from agents.agent_task_router import run_agent as run_router - from agents.registry import get_agent, list_agents - - def _tm(method: str, *args: Any) -> None: - if tm is not None and tm_task_id is not None: - getattr(tm, method)(tm_task_id, *args) - - try: - _tm("start_task", "Selecting the right agent...") - - # 1) Route (deterministic — same choice on every pass => locked route). - router_result = run_router( - host, token, llm_endpoint, - task_title=title, task_description=description, - available_agents=list_agents(), on_step=on_step, - ) - if not router_result.success or not router_result.chosen_agent_key: - reason = router_result.error or "No suitable agent for this task" - _tm("fail_task", reason) - _report(svc, folder, version, domain_task_id, comment_id, - body=f"**AI Agent**\n\nI could not route this task: {reason}", - event="agent_failed") - return - spec = get_agent(router_result.chosen_agent_key) - if spec is None: - _tm("fail_task", "Router chose an unknown agent") - return - - # 2) Plan against the conversation reconstructed from the thread. - _set_status(svc, folder, domain_task_id, "in_progress") - history = _thread_history(svc, folder, version, comment_id) - plan = run_planner( - host, token, llm_endpoint, - task_title=title, task_description=description, - agent=spec, history=history, on_step=on_step, - ) - - # 3a) Not ready -> post the plan/question and park (stay in_progress). - if not plan.ready: - question = plan.message or ( - "Could you clarify the scope of this task before I proceed?" - ) - _report(svc, folder, version, domain_task_id, comment_id, - body=f"**AI Agent — {spec.label}**\n\n{question}", - event="agent_progress") - _tm("complete_task", {"agent": spec.key, "state": "waiting_input"}, - "Waiting for your reply") - return - - # 3b) Ready -> run the chosen agent with the answers folded in. - _tm("advance_step", f"Running {spec.label}...") - task_text = _fold_answers(title, description, history) - summary, report, result = _dispatch_agent( - spec.key, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - task_text=task_text, on_step=on_step, - ) - _tm("advance_step", "Recording the result...") - _set_status(svc, folder, domain_task_id, "done") - body = f"**AI Agent — {spec.label}**\n\n" - if router_result.reasoning: - body += f"_Why this agent:_ {router_result.reasoning}\n\n" - body += report - _report(svc, folder, version, domain_task_id, comment_id, - body=body, event="task_done") - _tm("complete_task", - {"agent": spec.key, "agent_label": spec.label, **result}, summary) - except Exception as exc: # noqa: BLE001 - logger.exception("agent_task_runner: task %s crashed", domain_task_id) - _tm("fail_task", f"AI Agent run failed: {exc}") - _report(svc, folder, version, domain_task_id, comment_id, - body=f"**AI Agent**\n\nThe run failed: {exc}", - event="agent_failed") - - -def _thread_history( - svc: Any, folder: str, version: str, root_comment_id: str -) -> list[dict]: - """Reconstruct the ordered clarification Q&A from the task's thread. - - The thread is the root comment (``root_comment_id``) plus its direct replies, - ordered by ``created_at``. The AI Agent's own comments map to ``assistant``; - everyone else maps to ``user``. - """ - if not root_comment_id: - return [] - try: - comments = list(svc.list_comments(folder, version)) - except Exception as exc: # noqa: BLE001 - logger.debug("agent_task_runner: thread read skipped: %s", exc) - return [] - rid = str(root_comment_id) - thread = [ - c for c in comments - if str(c.get("id")) == rid or str(c.get("parent_id") or "") == rid - ] - thread.sort(key=lambda c: str(c.get("created_at") or "")) - history: list[dict] = [] - for c in thread: - role = "assistant" if (c.get("author") or "") == AI_AGENT_LABEL else "user" - history.append({"role": role, "text": (c.get("body") or "").strip()}) - return history - - -def _fold_answers(title: str, description: str, history: list[dict]) -> str: - """Build the agent input from the task plus the teammate's answers.""" - parts = [title] - if description: - parts.append(description) - answers = [h["text"] for h in history if h["role"] == "user" and h["text"]] - # Drop the first 'user' turn — it is the task statement itself, already above. - extra = answers[1:] if answers else [] - if extra: - parts.append("Clarifications from the assignee:\n- " + "\n- ".join(extra)) - return "\n\n".join(parts) -``` - -- [ ] **Step 5: Update `start_agent_task` step labels** (the `steps=[...]` list in `run_background_task`) - -```python - steps=[ - {"name": "route", "description": "Selecting the right agent"}, - {"name": "plan", "description": "Confirming scope with you"}, - {"name": "run", "description": "Running the selected agent"}, - ], -``` - -Also, just before `tm.run_background_task(...)`, mark the task active so a racing reply won't double-launch: - -```python - _ACTIVE_TASKS.add(task_id) - tm = get_task_manager() - task = tm.run_background_task( -``` - -- [ ] **Step 6: Add `resume_agent_task`** (after `start_agent_task`) - -```python -def resume_agent_task( - *, - svc: Any, - domain: Any, - settings: Any, - folder: str, - version: str, - task: Dict[str, Any], -) -> Optional[str]: - """Relaunch the plan-or-run worker for a parked AI-Agent *task*. - - Called when a teammate replies on the task's thread. No-op (returns ``None``) - when a pass is already running for this task. Best-effort: setup failures are - logged and surfaced as a comment. - """ - task_id = str(task.get("id") or "") - if not task_id or task_id in _ACTIVE_TASKS: - return None - - from back.core.helpers import require_serving_llm, resolve_warehouse_id - from back.core.task_manager import get_task_manager - - comment_id = str(task.get("comment_id") or "") - title = str(task.get("title") or "") - description = str(task.get("description") or "") - try: - host, token, llm_endpoint = require_serving_llm(domain, settings) - except Exception as exc: # noqa: BLE001 - logger.warning("agent_task_runner: resume blocked: %s (task=%s)", exc, task_id) - return None - try: - warehouse_id = resolve_warehouse_id(domain, settings) - except Exception: # noqa: BLE001 - warehouse_id = "" - - _ACTIVE_TASKS.add(task_id) - tm = get_task_manager() - bg = tm.run_background_task( - f"AI Agent: {title}"[:80], - "task_router", - _run, - steps=[ - {"name": "route", "description": "Selecting the right agent"}, - {"name": "plan", "description": "Confirming scope with you"}, - {"name": "run", "description": "Running the selected agent"}, - ], - svc=svc, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - folder=folder, version=version, domain_task_id=task_id, - title=title, description=description, comment_id=comment_id, - ) - logger.info("agent_task_runner: resumed task %s (bg=%s)", task_id, bg.id) - return bg.id -``` - -- [ ] **Step 7: Run tests to verify they pass** - -Run: `python -m pytest tests/units/registry/test_agent_task_runner.py -q` -Expected: PASS (existing + 4 new tests). If `_fake_svc` lacks `list_comments`, ensure it returns `[]` by default (it already does per the current module). - -- [ ] **Step 8: Commit** - -```bash -git add src/back/objects/registry/agent_task_runner.py tests/units/registry/test_agent_task_runner.py -git commit -m "feat(registry): plan-then-run worker with thread-driven resume for AI-Agent tasks" -``` - ---- - -### Task 3: Kickoff comment + resume hook in `CommentService` - -Give every standalone AI-Agent task a thread root (a kickoff comment), and resume the worker when a human replies on a parked AI-Agent task thread. - -**Files:** -- Modify: `src/back/objects/registry/CommentService.py` -- Test: `tests/units/registry/test_comment_service.py` - -- [ ] **Step 1: Write the failing tests** (append to the existing module; reuse its `_call`/`_svc` helpers — see the existing tests for their shape) - -```python -# tests/units/registry/test_comment_service.py (additions) -from back.objects.registry.agent_task_runner import AI_AGENT_PRINCIPAL - - -def test_create_ai_task_without_comment_inserts_kickoff_comment(monkeypatch): - svc = _svc() # existing helper used by this module - svc.insert_comment.return_value = {"id": "kick1", "anchor_type": "domain", - "anchor_ref": ""} - svc.insert_task.return_value = {"id": "T1"} - started = {} - monkeypatch.setattr( - "back.objects.registry.CommentService.start_agent_task", - lambda **k: started.update(k) or "bg1", - ) - _call("create_task", svc, assignee=AI_AGENT_PRINCIPAL, title="Is Person needed?", - description="evaluate", due_date=None, comment_id=None) - - svc.insert_comment.assert_called_once() # kickoff created - _, kwargs = svc.insert_task.call_args - assert kwargs["comment_id"] == "kick1" # task linked to it - assert started["comment_id"] == "kick1" # agent anchored to it - - -def test_reply_on_active_ai_task_triggers_resume(monkeypatch): - svc = _svc() - svc.insert_comment.return_value = {"id": "r2", "parent_id": "root", - "anchor_type": "domain", "anchor_ref": ""} - svc.list_tasks.return_value = [ - {"id": "T1", "assignee": AI_AGENT_PRINCIPAL, "status": "in_progress", - "comment_id": "root", "title": "x", "description": ""}, - ] - resumed = {} - monkeypatch.setattr( - "back.objects.registry.CommentService.resume_agent_task", - lambda **k: resumed.update(k) or "bg2", - ) - _call("add_comment", svc, anchor_type="domain", anchor_ref="", - body="yes go ahead", parent_id="root") - - assert resumed.get("task", {}).get("id") == "T1" - - -def test_reply_on_done_ai_task_does_not_resume(monkeypatch): - svc = _svc() - svc.insert_comment.return_value = {"id": "r3", "parent_id": "root", - "anchor_type": "domain", "anchor_ref": ""} - svc.list_tasks.return_value = [ - {"id": "T1", "assignee": AI_AGENT_PRINCIPAL, "status": "done", - "comment_id": "root", "title": "x", "description": ""}, - ] - called = {"n": 0} - monkeypatch.setattr( - "back.objects.registry.CommentService.resume_agent_task", - lambda **k: called.__setitem__("n", called["n"] + 1), - ) - _call("add_comment", svc, anchor_type="domain", anchor_ref="", - body="thanks", parent_id="root") - - assert called["n"] == 0 -``` - -Note: if this test module does not already expose `_svc`/`_call` helpers in the shape used above, adapt these three tests to the module's existing harness (it already monkeypatches `start_agent_task` in `test_create_task_ai_agent_triggers_runner`; copy that pattern). - -- [ ] **Step 2: Run tests to verify they fail** - -Run: `python -m pytest tests/units/registry/test_comment_service.py -q` -Expected: FAIL — kickoff comment not inserted; `resume_agent_task` not imported/called. - -- [ ] **Step 3: Import `resume_agent_task`** (extend the existing import block) - -```python -from back.objects.registry.agent_task_runner import ( - AI_AGENT_PRINCIPAL, - is_ai_agent, - resume_agent_task, - start_agent_task, -) -``` - -- [ ] **Step 4: Create the kickoff comment in `create_task`** - -Replace the AI-agent block in `create_task` (currently `insert_task(...)` then the `is_ai_agent` `start_agent_task(...)`) so that, for a standalone AI-Agent task, a kickoff comment is created first and used as the task's `comment_id`: - -```python - # A standalone AI-Agent task needs a thread root so its clarifying - # questions and your replies live in one place. Create a kickoff - # comment (the task statement) and anchor the task to it. - effective_comment_id = comment_id or None - if is_ai_agent(assignee) and not effective_comment_id: - kickoff_body = title + ( - f"\n\n{(description or '').strip()}" if (description or "").strip() else "" - ) - kickoff = svc.insert_comment( - folder, version, - anchor_type="domain", anchor_ref="", - author=CommentService._email(request), - body=kickoff_body, parent_id=None, - ) - if kickoff: - effective_comment_id = str(kickoff.get("id") or "") or None - - created = svc.insert_task( - folder, - version, - assignee=assignee, - created_by=CommentService._email(request), - title=title, - description=(description or "").strip(), - due_date=(due_date or None), - comment_id=effective_comment_id, - ) - if not created: - raise InfrastructureError("Failed to create task") -``` - -Then update the audit + `start_agent_task` call below to use `effective_comment_id`: - -```python - agent_task_id = None - if is_ai_agent(assignee): - agent_task_id = start_agent_task( - svc=svc, - domain=get_domain(session_mgr), - settings=settings, - folder=folder, - version=version, - task_id=created.get("id", ""), - title=title, - description=(description or "").strip(), - comment_id=effective_comment_id or "", - ) -``` - -(Use `effective_comment_id` in the `_audit(... meta={"comment_id": ...})` call too, for consistency.) - -- [ ] **Step 5: Add the resume hook to `add_comment`** - -After the existing successful-insert block in `add_comment` (right before `return {"success": True, "comment": created}`), add: - -```python - CommentService._maybe_resume_agent( - svc, session_mgr, settings, folder, version, created, - author=CommentService._email(request), - ) - return {"success": True, "comment": created} -``` - -And add the helper (next to the other private helpers): - -```python - @staticmethod - def _maybe_resume_agent( - svc, - session_mgr: SessionManager, - settings, - folder: str, - version: str, - comment: Dict[str, Any], - *, - author: str, - ) -> None: - """Resume a parked AI-Agent task when a teammate replies on its thread. - - Best-effort: the AI Agent's own outcome comments are written through the - store (not this method), so only human replies reach here. Matches the - new comment's thread root against an active AI-Agent task's ``comment_id``. - """ - from back.objects.registry.agent_task_runner import AI_AGENT_LABEL - - try: - if (author or "") == AI_AGENT_LABEL: - return - root = str(comment.get("parent_id") or comment.get("id") or "") - if not root: - return - for task in svc.list_tasks(folder, version): - if not is_ai_agent(task.get("assignee") or ""): - continue - if (task.get("status") or "") != "in_progress": - continue - if str(task.get("comment_id") or "") != root: - continue - resume_agent_task( - svc=svc, - domain=get_domain(session_mgr), - settings=settings, - folder=folder, - version=version, - task=task, - ) - break - except Exception as exc: # noqa: BLE001 - logger.debug("CommentService: agent resume skipped: %s", exc) -``` - -- [ ] **Step 6: Run tests to verify they pass** - -Run: `python -m pytest tests/units/registry/test_comment_service.py -q` -Expected: PASS (existing + 3 new). - -- [ ] **Step 7: Commit** - -```bash -git add src/back/objects/registry/CommentService.py tests/units/registry/test_comment_service.py -git commit -m "feat(registry): kickoff comment + reply-driven resume for AI-Agent tasks" -``` - ---- - -### Task 4: Docs, changelog, full test run - -**Files:** -- Modify: `docs/architecture.md` -- Create/append: `changelogs/v0.6.0/benoitcayladbx_2026-06-18.log` - -- [ ] **Step 1: Update `docs/architecture.md`** - -In the "AI Agent task assignment" subsection, document the clarify-then-run loop: route -> planner (`agent_task_planner`) -> park (`in_progress`, plan/question posted) -> resume on reply (`CommentService.add_comment` -> `resume_agent_task`) -> run when ready. Add `agent_task_planner/` to the `src/agents/` listing. - -- [ ] **Step 2: Append a changelog section** (version from `pyproject.toml`) - -Title: "Feature: AI Agent asks clarifying questions before running". Include context, the numbered change list (planner agent, plan-or-run worker + resume, kickoff comment + reply hook), modified files, and the test result. - -- [ ] **Step 3: Run the targeted suites** - -Run: `python -m pytest tests/units/agents/test_agent_task_planner.py tests/units/agents/test_agent_task_router.py tests/units/registry/test_agent_task_runner.py tests/units/registry/test_comment_service.py -q` -Expected: PASS. - -- [ ] **Step 4: Run the full suite and record the result** - -Run: `python -m pytest -q` -Expected: no NEW failures vs. baseline. (The repo currently has ~59 pre-existing failures in `tests/units/api/*` caused by global test-ordering pollution — they pass in isolation and are unrelated to this change. Record the count and note it, do not try to fix it here.) - -- [ ] **Step 5: Commit** - -```bash -git add docs/architecture.md changelogs/v0.6.0/benoitcayladbx_2026-06-18.log -git commit -m "docs: document AI-Agent clarify-then-run loop + changelog" -``` - ---- - -## Self-review notes - -- **Spec coverage:** planner (Task 1), park/resume/multi-round/locked-route/answer-fold-in (Task 2), kickoff comment + reply hook + active-only/done-excluded triggers (Task 3), docs/changelog/tests (Task 4). Always-confirm is enforced because the first pass has no `user` answers in history, so the planner returns `ready=false`. -- **Type consistency:** `PlanResult{success, ready, message, ...}` (Task 1) is consumed in Task 2 as `plan.ready`/`plan.message`. `_thread_history` returns `[{"role", "text"}]`, consumed by the planner's `history` param and by `_fold_answers`. `resume_agent_task(svc, domain, settings, folder, version, task)` signature matches the `CommentService._maybe_resume_agent` call. -- **Guard:** `_ACTIVE_TASKS` is added in both `start_agent_task` and `resume_agent_task` and cleared in `_run`'s `finally`. -- **Known caveat:** `_thread_history` assumes one-level threads (replies parent to the root). The agent posts with `parent_id = comment_id` and the UI replies to the root, so this holds for the current comments panel. diff --git a/docs/superpowers/specs/2026-06-18-ai-agent-clarifying-questions-design.md b/docs/superpowers/specs/2026-06-18-ai-agent-clarifying-questions-design.md deleted file mode 100644 index a003a735..00000000 --- a/docs/superpowers/specs/2026-06-18-ai-agent-clarifying-questions-design.md +++ /dev/null @@ -1,170 +0,0 @@ -# AI Agent clarifying questions before running - -**Date:** 2026-06-18 -**Status:** Design — pending implementation plan -**Author:** benoitcayladbx - -## Problem - -A collaborative task assigned to the AI Agent fires immediately: the router -picks a specialized agent and runs it as a background job, then posts one report -comment. When the task is ambiguous the router can guess wrong (e.g. "evaluate -whether the `Person` class is necessary" was routed to the whole-ontology -Generator instead of the in-place Ontology Assistant). The user never gets a -chance to confirm scope or supply missing detail before work happens. - -## Goal - -Before running, the AI Agent posts a short plan plus any clarifying questions in -the task's Discussion thread, parks the task, and resumes automatically when the -user replies. It may ask follow-ups across several replies until it is confident, -then runs the chosen specialized agent and reports the outcome. - -## Decisions (locked) - -| Question | Decision | -|----------|----------| -| Loop model | **Park & resume** — post questions, park the task, resume on reply | -| Trigger | **Always confirm** — every AI-Agent task posts a plan + questions and waits for a go-ahead before running | -| Approval | **Any reply resumes** — the reply text is fed to the agent as answers/approval | -| Rounds | **Multi-round** — the agent may ask follow-ups until confident, then run | -| Routing | **Locked at start** — the router picks the agent once; clarification happens within that agent's scope | -| Architecture | **Thread is the source of truth** (Approach A) — the comment thread *is* the clarification conversation; no separate transcript storage | - -### Implementation refinements (zero schema change) - -To ship without a Postgres `CHECK`-constraint migration or base/file-store -changes, the locked decisions above are realized as follows: - -- **No new task status.** The parked ("waiting on you") state reuses the - existing `in_progress` status. A distinct, user-visible `waiting_input` status - is a follow-up (it requires altering the `domain_tasks.status` CHECK and the - store validation in three places). -- **Locked route without persistence.** The router runs at temperature 0 and is - deterministic, so on resume we simply re-run it on the same title/description — - the same agent is chosen every time. No `agent_key` column is added. -- **Linkage via the existing `comment_id`.** Every AI-Agent task is anchored to a - thread root comment: tasks born from a comment already have one; for standalone - tasks `create_task` first inserts a domain-level **kickoff comment** (the task - statement) and stores its id as the task's `comment_id`. A human reply whose - thread root equals a task's `comment_id` triggers resume. - -## Flow - -1. Task assigned to the AI Agent (`assignee == AI_AGENT_PRINCIPAL`) → - `start_agent_task` launches a background job (as today). -2. **Route once:** the existing `agent_task_router` picks the specialized agent - and records the choice. The choice is persisted on the task and not - re-evaluated on later turns. -3. **Plan / ask:** a new single-shot **planner** step receives the task - (title + description), the chosen agent's spec, and the conversation history - reconstructed from the thread. It returns `{ready: bool, message: str}`. - - First pass always returns `ready=false` with a plan + questions (the - "always confirm" rule), so the very first turn never runs the agent. - - Posts `message` as a comment under the task thread, keeps the task - `in_progress` (the parked state), and ends the job. -4. **Resume on reply:** when a human posts a comment under a parked AI-Agent task - thread, a resume hook in `CommentService.add_comment` launches a resume job - (`resume_agent_task`). Only human-authored API comments flow through - `add_comment`; the agent's own comments are written via the store directly, so - they never self-trigger. -5. **Re-plan:** the resume job re-runs the (deterministic) router, rebuilds the - Q&A history from the thread, and calls the planner again. - - `ready=false` → post the follow-up question, stay `in_progress`. - - `ready=true` → run the chosen specialized agent with the user's accumulated - answers folded into its input, post the outcome report, set status `done`. - -## Components - -### `src/agents/agent_task_planner/` (new) - -Single-shot LLM agent, mirroring `agent_task_router` (`engine.py`, `tools.py`, -`__init__.py`). - -- **Input:** task title/description, chosen `AgentSpec`, conversation history - (ordered list of `{role, text}` derived from the thread — AI Agent comments are - `assistant`, human replies are `user`). -- **Output:** `PlanResult { ready: bool, message: str, error: str }`. - - `ready=false`: `message` is the plan and/or the next question(s). - - `ready=true`: `message` is a brief "running now" confirmation; the runner then - dispatches the specialized agent. -- Degrades gracefully: on parse/LLM failure returns `error`; the runner posts an - error note and leaves the task `waiting_input` so a retry reply re-triggers. - -### `src/back/objects/registry/agent_task_runner.py` - -- Extract the post-route worker logic into one `_run` worker that does - route → history → plan → branch, used by both the initial and the resume job. -- `start_agent_task` (existing): launches the worker; the first pass always parks - with a plan + questions (history has no user answers yet). -- `resume_agent_task` (new): launches the same worker for a parked task. -- A module-level in-process guard (set of active `domain_task_id`s) prevents a - reply from starting a second concurrent run while one is in flight. -- `_thread_history(svc, folder, version, root_comment_id)`: reconstruct the - ordered Q&A from the thread rooted at the task's `comment_id` (the root comment - plus its replies, ordered by `created_at`). AI Agent author (`AI_AGENT_LABEL`) - → `assistant`; everyone else → `user`. -- The chosen agent is obtained by re-running the deterministic router each pass - (routing is locked; no persistence needed). -- Folding answers into agent input: the user's accumulated answers are appended - to the task text passed to `_dispatch_agent`. - - **Ontology Assistant:** `user_message` = task text + accumulated user answers. - - **Generator / rules / icons / mapper:** the confirmation gates the run; the - answers ride along in the task text where the bridge accepts free text. - -### `src/back/objects/registry/CommentService.py` - -- `create_task`: when `is_ai_agent(assignee)` and there is no originating - `comment_id`, first insert a domain-level **kickoff comment** (the task - statement) and pass its id as the task's `comment_id`, so every AI-Agent task - has a thread root. -- `add_comment`: after a successful insert, best-effort detect whether the new - (human) comment's thread root matches an active AI-Agent task and, if so, call - `resume_agent_task`. The AI Agent's own comments are written through the store - (`_report`), not `add_comment`, so they never trigger resume. Failures are - logged, not surfaced. - -## Data flow & linkage - -- Every AI-Agent task carries a `comment_id` thread root (originating comment, or - the kickoff comment for standalone tasks). -- Parked/active tasks = `assignee == AI_AGENT_PRINCIPAL` AND - `status == "in_progress"`. -- A new human comment whose thread root equals such a task's `comment_id` - triggers resume. -- The thread itself stores the full clarification transcript — no extra table. - -## Error handling - -- **Planner LLM failure:** post an error comment; leave the task `in_progress` - so the next human reply re-triggers planning. -- **Specialized agent failure:** unchanged from today — post a failure comment; - the task status reflects the failure. -- **Concurrent reply while running:** the in-process guard drops the second - resume so the agent never runs twice for one task at once. -- **No reply ever:** the task stays `in_progress` indefinitely (acceptable; - surfacing parked tasks distinctly in "My Tasks" is a separate follow-up). -- **Invariant:** the agent never runs without at least one human reply on the - thread (honors "always confirm"). - -## Testing - -- **Planner unit tests:** ready vs. ask decisions; graceful degradation on - unparseable/empty LLM output. -- **Runner tests:** first pass parks with a plan; resume that still needs info - asks again and stays `waiting_input`; resume that is ready runs the agent and - marks `done`; thread-history reconstruction maps authors to roles correctly. -- **CommentService tests:** standalone AI-Agent task creation inserts a kickoff - comment and links it; a human reply under an active AI-Agent task triggers - `resume_agent_task`; a reply under a `done`/non-agent task does not. - -## Out of scope / follow-ups - -- Re-routing on resume (locked route for v1). -- A distinct, user-visible `waiting_input` task status (needs a CHECK-constraint - migration + store validation changes); v1 reuses `in_progress`. -- Surfacing parked AI-Agent tasks in the "My Tasks" worklist (sentinel assignee - is not a user email). -- Auto-applying results for the non-conversational agents (generator, rules, - icons, mapper still produce proposals; only the Ontology Assistant applies). -- Dedicated UI affordances (Approve/Run buttons) — v1 infers from comment text. diff --git a/src/agents/agent_task_planner/__init__.py b/src/agents/agent_task_planner/__init__.py deleted file mode 100644 index 0e2478de..00000000 --- a/src/agents/agent_task_planner/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from agents.agent_task_planner.engine import PlanResult, run_agent # noqa: F401 - -__all__ = ["run_agent", "PlanResult"] diff --git a/src/agents/agent_task_planner/engine.py b/src/agents/agent_task_planner/engine.py deleted file mode 100644 index cc8555f1..00000000 --- a/src/agents/agent_task_planner/engine.py +++ /dev/null @@ -1,182 +0,0 @@ -""" -Task Planner agent engine. - -Single-shot gate that runs BEFORE a specialized agent does any work. Given the -task, the agent already chosen by the router, and the clarification Q&A so far -(reconstructed from the Discussion thread), the LLM decides whether it has -enough to act confidently (``ready=true``) or must ask the assignee more -(``ready=false`` + a short plan/question ``message``). JSON in / JSON out. -""" -from __future__ import annotations - -import json -import re -from dataclasses import dataclass, field -from typing import Callable, Dict, List, Optional - -from agents.engine_base import ( - AgentStep, - accumulate_usage, - call_serving_endpoint, - extract_message_content, -) -from agents.registry import AgentSpec -from agents.tracing import trace_agent -from back.core.logging import get_logger - -logger = get_logger(__name__) - -LLM_TIMEOUT = 60 -_TRACE_NAME = "task_planner" - - -@dataclass -class PlanResult: - """Outcome of a single planning turn.""" - - success: bool - ready: bool = False - message: str = "" - steps: List[AgentStep] = field(default_factory=list) - iterations: int = 0 - error: str = "" - usage: Dict[str, int] = field(default_factory=dict) - - -_SYSTEM_PROMPT = """\ -You are the Task Planner for OntoBricks. A teammate assigned a work item to the -"AI Agent", and a specialized agent has already been selected to carry it out. -Before that agent runs, you confirm scope with the teammate. - -You are given: the task, the selected agent's purpose, and the conversation so -far (your earlier questions and the teammate's replies, if any). - -RULES -- On the FIRST turn (no teammate replies yet) you are NOT ready: briefly state - what you will do and ask any clarifying question(s) needed to act safely. -- Mark ready=true ONLY once the teammate has replied with enough to proceed - (an approval or the missing detail). When unsure, ask one more focused - question rather than guessing. -- Keep messages short and concrete. No code fences. -- Reply with ONLY a JSON object: - {"ready": , "message": ""} -""" - - -def _build_user_prompt( - task_title: str, - task_description: str, - agent: AgentSpec, - history: List[dict], -) -> str: - lines = [ - f"SELECTED AGENT: {agent.label} — {agent.description}", - "", - f"TASK TITLE: {task_title}", - ] - if task_description: - lines.append(f"TASK DESCRIPTION: {task_description}") - lines.append("") - if history: - lines.append("CONVERSATION SO FAR:") - for turn in history: - who = "AI Agent" if turn.get("role") == "assistant" else "Teammate" - lines.append(f"- {who}: {turn.get('text', '')}") - else: - lines.append("CONVERSATION SO FAR: (none yet — this is the first turn)") - lines.append("") - lines.append('Respond with the JSON object: {"ready": ..., "message": "..."}') - return "\n".join(lines) - - -def _parse_plan(text: str) -> Optional[dict]: - """Extract the ``{"ready": ..., "message": ...}`` object from LLM text.""" - cleaned = (text or "").strip() - fence = re.search(r"```(?:json)?\s*([\s\S]*?)```", cleaned) - if fence: - cleaned = fence.group(1).strip() - for candidate in (cleaned, None): - if candidate is None: - brace = re.search(r"\{[\s\S]*\}", cleaned) - candidate = brace.group(0) if brace else None - if not candidate: - continue - try: - obj = json.loads(candidate) - if isinstance(obj, dict): - return obj - except json.JSONDecodeError: - continue - return None - - -@trace_agent(name="task_planner") -def run_agent( - host: str, - token: str, - endpoint_name: str, - *, - task_title: str, - task_description: str, - agent: AgentSpec, - history: List[dict], - on_step: Optional[Callable[[str], None]] = None, -) -> PlanResult: - """Decide whether to run the selected agent now or ask the teammate more. - - ``history`` is the ordered clarification Q&A: ``[{"role": "assistant"|"user", - "text": str}, ...]``. ``success`` is ``True`` when the LLM replied parseably; - ``ready`` gates the actual run. On any failure ``ready`` stays ``False`` so - the agent never runs without a confident go-ahead. - """ - result = PlanResult(success=False) - - if on_step: - on_step("Reviewing the task scope...") - - messages = [ - {"role": "system", "content": _SYSTEM_PROMPT}, - { - "role": "user", - "content": _build_user_prompt( - task_title, task_description, agent, history - ), - }, - ] - - result.iterations = 1 - try: - llm_response = call_serving_endpoint( - host, - token, - endpoint_name, - messages, - max_tokens=512, - temperature=0.0, - timeout=LLM_TIMEOUT, - trace_name=_TRACE_NAME, - ) - except Exception as exc: # noqa: BLE001 - result.error = f"Planner LLM request failed: {exc}" - logger.error("task_planner: %s", result.error) - return result - - accumulate_usage(result.usage, llm_response.get("usage", {})) - content = extract_message_content(llm_response) - result.steps.append(AgentStep(step_type="output", content=content[:500])) - - plan = _parse_plan(content) - if not plan: - result.error = "Planner returned an unparseable response" - result.message = ( - "I need a bit more detail before I proceed — could you clarify the " - "scope of this task?" - ) - logger.warning("task_planner: unparseable response: %s", content[:200]) - return result - - result.success = True - result.ready = bool(plan.get("ready", False)) - result.message = str(plan.get("message", "")).strip() - logger.info("task_planner: ready=%s", result.ready) - return result diff --git a/src/agents/agent_task_planner/tools.py b/src/agents/agent_task_planner/tools.py deleted file mode 100644 index 2d08538a..00000000 --- a/src/agents/agent_task_planner/tools.py +++ /dev/null @@ -1,7 +0,0 @@ -"""The planner is single-shot and uses no tools (kept for package symmetry).""" -from __future__ import annotations - -from typing import Callable, Dict, List - -TOOL_DEFINITIONS: List[dict] = [] -TOOL_HANDLERS: Dict[str, Callable] = {} diff --git a/src/agents/agent_task_router/__init__.py b/src/agents/agent_task_router/__init__.py deleted file mode 100644 index 19ff7805..00000000 --- a/src/agents/agent_task_router/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -""" -Task Router Agent -- picks which specialized OntoBricks agent should carry -out a task assigned to the "AI Agent". - -Single-shot classifier (no tool loop). Driven by -:func:`back.objects.registry.agent_task_runner.start_agent_task`, which runs -the chosen agent against the task's domain in a background thread. - -Exports: - run_agent / AgentResult -""" - -from agents.agent_task_router.engine import AgentResult, run_agent # noqa: F401 - -__all__ = ["run_agent", "AgentResult"] diff --git a/src/agents/agent_task_router/engine.py b/src/agents/agent_task_router/engine.py deleted file mode 100644 index b6b5ccf6..00000000 --- a/src/agents/agent_task_router/engine.py +++ /dev/null @@ -1,192 +0,0 @@ -""" -Task Router Agent engine. - -A single-shot classifier: given a task's title + description and the list of -dispatchable agents (:mod:`agents.registry`), the LLM picks the one agent best -suited to carry the task out and explains why. No tool-calling loop -- one -serving-endpoint call, JSON in / JSON out. - -The orchestrator (:mod:`back.objects.registry.agent_task_runner`) consumes -:attr:`AgentResult.chosen_agent_key` to actually run the specialized agent. -""" - -from __future__ import annotations - -import json -import re -from dataclasses import dataclass, field -from typing import Callable, Dict, List, Optional - -from agents.engine_base import ( - AgentStep, - accumulate_usage, - call_serving_endpoint, - extract_message_content, -) -from agents.registry import AgentSpec -from agents.tracing import trace_agent -from back.core.logging import get_logger - -logger = get_logger(__name__) - -LLM_TIMEOUT = 60 -_TRACE_NAME = "task_router" - - -@dataclass -class AgentResult: - """Outcome of a routing decision.""" - - success: bool - chosen_agent_key: str = "" - reasoning: str = "" - steps: List[AgentStep] = field(default_factory=list) - iterations: int = 0 - error: str = "" - usage: Dict[str, int] = field(default_factory=dict) - - -_SYSTEM_PROMPT = """\ -You are the Task Router for OntoBricks. A teammate assigned a work item to the -"AI Agent". Your only job is to decide which ONE specialized agent should carry -out the task, based on the task title and description. - -You will be given the list of available agents, each with a key and a -description of what it does and when to pick it. - -RULES -- Choose exactly one agent whose purpose matches the task intent. -- The ontology IS the domain model. Tasks that ask to design, model, create, - add, structure, or restructure a domain concept / entity / class / - relationship are ontology DESIGN tasks -- route them to the Ontology Assistant - (the default for ontology design and editing), even when phrased as "build" or - "create" something. A name you don't recognize is most likely a domain entity - to model, not unrelated work. -- Only choose "none" for tasks clearly unrelated to the ontology / data model, - its mappings, business rules, or entity icons (e.g. infrastructure, app code, - or off-topic requests). -- Reply with ONLY a JSON object, no prose, no code fences: - {"agent": "", "reasoning": ""} -""" - - -def _build_user_prompt( - task_title: str, task_description: str, available_agents: List[AgentSpec] -) -> str: - lines = ["AVAILABLE AGENTS:"] - for spec in available_agents: - lines.append(f'- key="{spec.key}" ({spec.label}): {spec.description}') - lines.append("") - lines.append(f"TASK TITLE: {task_title}") - if task_description: - lines.append(f"TASK DESCRIPTION: {task_description}") - lines.append("") - lines.append('Respond with the JSON object: {"agent": "...", "reasoning": "..."}') - return "\n".join(lines) - - -def _parse_decision(text: str) -> Optional[dict]: - """Extract the ``{"agent": ..., "reasoning": ...}`` object from LLM text.""" - cleaned = (text or "").strip() - fence = re.search(r"```(?:json)?\s*([\s\S]*?)```", cleaned) - if fence: - cleaned = fence.group(1).strip() - try: - obj = json.loads(cleaned) - if isinstance(obj, dict): - return obj - except json.JSONDecodeError: - pass - brace = re.search(r"\{[\s\S]*\}", cleaned) - if brace: - try: - obj = json.loads(brace.group(0)) - if isinstance(obj, dict): - return obj - except json.JSONDecodeError: - return None - return None - - -@trace_agent(name="task_router") -def run_agent( - host: str, - token: str, - endpoint_name: str, - *, - task_title: str, - task_description: str, - available_agents: List[AgentSpec], - on_step: Optional[Callable[[str], None]] = None, -) -> AgentResult: - """Pick the agent that should carry out *task_title* / *task_description*. - - Returns an :class:`AgentResult`; ``success`` is ``True`` only when a valid, - known agent key was chosen. ``chosen_agent_key`` is empty when the router - decided no agent fits (``reasoning`` explains why). - """ - result = AgentResult(success=False) - valid_keys = {spec.key for spec in available_agents} - - if not available_agents: - result.error = "No dispatchable agents are registered" - return result - - if on_step: - on_step("Selecting the right agent for this task...") - - messages = [ - {"role": "system", "content": _SYSTEM_PROMPT}, - { - "role": "user", - "content": _build_user_prompt( - task_title, task_description, available_agents - ), - }, - ] - - result.iterations = 1 - try: - llm_response = call_serving_endpoint( - host, - token, - endpoint_name, - messages, - max_tokens=256, - temperature=0.0, - timeout=LLM_TIMEOUT, - trace_name=_TRACE_NAME, - ) - except Exception as exc: # noqa: BLE001 - result.error = f"Router LLM request failed: {exc}" - logger.error("task_router: %s", result.error) - return result - - accumulate_usage(result.usage, llm_response.get("usage", {})) - content = extract_message_content(llm_response) - result.steps.append(AgentStep(step_type="output", content=content[:500])) - - decision = _parse_decision(content) - if not decision: - result.error = "Router returned an unparseable response" - logger.warning("task_router: unparseable response: %s", content[:200]) - return result - - chosen = str(decision.get("agent", "")).strip() - reasoning = str(decision.get("reasoning", "")).strip() - result.reasoning = reasoning - - if chosen.lower() in ("", "none", "null"): - result.error = reasoning or "No suitable agent for this task" - logger.info("task_router: no agent chosen (%s)", result.error) - return result - - if chosen not in valid_keys: - result.error = f"Router chose an unknown agent: {chosen}" - logger.warning("task_router: %s", result.error) - return result - - result.success = True - result.chosen_agent_key = chosen - logger.info("task_router: chose '%s' — %s", chosen, reasoning) - return result diff --git a/src/agents/agent_task_router/tools.py b/src/agents/agent_task_router/tools.py deleted file mode 100644 index 98ffbf68..00000000 --- a/src/agents/agent_task_router/tools.py +++ /dev/null @@ -1,13 +0,0 @@ -""" -Tool definitions for the Task Router agent. - -The router is a single-shot classifier and intentionally exposes **no** tools: -it reads the task + the static agent registry and returns a routing decision in -one LLM call. These empty collections exist only for parity with the other -agent packages (every ``agent_*`` package ships a ``tools`` module). -""" - -from typing import Callable, Dict, List - -TOOL_DEFINITIONS: List[dict] = [] -TOOL_HANDLERS: Dict[str, Callable] = {} diff --git a/src/agents/registry.py b/src/agents/registry.py deleted file mode 100644 index 0b9f6e04..00000000 --- a/src/agents/registry.py +++ /dev/null @@ -1,121 +0,0 @@ -""" -Static registry of the agents that the task router may dispatch to. - -OntoBricks discovers agents statically (one package per agent under -``src/agents/agent_*``); there is no dynamic factory. This module mirrors that -convention: it lists the *dispatchable* agents -- the ones the -:mod:`agents.agent_task_router` can pick and the orchestrator -(:mod:`back.objects.registry.agent_task_runner`) knows how to run from a -domain session. - -Only agents that already have background-task + domain-context wiring are -listed here. Interactive chat agents (dtwin chat, ontology assistant, cohort) -are intentionally excluded -- they need a live conversation, not a task. -""" - -from __future__ import annotations - -from dataclasses import dataclass -from typing import List, Optional - - -@dataclass(frozen=True) -class AgentSpec: - """One dispatchable agent the router can choose. - - Attributes: - key: Stable identifier used by the router output and the orchestrator - dispatch table. - label: Human-readable name surfaced in task comments / UI. - description: What the agent does and *when to pick it* -- fed verbatim - to the router LLM, so phrase it as routing guidance. - task_type: The :class:`~back.core.task_manager.models.Task` ``task_type`` - the underlying agent runs under (kept for parity with the existing - background routes). - """ - - key: str - label: str - description: str - task_type: str - - -DISPATCHABLE_AGENTS: List[AgentSpec] = [ - AgentSpec( - key="ontology_assistant", - label="Ontology Assistant", - description=( - "Design and edit the domain ontology (the data model) in place and " - "save the changes. This is the default agent for any ontology " - "MODELING or DESIGN task: create, add, model, or design new " - "classes/entities/relationships (e.g. 'create an Agent Manager " - "entity'); rename, merge, split, or remove existing ones; evaluate " - "whether a class is necessary; adjust the class hierarchy or a " - "relationship's domain/range. Pick this whenever the task is about " - "shaping what concepts/entities exist in the ontology, including " - "targeted edits and incremental design (changes are applied " - "directly). Prefer this over the Generator unless the task asks to " - "(re)build the WHOLE ontology from scratch." - ), - task_type="ontology_assistant", - ), - AgentSpec( - key="owl_generator", - label="Ontology Generator", - description=( - "Generate the WHOLE OWL/Turtle ontology from scratch from the " - "imported Unity Catalog metadata and domain documents. Pick this " - "only to bootstrap a brand-new ontology or fully regenerate " - "everything -- NOT for editing or tweaking a few classes (use the " - "Ontology Assistant for targeted edits)." - ), - task_type="ontology_generation", - ), - AgentSpec( - key="business_rules_generator", - label="Business Rules Generator", - description=( - "Propose business rules (SWRL inferences, decision tables, SPARQL " - "queries, aggregate constraints) from the existing ontology " - "design. Pick this when the task asks to add, define, generate, or " - "suggest business rules, logic, inferences, constraints, or " - "validations." - ), - task_type="business_rules_generation", - ), - AgentSpec( - key="icon_assign", - label="Icon Assigner", - description=( - "Assign a representative emoji icon to each ontology entity. Pick " - "this when the task asks to set, assign, choose, or refresh icons " - "or emojis for entities / classes." - ), - task_type="auto_assign_icons", - ), - AgentSpec( - key="auto_assignment", - label="Auto SQL Mapper", - description=( - "Map ontology entities and relationships to validated SQL queries " - "over the warehouse tables. Pick this when the task asks to map, " - "assign, or connect entities / relationships to tables, columns, " - "or data, or to build the SQL mappings." - ), - task_type="auto_assign", - ), -] - - -def list_agents() -> List[AgentSpec]: - """Return the dispatchable agent specs (a copy, safe to mutate).""" - return list(DISPATCHABLE_AGENTS) - - -def get_agent(key: str) -> Optional[AgentSpec]: - """Return the :class:`AgentSpec` for *key*, or ``None`` when unknown.""" - key = (key or "").strip() - for spec in DISPATCHABLE_AGENTS: - if spec.key == key: - return spec - return None diff --git a/src/back/objects/mapping/Mapping.py b/src/back/objects/mapping/Mapping.py index 8a196640..ed36b9b3 100644 --- a/src/back/objects/mapping/Mapping.py +++ b/src/back/objects/mapping/Mapping.py @@ -960,30 +960,6 @@ def _merge_relationship_mappings( merged.append(new_m) return merged - def apply_agent_mappings( - self, - entity_mappings: Optional[List[Dict[str, Any]]], - relationship_mappings: Optional[List[Dict[str, Any]]], - ) -> Dict[str, int]: - """Merge agent-proposed mappings into the domain and persist to the registry. - - The session-less counterpart of :meth:`save_mappings_to_session`: it - upserts into ``domain.assignment`` (preserving ``excluded`` flags) and - calls ``domain.save()``. Used by the background AI-Agent task runner, - which has a domain but no HTTP session. Returns the post-merge totals. - """ - domain = self._domain - merged_e = Mapping._merge_entity_mappings( - domain.get_entity_mappings(), entity_mappings or [] - ) - merged_r = Mapping._merge_relationship_mappings( - domain.get_relationship_mappings(), relationship_mappings or [] - ) - domain.assignment["entities"] = merged_e - domain.assignment["relationships"] = merged_r - domain.save() - return {"entities": len(merged_e), "relationships": len(merged_r)} - @staticmethod def save_mappings_to_session( session_id: Optional[str], diff --git a/src/back/objects/registry/CommentService.py b/src/back/objects/registry/CommentService.py index 3a2f598f..24f47ba1 100644 --- a/src/back/objects/registry/CommentService.py +++ b/src/back/objects/registry/CommentService.py @@ -42,12 +42,6 @@ ValidationError, ) from back.core.logging import get_logger -from back.objects.registry.agent_task_runner import ( - AI_AGENT_PRINCIPAL, - is_ai_agent, - resume_agent_task, - start_agent_task, -) from back.objects.registry.RegistryService import RegistryCfg, RegistryService from back.objects.registry.PermissionService import ( ASSIGNABLE_ROLES, @@ -143,10 +137,6 @@ def add_comment( ) if not created: raise InfrastructureError("Failed to save comment") - CommentService._maybe_resume_agent( - svc, session_mgr, settings, folder, version, created, - author=CommentService._email(request), - ) return {"success": True, "comment": created} @staticmethod @@ -268,17 +258,6 @@ def list_assignees( members.sort( key=lambda m: (-role_level(m["role"]), m["display_name"].lower()) ) - # The AI Agent is always assignable: picking it routes the task to the - # right specialized agent and runs it asynchronously. Listed first. - members.insert( - 0, - { - "principal": AI_AGENT_PRINCIPAL, - "principal_type": "agent", - "display_name": "AI Agent", - "role": "agent", - }, - ) return {"success": True, "domain": folder, "members": members} @staticmethod @@ -313,28 +292,7 @@ def create_task( CommentService._require_member(user_role, user_domain_role) CommentService._require_writable(status) - # A standalone AI-Agent task needs a thread root so its clarifying - # questions and your replies live in one place. Create a kickoff - # comment (the task statement) and anchor the task to it. effective_comment_id = comment_id or None - if is_ai_agent(assignee) and not effective_comment_id: - kickoff_body = title + ( - f"\n\n{(description or '').strip()}" if (description or "").strip() else "" - ) - kickoff = svc.insert_comment( - folder, version, - author=CommentService._email(request), - body=kickoff_body, parent_id=None, - ) - if kickoff: - effective_comment_id = str(kickoff.get("id") or "") or None - else: - logger.warning( - "create_task: kickoff comment could not be created for " - "AI-Agent task in %s/%s; the task will have no thread root " - "and cannot be resumed", folder, version, - ) - created = svc.insert_task( folder, version, @@ -361,26 +319,7 @@ def create_task( }, ) - # When assigned to the AI Agent, kick off the async router that picks - # and runs the right specialized agent against this domain. - agent_task_id = None - if is_ai_agent(assignee): - agent_task_id = start_agent_task( - svc=svc, - domain=get_domain(session_mgr), - settings=settings, - folder=folder, - version=version, - task_id=created.get("id", ""), - title=title, - description=(description or "").strip(), - comment_id=effective_comment_id or "", - ) - - result = {"success": True, "task": created} - if agent_task_id: - result["agent_task_id"] = agent_task_id - return result + return {"success": True, "task": created} @staticmethod def update_task_status( @@ -488,50 +427,6 @@ def _audit( except Exception as exc: # noqa: BLE001 logger.debug("collab audit append skipped: %s", exc) - @staticmethod - def _maybe_resume_agent( - svc, - session_mgr: SessionManager, - settings, - folder: str, - version: str, - comment: Dict[str, Any], - *, - author: str, - ) -> None: - """Resume a parked AI-Agent task when a teammate replies on its thread. - - Best-effort: the AI Agent's own outcome comments are written through the - store (not this method), so only human replies reach here. Matches the - new comment's thread root against an active AI-Agent task's ``comment_id``. - """ - from back.objects.registry.agent_task_runner import AI_AGENT_LABEL - - try: - if (author or "") == AI_AGENT_LABEL: - return - root = str(comment.get("parent_id") or comment.get("id") or "") - if not root: - return - for task in svc.list_tasks(folder, version): - if not is_ai_agent(task.get("assignee") or ""): - continue - if (task.get("status") or "") != "in_progress": - continue - if str(task.get("comment_id") or "") != root: - continue - resume_agent_task( - svc=svc, - domain=get_domain(session_mgr), - settings=settings, - folder=folder, - version=version, - task=task, - ) - break - except Exception as exc: # noqa: BLE001 - logger.debug("CommentService: agent resume skipped: %s", exc) - @staticmethod def _is_comment_author( svc: RegistryService, diff --git a/src/back/objects/registry/agent_task_runner.py b/src/back/objects/registry/agent_task_runner.py deleted file mode 100644 index f6c142f0..00000000 --- a/src/back/objects/registry/agent_task_runner.py +++ /dev/null @@ -1,718 +0,0 @@ -""" -AI-Agent task runner -- the bridge between a task assigned to the "AI Agent" -and the specialized OntoBricks agents. - -When a collaborative task is created with the AI-agent sentinel assignee -(:data:`AI_AGENT_PRINCIPAL`), :func:`start_agent_task` spins up a background -:class:`~back.core.task_manager.TaskManager` job that runs a *plan-or-run* loop: - -1. route -- :mod:`agents.agent_task_router` picks the best agent (deterministic, - so the choice is stable on every pass), -2. reconstruct the clarification Q&A from the task's Discussion thread, -3. plan -- :mod:`agents.agent_task_planner` decides whether the scope is clear, -4. on the FIRST pass (no human reply yet beyond the task statement) -- or when - the planner is not ready -- post a short plan/question and *park* the task - (status stays ``in_progress``). The first-pass park is code-enforced, not - left to the planner's prompt. - -A teammate's reply on the thread relaunches the same worker via -:func:`resume_agent_task`; an in-process guard prevents double concurrent runs. -Once the planner is ready (and a human has replied), the chosen agent runs with -the answers folded in, the outcome is posted to the Discussion, and the task is -marked ``done``. -""" - -from __future__ import annotations - -import re -import threading -from typing import Any, Callable, Dict, Optional, Tuple - -from back.core.logging import get_logger - -logger = get_logger(__name__) - -# Removal/unmapping intent. The Auto SQL Mapper (the only mapping agent) can -# only *add* mappings -- it has no "remove/unmap" operation -- so a task that -# asks to unmap/remove/exclude a mapping must be refused rather than silently -# triggering a full additive re-map. Scoped to the mapper at the call site. -_MAPPING_REMOVAL_RE = re.compile( - r"\b(un-?map|un-?assign|un-?link|detach)\b" - r"|\b(remove|delete|drop|clear|exclude|strip|reset)\b[^.\n]{0,40}" - r"\b(mapping|map|assignment|assign|sql|quer(?:y|ies)|table|column)s?\b" - r"|\b(mapping|map|assignment|sql)s?\b[^.\n]{0,40}" - r"\b(remove|delete|drop|clear|exclude|strip|reset)\b", - re.IGNORECASE, -) - - -def _is_unsupported_mapping_removal(text: str) -> bool: - """True when *text* asks to remove/unmap a mapping (unsupported by agents).""" - return bool(_MAPPING_REMOVAL_RE.search(text or "")) - -# Virtual assignee that means "let the AI figure out and run the right agent". -# Not a real Databricks principal -- it never appears in domain permissions. -AI_AGENT_PRINCIPAL = "agent://router" -AI_AGENT_LABEL = "AI Agent" - -# In-process guard: domain_task ids with a background pass currently running. -# Prevents a reply from launching a second concurrent run for the same task. -# (Single-process app; reset on restart, which is fine — a stale entry only -# delays one resume.) -_ACTIVE_TASKS: set[str] = set() -_ACTIVE_LOCK = threading.Lock() - - -def _claim_task(task_id: str) -> bool: - """Atomically mark *task_id* active. Returns False if already running.""" - if not task_id: - return False - with _ACTIVE_LOCK: - if task_id in _ACTIVE_TASKS: - return False - _ACTIVE_TASKS.add(task_id) - return True - - -def _launch_worker( - *, - svc: Any, - domain: Any, - host: str, - token: str, - llm_endpoint: str, - warehouse_id: str, - folder: str, - version: str, - task_id: str, - title: str, - description: str, - comment_id: str, -) -> Optional[str]: - """Claim the task and launch the background plan-or-run worker. - - Returns the background task id, or ``None`` when the task is already running. - On launch failure the claim is released and the exception propagates to the - caller (``start_agent_task`` / ``resume_agent_task``) to handle. - """ - from back.core.task_manager import get_task_manager - - if not _claim_task(task_id): - return None - try: - tm = get_task_manager() - bg = tm.run_background_task( - f"AI Agent: {title}"[:80], - "task_router", - _run, - steps=[ - {"name": "route", "description": "Selecting the right agent"}, - {"name": "plan", "description": "Confirming scope with you"}, - {"name": "run", "description": "Running the selected agent"}, - ], - svc=svc, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - folder=folder, version=version, domain_task_id=task_id, - title=title, description=description, comment_id=comment_id, - ) - return bg.id - except Exception: - _ACTIVE_TASKS.discard(task_id) - raise - - -def is_ai_agent(assignee: str) -> bool: - """Return ``True`` when *assignee* is the AI-agent sentinel.""" - return (assignee or "").strip().lower() == AI_AGENT_PRINCIPAL - - -def start_agent_task( - *, - svc: Any, - domain: Any, - settings: Any, - folder: str, - version: str, - task_id: str, - title: str, - description: str = "", - comment_id: str = "", -) -> Optional[str]: - """Launch the background router+dispatch job for an AI-agent task. - - Best-effort: any setup failure is logged and recorded as a comment, and the - function returns ``None`` so the (already created) task still succeeds. - - Returns the background :class:`~back.core.task_manager.models.Task` id, or - ``None`` when the job could not be started. - """ - from back.core.helpers import require_serving_llm, resolve_warehouse_id - - try: - host, token, llm_endpoint = require_serving_llm(domain, settings) - except Exception as exc: # noqa: BLE001 - msg = f"AI Agent could not start: {exc}" - logger.warning("agent_task_runner: %s (task=%s)", msg, task_id) - _report( - svc, folder, version, task_id, comment_id, - body=f"**AI Agent**\n\n{msg}", event="agent_failed", - ) - return None - - try: - warehouse_id = resolve_warehouse_id(domain, settings) - except Exception: # noqa: BLE001 - warehouse_id = "" - - bg_id = _launch_worker( - svc=svc, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - folder=folder, version=version, task_id=task_id, - title=title, description=description, comment_id=comment_id, - ) - if bg_id is None: - return None - logger.info( - "agent_task_runner: started background task %s for domain_task %s", - bg_id, - task_id, - ) - return bg_id - - -def resume_agent_task( - *, - svc: Any, - domain: Any, - settings: Any, - folder: str, - version: str, - task: Dict[str, Any], -) -> Optional[str]: - """Relaunch the plan-or-run worker for a parked AI-Agent *task*. - - Called when a teammate replies on the task's thread. No-op (returns ``None``) - when a pass is already running for this task. Best-effort: setup failures are - logged and surfaced as a comment. - """ - task_id = str(task.get("id") or "") - if not task_id: - return None - - from back.core.helpers import require_serving_llm, resolve_warehouse_id - - comment_id = str(task.get("comment_id") or "") - title = str(task.get("title") or "") - description = str(task.get("description") or "") - try: - host, token, llm_endpoint = require_serving_llm(domain, settings) - except Exception as exc: # noqa: BLE001 - logger.warning("agent_task_runner: resume blocked: %s (task=%s)", exc, task_id) - return None - try: - warehouse_id = resolve_warehouse_id(domain, settings) - except Exception: # noqa: BLE001 - warehouse_id = "" - - bg_id = _launch_worker( - svc=svc, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - folder=folder, version=version, task_id=task_id, - title=title, description=description, comment_id=comment_id, - ) - if bg_id is None: - return None - logger.info("agent_task_runner: resumed task %s (bg=%s)", task_id, bg_id) - return bg_id - - -# --------------------------------------------------------------------------- -# Background worker -# --------------------------------------------------------------------------- - - -def _run( - task: Any, - *, - svc: Any, - domain: Any, - host: str, - token: str, - llm_endpoint: str, - warehouse_id: str, - folder: str, - version: str, - domain_task_id: str, - title: str, - description: str, - comment_id: str, -) -> None: - """TaskManager entry point: delegate to the shared plan-or-run worker.""" - from back.core.task_manager import get_task_manager - - tm = get_task_manager() - try: - _run_for_task( - svc=svc, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - folder=folder, version=version, domain_task_id=domain_task_id, - title=title, description=description, comment_id=comment_id, - on_step=lambda m: tm.update_progress(task.id, task.progress, m), - tm=tm, tm_task_id=task.id, - ) - finally: - _ACTIVE_TASKS.discard(domain_task_id) - - -def _run_for_task( - *, - svc: Any, - domain: Any, - host: str, - token: str, - llm_endpoint: str, - warehouse_id: str, - folder: str, - version: str, - domain_task_id: str, - title: str, - description: str, - comment_id: str, - on_step: Callable[[str], None], - tm: Any, - tm_task_id: Optional[str], -) -> None: - """Route, reconstruct the thread Q&A, plan, then ask-again or run the agent. - - ``tm``/``tm_task_id`` are the optional TaskManager handle for progress; the - worker is fully functional without them (used directly in tests). - """ - from agents.agent_task_planner import run_agent as run_planner - from agents.agent_task_router import run_agent as run_router - from agents.registry import get_agent, list_agents - - def _tm(method: str, *args: Any) -> None: - if tm is not None and tm_task_id is not None: - getattr(tm, method)(tm_task_id, *args) - - try: - _tm("start_task", "Selecting the right agent...") - - # 1) Route (deterministic — same choice on every pass => locked route). - router_result = run_router( - host, token, llm_endpoint, - task_title=title, task_description=description, - available_agents=list_agents(), on_step=on_step, - ) - if not router_result.success or not router_result.chosen_agent_key: - reason = router_result.error or "No suitable agent for this task" - _tm("fail_task", reason) - _report(svc, folder, version, domain_task_id, comment_id, - body=f"**AI Agent**\n\nI could not route this task: {reason}", - event="agent_failed") - return - spec = get_agent(router_result.chosen_agent_key) - if spec is None: - _tm("fail_task", "Router chose an unknown agent") - return - - # 1b) Refuse unsupported removal: the Auto SQL Mapper only *adds* - # mappings, so an "unmap / remove mapping / exclude" request would - # otherwise trigger a full additive re-map. Park (stay in_progress) with - # a helpful note so a rephrase can resume the same task. - if spec.key == "auto_assignment" and _is_unsupported_mapping_removal( - f"{title}\n{description}" - ): - _set_status(svc, folder, domain_task_id, "in_progress") - _report( - svc, folder, version, domain_task_id, comment_id, - body=( - f"**AI Agent — {spec.label}**\n\n" - "I can't **remove or unmap** mappings automatically — the Auto " - "SQL Mapper only *adds* SQL mappings, and no agent supports " - "removal yet. To clear a mapping, open the **Mapping** page and " - "remove it there. If you meant to *map* a specific entity, reply " - "with a rephrased request and I'll continue." - ), - event="agent_progress", - ) - _tm("complete_task", {"agent": spec.key, "state": "waiting_input"}, - "Cannot unmap — waiting for a rephrase") - return - - # 2) Plan against the conversation reconstructed from the thread. - _set_status(svc, folder, domain_task_id, "in_progress") - history = _thread_history(svc, folder, version, comment_id) - plan = run_planner( - host, token, llm_endpoint, - task_title=title, task_description=description, - agent=spec, history=history, on_step=on_step, - ) - - # Always confirm scope before doing any work: the very first pass (no - # human reply yet beyond the task statement) must park and ask, no matter - # what the planner returns. This makes the guarantee code-enforced rather - # than relying on the planner's prompt. - human_turns = sum(1 for h in history if h.get("role") == "user") - first_pass = human_turns <= 1 - ready = plan.ready and not first_pass - - # 3a) Not ready -> post the plan/question and park (stay in_progress). - if not ready: - question = plan.message or ( - "Could you clarify the scope of this task before I proceed?" - ) - _report(svc, folder, version, domain_task_id, comment_id, - body=f"**AI Agent — {spec.label}**\n\n{question}", - event="agent_progress") - _tm("complete_task", {"agent": spec.key, "state": "waiting_input"}, - "Waiting for your reply") - return - - # 3b) Ready -> run the chosen agent with the answers folded in. - _tm("advance_step", f"Running {spec.label}...") - task_text = _fold_answers(title, description, history) - summary, report, result = _dispatch_agent( - spec.key, domain=domain, host=host, token=token, - llm_endpoint=llm_endpoint, warehouse_id=warehouse_id, - task_text=task_text, on_step=on_step, - ) - _tm("advance_step", "Recording the result...") - _set_status(svc, folder, domain_task_id, "done") - body = f"**AI Agent — {spec.label}**\n\n" - if router_result.reasoning: - body += f"_Why this agent:_ {router_result.reasoning}\n\n" - body += report - _report(svc, folder, version, domain_task_id, comment_id, - body=body, event="task_done") - _tm("complete_task", - {"agent": spec.key, "agent_label": spec.label, **result}, summary) - except Exception as exc: # noqa: BLE001 - logger.exception("agent_task_runner: task %s crashed", domain_task_id) - _tm("fail_task", f"AI Agent run failed: {exc}") - _report(svc, folder, version, domain_task_id, comment_id, - body=f"**AI Agent**\n\nThe run failed: {exc}", - event="agent_failed") - - -def _thread_history( - svc: Any, folder: str, version: str, root_comment_id: str -) -> list[dict]: - """Reconstruct the ordered clarification Q&A from the task's thread. - - The thread is the root comment (``root_comment_id``) plus its direct replies, - ordered by ``created_at``. The AI Agent's own comments map to ``assistant``; - everyone else maps to ``user``. - """ - if not root_comment_id: - return [] - try: - comments = list(svc.list_comments(folder, version)) - except Exception as exc: # noqa: BLE001 - logger.debug("agent_task_runner: thread read skipped: %s", exc) - return [] - rid = str(root_comment_id) - thread = [ - c for c in comments - if str(c.get("id")) == rid or str(c.get("parent_id") or "") == rid - ] - thread.sort(key=lambda c: str(c.get("created_at") or "")) - history: list[dict] = [] - for c in thread: - role = "assistant" if (c.get("author") or "") == AI_AGENT_LABEL else "user" - history.append({"role": role, "text": (c.get("body") or "").strip()}) - return history - - -def _fold_answers(title: str, description: str, history: list[dict]) -> str: - """Build the agent input from the task plus the teammate's answers.""" - parts = [title] - if description: - parts.append(description) - answers = [h["text"] for h in history if h["role"] == "user" and h["text"]] - # Drop the first 'user' turn — it is the task statement itself, already above. - extra = answers[1:] if answers else [] - if extra: - parts.append("Clarifications from the assignee:\n- " + "\n- ".join(extra)) - return "\n\n".join(parts) - - -# --------------------------------------------------------------------------- -# Per-agent dispatch -# --------------------------------------------------------------------------- - - -def _dispatch_agent( - key: str, - *, - domain: Any, - host: str, - token: str, - llm_endpoint: str, - warehouse_id: str, - task_text: str = "", - on_step: Callable[[str], None], -) -> Tuple[str, str, Dict[str, Any]]: - """Run the specialized agent identified by *key* against the domain session. - - Returns ``(summary, report, result_payload)`` where ``summary`` is a short - one-liner (TaskManager message) and ``report`` is the markdown posted to the - domain Discussion. Raises on agent failure so the worker records it. - """ - from agents.serialization import serialize_agent_steps - from back.objects.ontology import Ontology - - if key == "ontology_assistant": - from shared.config.constants import DEFAULT_BASE_URI - - ont = Ontology(domain) - classes = list(domain.get_classes()) - properties = list(domain.get_properties()) - base_uri = domain.ontology.get("base_uri") or DEFAULT_BASE_URI - from agents.agent_ontology_assistant import run_agent as run_assistant - - res = run_assistant( - host=host, - token=token, - endpoint_name=llm_endpoint, - classes=classes, - properties=properties, - base_uri=base_uri, - user_message=task_text, - on_step=on_step, - ) - if not res.success: - raise RuntimeError(res.error or "Ontology assistant failed") - if res.ontology_changed: - # Apply + persist the edits directly to the domain ontology. - cfg = ont.apply_agent_ontology_changes( - res.classes, res.properties, prune_orphan_mappings=True - ) - summary = ( - f"updated the ontology " - f"({len(cfg['classes'])} classes, {len(cfg['properties'])} properties)" - ) - report = ( - (res.reply.strip() + "\n\n" if res.reply else "") - + f"Applied the changes to the ontology — it now has " - f"**{len(cfg['classes'])} class(es)** and " - f"**{len(cfg['properties'])} property(ies)**." - ) - else: - summary = "reviewed the ontology (no change needed)" - report = res.reply.strip() or "No ontology changes were necessary." - return summary, report, { - "ontology_changed": res.ontology_changed, - "reply": res.reply, - "agent_steps": serialize_agent_steps(res.steps), - "agent_iterations": res.iterations, - "agent_usage": res.usage, - } - - if key == "owl_generator": - res = Ontology(domain).generate_with_agent( - host=host, - token=token, - endpoint_name=llm_endpoint, - metadata=domain.catalog_metadata, - warehouse_id=warehouse_id, - on_step=on_step, - ) - if not res.success: - raise RuntimeError(res.error or "Ontology generation produced no output") - summary = ( - f"generated ontology draft ({len(res.owl_content)} chars, " - f"{res.iterations} iteration(s))" - ) - report = ( - f"Generated an ontology draft in {res.iterations} iteration(s) " - f"({len(res.owl_content):,} characters of Turtle). " - "Open the **Ontology** page to review and apply it." - ) - return summary, report, { - "owl_content": res.owl_content, - "agent_steps": serialize_agent_steps(res.steps), - "agent_iterations": res.iterations, - "agent_usage": res.usage, - } - - if key == "business_rules_generator": - res = Ontology(domain).generate_rules_with_agent( - host=host, - token=token, - endpoint_name=llm_endpoint, - warehouse_id=warehouse_id, - on_step=on_step, - ) - if not res.success: - raise RuntimeError(res.error or "Business-rules generation failed") - summary = f"proposed {res.total_rules()} business rule(s)" - report = ( - f"Proposed {res.total_rules()} business rule(s): " - f"{len(res.swrl_rules)} SWRL, " - f"{len(res.decision_tables)} decision table(s), " - f"{len(res.sparql_rules)} SPARQL, " - f"{len(res.aggregate_rules)} aggregate. " - "Open **Ontology -> Business Rules** to review and accept them." - ) - return summary, report, { - "swrl_rules": res.swrl_rules, - "decision_tables": res.decision_tables, - "sparql_rules": res.sparql_rules, - "aggregate_rules": res.aggregate_rules, - "agent_steps": serialize_agent_steps(res.steps), - "agent_iterations": res.iterations, - "agent_usage": res.usage, - } - - if key == "icon_assign": - entity_names = [ - c.get("name", "") for c in domain.get_classes() if c.get("name") - ] - if not entity_names: - raise RuntimeError("No ontology entities to assign icons to") - res = Ontology(domain).assign_icons_with_agent( - host=host, - token=token, - endpoint_name=llm_endpoint, - entity_names=entity_names, - on_step=on_step, - ) - if not res.success: - raise RuntimeError(res.error or "Icon assignment failed") - summary = f"assigned icons to {len(res.icons)} entity(ies)" - preview = " ".join( - f"{name} {emoji}" for name, emoji in list(res.icons.items())[:10] - ) - report = ( - f"Proposed icons for {len(res.icons)} entity(ies)" - + (f": {preview}" if preview else "") - + ". Open the **Ontology** page to review them." - ) - return summary, report, { - "icons": res.icons, - "agent_steps": serialize_agent_steps(res.steps), - "agent_iterations": res.iterations, - "agent_usage": res.usage, - } - - if key == "auto_assignment": - from back.core.databricks import DatabricksClient - from back.objects.mapping import Mapping - - mapping_svc = Mapping(domain) - schema_context = mapping_svc.resolve_auto_assign_schema_context({}) - ontology_ctx = Ontology(domain).agent_ontology_context() - if not ontology_ctx.get("entities"): - raise RuntimeError("No ontology entities to map") - if not warehouse_id: - raise RuntimeError("No SQL warehouse configured for auto-mapping") - client = DatabricksClient( - host=host, token=token, warehouse_id=warehouse_id - ) - res = mapping_svc.auto_assign_with_agent( - host=host, - token=token, - endpoint_name=llm_endpoint, - client=client, - metadata=schema_context, - ontology=ontology_ctx, - on_step=lambda m, pct=0: on_step(m), - ) - if not res.success and res.error: - raise RuntimeError(res.error) - # Persist directly (session-less): merge into the domain assignment and - # save to the registry, so the mappings survive a page reload. Existing - # ``excluded`` flags are preserved by the merge. - counts = mapping_svc.apply_agent_mappings( - res.entity_mappings, res.relationship_mappings - ) - summary = ( - f"mapped {len(res.entity_mappings)} entity and " - f"{len(res.relationship_mappings)} relationship(s)" - ) - report = ( - f"Applied SQL mappings — the domain now has " - f"**{counts['entities']} entity** and " - f"**{counts['relationships']} relationship** mapping(s). " - "Open the **Mapping** page to review them." - ) - return summary, report, { - "entity_mappings": res.entity_mappings, - "relationship_mappings": res.relationship_mappings, - "agent_steps": serialize_agent_steps(res.steps), - "agent_iterations": res.iterations, - "agent_usage": res.usage, - } - - raise RuntimeError(f"No dispatch wiring for agent '{key}'") - - -# --------------------------------------------------------------------------- -# Persistence helpers (run outside a request -> no human authorization) -# --------------------------------------------------------------------------- - - -def _set_status(svc: Any, folder: str, task_id: str, status: str) -> None: - """Update the domain_tasks row status, swallowing storage errors.""" - try: - svc.update_task_status(folder, task_id, status) - except Exception as exc: # noqa: BLE001 - logger.debug("agent_task_runner: status update skipped: %s", exc) - - -def _report( - svc: Any, - folder: str, - version: str, - task_id: str, - comment_id: str, - *, - body: str, - event: str = "agent_progress", -) -> None: - """Surface the AI Agent's outcome. - - Posts *body* as a real comment in the domain Discussion (threaded under the - originating comment when there is one, otherwise a domain-level note) so the - team sees the report, and appends a matching review-audit row for the - Validation timeline. Both are best-effort. - """ - try: - parent_id = _resolve_thread_parent(svc, folder, version, comment_id) - svc.insert_comment( - folder, - version, - author=AI_AGENT_LABEL, - body=body, - parent_id=parent_id, - ) - except Exception as exc: # noqa: BLE001 - logger.debug("agent_task_runner: discussion comment skipped: %s", exc) - try: - svc.record_review_event( - folder, - version, - AI_AGENT_LABEL, - "commented", - comment=body, - meta={"task_id": task_id, "comment_id": comment_id or "", "event": event}, - ) - except Exception as exc: # noqa: BLE001 - logger.debug("agent_task_runner: audit append skipped: %s", exc) - - -def _resolve_thread_parent( - svc: Any, folder: str, version: str, comment_id: str -) -> Optional[str]: - """Reply under the originating comment when it still exists, otherwise - post a top-level note (``None``). - """ - if comment_id: - try: - for c in svc.list_comments(folder, version): - if str(c.get("id")) == str(comment_id): - return comment_id - except Exception: # noqa: BLE001 - pass - return None diff --git a/src/front/static/global/css/review-modals.css b/src/front/static/global/css/review-modals.css index cff22fb2..646f5a0e 100644 --- a/src/front/static/global/css/review-modals.css +++ b/src/front/static/global/css/review-modals.css @@ -270,74 +270,3 @@ background: var(--db-surface-muted, #f7f9fb); } -/* ---- AI-Agent live status --------------------------------------------- */ - -/* Top-of-panel progress strip for an active AI-Agent background run. */ -.oc-agent-strip { - background: var(--db-accent-subtle, #e7f0fe); - color: var(--db-text, #334155); -} - -.oc-agent-strip .oc-agent-spin { - color: var(--db-accent, #1b6ec2); - animation: oc-agent-spin 1.4s linear infinite; - display: inline-flex; -} - -@keyframes oc-agent-spin { - from { transform: rotate(0deg); } - to { transform: rotate(360deg); } -} - -/* AI-Agent task threads get a tinted left edge so they stand out. */ -.oc-thread-agent { - border-left: 3px solid var(--db-accent, #1b6ec2); -} - -/* Per-thread status chip. */ -.oc-agent-chip { - display: inline-flex; - align-items: center; - font-size: 0.72rem; - font-weight: 600; - padding: 0.1rem 0.5rem; - border-radius: 999px; - border: 1px solid transparent; -} - -.oc-agent-chip.oc-agent-working { - background: var(--db-accent-subtle, #e7f0fe); - color: var(--db-accent, #1b6ec2); - border-color: #b6d4fe; -} - -.oc-agent-chip.oc-agent-waiting { - background: #fff3cd; - color: #8a6d00; - border-color: #ffe69c; -} - -.oc-agent-chip.oc-agent-queued { - background: var(--db-surface-muted, #f1f3f5); - color: var(--db-text-muted, #6c757d); - border-color: #e3e6ea; -} - -.oc-agent-chip.oc-agent-done { - background: #d1e7dd; - color: #0f5132; - border-color: #badbcc; -} - -/* Prominent answer box on a parked AI-Agent thread. */ -.oc-agent-answer { - margin: 0.4rem 0 0.2rem 1.6rem; - padding: 0.5rem; - border: 1px solid #ffe69c; - border-radius: 0.5rem; - background: #fffbef; -} - -.oc-agent-answer .fw-semibold { - color: #8a6d00; -} diff --git a/src/front/static/global/js/comments-panel.js b/src/front/static/global/js/comments-panel.js index 829904c4..170b3ae5 100644 --- a/src/front/static/global/js/comments-panel.js +++ b/src/front/static/global/js/comments-panel.js @@ -17,22 +17,13 @@ (function () { 'use strict'; - // Sentinel assignee that routes the task to the AI Agent (see - // back/objects/registry/agent_task_runner.AI_AGENT_PRINCIPAL). - const AI_AGENT_PRINCIPAL = 'agent://router'; - let el = null; let offcanvas = null; let ctx = null; // { folder, version } let membersCache = {}; // key folder/version -> [members] let currentUser = null; // current user's email/principal (for "Assign to me") let currentUserPromise = null; - let aiTasksByComment = {}; // root comment_id -> AI-Agent DomainTask (this version) - let agentRuns = []; // active task_router background runs (from /tasks/) - let panelPollTimer = null; // live-refresh timer while the panel is open - let lastListSig = ''; // signature of the last rendered comment set - let aiStatusSnapshot = {}; // comment_id -> last-seen AI task status (transition guard) - let aiSnapshotReady = false;// becomes true after the first AI-task load (baseline) + let lastListSig = ''; // signature of the last rendered comment set function esc(text) { if (typeof window.escapeHtml === 'function') return window.escapeHtml(text); @@ -81,13 +72,12 @@ '
    ' + '
    ' + '' + '' + '
    ' + '
    ' + '
    ' + - '
    ' + '
    ' + '
    ' + '' + - '
    ' + - '' + - '
    '; + return comments.length + '#' + base; } function renderList(list, comments) { @@ -468,13 +257,9 @@ function threadHtml(root, replies) { const replyHtml = replies.map((r) => bubble(r, true)).join(''); const resolvedCls = root.resolved ? ' oc-resolved' : ''; - const aiTask = aiTasksByComment[root.id]; - const aiCls = aiTask ? ' oc-thread-agent' : ''; - return '
    ' + - (aiTask ? agentChipHtml(aiTask) : '') + + return '
    ' + bubble(root, false) + '
    ' + replyHtml + '
    ' + - (aiTask ? agentAnswerHtml(root.id, aiTask) : '') + '
    ' + '' + @@ -519,16 +304,6 @@ list.querySelectorAll('button[data-task]').forEach((btn) => { btn.addEventListener('click', () => toggleTask(btn.dataset.task)); }); - // Answering a parked AI-Agent thread: a reply here resumes the agent. - list.querySelectorAll('button[data-agent-send]').forEach((btn) => { - btn.addEventListener('click', () => { - const box = btn.closest('[data-agent-answer]'); - const ta = box ? box.querySelector('textarea') : null; - const text = ta ? (ta.value || '').trim() : ''; - postComment(text, btn.dataset.agentSend, ta, box) - .then(() => ensureAgentTracking()); - }); - }); } function toggleReply(rootId) { @@ -553,11 +328,9 @@ function taskFormHtml(heading, withCancel) { const members = membersCache[ctx.folder + '/' + ctx.version] || []; const opts = members.map((m) => { - const label = m.principal_type === 'agent' - ? '\uD83E\uDD16 ' + esc(m.display_name || 'AI Agent') + ' (auto)' - : esc(m.display_name || m.principal) + - (m.principal === currentUser ? ' (me)' : '') + - ' (' + esc(m.role) + ')'; + const label = esc(m.display_name || m.principal) + + (m.principal === currentUser ? ' (me)' : '') + + ' (' + esc(m.role) + ')'; return ''; }).join(''); const cancel = withCancel @@ -594,15 +367,8 @@ syncDueVisibility(box); } - // The AI Agent runs the task immediately, so a due date is meaningless — - // hide (and clear) it whenever the AI Agent is the selected assignee. function syncDueVisibility(box) { - const sel = box.querySelector('[data-tk-assignee]'); - const due = box.querySelector('[data-tk-due]'); - if (!sel || !due) return; - const isAgent = sel.value === AI_AGENT_PRINCIPAL; - due.classList.toggle('d-none', isAgent); - if (isAgent) due.value = ''; + // no-op: kept as hook for future visibility rules } function hideTaskBox(box) { @@ -621,8 +387,7 @@ wireTaskForm(box, rootId); } - // Standalone task creation (not tied to a comment), opened from the - // panel header. Lets the user assign a task to a teammate or the AI Agent. + // Standalone task creation (not tied to a comment), opened from the panel header. async function openNewTask() { const box = el.querySelector('[data-oc-newtask]'); if (!box) return; @@ -675,7 +440,6 @@ } if (ta) ta.value = ''; await reload(); - ensureAgentTracking(); } catch (err) { notify('Error: ' + err.message, 'error'); } @@ -732,15 +496,9 @@ notify(data.message || 'Failed to create task', 'error'); return; } - if (data.agent_task_id) { - notify('AI Agent started — routing your task to the right agent', 'success'); - if (typeof window.refreshTasks === 'function') { window.refreshTasks(); } - } else { - notify('Task assigned to ' + assignee, 'success'); - } + notify('Task assigned to ' + assignee, 'success'); hideTaskBox(box); await reload(); - if (data.agent_task_id) ensureAgentTracking(); } catch (err) { notify('Error: ' + err.message, 'error'); } diff --git a/src/front/static/mapping/js/mapping-init.js b/src/front/static/mapping/js/mapping-init.js index 0ac562fc..29492bd4 100644 --- a/src/front/static/mapping/js/mapping-init.js +++ b/src/front/static/mapping/js/mapping-init.js @@ -13,27 +13,6 @@ document.body.classList.add('full-width-layout'); // Configure sidebar navigation with callbacks window.SIDEBAR_NAV_MANUAL_INIT = true; -// When an AI Agent finishes a task that edited & saved the ontology, the -// Discussion panel fires `ontobricks:design-updated`. The mapping page derives -// its entity/relationship rows from the ontology, so re-pull the loaded -// ontology into MappingState and redraw the design. -window.addEventListener('ontobricks:design-updated', async function () { - try { - const resp = await fetch('/ontology/get-loaded-ontology', - { credentials: 'same-origin' }); - const result = await resp.json(); - if (result.success && result.ontology && typeof MappingState !== 'undefined') { - MappingState.loadedOntology = result.ontology; - } - if (typeof refreshMappingDesign === 'function') refreshMappingDesign(); - if (typeof updateMappingCompletionStatus === 'function') { - updateMappingCompletionStatus(); - } - } catch (e) { - console.error('[Mapping] design-updated refresh failed', e); - } -}); - // Main initialization function async function initializeMappingPage() { console.log('Mapping Page: Starting initialization...'); diff --git a/src/front/static/ontology/js/ontology-init.js b/src/front/static/ontology/js/ontology-init.js index 7718ec3f..6e532e9b 100644 --- a/src/front/static/ontology/js/ontology-init.js +++ b/src/front/static/ontology/js/ontology-init.js @@ -115,32 +115,6 @@ document.addEventListener('DOMContentLoaded', function() { } }); -// When an AI Agent finishes a task that edited & saved the ontology, the -// Discussion panel fires `ontobricks:design-updated`. Pull the agent's changes -// into session state and re-render whichever ontology section is active so the -// designer (and every other section) reflects the new model without a manual -// reload. Idempotent and version-guarded (initOntologyDesigner skips reload -// when the fingerprint is unchanged). -window.addEventListener('ontobricks:design-updated', async function () { - try { - if (typeof loadOntologyFromSession === 'function') { - await loadOntologyFromSession(); - } - if (typeof window.refreshOntologyStatus === 'function') { - window.refreshOntologyStatus(); - } - if (typeof SidebarNav !== 'undefined' && - typeof SidebarNav.getActiveSection === 'function') { - _initSectionByName(SidebarNav.getActiveSection()); - } - if (typeof showNotification === 'function') { - showNotification("Ontology refreshed with the AI Agent's changes", 'info', 3000); - } - } catch (e) { - console.error('[Ontology] design-updated refresh failed', e); - } -}); - /** * Add a "Discuss" button to every ontology section header (except Import) * so the ontology discussion can be opened from anywhere. The Model/Designer diff --git a/tests/units/agents/test_agent_task_planner.py b/tests/units/agents/test_agent_task_planner.py deleted file mode 100644 index ce9621c0..00000000 --- a/tests/units/agents/test_agent_task_planner.py +++ /dev/null @@ -1,67 +0,0 @@ -"""Unit tests for the task-planner agent (ready vs. ask decision).""" -from __future__ import annotations - -from unittest.mock import patch - -from agents.agent_task_planner import PlanResult, run_agent -from agents.registry import get_agent - - -def _spec(): - return get_agent("ontology_assistant") - - -def _llm(content: str): - return {"choices": [{"message": {"content": content}}], "usage": {}} - - -def test_first_turn_asks_when_no_answers(): - with patch( - "agents.agent_task_planner.engine.call_serving_endpoint", - return_value=_llm('{"ready": false, "message": "Plan: remove Person? Confirm scope."}'), - ): - res = run_agent( - "h", "t", "ep", - task_title="Is Person needed?", - task_description="", - agent=_spec(), - history=[], - ) - assert isinstance(res, PlanResult) - assert res.success is True - assert res.ready is False - assert "Plan" in res.message - - -def test_ready_when_user_approved(): - history = [ - {"role": "assistant", "text": "Shall I remove Person?"}, - {"role": "user", "text": "yes go ahead"}, - ] - with patch( - "agents.agent_task_planner.engine.call_serving_endpoint", - return_value=_llm('{"ready": true, "message": "Running now."}'), - ): - res = run_agent( - "h", "t", "ep", - task_title="Is Person needed?", - task_description="", - agent=_spec(), - history=history, - ) - assert res.success is True - assert res.ready is True - - -def test_unparseable_response_degrades_to_ask(): - with patch( - "agents.agent_task_planner.engine.call_serving_endpoint", - return_value=_llm("not json at all"), - ): - res = run_agent( - "h", "t", "ep", - task_title="x", task_description="", agent=_spec(), history=[], - ) - # Degrade safe: never auto-run on a parse failure. - assert res.ready is False - assert res.error diff --git a/tests/units/agents/test_agent_task_router.py b/tests/units/agents/test_agent_task_router.py deleted file mode 100644 index 4f164d38..00000000 --- a/tests/units/agents/test_agent_task_router.py +++ /dev/null @@ -1,132 +0,0 @@ -"""Tests for the Task Router agent + the dispatchable-agent registry. - -The router is a single-shot classifier; we patch ``call_serving_endpoint`` -to return a scripted JSON decision and assert the parsed routing outcome. -""" - -from __future__ import annotations - -from unittest.mock import patch - -import pytest - -from agents import registry -from agents.agent_task_router import engine as router_engine - - -def _llm(content: str) -> dict: - return { - "choices": [{"message": {"content": content}}], - "usage": {"prompt_tokens": 10, "completion_tokens": 5}, - } - - -def _run(content: str): - with patch.object(router_engine, "call_serving_endpoint", return_value=_llm(content)): - return router_engine.run_agent( - "https://host", - "tok", - "ep", - task_title="Generate the ontology from the metadata", - task_description="", - available_agents=registry.list_agents(), - ) - - -# ---------------------------------------------------------------------- -# Registry -# ---------------------------------------------------------------------- - - -def test_registry_lists_agents_with_unique_keys(): - agents = registry.list_agents() - assert agents, "registry must not be empty" - keys = [a.key for a in agents] - assert len(keys) == len(set(keys)), "agent keys must be unique" - assert {"owl_generator", "business_rules_generator", "icon_assign", - "auto_assignment", "ontology_assistant"} <= set(keys) - - -def test_get_agent_known_and_unknown(): - assert registry.get_agent("owl_generator").label == "Ontology Generator" - assert registry.get_agent("does_not_exist") is None - assert registry.get_agent("") is None - - -def test_ontology_assistant_is_the_design_default(): - # Ontology design/modeling tasks ("create/model an entity") must route to the - # Ontology Assistant, so its routing guidance has to advertise design intent. - desc = registry.get_agent("ontology_assistant").description.lower() - assert "design" in desc - assert any(verb in desc for verb in ("create", "model", "add")) - assert "new" in desc - - -def test_router_prompt_treats_ontology_as_domain_model(): - # The router must not bail to "none" on ontology design tasks; the system - # prompt has to steer design/modeling toward an agent and reserve "none" for - # clearly unrelated work. - prompt = router_engine._SYSTEM_PROMPT.lower() - assert "domain model" in prompt - assert "design" in prompt - assert "none" in prompt - - -# ---------------------------------------------------------------------- -# Router decisions -# ---------------------------------------------------------------------- - - -def test_router_picks_valid_agent(): - res = _run('{"agent": "owl_generator", "reasoning": "asks to generate ontology"}') - assert res.success is True - assert res.chosen_agent_key == "owl_generator" - assert res.reasoning - assert res.usage["prompt_tokens"] == 10 - - -def test_router_handles_code_fenced_json(): - res = _run('```json\n{"agent": "icon_assign", "reasoning": "icons"}\n```') - assert res.success is True - assert res.chosen_agent_key == "icon_assign" - - -def test_router_none_decision_is_unsuccessful(): - res = _run('{"agent": "none", "reasoning": "nothing fits"}') - assert res.success is False - assert res.chosen_agent_key == "" - assert "nothing fits" in res.error - - -def test_router_rejects_unknown_agent_key(): - res = _run('{"agent": "make_coffee", "reasoning": "?"}') - assert res.success is False - assert "unknown agent" in res.error.lower() - - -def test_router_unparseable_response(): - res = _run("I think you should run the owl generator.") - assert res.success is False - assert "unparseable" in res.error.lower() - - -def test_router_llm_failure_is_captured(): - with patch.object( - router_engine, "call_serving_endpoint", side_effect=RuntimeError("boom") - ): - res = router_engine.run_agent( - "h", "t", "ep", - task_title="x", - task_description="", - available_agents=registry.list_agents(), - ) - assert res.success is False - assert "boom" in res.error - - -def test_router_no_agents_registered(): - res = router_engine.run_agent( - "h", "t", "ep", task_title="x", task_description="", available_agents=[] - ) - assert res.success is False - assert "No dispatchable agents" in res.error diff --git a/tests/units/api/test_discussion_panel_assets.py b/tests/units/api/test_discussion_panel_assets.py index ca73e019..9d413b6c 100644 --- a/tests/units/api/test_discussion_panel_assets.py +++ b/tests/units/api/test_discussion_panel_assets.py @@ -1,18 +1,14 @@ """ Contract tests for the Discussion panel front-end assets. -The Discussion-panel behaviour added for AI-Agent tasks lives entirely in -static JS/CSS (the repo has no JS unit-test harness). These tests fetch the -served assets through the app's ``/static`` mount and assert the wiring is -present, so an accidental removal/rename of a key hook is caught by CI. +These tests fetch the served assets through the app's ``/static`` mount and +assert the wiring is present, so an accidental removal/rename of a key hook +is caught by CI. They are deliberately token-level (not behavioural) — they guard that the contract between the panel and the rest of the app stays intact: -* comment bodies are rendered as markdown (via the global ``marked``); -* AI-Agent task status + progress are surfaced in the pane and answerable; -* finishing an AI-Agent task broadcasts ``ontobricks:design-updated`` and the - ontology / mapping pages listen for it to refresh their design. +* comment bodies are rendered as markdown (via the global ``marked``). """ from __future__ import annotations @@ -25,9 +21,6 @@ COLLAB_JS = "/static/domain/js/domain-collaboration.js" REVIEW_CSS = "/static/global/css/review-modals.css" -# Event name shared between the panel (dispatch) and the pages (listeners). -DESIGN_UPDATED_EVENT = "ontobricks:design-updated" - def _static(client, path: str) -> str: """Fetch a served static asset, asserting it is reachable.""" @@ -67,75 +60,6 @@ def test_markdown_styles_present(self, client): assert ".oc-md" in css -class TestDiscussionAgentStatus: - """AI-Agent runs surface progress + status inside the pane.""" - - def test_loads_ai_tasks_and_runs(self, panel_js): - assert "function loadAiTasks" in panel_js - assert "function loadAgentRuns" in panel_js - # AI-Agent background runs are the router/plan/run worker. - assert "'task_router'" in panel_js - - def test_progress_strip_rendered(self, panel_js): - assert "function renderAgentStrip" in panel_js - assert "oc-agent-strip" in panel_js - - def test_live_polling_loop(self, panel_js): - assert "function panelPollTick" in panel_js - assert "function startPanelPolling" in panel_js - # Polling must not clobber a half-written reply. - assert "function userIsComposing" in panel_js - - def test_per_thread_status_chip(self, panel_js): - assert "function agentChipHtml" in panel_js - assert "waiting for your reply" in panel_js - - def test_strip_and_chip_styles_present(self, client): - css = _static(client, REVIEW_CSS) - for token in (".oc-agent-strip", "oc-agent-working", "oc-agent-waiting"): - assert token in css, f"missing CSS token {token!r}" - - -class TestAnswerTheAgent: - """A parked AI-Agent thread is answerable from the pane.""" - - def test_answer_box_present(self, panel_js): - assert "function agentAnswerHtml" in panel_js - assert "Answer the AI Agent" in panel_js - - def test_answer_send_wired_to_reply(self, panel_js): - # The send button posts a reply (parent = thread root) which resumes the - # agent server-side, then re-checks tracking. - assert "data-agent-send" in panel_js - assert "ensureAgentTracking" in panel_js - - def test_answer_box_styles_present(self, client): - css = _static(client, REVIEW_CSS) - assert ".oc-agent-answer" in css - - -class TestDesignUpdatedRefresh: - """Finishing an AI-Agent design task refreshes the open pages.""" - - def test_panel_dispatches_event_on_completion(self, panel_js): - assert "function announceAgentCompletions" in panel_js - assert DESIGN_UPDATED_EVENT in panel_js - - def test_ontology_page_listens_and_refreshes(self, client): - js = _static(client, ONTOLOGY_INIT_JS) - assert DESIGN_UPDATED_EVENT in js - # Pulls the agent's saved changes and re-renders the active section. - assert "loadOntologyFromSession" in js - assert "_initSectionByName(SidebarNav.getActiveSection())" in js - - def test_mapping_page_listens_and_refreshes(self, client): - js = _static(client, MAPPING_INIT_JS) - assert DESIGN_UPDATED_EVENT in js - # Re-pulls the loaded ontology and redraws the mapping design. - assert "/ontology/get-loaded-ontology" in js - assert "refreshMappingDesign" in js - - class TestDiscussionDomainScope: """The panel is a single domain-wide thread with no tagging UI.""" diff --git a/tests/units/mapping/test_mapping_service.py b/tests/units/mapping/test_mapping_service.py index 06ede72e..a15feffe 100644 --- a/tests/units/mapping/test_mapping_service.py +++ b/tests/units/mapping/test_mapping_service.py @@ -154,45 +154,6 @@ def test_reset(self): assert domain.assignment["entities"] == [] -class TestApplyAgentMappings: - def test_adds_and_persists(self): - domain = _mock_domain() - counts = Mapping(domain).apply_agent_mappings( - [{"ontology_class": "http://t/A", "id_column": "id"}], - [{"property": "http://t/p"}], - ) - assert counts == {"entities": 1, "relationships": 1} - assert domain.assignment["entities"][0]["id_column"] == "id" - domain.save.assert_called_once() - - def test_upserts_by_uri(self): - domain = _mock_domain( - entities=[{"ontology_class": "http://t/A", "id_column": "old"}] - ) - Mapping(domain).apply_agent_mappings( - [{"ontology_class": "http://t/A", "id_column": "new"}], [] - ) - assert len(domain.assignment["entities"]) == 1 - assert domain.assignment["entities"][0]["id_column"] == "new" - - def test_preserves_existing_excluded_flag(self): - # An entity the user excluded must stay excluded after a re-map even if - # the agent proposes a fresh mapping for it. - domain = _mock_domain( - entities=[{"ontology_class": "http://t/A", "excluded": True}] - ) - Mapping(domain).apply_agent_mappings( - [{"ontology_class": "http://t/A", "id_column": "id"}], [] - ) - assert domain.assignment["entities"][0]["excluded"] is True - - def test_handles_none_payloads(self): - domain = _mock_domain(entities=[{"ontology_class": "http://t/A"}]) - counts = Mapping(domain).apply_agent_mappings(None, None) - assert counts == {"entities": 1, "relationships": 0} - domain.save.assert_called_once() - - class TestExtractFqnFromSql: def test_simple_from(self): triples = Mapping._extract_fqn_from_sql( diff --git a/tests/units/registry/test_agent_task_runner.py b/tests/units/registry/test_agent_task_runner.py deleted file mode 100644 index 3b75f954..00000000 --- a/tests/units/registry/test_agent_task_runner.py +++ /dev/null @@ -1,479 +0,0 @@ -"""Tests for the AI-agent task runner (router + dispatch orchestration). - -We never call a real agent: the router and the per-agent dispatch are patched, -and the in-memory ``TaskManager`` singleton tracks the background job. We assert -the orchestration side effects -- task status transitions on the ``domain_tasks`` -row, the audit comments, and the TaskManager terminal state. -""" - -from __future__ import annotations - -from types import SimpleNamespace -from unittest.mock import MagicMock, patch - -import pytest - -from back.core.task_manager import get_task_manager -from back.objects.registry import agent_task_runner as runner - - -def _fake_svc(): - """A registry-service double recording status updates + posted comments.""" - statuses = [] - comments = [] - svc = MagicMock() - svc.update_task_status.side_effect = lambda folder, tid, status: ( - statuses.append(status) or (True, "") - ) - svc.list_comments.return_value = [] - svc.insert_comment.side_effect = lambda *a, **k: ( - comments.append(k.get("body", "")) or {"id": "x"} - ) - svc.record_review_event.side_effect = lambda *a, **k: (True, "") - return svc, statuses, comments - - -def _svc_with_thread(thread): - """Service double whose list_comments returns *thread* (list of dicts).""" - svc, statuses, comments = _fake_svc() - svc.list_comments.return_value = thread - return svc, statuses, comments - - -def _router_ok(key="owl_generator"): - return SimpleNamespace( - success=True, chosen_agent_key=key, reasoning="fits", error="" - ) - - -def _router_fail(): - return SimpleNamespace( - success=False, chosen_agent_key="", reasoning="", error="no fit" - ) - - -def _plan_ready(): - return SimpleNamespace(success=True, ready=True, message="Running now.", error="") - - -# ---------------------------------------------------------------------- -# Sentinel helper -# ---------------------------------------------------------------------- - - -def test_is_ai_agent(): - assert runner.is_ai_agent("agent://router") is True - assert runner.is_ai_agent("AGENT://ROUTER") is True - assert runner.is_ai_agent("bob@acme.com") is False - assert runner.is_ai_agent("") is False - - -# ---------------------------------------------------------------------- -# start_agent_task setup guard -# ---------------------------------------------------------------------- - - -def test_start_agent_task_returns_none_when_llm_unconfigured(): - svc, _, _ = _fake_svc() - with patch( - "back.core.helpers.require_serving_llm", - side_effect=RuntimeError("Databricks LLM not configured"), - ): - bg = runner.start_agent_task( - svc=svc, domain=MagicMock(), settings=MagicMock(), - folder="acme", version="1", task_id="t1", - title="do something", description="", - ) - assert bg is None - # The failure is surfaced as an audit row on the task. - assert svc.record_review_event.called - - -# ---------------------------------------------------------------------- -# Background worker -# ---------------------------------------------------------------------- - - -def test_run_happy_path_routes_dispatches_and_completes(): - # Thread with a human reply beyond the root (2 user turns) so the - # code-enforced first-pass park does NOT apply and the ready path runs. - svc, statuses, comments = _svc_with_thread([ - {"id": "c1", "parent_id": "", "author": "alice@x.io", - "body": "Generate ontology", "created_at": "t0"}, - {"id": "r1", "parent_id": "c1", "author": "alice@x.io", - "body": "go ahead", "created_at": "t1"}, - ]) - tm = get_task_manager() - task = tm.create_task("AI Agent: x", "task_router", steps=[ - {"name": "route", "description": "r"}, - {"name": "run", "description": "u"}, - {"name": "finalize", "description": "f"}, - ]) - - with patch("agents.agent_task_router.run_agent", return_value=_router_ok()), \ - patch("agents.agent_task_planner.run_agent", return_value=_plan_ready()), \ - patch.object( - runner, "_dispatch_agent", - return_value=( - "generated ontology (10 chars)", - "Generated an ontology draft. Open the Ontology page.", - {"owl_content": "x"}, - ), - ): - runner._run( - task, svc=svc, domain=MagicMock(), host="h", token="t", - llm_endpoint="ep", warehouse_id="wh", folder="acme", version="1", - domain_task_id="t1", title="Generate ontology", description="", - comment_id="c1", - ) - - final = tm.get_task(task.id) - assert final.status.value == "completed" - assert final.result["agent"] == "owl_generator" - # Task moved open -> in_progress -> done. - assert statuses == ["in_progress", "done"] - # The agent report is posted to the Discussion as a comment. - assert any("Ontology Generator" in body for body in comments) - assert any("Generated an ontology draft" in body for body in comments) - - -def test_run_router_failure_leaves_task_open(): - svc, statuses, comments = _fake_svc() - tm = get_task_manager() - task = tm.create_task("AI Agent: x", "task_router") - - with patch("agents.agent_task_router.run_agent", return_value=_router_fail()): - runner._run( - task, svc=svc, domain=MagicMock(), host="h", token="t", - llm_endpoint="ep", warehouse_id="", folder="acme", version="1", - domain_task_id="t1", title="ambiguous", description="", - comment_id="", - ) - - final = tm.get_task(task.id) - assert final.status.value == "failed" - # Status never advanced past open. - assert statuses == [] - assert any("could not route" in body.lower() for body in comments) - - -def test_run_dispatch_exception_is_recorded_as_failure(): - # A replied-to thread (2 user turns) so the ready path reaches dispatch. - svc, statuses, comments = _svc_with_thread([ - {"id": "c1", "parent_id": "", "author": "alice@x.io", - "body": "Generate ontology", "created_at": "t0"}, - {"id": "r1", "parent_id": "c1", "author": "alice@x.io", - "body": "go ahead", "created_at": "t1"}, - ]) - tm = get_task_manager() - task = tm.create_task("AI Agent: x", "task_router") - - with patch("agents.agent_task_router.run_agent", return_value=_router_ok()), \ - patch("agents.agent_task_planner.run_agent", return_value=_plan_ready()), \ - patch.object(runner, "_dispatch_agent", side_effect=RuntimeError("agent boom")): - runner._run( - task, svc=svc, domain=MagicMock(), host="h", token="t", - llm_endpoint="ep", warehouse_id="", folder="acme", version="1", - domain_task_id="t1", title="Generate ontology", description="", - comment_id="c1", - ) - - final = tm.get_task(task.id) - assert final.status.value == "failed" - # It was picked up (in_progress) but never marked done. - assert statuses == ["in_progress"] - assert any("run failed" in body.lower() for body in comments) - - -def test_dispatch_unknown_agent_raises(): - with pytest.raises(RuntimeError): - runner._dispatch_agent( - "no_such_agent", domain=MagicMock(), host="h", token="t", - llm_endpoint="ep", warehouse_id="", on_step=lambda m: None, - ) - - -def test_dispatch_auto_assignment_persists_mappings(): - # The mapper must APPLY+PERSIST its proposals (not merely propose), so the - # mappings survive a page reload. - res = SimpleNamespace( - success=True, error="", - entity_mappings=[{"ontology_class": "C"}], - relationship_mappings=[], - steps=[], iterations=1, usage={}, - ) - fake_mapping = MagicMock() - fake_mapping.resolve_auto_assign_schema_context.return_value = {"tables": [1]} - fake_mapping.auto_assign_with_agent.return_value = res - fake_mapping.apply_agent_mappings.return_value = {"entities": 1, "relationships": 0} - fake_ont = MagicMock() - fake_ont.agent_ontology_context.return_value = {"entities": [{"uri": "C"}]} - - with patch("back.objects.mapping.Mapping", return_value=fake_mapping), \ - patch("back.objects.ontology.Ontology", return_value=fake_ont), \ - patch("back.core.databricks.DatabricksClient", return_value=MagicMock()): - summary, report, payload = runner._dispatch_agent( - "auto_assignment", domain=MagicMock(), host="h", token="t", - llm_endpoint="ep", warehouse_id="wh", task_text="map it", - on_step=lambda m: None, - ) - - fake_mapping.apply_agent_mappings.assert_called_once_with( - res.entity_mappings, res.relationship_mappings - ) - assert "Applied SQL mappings" in report - assert payload["entity_mappings"] == res.entity_mappings - - -def test_dispatch_ontology_assistant_applies_and_saves_changes(): - res = SimpleNamespace( - success=True, ontology_changed=True, reply="Removed the Person class.", - classes=[{"uri": "a"}], properties=[], steps=[], iterations=2, usage={}, - ) - fake_ont = MagicMock() - fake_ont.apply_agent_ontology_changes.return_value = { - "classes": [{"uri": "a"}], "properties": [], - } - domain = MagicMock() - domain.get_classes.return_value = [{"name": "Person"}] - domain.get_properties.return_value = [] - domain.ontology = {"base_uri": "http://x#"} - - with patch("agents.agent_ontology_assistant.run_agent", return_value=res), \ - patch("back.objects.ontology.Ontology", return_value=fake_ont): - summary, report, payload = runner._dispatch_agent( - "ontology_assistant", domain=domain, host="h", token="t", - llm_endpoint="ep", warehouse_id="", task_text="Is Person needed?", - on_step=lambda m: None, - ) - - # The edits are applied + persisted (apply_agent_ontology_changes calls save()). - fake_ont.apply_agent_ontology_changes.assert_called_once() - assert "updated the ontology" in summary - assert payload["ontology_changed"] is True - assert "Removed the Person class." in report - - -def test_dispatch_ontology_assistant_no_change(): - res = SimpleNamespace( - success=True, ontology_changed=False, reply="Person is still needed.", - classes=[], properties=[], steps=[], iterations=1, usage={}, - ) - fake_ont = MagicMock() - domain = MagicMock() - domain.get_classes.return_value = [{"name": "Person"}] - domain.get_properties.return_value = [] - domain.ontology = {"base_uri": "http://x#"} - - with patch("agents.agent_ontology_assistant.run_agent", return_value=res), \ - patch("back.objects.ontology.Ontology", return_value=fake_ont): - summary, report, payload = runner._dispatch_agent( - "ontology_assistant", domain=domain, host="h", token="t", - llm_endpoint="ep", warehouse_id="", task_text="Is Person needed?", - on_step=lambda m: None, - ) - - fake_ont.apply_agent_ontology_changes.assert_not_called() - assert payload["ontology_changed"] is False - assert "Person is still needed." in report - - -# ---------------------------------------------------------------------- -# Plan-then-run worker (_run_for_task) + thread-driven resume -# ---------------------------------------------------------------------- - - -def test_first_pass_parks_with_plan_and_stays_in_progress(monkeypatch): - svc, statuses, comments = _svc_with_thread( - [{"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "Is Person needed?", "created_at": "t0", - "anchor_type": "domain", "anchor_ref": ""}] - ) - router_res = SimpleNamespace(success=True, chosen_agent_key="ontology_assistant", - reasoning="edit", error="") - plan_res = SimpleNamespace(success=True, ready=False, - message="Plan: remove Person? Confirm.", error="") - monkeypatch.setattr("agents.agent_task_router.run_agent", lambda *a, **k: router_res) - monkeypatch.setattr("agents.agent_task_planner.run_agent", lambda *a, **k: plan_res) - dispatched = [] - monkeypatch.setattr(runner, "_dispatch_agent", - lambda *a, **k: dispatched.append(k) or ("s", "r", {})) - - runner._run_for_task( - svc=svc, domain=MagicMock(), host="h", token="t", llm_endpoint="ep", - warehouse_id="", folder="d", version="v", domain_task_id="T1", - title="Is Person needed?", description="", comment_id="root", - on_step=lambda m: None, tm=None, tm_task_id=None, - ) - - assert dispatched == [] # agent did NOT run - assert "in_progress" in statuses # parked - assert any("Plan: remove Person?" in c for c in comments) - - -def test_first_pass_parks_even_when_planner_ready(monkeypatch): - # Only the root comment (one human turn) -> first pass. Even though the - # planner says ready, the code-level guard must override and park. - svc, statuses, comments = _svc_with_thread( - [{"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "Remove Person", "created_at": "t0", - "anchor_type": "domain", "anchor_ref": ""}] - ) - router_res = SimpleNamespace(success=True, chosen_agent_key="ontology_assistant", - reasoning="edit", error="") - plan_res = SimpleNamespace(success=True, ready=True, message="Plan: confirm?", - error="") - monkeypatch.setattr("agents.agent_task_router.run_agent", lambda *a, **k: router_res) - monkeypatch.setattr("agents.agent_task_planner.run_agent", lambda *a, **k: plan_res) - dispatched = [] - monkeypatch.setattr(runner, "_dispatch_agent", - lambda *a, **k: dispatched.append(k) or ("s", "r", {})) - - runner._run_for_task( - svc=svc, domain=MagicMock(), host="h", token="t", llm_endpoint="ep", - warehouse_id="", folder="d", version="v", domain_task_id="T1", - title="Remove Person", description="", comment_id="root", - on_step=lambda m: None, tm=None, tm_task_id=None, - ) - - assert dispatched == [] # guard overrode planner readiness - assert statuses[-1] == "in_progress" # parked, never marked done - assert "done" not in statuses - - -def test_resume_runs_agent_when_planner_ready(monkeypatch): - svc, statuses, comments = _svc_with_thread([ - {"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "Is Person needed?", "created_at": "t0", - "anchor_type": "domain", "anchor_ref": ""}, - {"id": "q1", "parent_id": "root", "author": "AI Agent", - "body": "Remove Person?", "created_at": "t1", - "anchor_type": "domain", "anchor_ref": ""}, - {"id": "a1", "parent_id": "root", "author": "alice@x.io", - "body": "yes remove it", "created_at": "t2", - "anchor_type": "domain", "anchor_ref": ""}, - ]) - router_res = SimpleNamespace(success=True, chosen_agent_key="ontology_assistant", - reasoning="edit", error="") - plan_res = SimpleNamespace(success=True, ready=True, message="Running now.", error="") - monkeypatch.setattr("agents.agent_task_router.run_agent", lambda *a, **k: router_res) - monkeypatch.setattr("agents.agent_task_planner.run_agent", lambda *a, **k: plan_res) - captured = {} - monkeypatch.setattr( - runner, "_dispatch_agent", - lambda key, **k: captured.update(k) or ("updated", "Removed Person.", {}), - ) - - runner._run_for_task( - svc=svc, domain=MagicMock(), host="h", token="t", llm_endpoint="ep", - warehouse_id="", folder="d", version="v", domain_task_id="T1", - title="Is Person needed?", description="", comment_id="root", - on_step=lambda m: None, tm=None, tm_task_id=None, - ) - - assert statuses[-1] == "done" # solved - assert "yes remove it" in captured["task_text"] # answer folded in - assert any("Removed Person." in c for c in comments) - - -def test_is_unsupported_mapping_removal_detects_removal_intent(): - f = runner._is_unsupported_mapping_removal - assert f("Unmap Customer") is True - assert f("please remove the mapping for Order") is True - assert f("clear the SQL mapping") is True - assert f("unassign Person") is True - # Additive / unrelated requests must NOT trip the guard. - assert f("Map Customer to the orders table") is False - assert f("create an Agent Manager entity") is False - assert f("") is False - - -def test_run_for_task_refuses_unmap_and_parks(monkeypatch): - # "Unmap Customer" routed to the Auto SQL Mapper must be refused (the mapper - # only adds), parked for a rephrase -- never planned, never dispatched. - svc, statuses, comments = _svc_with_thread( - [{"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "Unmap Customer", "created_at": "t0"}] - ) - router_res = SimpleNamespace(success=True, chosen_agent_key="auto_assignment", - reasoning="map", error="") - plan_called = [] - monkeypatch.setattr("agents.agent_task_router.run_agent", lambda *a, **k: router_res) - monkeypatch.setattr( - "agents.agent_task_planner.run_agent", - lambda *a, **k: plan_called.append(1) or SimpleNamespace( - success=True, ready=True, message="", error=""), - ) - dispatched = [] - monkeypatch.setattr(runner, "_dispatch_agent", - lambda *a, **k: dispatched.append(k) or ("s", "r", {})) - - runner._run_for_task( - svc=svc, domain=MagicMock(), host="h", token="t", llm_endpoint="ep", - warehouse_id="wh", folder="d", version="v", domain_task_id="T1", - title="Unmap Customer", description="", comment_id="root", - on_step=lambda m: None, tm=None, tm_task_id=None, - ) - - assert dispatched == [] # mapper never ran - assert plan_called == [] # guard short-circuits before planning - assert statuses[-1] == "in_progress" # parked for a rephrase - assert "done" not in statuses - assert any("unmap" in c.lower() for c in comments) - - -def test_thread_history_maps_authors_to_roles(): - svc, _, _ = _svc_with_thread([ - {"id": "root", "parent_id": "", "author": "alice@x.io", - "body": "do X", "created_at": "t0"}, - {"id": "q1", "parent_id": "root", "author": "AI Agent", - "body": "clarify?", "created_at": "t1"}, - {"id": "a1", "parent_id": "root", "author": "alice@x.io", - "body": "answer", "created_at": "t2"}, - {"id": "other", "parent_id": "elsewhere", "author": "bob@x.io", - "body": "unrelated", "created_at": "t3"}, - ]) - hist = runner._thread_history(svc, "d", "v", "root") - assert [h["role"] for h in hist] == ["user", "assistant", "user"] - assert hist[1]["text"] == "clarify?" - assert all(h["text"] != "unrelated" for h in hist) # other thread excluded - - -def test_resume_skips_when_already_running(monkeypatch): - runner._ACTIVE_TASKS.add("T1") - try: - started = runner.resume_agent_task( - svc=MagicMock(), domain=MagicMock(), settings=MagicMock(), - folder="d", version="v", task={"id": "T1", "comment_id": "root", - "title": "x", "description": ""}, - ) - finally: - runner._ACTIVE_TASKS.discard("T1") - assert started is None - - -def test_claim_task_is_idempotent_per_id(): - assert "T9" not in runner._ACTIVE_TASKS - try: - assert runner._claim_task("T9") is True # first claim wins - assert runner._claim_task("T9") is False # already active - assert runner._claim_task("") is False # empty id never claims - finally: - runner._ACTIVE_TASKS.discard("T9") - - -def test_launch_failure_releases_the_claim(monkeypatch): - tm = MagicMock() - tm.run_background_task.side_effect = RuntimeError("thread boom") - monkeypatch.setattr( - "back.core.task_manager.get_task_manager", lambda: tm - ) - assert "T7" not in runner._ACTIVE_TASKS - with pytest.raises(RuntimeError): - runner._launch_worker( - svc=MagicMock(), domain=MagicMock(), host="h", token="t", - llm_endpoint="ep", warehouse_id="", folder="d", version="v", - task_id="T7", title="x", description="", comment_id="root", - ) - # The claim must NOT leak when the launch raises. - assert "T7" not in runner._ACTIVE_TASKS diff --git a/tests/units/registry/test_comment_service.py b/tests/units/registry/test_comment_service.py index ae282471..f6e989bd 100644 --- a/tests/units/registry/test_comment_service.py +++ b/tests/units/registry/test_comment_service.py @@ -168,58 +168,6 @@ def test_add_comment_requires_body(): user_role=ROLE_ADMIN, user_domain_role=ROLE_NONE) -def test_add_comment_resumes_active_ai_agent_task(): - prior = [{ - "id": "1", "folder": "acme", "version": "2", - "assignee": _mod.AI_AGENT_PRINCIPAL, "created_by": "alice@acme.com", - "title": "t", "description": "", "status": "in_progress", - "due_date": "", "comment_id": "5", - "created_at": "t", "updated_at": "t", - }] - svc, _, _, _ = _make_svc(status="DRAFT", tasks=prior) - with patch.object(_mod, "resume_agent_task", return_value="bg7") as resume: - result = _call("add_comment", svc, - body="any update?", parent_id="5", - user_role="", user_domain_role=ROLE_VIEWER) - assert result["success"] is True - resume.assert_called_once() - assert resume.call_args.kwargs["task"]["id"] == "1" - - -def test_add_comment_does_not_resume_done_task(): - prior = [{ - "id": "1", "folder": "acme", "version": "2", - "assignee": _mod.AI_AGENT_PRINCIPAL, "created_by": "alice@acme.com", - "title": "t", "description": "", "status": "done", - "due_date": "", "comment_id": "5", - "created_at": "t", "updated_at": "t", - }] - svc, _, _, _ = _make_svc(status="DRAFT", tasks=prior) - with patch.object(_mod, "resume_agent_task") as resume: - result = _call("add_comment", svc, - body="any update?", parent_id="5", - user_role="", user_domain_role=ROLE_VIEWER) - assert result["success"] is True - resume.assert_not_called() - - -def test_add_comment_does_not_resume_human_task(): - prior = [{ - "id": "1", "folder": "acme", "version": "2", - "assignee": "bob@acme.com", "created_by": "alice@acme.com", - "title": "t", "description": "", "status": "in_progress", - "due_date": "", "comment_id": "5", - "created_at": "t", "updated_at": "t", - }] - svc, _, _, _ = _make_svc(status="DRAFT", tasks=prior) - with patch.object(_mod, "resume_agent_task") as resume: - result = _call("add_comment", svc, - body="any update?", parent_id="5", - user_role="", user_domain_role=ROLE_VIEWER) - assert result["success"] is True - resume.assert_not_called() - - # ---------------------------------------------------------------------- # Comments — resolve # ---------------------------------------------------------------------- @@ -283,71 +231,6 @@ def test_create_task_succeeds_and_audits(): assert events[-1]["meta"]["task_id"] == tasks[-1]["id"] -def test_create_task_ai_agent_triggers_runner(): - svc, _, tasks, _ = _make_svc(status="DRAFT") - with patch.object(_mod, "start_agent_task", return_value="bg42") as start: - result = _call( - "create_task", svc, assignee=_mod.AI_AGENT_PRINCIPAL, - title="Generate the ontology", description="from metadata", - due_date=None, comment_id="7", - user_role="", user_domain_role=ROLE_VIEWER, - ) - assert result["success"] is True - assert result["agent_task_id"] == "bg42" - start.assert_called_once() - assert start.call_args.kwargs["task_id"] == tasks[-1]["id"] - assert start.call_args.kwargs["title"] == "Generate the ontology" - - -def test_create_task_ai_agent_no_comment_inserts_kickoff(): - svc, comments, tasks, _ = _make_svc(status="DRAFT") - with patch.object(_mod, "start_agent_task", return_value="bg99") as start: - result = _call( - "create_task", svc, assignee=_mod.AI_AGENT_PRINCIPAL, - title="Generate the ontology", description="from metadata", - due_date=None, comment_id=None, - user_role="", user_domain_role=ROLE_VIEWER, - ) - assert result["success"] is True - # A kickoff comment was created (body = the task statement) ... - assert comments[-1]["body"] == "Generate the ontology\n\nfrom metadata" - kickoff_id = comments[-1]["id"] - # ... and the task + runner are anchored to it. - assert tasks[-1]["comment_id"] == kickoff_id - start.assert_called_once() - assert start.call_args.kwargs["comment_id"] == kickoff_id - - -def test_create_task_ai_agent_kickoff_failure_still_creates_task(): - svc, _, tasks, _ = _make_svc(status="DRAFT") - # The kickoff comment can't be created (store returns falsy): the task is - # still created, just without a thread root (comment_id stays None). - svc.insert_comment.side_effect = lambda *a, **k: None - with patch.object(_mod, "start_agent_task", return_value="bg00") as start: - result = _call( - "create_task", svc, assignee=_mod.AI_AGENT_PRINCIPAL, - title="Generate the ontology", description="from metadata", - due_date=None, comment_id=None, - user_role="", user_domain_role=ROLE_VIEWER, - ) - assert result["success"] is True - assert svc.insert_task.call_args.kwargs["comment_id"] is None - assert start.call_args.kwargs["comment_id"] == "" - - -def test_create_task_human_assignee_does_not_trigger_runner(): - svc, _, _, _ = _make_svc(status="DRAFT") - with patch.object(_mod, "start_agent_task") as start: - result = _call( - "create_task", svc, assignee="bob@acme.com", title="Fix mapping", - description="", due_date=None, comment_id=None, - user_role="", user_domain_role=ROLE_VIEWER, - ) - assert result["success"] is True - assert "agent_task_id" not in result - start.assert_not_called() - - def test_create_task_requires_assignee(): svc, _, _, _ = _make_svc(status="DRAFT") with pytest.raises(ValidationError): @@ -515,11 +398,8 @@ def test_list_assignees_returns_domain_holders_sorted(): result = _call_assignees(entries=entries) assert result["success"] is True members = result["members"] - # The AI Agent is always offered first. - assert members[0]["principal"] == _mod.AI_AGENT_PRINCIPAL - assert members[0]["principal_type"] == "agent" - # Then domain holders, most-privileged first; the role-less entry is dropped. - assert [m["principal"] for m in members[1:]] == [ + # Domain holders, most-privileged first; the role-less entry is dropped. + assert [m["principal"] for m in members] == [ "b@acme.com", "e@acme.com", "v@acme.com", ] From 047956b37d09616b400600785a555a9131c23e10 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Fri, 19 Jun 2026 15:46:34 +0200 Subject: [PATCH 11/54] feat (tests) add tests for comments --- .../v0.6.0/benoitcayladbx_2026-06-19.log | 47 +++ .../units/registry/test_comment_multiuser.py | 276 ++++++++++++++ tests/units/registry/test_review_multiuser.py | 345 ++++++++++++++++++ 3 files changed, 668 insertions(+) create mode 100644 tests/units/registry/test_comment_multiuser.py create mode 100644 tests/units/registry/test_review_multiuser.py diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log index 9d210b07..b1840391 100644 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log @@ -1,3 +1,50 @@ +## Tests: Multi-user review/comment/task collaboration scenarios + +**Context:** The review/validation workflow (`ReviewService`) and the +collaborative comments/tasks workflow (`CommentService`) were well covered for +single-actor rules, but the *interactions between distinct users* that the +audit trail and sign-off quorum exist for were under-tested: distinct reviewers +accumulating sign-offs toward a quorum end-to-end, a change-request from one +reviewer discarding another's approval, a full lifecycle chain driven by four +different users, and the cross-domain `my_tasks` worklist resolving a real +per-domain role (not the admin short-circuit). Added two focused test modules +that drive several sequential calls against a shared review-event / comment / +task list so the rules run as a real multi-user sequence. + +**Changes:** +1. `tests/units/registry/test_review_multiuser.py` (new) — 9 tests: + - two distinct reviewers meeting a quorum of 2 then a builder publishing + (no override, distinct approvers recorded in order); + - a single reviewer / a duplicate sign-off (incl. case-insensitive email) + failing to satisfy the quorum and blocking publish; + - a change-request discarding a prior approval and reopening to DRAFT; + - a full DRAFT -> IN-REVIEW -> PUBLISHED -> reopen -> resubmit chain + (builder + two reviewers + admin) with the interleaved audit log asserted; + - `my_tasks` resolving a real per-domain role via a stubbed + `permission_service.get_domain_role` — listing only domains where the + caller has a role, and gating the builder's "publish" action on a + distinct-approver quorum. +2. `tests/units/registry/test_comment_multiuser.py` (new) — 9 tests: + - a threaded conversation (root + replies) authored by three members with + `parent_id` anchoring asserted; + - author vs editor vs stranger resolution rules on another user's thread; + - a task created by one user, assigned to a second, completed only by the + assignee (stranger refused, creator + admin allowed), with the linked + `commented` audit rows (`task_created` / `task_done`) asserted; + - collaboration blocked once the version is PUBLISHED. + +No production code changed — tests only. + +**Modified files:** +- `tests/units/registry/test_review_multiuser.py` (new) +- `tests/units/registry/test_comment_multiuser.py` (new) + +**Test result:** `pytest tests/units/registry/test_review_multiuser.py +tests/units/registry/test_comment_multiuser.py` → 18 passed. Full +`pytest tests/units` → 2432 passed, 1 warning. + +--- + ## Change: Drop the comment `anchor_type` / `anchor_ref` columns **Context:** Discussions are now a single domain-wide thread per diff --git a/tests/units/registry/test_comment_multiuser.py b/tests/units/registry/test_comment_multiuser.py new file mode 100644 index 00000000..af8f4cc5 --- /dev/null +++ b/tests/units/registry/test_comment_multiuser.py @@ -0,0 +1,276 @@ +"""Multi-user comment & task scenarios (CommentService). + +The single-action rules are covered in ``test_comment_service.py``. This +module exercises *collaboration between distinct users* on the shared +domain discussion: + +* a threaded conversation (root + replies) authored by several members, +* one member resolving another member's thread (author vs editor vs + stranger), +* a task created by one user, assigned to a second, worked by the + assignee, and refused to an unrelated third user, and +* the unified audit rows (``commented``) that each task event appends. + +Collaborators are mocked but the comment/task rows are shared across the +sequential calls so the threading and ownership rules run end-to-end. +""" + +import importlib + +import pytest +from unittest.mock import MagicMock, patch + +from back.core.errors import AuthorizationError, ConflictError +from back.objects.registry.PermissionService import ( + ROLE_ADMIN, + ROLE_BUILDER, + ROLE_EDITOR, + ROLE_NONE, + ROLE_VIEWER, +) +from back.objects.registry.CommentService import CommentService + +_mod = importlib.import_module("back.objects.registry.CommentService") + + +def _request(email="alice@acme.com"): + req = MagicMock() + req.state.user_email = email + req.headers = {} + return req + + +def _make_svc(*, status="DRAFT", versions=("1", "2"), configured=True, + comments=None, tasks=None): + info = {"status": status} + comment_rows = [dict(c) for c in (comments or [])] + task_rows = [dict(t) for t in (tasks or [])] + events = [] + + svc = MagicMock() + svc.cfg.is_configured = configured + svc.list_versions_sorted.return_value = list(versions) + svc.read_version.return_value = (True, {"info": info}, "") + + def _insert_comment(folder, version, *, author, body, parent_id=None): + row = { + "id": str(len(comment_rows) + 1), "folder": folder, + "version": version, "parent_id": parent_id or "", + "author": author, "body": body, "resolved": False, + "created_at": "2026-01-01T00:00:00", + } + comment_rows.append(row) + return dict(row) + + def _list_comments(folder, version=None, *, include_resolved=True): + return [dict(c) for c in comment_rows] + + def _resolve_comment(folder, comment_id, *, resolved=True): + for c in comment_rows: + if c["id"] == str(comment_id): + c["resolved"] = resolved + return True, "" + return False, "Comment not found" + + def _insert_task(folder, version, *, assignee, created_by, title, + description="", due_date=None, comment_id=None): + row = { + "id": str(len(task_rows) + 1), "folder": folder, + "version": version, "assignee": assignee, + "created_by": created_by, "title": title, + "description": description, "status": "open", + "due_date": due_date or "", "comment_id": comment_id or "", + "created_at": "2026-01-01T00:00:00", + "updated_at": "2026-01-01T00:00:00", + } + task_rows.append(row) + return dict(row) + + def _list_tasks(folder, version=None): + return [dict(t) for t in task_rows] + + def _update_task_status(folder, task_id, status): + for t in task_rows: + if t["id"] == str(task_id): + t["status"] = status + return True, "" + return False, "Task not found" + + def _record(folder, version, actor, action, *, from_status="", + to_status="", comment="", meta=None): + events.append({"actor": actor, "action": action, + "comment": comment, "meta": meta or {}}) + return True, "" + + svc.insert_comment.side_effect = _insert_comment + svc.list_comments.side_effect = _list_comments + svc.resolve_comment.side_effect = _resolve_comment + svc.insert_task.side_effect = _insert_task + svc.list_tasks.side_effect = _list_tasks + svc.update_task_status.side_effect = _update_task_status + svc.record_review_event.side_effect = _record + return svc, comment_rows, task_rows, events + + +def _patch(svc): + domain = MagicMock() + return patch.object(_mod, "get_domain", MagicMock(return_value=domain)), \ + patch.object(_mod.RegistryService, "from_context", return_value=svc) + + +def _call(method, svc, **kwargs): + email = kwargs.pop("email", "alice@acme.com") + p1, p2 = _patch(svc) + with p1, p2: + return getattr(CommentService, method)( + _request(email), MagicMock(), MagicMock(), "acme", "2", **kwargs + ) + + +# ---------------------------------------------------------------------- +# Threaded conversation across users +# ---------------------------------------------------------------------- + + +def test_comment_thread_across_three_users(): + svc, comments, _, _ = _make_svc(status="DRAFT") + + root = _call("add_comment", svc, body="Person should be Individual", + parent_id=None, email="alice@acme.com", + user_role="", user_domain_role=ROLE_EDITOR) + root_id = root["comment"]["id"] + + _call("add_comment", svc, body="agreed", parent_id=root_id, + email="bob@acme.com", user_role="", user_domain_role=ROLE_VIEWER) + _call("add_comment", svc, body="renamed", parent_id=root_id, + email="carol@acme.com", user_role="", user_domain_role=ROLE_BUILDER) + + listing = _call("list_comments", svc, user_role="", + user_domain_role=ROLE_VIEWER) + rows = listing["comments"] + assert [c["author"] for c in rows] == [ + "alice@acme.com", "bob@acme.com", "carol@acme.com", + ] + # Both replies are anchored to the root comment. + replies = [c for c in rows if c["parent_id"] == root_id] + assert {c["author"] for c in replies} == { + "bob@acme.com", "carol@acme.com", + } + assert all(c["parent_id"] == "" for c in rows if c["id"] == root_id) + + +def test_non_member_cannot_join_the_thread(): + svc, _, _, _ = _make_svc(status="DRAFT") + with pytest.raises(AuthorizationError): + _call("add_comment", svc, body="hi", parent_id=None, + email="outsider@acme.com", user_role="", + user_domain_role=ROLE_NONE) + + +# ---------------------------------------------------------------------- +# Resolving another user's thread +# ---------------------------------------------------------------------- + + +def _seed_comment(author="bob@acme.com"): + return [{ + "id": "1", "folder": "acme", "version": "2", "parent_id": "", + "author": author, "body": "x", "resolved": False, "created_at": "t", + }] + + +def test_author_resolves_own_thread(): + svc, comments, _, _ = _make_svc(status="DRAFT", + comments=_seed_comment("bob@acme.com")) + _call("resolve_comment", svc, comment_id="1", resolved=True, + email="bob@acme.com", user_role="", user_domain_role=ROLE_VIEWER) + assert comments[0]["resolved"] is True + + +def test_editor_resolves_another_users_thread(): + svc, comments, _, _ = _make_svc(status="DRAFT", + comments=_seed_comment("bob@acme.com")) + _call("resolve_comment", svc, comment_id="1", resolved=True, + email="carol@acme.com", user_role="", user_domain_role=ROLE_EDITOR) + assert comments[0]["resolved"] is True + + +def test_viewer_cannot_resolve_another_users_thread(): + svc, _, _, _ = _make_svc(status="DRAFT", + comments=_seed_comment("bob@acme.com")) + with pytest.raises(AuthorizationError): + _call("resolve_comment", svc, comment_id="1", resolved=True, + email="carol@acme.com", user_role="", + user_domain_role=ROLE_VIEWER) + + +# ---------------------------------------------------------------------- +# Task delegation between distinct users +# ---------------------------------------------------------------------- + + +def test_task_delegated_and_completed_by_assignee_only(): + svc, _, tasks, events = _make_svc(status="DRAFT") + + # Alice (editor) creates a task assigned to Bob. + created = _call("create_task", svc, assignee="bob@acme.com", + title="Fix the SDTM mapping", description="", + due_date=None, comment_id="9", + email="alice@acme.com", user_role="", + user_domain_role=ROLE_EDITOR) + task_id = created["task"]["id"] + assert tasks[-1]["assignee"] == "bob@acme.com" + assert tasks[-1]["created_by"] == "alice@acme.com" + # Creating the task drops a linked audit row. + assert events[-1]["action"] == "commented" + assert events[-1]["meta"]["event"] == "task_created" + assert events[-1]["meta"]["task_id"] == task_id + + # An unrelated viewer may not advance someone else's task. + with pytest.raises(AuthorizationError): + _call("update_task_status", svc, task_id=task_id, status="in_progress", + email="carol@acme.com", user_role="", + user_domain_role=ROLE_VIEWER) + + # The assignee can, and completing it audits a task_done row. + _call("update_task_status", svc, task_id=task_id, status="done", + email="bob@acme.com", user_role="", user_domain_role=ROLE_VIEWER) + assert tasks[-1]["status"] == "done" + assert events[-1]["actor"] == "bob@acme.com" + assert events[-1]["meta"]["event"] == "task_done" + assert events[-1]["meta"]["task_id"] == task_id + + +def test_task_creator_can_also_update_their_delegated_task(): + svc, _, tasks, _ = _make_svc(status="DRAFT") + created = _call("create_task", svc, assignee="bob@acme.com", + title="t", description="", due_date=None, comment_id=None, + email="alice@acme.com", user_role="", + user_domain_role=ROLE_EDITOR) + task_id = created["task"]["id"] + # The creator (alice) is an owner too. + _call("update_task_status", svc, task_id=task_id, status="cancelled", + email="alice@acme.com", user_role="", user_domain_role=ROLE_EDITOR) + assert tasks[-1]["status"] == "cancelled" + + +def test_admin_can_update_any_users_task(): + svc, _, tasks, _ = _make_svc(status="DRAFT") + created = _call("create_task", svc, assignee="bob@acme.com", + title="t", description="", due_date=None, comment_id=None, + email="alice@acme.com", user_role="", + user_domain_role=ROLE_BUILDER) + task_id = created["task"]["id"] + _call("update_task_status", svc, task_id=task_id, status="in_progress", + email="zoe@acme.com", user_role=ROLE_ADMIN, + user_domain_role=ROLE_NONE) + assert tasks[-1]["status"] == "in_progress" + + +def test_collaboration_blocked_once_published(): + svc, _, _, _ = _make_svc(status="PUBLISHED") + with pytest.raises(ConflictError): + _call("create_task", svc, assignee="bob@acme.com", title="late", + description="", due_date=None, comment_id=None, + email="alice@acme.com", user_role=ROLE_ADMIN, + user_domain_role=ROLE_NONE) diff --git a/tests/units/registry/test_review_multiuser.py b/tests/units/registry/test_review_multiuser.py new file mode 100644 index 00000000..fe3da14e --- /dev/null +++ b/tests/units/registry/test_review_multiuser.py @@ -0,0 +1,345 @@ +"""Multi-user review/validation scenarios (ReviewService). + +The single-actor rules are covered in ``test_review_service.py``. This +module exercises the *interactions between several distinct users* that +the audit trail and quorum gate exist for: + +* distinct reviewers accumulating sign-offs toward a quorum, +* the same reviewer being unable to satisfy the quorum alone, +* a change-request from one reviewer discarding another's approval, +* a full DRAFT -> IN-REVIEW -> PUBLISHED -> reopen -> resubmit chain + driven by a builder, two reviewers and an admin, and +* the cross-domain ``my_tasks`` worklist resolving a *real* per-domain + role for the caller (not the admin short-circuit). + +Collaborators are mocked, but the review-event list is shared across the +sequential calls so the workflow rules are exercised end-to-end. +""" + +import importlib + +import pytest +from unittest.mock import MagicMock, patch + +from back.core.errors import ConflictError +from back.objects.registry.PermissionService import ( + ROLE_ADMIN, + ROLE_BUILDER, + ROLE_NONE, + ROLE_VIEWER, +) +from back.objects.registry.ReviewService import ( + ACTION_APPROVED, + ACTION_PUBLISHED, + ACTION_SUBMITTED, + ReviewService, +) + +_mod = importlib.import_module("back.objects.registry.ReviewService") + + +# ---------------------------------------------------------------------- +# Shared fixtures (mirror test_review_service.py so a svc accumulates +# events across multiple sequential _call invocations). +# ---------------------------------------------------------------------- + + +def _request(email="alice@acme.com"): + req = MagicMock() + req.state.user_email = email + req.headers = {} + return req + + +def _make_svc(*, status="DRAFT", last_build="2026-01-01", quorum=1, + versions=("1", "2"), initial_events=None, configured=True): + info = {"status": status, "last_build": last_build} + events = [dict(e) for e in (initial_events or [])] + + svc = MagicMock() + svc.cfg.is_configured = configured + svc.list_versions_sorted.return_value = list(versions) + svc.read_version.return_value = (True, {"info": info}, "") + svc.store.get_domain_quorum.return_value = quorum + + def _set_status(folder, version, new_status): + info["status"] = new_status + return True, "ok" + + svc.set_version_status.side_effect = _set_status + + def _record(folder, version, actor, action, *, from_status="", + to_status="", comment="", meta=None): + events.append({ + "folder": folder, "version": version, "actor": actor, + "action": action, "from_status": from_status, + "to_status": to_status, "comment": comment, + "meta": meta or {}, + "created_at": "2026-01-01T00:00:%02d" % len(events), + }) + return True, "" + + svc.record_review_event.side_effect = _record + svc.list_review_events.side_effect = lambda folder, version=None: list(events) + return svc, info, events + + +def _patch(svc): + domain = MagicMock() + domain.domain_folder = "other" + domain.current_version = "9" + domain.info = {} + return patch.multiple( + _mod, + get_domain=MagicMock(return_value=domain), + invalidate_registry_cache=MagicMock(), + ), patch.object(_mod.RegistryService, "from_context", return_value=svc) + + +def _call(method, svc, **kwargs): + p1, p2 = _patch(svc) + with p1, p2: + return getattr(ReviewService, method)( + _request(kwargs.pop("email", "alice@acme.com")), + MagicMock(), # session_mgr + MagicMock(), # settings + "acme", + "2", + **kwargs, + ) + + +def _approve(svc, email): + return _call("signoff", svc, decision="approve", comment="", + email=email, user_role="", user_domain_role=ROLE_VIEWER) + + +# ---------------------------------------------------------------------- +# Quorum across distinct reviewers +# ---------------------------------------------------------------------- + + +def test_two_distinct_reviewers_meet_quorum_then_builder_publishes(): + svc, info, events = _make_svc(status="IN-REVIEW", quorum=2) + + _approve(svc, "bob@acme.com") + detail = _approve(svc, "carol@acme.com") + assert detail["approvals"] == 2 + assert detail["approvers"] == ["bob@acme.com", "carol@acme.com"] + assert detail["quorum_met"] is True + + result = _call("publish", svc, comment="ship", + email="dave@acme.com", user_role="", + user_domain_role=ROLE_BUILDER) + assert result["status"] == "PUBLISHED" + assert info["status"] == "PUBLISHED" + + published = events[-1] + assert published["action"] == ACTION_PUBLISHED + assert published["actor"] == "dave@acme.com" + assert published["meta"]["quorum_override"] is False + assert published["meta"]["approvals"] == 2 + assert [e["actor"] for e in events if e["action"] == ACTION_APPROVED] == [ + "bob@acme.com", "carol@acme.com", + ] + + +def test_single_reviewer_below_quorum_blocks_builder_publish(): + svc, info, _ = _make_svc(status="IN-REVIEW", quorum=2) + _approve(svc, "bob@acme.com") + with pytest.raises(ConflictError): + _call("publish", svc, comment="", + email="dave@acme.com", user_role="", + user_domain_role=ROLE_BUILDER) + assert info["status"] == "IN-REVIEW" # publish was rejected + + +def test_same_reviewer_cannot_satisfy_quorum_alone(): + svc, _, events = _make_svc(status="IN-REVIEW", quorum=2) + _approve(svc, "bob@acme.com") + # Bob signing off a second time is rejected and does not double-count. + with pytest.raises(ConflictError): + _approve(svc, "bob@acme.com") + assert len([e for e in events if e["action"] == ACTION_APPROVED]) == 1 + with pytest.raises(ConflictError): + _call("publish", svc, comment="", + email="dave@acme.com", user_role="", + user_domain_role=ROLE_BUILDER) + + +def test_approver_email_is_case_insensitive_across_users(): + svc, _, _ = _make_svc(status="IN-REVIEW", quorum=2) + _approve(svc, "Bob@Acme.com") + with pytest.raises(ConflictError): + _approve(svc, "bob@acme.com") # same person, different casing + + +def test_request_changes_discards_other_reviewers_approval(): + svc, info, events = _make_svc(status="IN-REVIEW", quorum=2) + _approve(svc, "bob@acme.com") + # A second reviewer asks for changes -> reopen + reset the round. + _call("signoff", svc, decision="request_changes", comment="rename X", + email="carol@acme.com", user_role="", user_domain_role=ROLE_VIEWER) + assert info["status"] == "DRAFT" + summary = ReviewService._summarize(events) + assert summary["approvals"] == 0 + assert summary["approvers"] == [] + + +# ---------------------------------------------------------------------- +# Full lifecycle chain driven by four different users +# ---------------------------------------------------------------------- + + +def test_full_lifecycle_chain_multiuser(): + svc, info, events = _make_svc(status="DRAFT", last_build="2026-01-01", + quorum=2) + + # Builder submits. + _call("submit", svc, comment="ready", email="alice@acme.com", + user_role="", user_domain_role=ROLE_BUILDER) + assert info["status"] == "IN-REVIEW" + assert events[-1]["action"] == ACTION_SUBMITTED + + # Two distinct reviewers approve. + _approve(svc, "bob@acme.com") + _approve(svc, "carol@acme.com") + + # Builder publishes on a met quorum (not an override). + pub = _call("publish", svc, comment="ship", email="alice@acme.com", + user_role="", user_domain_role=ROLE_BUILDER) + assert pub["status"] == "PUBLISHED" + assert events[-1]["meta"]["quorum_override"] is False + + # An admin reopens for a hotfix. + _call("reopen", svc, comment="hotfix", email="zoe@acme.com", + user_role=ROLE_ADMIN, user_domain_role=ROLE_NONE) + assert info["status"] == "DRAFT" + + # Resubmitting starts a fresh review round with zero approvals. + detail = _call("submit", svc, comment="round 2", email="alice@acme.com", + user_role="", user_domain_role=ROLE_BUILDER) + assert detail["status"] == "IN-REVIEW" + assert detail["approvals"] == 0 + + # The audit log preserves the whole interleaved history. + actions = [e["action"] for e in events] + assert actions == [ + ACTION_SUBMITTED, ACTION_APPROVED, ACTION_APPROVED, + ACTION_PUBLISHED, "reopened", ACTION_SUBMITTED, + ] + + +# ---------------------------------------------------------------------- +# My Tasks — real per-domain role resolution for the caller +# ---------------------------------------------------------------------- + + +def _my_tasks_svc(domains, events=None, *, configured=True): + svc = MagicMock() + svc.cfg.is_configured = configured + svc.list_domain_details_cached.return_value = (True, list(domains), "") + svc.list_all_review_events.return_value = list(events or []) + svc.list_tasks_for_assignee.return_value = [] + return svc + + +def _call_my_tasks_roles(svc, role_map, *, email="alice@acme.com", + app_role="viewer"): + """Invoke my_tasks resolving a *real* per-domain role per folder. + + ``app_role`` is non-empty and non-admin so ``_resolve_roles`` performs + the registry lookup instead of the admin short-circuit; the lookup is + stubbed from ``role_map`` (folder -> role). + """ + req = _request(email) + req.state.user_role = app_role + domain = MagicMock() + domain.domain_folder = "other" + domain.current_version = "9" + domain.info = {} + + def _role(*args, **kwargs): + folder = args[5] # (email, host, token, cfg, app_name, folder, ...) + return role_map.get(folder, ROLE_NONE) + + with ( + patch.object(_mod, "get_domain", return_value=domain), + patch.object(_mod.RegistryService, "from_context", return_value=svc), + patch.object( + _mod.RegistryCfg, "from_domain", + return_value=MagicMock(as_dict=lambda: {}), + ), + patch( + "back.core.helpers.get_databricks_host_and_token", + return_value=("https://host", "tok"), + ), + patch.object(_mod.permission_service, "get_domain_role", + side_effect=_role), + ): + return ReviewService.my_tasks(req, MagicMock(), MagicMock()) + + +def test_my_tasks_lists_only_domains_where_user_has_a_role(): + domains = [ + {"name": "acme", "review_quorum": 1, + "versions": [{"version": "2", "status": "IN-REVIEW", + "last_build": "b"}]}, + {"name": "beta", "review_quorum": 1, + "versions": [{"version": "1", "status": "IN-REVIEW", + "last_build": "b"}]}, + ] + result = _call_my_tasks_roles( + _my_tasks_svc(domains), {"acme": ROLE_VIEWER, "beta": ROLE_NONE} + ) + assert [t["domain"] for t in result["tasks"]] == ["acme"] + task = result["tasks"][0] + assert task["your_role"] == ROLE_VIEWER + assert [a["id"] for a in task["actions"]] == ["review"] + + +def test_my_tasks_builder_has_no_publish_below_quorum(): + domains = [{ + "name": "acme", "review_quorum": 2, + "versions": [{"version": "2", "status": "IN-REVIEW", + "last_build": "b"}], + }] + events = [ + {"folder": "acme", "version": "2", "action": ACTION_SUBMITTED, + "actor": "x", "created_at": "t1"}, + {"folder": "acme", "version": "2", "action": ACTION_APPROVED, + "actor": "bob@acme.com", "created_at": "t2"}, + ] + result = _call_my_tasks_roles( + _my_tasks_svc(domains, events), {"acme": ROLE_BUILDER}, + email="alice@acme.com", + ) + task = result["tasks"][0] + ids = [a["id"] for a in task["actions"]] + assert task["approvals"] == 1 + assert "publish" not in ids + # The builder has not approved yet, so they can still review. + assert "review" in ids + + +def test_my_tasks_builder_gets_publish_when_distinct_quorum_met(): + domains = [{ + "name": "acme", "review_quorum": 2, + "versions": [{"version": "2", "status": "IN-REVIEW", + "last_build": "b"}], + }] + events = [ + {"folder": "acme", "version": "2", "action": ACTION_SUBMITTED, + "actor": "x", "created_at": "t1"}, + {"folder": "acme", "version": "2", "action": ACTION_APPROVED, + "actor": "bob@acme.com", "created_at": "t2"}, + {"folder": "acme", "version": "2", "action": ACTION_APPROVED, + "actor": "carol@acme.com", "created_at": "t3"}, + ] + result = _call_my_tasks_roles( + _my_tasks_svc(domains, events), {"acme": ROLE_BUILDER}, + email="alice@acme.com", + ) + task = result["tasks"][0] + assert task["approvals"] == 2 + assert "publish" in [a["id"] for a in task["actions"]] From c2416ccbd57eba7d0450bee251278a2253bda5cd Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Fri, 19 Jun 2026 15:56:10 +0200 Subject: [PATCH 12/54] feat (discussion) fixes --- .../v0.6.0/benoitcayladbx_2026-06-19.log | 69 +++++++++++++++++++ src/front/static/global/js/comments-panel.js | 3 +- src/front/static/ontology/js/ontology-map.js | 14 ++++ .../ontology/_ontology_information.html | 12 +++- 4 files changed, 94 insertions(+), 4 deletions(-) diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log index b1840391..57458ea3 100644 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-19.log @@ -282,3 +282,72 @@ this capability before the v0.6 merge to keep the feature surface focused. **Test result:** `pytest tests/units tests/back -q` → 2132 passed, 15 skipped, 1 pre-existing lakebase/psycopg failure unrelated to these changes. + +--- + +## Fix: Discussion panel crashes on open — `stopPanelPolling` not defined + +**Context:** Clicking the Discussion button on the Designer (and any other +surface calling `OntoComments.openForSelection`) silently failed after a fresh +page load. The `build()` function in `comments-panel.js` referenced +`stopPanelPolling` as an event listener callback on the `hidden.bs.offcanvas` +event, but that function was never defined — it was a stale reference left when +the AI-Agent polling loop was removed. The `ReferenceError` was thrown inside +the async `openThread` promise, aborting the whole flow before the offcanvas +ever opened. + +**Changes:** +1. `src/front/static/global/js/comments-panel.js` — replaced the + `stopPanelPolling` reference with an explicit no-op arrow function + (`() => {}`). The listener is kept as a hook for future cleanup (e.g. + clearing a future auto-refresh timer) without breaking anything today. + +**Modified files:** +- `src/front/static/global/js/comments-panel.js` + +**Test result:** `pytest tests/units -q` → 2372 passed, 15 skipped, 4 +pre-existing lakebase/psycopg failures unrelated to this change. + +--- + +## Feature: Add Discussion button to Ontology/Information page + +**Context:** The Discussion button (opening the domain-wide comments panel via +`openOntologyDiscussion()`) was only present on the Visual Designer tab. The +Information tab had no way to open it, forcing the user to navigate to a +different tab. + +**Changes:** +1. `src/front/templates/partials/ontology/_ontology_information.html` — wrapped + the existing Reset button in a flex group and added the Discussion button + (`btn-outline-primary onto-discuss-btn`) with the same markup and + `onclick="openOntologyDiscussion()"` as the Designer tab. + +**Modified files:** +- `src/front/templates/partials/ontology/_ontology_information.html` + +**Test result:** no JS/Python logic changed — existing test suite unaffected. + +--- + +## Fix: Suppress spurious `[Map] Skipping property` warnings for data-type attributes + +**Context:** The ontology graph map was logging `console.warn` for every +data-type attribute property (range = `string`, `integer`, `double`, +`boolean`, `date`, etc.) because it tried to resolve the range as a class node +and failed. These are not errors — data-type attributes are intentionally +absent from the graph. The noisy warnings made it hard to spot real problems +(a range that names a class but can't be resolved). + +**Changes:** +1. `src/front/static/ontology/js/ontology-map.js` — added a `PRIMITIVE_TYPES` + set covering common XSD/OWL literal types. In the property-link loop, + properties whose `range` matches a primitive are skipped silently (no + `console.warn`); only genuine misconfigured object properties (range looks + like a class name but isn't found) still log a warning. + +**Modified files:** +- `src/front/static/ontology/js/ontology-map.js` + +**Test result:** `pytest tests/units -q` → 2372 passed, 15 skipped, 4 +pre-existing lakebase/psycopg failures unrelated to this change. diff --git a/src/front/static/global/js/comments-panel.js b/src/front/static/global/js/comments-panel.js index 170b3ae5..212c0068 100644 --- a/src/front/static/global/js/comments-panel.js +++ b/src/front/static/global/js/comments-panel.js @@ -95,7 +95,8 @@ postComment((ta.value || '').trim(), null, ta, compose); }); el.querySelector('[data-oc-new-task]').addEventListener('click', openNewTask); - el.addEventListener('hidden.bs.offcanvas', stopPanelPolling); + // No-op: polling was removed; handler kept for future cleanup hooks. + el.addEventListener('hidden.bs.offcanvas', () => {}); } // Header subtitle: discussions are domain-wide, so just name the domain diff --git a/src/front/static/ontology/js/ontology-map.js b/src/front/static/ontology/js/ontology-map.js index e0f2125f..127533b6 100644 --- a/src/front/static/ontology/js/ontology-map.js +++ b/src/front/static/ontology/js/ontology-map.js @@ -190,10 +190,24 @@ async function initOntologyMap() { return nodeNameLower.get(name.toLowerCase()); } + // Primitive XSD/OWL data types — properties whose range is one of these are + // data-type attributes, not object relationships. Skip them silently; they + // have no target node on the graph. + const PRIMITIVE_TYPES = new Set([ + 'string', 'integer', 'int', 'long', 'float', 'double', 'decimal', + 'boolean', 'date', 'datetime', 'time', 'duration', + 'anyuri', 'literal', 'plainliteral', 'langstring', + 'xsd:string', 'xsd:integer', 'xsd:int', 'xsd:long', 'xsd:float', + 'xsd:double', 'xsd:decimal', 'xsd:boolean', 'xsd:date', + 'xsd:datetime', 'xsd:time', 'xsd:duration', 'xsd:anyuri', + 'rdfs:literal', + ]); + // Add relationship links (only if both domain and range exist as classes) let mapSkipped = 0; properties.forEach(prop => { if (prop.domain && prop.range) { + if (PRIMITIVE_TYPES.has((prop.range || '').toLowerCase())) return; const source = resolveNodeId(prop.domain); const target = resolveNodeId(prop.range); if (source && target) { diff --git a/src/front/templates/partials/ontology/_ontology_information.html b/src/front/templates/partials/ontology/_ontology_information.html index 0a5f1d03..c723b677 100644 --- a/src/front/templates/partials/ontology/_ontology_information.html +++ b/src/front/templates/partials/ontology/_ontology_information.html @@ -5,9 +5,15 @@

    Ontology Information

    Define your ontology name and base URI

    - +
    + + +
    From 715eaaeb314f73b81f516c81ea09538a678f5114 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Fri, 19 Jun 2026 17:46:11 +0200 Subject: [PATCH 13/54] fix(merge): restore collaboration UI lost during auto-merge with develop The git auto-merge silently took develop's version of 4 files, stripping all collaboration UI wiring: - base.html: lost comments-panel.js + diff --git a/src/front/templates/domain.html b/src/front/templates/domain.html index 2006c0d4..d3c59dc4 100644 --- a/src/front/templates/domain.html +++ b/src/front/templates/domain.html @@ -9,6 +9,7 @@ + {% endblock %} @@ -42,6 +43,16 @@ + + + + + +
    '; + var _dSrc = esc(source).replace(/'/g, "\\'"); + var _dPred = esc(predicateUri).replace(/'/g, "\\'"); + var _dTgt = esc(target).replace(/'/g, "\\'"); + var _dPlbl = esc(predicateLabel).replace(/'/g, "\\'"); + html += '
    ' + + '
    '; + el.innerHTML = html; } @@ -2351,6 +2365,24 @@ var SigmaGraph = (function () { } }, + // Open the contextual discussion thread anchored to a graph node + // (subject URI) or edge (source|predicate|target). Auto-resolves + // the loaded domain + version via OntoComments. + discussNode: function (nodeId, label) { + if (window.OntoComments) { + window.OntoComments.openForSelection('graph_node', nodeId, label || nodeId); + } + }, + + discussEdge: function (source, predicate, target, label) { + if (window.OntoComments) { + window.OntoComments.openForSelection( + 'graph_edge', source + '|' + predicate + '|' + target, + label || predicate + ); + } + }, + focusEntityByUri: async function (uri) { if (!uri) return false; diff --git a/src/front/static/query/js/query.js b/src/front/static/query/js/query.js index d6bbc54b..fc370ce3 100644 --- a/src/front/static/query/js/query.js +++ b/src/front/static/query/js/query.js @@ -60,6 +60,38 @@ let taxonomyIcons = {}; // Track all relationship types for filtering let allRelationshipTypes = new Set(); +// ===================================================== +// DISCUSSION +// ===================================================== + +// Cache the ontology-derived tag vocabulary for the Digital Twin discussion. +let _twinTaggable = null; + +/** + * Open the Digital Twin discussion. Anchors to the whole twin + * (domain/'digital-twin'); each comment can optionally be tagged with one or + * more ontology classes/relationships via the compose-box tag picker. The tag + * vocabulary is lazily fetched from the loaded ontology and cached. + */ +async function openTwinDiscussion() { + if (!window.OntoComments) return; + if (_twinTaggable === null) { + _twinTaggable = []; + try { + const resp = await fetch('/ontology/load', { credentials: 'same-origin' }); + const data = await resp.json(); + const cfg = (data && data.success && data.config) ? data.config : {}; + _twinTaggable = window.OntoComments.taggableFromOntology(cfg); + } catch (e) { + console.log('Twin discussion: could not load ontology tags:', e.message); + } + } + window.OntoComments.openForSelection( + 'domain', 'digital-twin', 'Digital Twin', _twinTaggable + ); +} +window.openTwinDiscussion = openTwinDiscussion; + // ===================================================== // INITIALIZATION // ===================================================== diff --git a/src/front/static/registry/js/registry-my-tasks.js b/src/front/static/registry/js/registry-my-tasks.js index 04ff01df..1a993740 100644 --- a/src/front/static/registry/js/registry-my-tasks.js +++ b/src/front/static/registry/js/registry-my-tasks.js @@ -53,7 +53,7 @@ '
    '; return; } - render(data.tasks || []); + render(data.tasks || [], data.assigned_tasks || []); loaded = true; } catch (err) { console.error('loadTasks error:', err); @@ -64,11 +64,12 @@ } } - function render(tasks) { + function render(tasks, assignedTasks) { const container = document.getElementById('myTasksContainer'); if (!container) return; + assignedTasks = assignedTasks || []; - if (!tasks.length) { + if (!tasks.length && !assignedTasks.length) { container.innerHTML = '
    ' + '' + @@ -77,6 +78,15 @@ return; } + container.innerHTML = assignedTasksHtml(assignedTasks) + + reviewTasksHtml(tasks); + + bindReviewActions(container); + bindAssignedActions(container); + } + + function reviewTasksHtml(tasks) { + if (!tasks.length) return ''; const rows = tasks.map((t) => { const approvals = '' + t.approvals + ' / ' + t.required + ''; @@ -93,15 +103,67 @@ ''; }).join(''); - container.innerHTML = - '
    ' + + return '
    ' + + 'Review worklist
    ' + + '
    ' + '' + '' + '' + '' + '' + '' + rows + '
    DomainVersionStatusApprovalsLast activityYour action
    '; + } + + function assignedTasksHtml(tasks) { + if (!tasks.length) return ''; + const rows = tasks.map((t) => { + return '' + + '' + escapeHtml(t.title) + '' + + '' + escapeHtml(t.folder) + ' v' + escapeHtml(t.version) + '' + + '' + escapeHtml(t.created_by) + '' + + '' + taskStatusBadge(t.status) + '' + + '' + (t.due_date ? escapeHtml(t.due_date) : '') + '' + + '' + taskActions(t) + '' + + ''; + }).join(''); + + return '
    ' + + 'Assigned to me
    ' + + '
    ' + + '' + + '' + + '' + + '' + + '' + rows + '
    TaskDomainFromStatusDueAction
    '; + } + + function taskActions(t) { + const start = t.status === 'open' + ? '' + : ''; + const done = ''; + return start + ' ' + done; + } + function taskStatusBadge(status) { + const map = { + open: 'bg-secondary-subtle text-dark border', + in_progress: 'bg-info-subtle text-dark border-info', + done: 'bg-success-subtle text-dark border-success', + cancelled: 'bg-light text-muted border', + }; + const cls = map[status] || map.open; + const label = (status || 'open').replace('_', ' '); + return '' + escapeHtml(label) + ''; + } + + function bindReviewActions(container) { container.querySelectorAll('button[data-action]').forEach((btn) => { btn.addEventListener('click', onAction); }); @@ -112,6 +174,40 @@ }); } + function bindAssignedActions(container) { + container.querySelectorAll('button[data-task-status]').forEach((btn) => { + btn.addEventListener('click', () => onTaskStatus(btn)); + }); + } + + async function onTaskStatus(btn) { + const { folder, version, taskId } = btn.dataset; + const status = btn.dataset.taskStatus; + try { + const resp = await fetch( + '/comments/' + encodeURIComponent(folder) + '/' + + encodeURIComponent(version) + '/tasks/' + + encodeURIComponent(taskId) + '/status', + { + method: 'POST', + credentials: 'same-origin', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ status: status }), + } + ); + const data = await resp.json(); + if (!resp.ok || !data.success) { + showNotification(data.message || 'Failed to update task', 'error'); + return; + } + showNotification('Task marked ' + status.replace('_', ' ') + '.', 'success'); + loaded = false; + loadTasks(); + } catch (err) { + showNotification('Error: ' + err.message, 'error'); + } + } + function commentsButton(task) { return '

    -
    +
    +
    diff --git a/src/front/templates/partials/dtwin/_query_cohorts.html b/src/front/templates/partials/dtwin/_query_cohorts.html index 244864b5..b21f0347 100644 --- a/src/front/templates/partials/dtwin/_query_cohorts.html +++ b/src/front/templates/partials/dtwin/_query_cohorts.html @@ -37,6 +37,10 @@

    Cohort Discovery

    onclick="CohortModule.openMaterializeModal()" disabled> Materialise +
    diff --git a/src/front/templates/partials/dtwin/_query_dataquality.html b/src/front/templates/partials/dtwin/_query_dataquality.html index 1a890e39..23a2c287 100644 --- a/src/front/templates/partials/dtwin/_query_dataquality.html +++ b/src/front/templates/partials/dtwin/_query_dataquality.html @@ -26,6 +26,10 @@

    Data Quality

    +
    diff --git a/src/front/templates/partials/dtwin/_query_graphql.html b/src/front/templates/partials/dtwin/_query_graphql.html index e6f8e3da..3af4c586 100644 --- a/src/front/templates/partials/dtwin/_query_graphql.html +++ b/src/front/templates/partials/dtwin/_query_graphql.html @@ -24,6 +24,10 @@

    GraphQL Playground New tab +

    diff --git a/src/front/templates/partials/dtwin/_query_insights.html b/src/front/templates/partials/dtwin/_query_insights.html index 4a747427..d84ff0d2 100644 --- a/src/front/templates/partials/dtwin/_query_insights.html +++ b/src/front/templates/partials/dtwin/_query_insights.html @@ -8,11 +8,15 @@

    Digital Twin Insights

    Content overview of the triple store: entity types and relationships

    -
    +
    +
    diff --git a/src/front/templates/partials/dtwin/_query_reasoning.html b/src/front/templates/partials/dtwin/_query_reasoning.html index e92d6f0d..378066d4 100644 --- a/src/front/templates/partials/dtwin/_query_reasoning.html +++ b/src/front/templates/partials/dtwin/_query_reasoning.html @@ -1,7 +1,7 @@
    -
    +

    Inference

    OWL 2 RL inference, SWRL rules, graph reasoning, and business rules
    Domain: {{ domain_name }} v{{ current_version }} Draft @@ -10,9 +10,13 @@

    Inference

    - +
    diff --git a/src/front/templates/partials/dtwin/_query_sigmagraph.html b/src/front/templates/partials/dtwin/_query_sigmagraph.html index 53457141..bbe7c476 100644 --- a/src/front/templates/partials/dtwin/_query_sigmagraph.html +++ b/src/front/templates/partials/dtwin/_query_sigmagraph.html @@ -58,6 +58,10 @@

    Knowledge Graph

    +
    diff --git a/src/front/templates/partials/mapping/_mapping_autoassign.html b/src/front/templates/partials/mapping/_mapping_autoassign.html index 4eac28c5..89552a5d 100644 --- a/src/front/templates/partials/mapping/_mapping_autoassign.html +++ b/src/front/templates/partials/mapping/_mapping_autoassign.html @@ -1,7 +1,7 @@
    -
    +

    Batch Auto-Map

    Automatically generate SQL queries and assign columns using AI

    @@ -16,6 +16,10 @@

    Batch Auto-Map

    Cancel
    +
    diff --git a/src/front/templates/partials/mapping/_mapping_design.html b/src/front/templates/partials/mapping/_mapping_design.html index 63bb257d..a632be5b 100644 --- a/src/front/templates/partials/mapping/_mapping_design.html +++ b/src/front/templates/partials/mapping/_mapping_design.html @@ -3,7 +3,7 @@
    -
    +

    Visual Mapping Designer

    Click on an entity or relationship to configure its data mapping.

    @@ -42,6 +42,10 @@

    Visual Mapping Designer +

    diff --git a/src/front/templates/partials/mapping/_mapping_diagnostics.html b/src/front/templates/partials/mapping/_mapping_diagnostics.html index e8bb216c..f56f8d44 100644 --- a/src/front/templates/partials/mapping/_mapping_diagnostics.html +++ b/src/front/templates/partials/mapping/_mapping_diagnostics.html @@ -3,13 +3,17 @@
    -
    +

    Mapping Diagnostics

    Validate entity and relationship mappings before building the Digital Twin

    - +
    diff --git a/src/front/templates/partials/mapping/_mapping_import.html b/src/front/templates/partials/mapping/_mapping_import.html index 89f6bd6a..2df6cd93 100644 --- a/src/front/templates/partials/mapping/_mapping_import.html +++ b/src/front/templates/partials/mapping/_mapping_import.html @@ -2,10 +2,14 @@
    -
    +

    Import R2RML

    Import an existing R2RML mapping file to populate entity and relationship mappings.

    +
    diff --git a/src/front/templates/partials/mapping/_mapping_information.html b/src/front/templates/partials/mapping/_mapping_information.html index 736a9e0f..72b7eb53 100644 --- a/src/front/templates/partials/mapping/_mapping_information.html +++ b/src/front/templates/partials/mapping/_mapping_information.html @@ -32,13 +32,17 @@
    -
    +

    Mapping Summary

    Overview of mappings between ontology and data sources

    - +
    diff --git a/src/front/templates/partials/mapping/_mapping_manual.html b/src/front/templates/partials/mapping/_mapping_manual.html index 7fdb635c..266c2518 100644 --- a/src/front/templates/partials/mapping/_mapping_manual.html +++ b/src/front/templates/partials/mapping/_mapping_manual.html @@ -2,7 +2,7 @@
    -
    +

    Manual Mapping

    Manually configure SQL queries and column mappings for each entity and relationship

    @@ -18,6 +18,10 @@

    Manual Mapping

    +
    diff --git a/src/front/templates/partials/mapping/_mapping_r2rml.html b/src/front/templates/partials/mapping/_mapping_r2rml.html index 528c689f..c4d16923 100644 --- a/src/front/templates/partials/mapping/_mapping_r2rml.html +++ b/src/front/templates/partials/mapping/_mapping_r2rml.html @@ -30,7 +30,7 @@
    -
    +

    R2RML Content (Turtle Format)

    Generated R2RML mapping from current mappings

    @@ -44,6 +44,10 @@

    R2RML Content (Turtle Form +

    diff --git a/src/front/templates/partials/mapping/_mapping_sparksql.html b/src/front/templates/partials/mapping/_mapping_sparksql.html index f2d9ec0c..c64414f2 100644 --- a/src/front/templates/partials/mapping/_mapping_sparksql.html +++ b/src/front/templates/partials/mapping/_mapping_sparksql.html @@ -29,7 +29,7 @@
    -
    +

    Generated Spark SQL

    View the Spark SQL generated from your SPARQL queries

    @@ -40,6 +40,10 @@

    Generated Spark SQL +

    diff --git a/src/front/templates/partials/ontology/_ontology_business_rules.html b/src/front/templates/partials/ontology/_ontology_business_rules.html index 0c02e107..c56a844d 100644 --- a/src/front/templates/partials/ontology/_ontology_business_rules.html +++ b/src/front/templates/partials/ontology/_ontology_business_rules.html @@ -2,11 +2,11 @@
    -
    +

    Business Rules

    Define inference and business rules across multiple rule paradigms

    -
    +
    +
    diff --git a/src/front/templates/partials/ontology/_ontology_cohorts.html b/src/front/templates/partials/ontology/_ontology_cohorts.html index b3817223..eff15096 100644 --- a/src/front/templates/partials/ontology/_ontology_cohorts.html +++ b/src/front/templates/partials/ontology/_ontology_cohorts.html @@ -26,6 +26,10 @@

    Cohorts

    onclick="CohortModule.save()"> Save rule +
    diff --git a/src/front/templates/partials/ontology/_ontology_dataquality.html b/src/front/templates/partials/ontology/_ontology_dataquality.html index 3c47f8cd..025bcbe9 100644 --- a/src/front/templates/partials/ontology/_ontology_dataquality.html +++ b/src/front/templates/partials/ontology/_ontology_dataquality.html @@ -2,11 +2,11 @@
    -
    +

    Data Quality

    Define SHACL-based data quality rules across six dimensions

    -
    +
    @@ -22,6 +22,10 @@

    Data Quality

    SHACL
    +
    diff --git a/src/front/templates/partials/ontology/_ontology_design.html b/src/front/templates/partials/ontology/_ontology_design.html index 70e29b0d..7673bb35 100644 --- a/src/front/templates/partials/ontology/_ontology_design.html +++ b/src/front/templates/partials/ontology/_ontology_design.html @@ -1,7 +1,7 @@
    -
    +

    Visual Ontology Designer - Business Views

    View your ontology visually. Click "Edit" to modify entities and relationships.

    @@ -46,6 +46,10 @@

    Visual Ontology Designer - Create Group

    +
    diff --git a/src/front/templates/partials/ontology/_ontology_entities.html b/src/front/templates/partials/ontology/_ontology_entities.html index c7ae1e5b..56f1115a 100644 --- a/src/front/templates/partials/ontology/_ontology_entities.html +++ b/src/front/templates/partials/ontology/_ontology_entities.html @@ -1,7 +1,7 @@
    -
    +

    Classes (Hierarchy)

    View the class inheritance hierarchy and manage entities

    @@ -17,6 +17,10 @@

    Classes (Hierarchy)

    +
    diff --git a/src/front/templates/partials/ontology/_ontology_import.html b/src/front/templates/partials/ontology/_ontology_import.html index 9af5e543..69666223 100644 --- a/src/front/templates/partials/ontology/_ontology_import.html +++ b/src/front/templates/partials/ontology/_ontology_import.html @@ -2,10 +2,14 @@
    -
    +

    Import

    Import ontologies from local files or load industry-standard ontologies.

    +
    diff --git a/src/front/templates/partials/ontology/_ontology_map.html b/src/front/templates/partials/ontology/_ontology_map.html index 2fa8e76d..4eba18a4 100644 --- a/src/front/templates/partials/ontology/_ontology_map.html +++ b/src/front/templates/partials/ontology/_ontology_map.html @@ -23,6 +23,10 @@

    Ontology Designer

    +
    +
    diff --git a/src/front/templates/partials/ontology/_ontology_relationships.html b/src/front/templates/partials/ontology/_ontology_relationships.html index 7d2bba7e..acf73a4a 100644 --- a/src/front/templates/partials/ontology/_ontology_relationships.html +++ b/src/front/templates/partials/ontology/_ontology_relationships.html @@ -1,13 +1,17 @@
    -
    +

    Relationships (Properties)

    Define how entities relate to each other

    - +
    diff --git a/src/front/templates/partials/ontology/_ontology_wizard.html b/src/front/templates/partials/ontology/_ontology_wizard.html index eb642433..3db3cc60 100644 --- a/src/front/templates/partials/ontology/_ontology_wizard.html +++ b/src/front/templates/partials/ontology/_ontology_wizard.html @@ -2,13 +2,17 @@
    -
    +

    Generate Ontology

    Auto-generate an ontology from your data sources using AI

    - +
    diff --git a/src/front/templates/partials/ontology/_pitfalls.html b/src/front/templates/partials/ontology/_pitfalls.html index 13b3cbbf..dd25d85e 100644 --- a/src/front/templates/partials/ontology/_pitfalls.html +++ b/src/front/templates/partials/ontology/_pitfalls.html @@ -23,6 +23,10 @@

    Pitfalls

    +
    diff --git a/tests/units/api/test_ui_rendering.py b/tests/units/api/test_ui_rendering.py index af69e784..c490c5a9 100644 --- a/tests/units/api/test_ui_rendering.py +++ b/tests/units/api/test_ui_rendering.py @@ -386,7 +386,8 @@ def test_sidebar_present(self, client): @pytest.mark.parametrize( "section", - ["information", "metadata", "documents", "validation", "owl-content", "r2rml"], + ["information", "metadata", "documents", "validation", "owl-content", + "r2rml", "mytasks", "discussions"], ) def test_sidebar_has_section_link(self, client, section): html = _html(client, "/domain") @@ -397,7 +398,8 @@ def test_sidebar_has_section_link(self, client, section): @pytest.mark.parametrize( "section_id", ["information-section", "metadata-section", "validation-section", - "runs-section", "audit-section"], + "runs-section", "audit-section", "mytasks-section", + "discussions-section"], ) def test_section_div_exists(self, client, section_id): html = _html(client, "/domain") @@ -409,6 +411,16 @@ def test_audit_section_link_and_script(self, client): assert any(t == "a" and a.get("data-section") == "audit" for t, a in tags) assert any("domain-audit.js" in src for src in _script_srcs(html)) + def test_collaboration_section_assets_loaded(self, client): + """The new Domain → Collaboration timeline ships its own JS module + and a container the script populates.""" + html = _html(client, "/domain") + assert any( + "domain-collaboration.js" in src for src in _script_srcs(html) + ) + assert _find(_tags(html), id_="domainDiscussionsContainer") is not None + assert _find(_tags(html), id_="domainMyTasksContainer") is not None + # ===================================================== # DIGITAL TWIN PAGE diff --git a/tests/units/registry/test_registry_store.py b/tests/units/registry/test_registry_store.py index f43fd3d4..330e9588 100644 --- a/tests/units/registry/test_registry_store.py +++ b/tests/units/registry/test_registry_store.py @@ -53,6 +53,8 @@ def __init__(self, tag: str = "memory"): self._history: Dict[str, List[ScheduleHistoryEntry]] = {} self._build_runs: Dict[str, List[Dict[str, Any]]] = {} self._review_events: List[Dict[str, Any]] = [] + self._comments: List[Dict[str, Any]] = [] + self._tasks: List[Dict[str, Any]] = [] self._global: Dict[str, Any] = {} self._initialized = False @@ -237,6 +239,109 @@ def list_review_events( def list_all_review_events(self) -> List[Dict[str, Any]]: return [dict(e) for e in self._review_events] + def insert_comment( + self, + folder: str, + version: str, + *, + author: str, + body: str, + parent_id=None, + ): + row = { + "id": str(len(self._comments) + 1), + "folder": folder, + "version": version, + "parent_id": str(parent_id) if parent_id else "", + "author": author or "", + "body": body or "", + "resolved": False, + "created_at": f"2026-01-01T00:00:{len(self._comments):02d}", + } + self._comments.append(row) + return dict(row) + + def list_comments( + self, + folder: str, + version=None, + *, + include_resolved: bool = True, + ) -> List[Dict[str, Any]]: + return [ + dict(c) + for c in self._comments + if c["folder"] == folder + and (version is None or c["version"] == version) + and (include_resolved or not c["resolved"]) + ] + + def resolve_comment( + self, folder: str, comment_id: str, *, resolved: bool = True + ) -> Tuple[bool, str]: + for c in self._comments: + if c["folder"] == folder and c["id"] == str(comment_id): + c["resolved"] = resolved + return True, "" + return False, "Comment not found" + + def insert_task( + self, + folder: str, + version: str, + *, + assignee: str, + created_by: str, + title: str, + description: str = "", + due_date=None, + comment_id=None, + ): + row = { + "id": str(len(self._tasks) + 1), + "folder": folder, + "version": version, + "assignee": assignee or "", + "created_by": created_by or "", + "title": title or "", + "description": description or "", + "status": "open", + "due_date": due_date or "", + "comment_id": str(comment_id) if comment_id else "", + "created_at": f"2026-01-01T00:00:{len(self._tasks):02d}", + "updated_at": f"2026-01-01T00:00:{len(self._tasks):02d}", + } + self._tasks.append(row) + return dict(row) + + def list_tasks(self, folder: str, version=None) -> List[Dict[str, Any]]: + rows = [ + dict(t) + for t in self._tasks + if t["folder"] == folder + and (version is None or t["version"] == version) + ] + rows.reverse() # newest-first + return rows + + def list_tasks_for_assignee(self, assignee: str) -> List[Dict[str, Any]]: + rows = [ + dict(t) + for t in self._tasks + if t["assignee"].lower() == (assignee or "").lower() + ] + rows.reverse() + return rows + + def update_task_status( + self, folder: str, task_id: str, status: str + ) -> Tuple[bool, str]: + for t in self._tasks: + if t["folder"] == folder and t["id"] == str(task_id): + t["status"] = status + return True, "" + return False, "Task not found" + def load_global_config(self) -> Dict[str, Any]: return dict(self._global) @@ -486,6 +591,69 @@ def test_list_all_review_events_spans_domains(self, store): folders = {e["folder"] for e in allev} assert folders == {"demo", "other"} + def test_comments_round_trip_oldest_first(self, store): + store.insert_comment( + "demo", "1", author="a@a.com", body="first", + ) + store.insert_comment( + "demo", "1", author="b@a.com", body="second", + ) + comments = store.list_comments("demo", "1") + assert [c["body"] for c in comments] == ["first", "second"] + assert comments[0]["resolved"] is False + + def test_resolve_comment_flips_flag_and_filters(self, store): + c = store.insert_comment( + "demo", "1", author="a@a.com", body="hi", + ) + ok, _ = store.resolve_comment("demo", c["id"], resolved=True) + assert ok + assert store.list_comments("demo", "1", include_resolved=False) == [] + assert len(store.list_comments("demo", "1")) == 1 + + def test_resolve_unknown_comment_returns_false(self, store): + ok, msg = store.resolve_comment("demo", "999") + assert ok is False and msg + + def test_tasks_round_trip_newest_first(self, store): + store.insert_task( + "demo", "1", assignee="x@a.com", created_by="a@a.com", + title="task one", + ) + store.insert_task( + "demo", "1", assignee="y@a.com", created_by="a@a.com", + title="task two", + ) + tasks = store.list_tasks("demo", "1") + assert [t["title"] for t in tasks] == ["task two", "task one"] + assert tasks[0]["status"] == "open" + + def test_tasks_for_assignee_is_case_insensitive_and_cross_domain(self, store): + store.insert_task( + "demo", "1", assignee="X@a.com", created_by="a@a.com", title="t1", + ) + store.insert_task( + "other", "1", assignee="x@a.com", created_by="a@a.com", title="t2", + ) + store.insert_task( + "demo", "1", assignee="z@a.com", created_by="a@a.com", title="t3", + ) + mine = store.list_tasks_for_assignee("x@a.com") + assert {t["title"] for t in mine} == {"t1", "t2"} + assert {t["folder"] for t in mine} == {"demo", "other"} + + def test_update_task_status_round_trip(self, store): + t = store.insert_task( + "demo", "1", assignee="x@a.com", created_by="a@a.com", title="t", + ) + ok, _ = store.update_task_status("demo", t["id"], "done") + assert ok + assert store.list_tasks("demo", "1")[0]["status"] == "done" + + def test_update_unknown_task_returns_false(self, store): + ok, msg = store.update_task_status("demo", "999", "done") + assert ok is False and msg + def test_table_row_counts_defaults_to_zero(self, store): # The base class returns zero for every requested table — only # Lakebase overrides this. Ensures the admin UI can call the @@ -510,11 +678,13 @@ class _ScriptedCursor: """ def __init__(self, script): - # script: list of dicts with keys: contains, fetchone, fetchall + # script: list of dicts with keys: contains, fetchone, fetchall, + # rowcount self._script = list(script) self.executed = [] # captured (sql, params) tuples self._next_one = None self._next_all = [] + self.rowcount = 0 def __enter__(self): return self @@ -529,11 +699,13 @@ def execute(self, sql, params=None): entry["_used"] = True self._next_one = entry.get("fetchone") self._next_all = entry.get("fetchall", []) + self.rowcount = entry.get("rowcount", 0) return # Default to "no row" so unscripted queries don't accidentally # return stale data from the previous script entry. self._next_one = None self._next_all = [] + self.rowcount = 0 def fetchone(self): return self._next_one @@ -547,7 +719,9 @@ def __init__(self, cursor): self._cursor = cursor self.closed = False - def cursor(self): + def cursor(self, *args, **kwargs): + # Accept ``row_factory=dict_row`` (used by the list/insert paths) + # while staying compatible with the no-arg callers. return self._cursor def close(self): @@ -1068,3 +1242,197 @@ def test_distinct_databases_have_distinct_cache_entries(self, monkeypatch): assert first == ("c1", "s1", "v1") assert second == ("c2", "s2", "v2") + + +# --------------------------------------------------------------------- +# Lakebase collaborative comments + tasks — real SQL code paths +# +# The in-memory fake above proves the *contract*; these tests drive the +# concrete Lakebase implementation (row mappers, the lazy +# ``_ensure_collab_tables`` short-circuit, and the rowcount-based +# not-found handling) without a real Postgres, via the scripted cursor. +# --------------------------------------------------------------------- + + +from datetime import datetime # noqa: E402 + + +def _collab_store(monkeypatch, cur): + """A Lakebase store whose ``_connect`` yields *cur* and whose collab + tables are already marked present (skips the lazy DDL probe). + """ + from contextlib import contextmanager + + store = _make_lakebase_store(monkeypatch) + store._registry_id = "rid-1" # skip registry-id resolution + store._collab_tables_ready = True # skip the ensure/CREATE probe + + @contextmanager + def fake_connect(): + yield _ScriptedConn(cur) + + monkeypatch.setattr(store, "_connect", fake_connect) + return store + + +class TestLakebaseCollab: + def test_ensure_collab_tables_short_circuits_when_present(self, monkeypatch): + from contextlib import contextmanager + + store = _make_lakebase_store(monkeypatch) + store._registry_id = "rid-1" + cur = _ScriptedCursor( + [{"contains": "information_schema.tables", "fetchone": (1,)}] + ) + + @contextmanager + def fake_connect(): + yield _ScriptedConn(cur) + + monkeypatch.setattr(store, "_connect", fake_connect) + + assert store._ensure_collab_tables() is True + assert store._collab_tables_ready is True + # Table already exists → must NOT issue any CREATE TABLE. + assert not any("CREATE TABLE" in s for s, _ in cur.executed) + + def test_insert_comment_maps_returning_row(self, monkeypatch): + cur = _ScriptedCursor( + [ + { + "contains": "INSERT INTO", + "fetchone": { + "id": "c-1", "version": "2", + "parent_id": None, + "author": "a@a.com", "body": "rename", + "resolved": False, + "created_at": datetime(2026, 1, 1, 0, 0, 0), + }, + } + ] + ) + store = _collab_store(monkeypatch, cur) + out = store.insert_comment( + "demo", "2", author="a@a.com", body="rename", + ) + assert out["id"] == "c-1" + assert out["body"] == "rename" + assert out["folder"] == "demo" + assert out["resolved"] is False + assert out["created_at"].startswith("2026-01-01") + + def test_insert_comment_returns_none_when_domain_missing(self, monkeypatch): + # No RETURNING row (unknown domain) → fetchone None → None. + cur = _ScriptedCursor([]) + store = _collab_store(monkeypatch, cur) + assert store.insert_comment( + "ghost", "2", author="a@a.com", body="x", + ) is None + + def test_list_comments_maps_rows_and_filters(self, monkeypatch): + cur = _ScriptedCursor( + [ + { + "contains": "FROM", + "fetchall": [ + { + "id": "c-1", "folder": "demo", "version": "2", + "parent_id": None, "author": "a@a.com", + "body": "hi", "resolved": False, + "created_at": datetime(2026, 1, 1), + } + ], + } + ] + ) + store = _collab_store(monkeypatch, cur) + rows = store.list_comments( + "demo", "2", include_resolved=False, + ) + assert [c["body"] for c in rows] == ["hi"] + # The version + resolved filters must reach the SQL. + sql, params = cur.executed[-1] + assert "c.version = %s" in sql + assert "resolved = false" in sql + assert "2" in params + + def test_resolve_comment_not_found_returns_false(self, monkeypatch): + cur = _ScriptedCursor([{"contains": "UPDATE", "rowcount": 0}]) + store = _collab_store(monkeypatch, cur) + ok, msg = store.resolve_comment("demo", "c-9") + assert ok is False and msg == "Comment not found" + + def test_resolve_comment_success(self, monkeypatch): + cur = _ScriptedCursor([{"contains": "UPDATE", "rowcount": 1}]) + store = _collab_store(monkeypatch, cur) + ok, msg = store.resolve_comment("demo", "c-1", resolved=True) + assert ok is True and msg == "" + _, params = cur.executed[-1] + assert params[0] is True # resolved flag forwarded + + def test_insert_task_maps_returning_row(self, monkeypatch): + cur = _ScriptedCursor( + [ + { + "contains": "INSERT INTO", + "fetchone": { + "id": "t-1", "version": "2", + "assignee": "bob@a.com", "created_by": "a@a.com", + "title": "fix", "description": "", "status": "open", + "due_date": None, "comment_id": "c-1", + "created_at": datetime(2026, 1, 1), + "updated_at": datetime(2026, 1, 1), + }, + } + ] + ) + store = _collab_store(monkeypatch, cur) + out = store.insert_task( + "demo", "2", assignee="bob@a.com", created_by="a@a.com", + title="fix", comment_id="c-1", + ) + assert out["id"] == "t-1" + assert out["assignee"] == "bob@a.com" + assert out["comment_id"] == "c-1" + assert out["status"] == "open" + assert out["due_date"] == "" + + def test_list_tasks_for_assignee_maps_rows(self, monkeypatch): + cur = _ScriptedCursor( + [ + { + "contains": "lower(t.assignee) = lower(%s)", + "fetchall": [ + { + "id": "t-1", "folder": "demo", "version": "2", + "assignee": "bob@a.com", "created_by": "a@a.com", + "title": "fix", "description": "", "status": "open", + "due_date": None, "comment_id": None, + "created_at": datetime(2026, 1, 1), + "updated_at": datetime(2026, 1, 1), + } + ], + } + ] + ) + store = _collab_store(monkeypatch, cur) + rows = store.list_tasks_for_assignee("BOB@a.com") + assert [t["title"] for t in rows] == ["fix"] + assert rows[0]["folder"] == "demo" + _, params = cur.executed[-1] + assert params == ("rid-1", "BOB@a.com") + + def test_update_task_status_not_found(self, monkeypatch): + cur = _ScriptedCursor([{"contains": "UPDATE", "rowcount": 0}]) + store = _collab_store(monkeypatch, cur) + ok, msg = store.update_task_status("demo", "t-9", "done") + assert ok is False and msg == "Task not found" + + def test_update_task_status_success(self, monkeypatch): + cur = _ScriptedCursor([{"contains": "UPDATE", "rowcount": 1}]) + store = _collab_store(monkeypatch, cur) + ok, _ = store.update_task_status("demo", "t-1", "in_progress") + assert ok is True + sql, params = cur.executed[-1] + assert "SET status = %s" in sql + assert params[0] == "in_progress" diff --git a/tests/units/registry/test_review_service.py b/tests/units/registry/test_review_service.py index 13f3dfd2..cff0e5c7 100644 --- a/tests/units/registry/test_review_service.py +++ b/tests/units/registry/test_review_service.py @@ -738,3 +738,54 @@ def test_my_tasks_raises_when_domain_listing_fails(): svc.list_domain_details_cached.return_value = (False, [], "boom") with pytest.raises(InfrastructureError): _call_my_tasks(svc) + + +# ---------------------------------------------------------------------- +# My Tasks — assigned collaborative tasks merged into the worklist +# ---------------------------------------------------------------------- + + +def test_my_tasks_includes_assigned_open_and_in_progress(): + svc = _my_tasks_svc([]) # no review actions, only assigned tasks + svc.list_tasks_for_assignee.return_value = [ + {"id": "1", "folder": "acme", "version": "2", "title": "fix", + "status": "open", "assignee": "alice@acme.com"}, + {"id": "2", "folder": "acme", "version": "2", "title": "wip", + "status": "in_progress", "assignee": "alice@acme.com"}, + ] + result = _call_my_tasks(svc) + assert result["success"] is True + assert result["tasks"] == [] + assert [t["id"] for t in result["assigned_tasks"]] == ["1", "2"] + svc.list_tasks_for_assignee.assert_called_once_with("alice@acme.com") + + +def test_my_tasks_assigned_filters_done_and_cancelled(): + svc = _my_tasks_svc([]) + svc.list_tasks_for_assignee.return_value = [ + {"id": "1", "status": "open"}, + {"id": "2", "status": "done"}, + {"id": "3", "status": "cancelled"}, + {"id": "4", "status": "in_progress"}, + ] + result = _call_my_tasks(svc) + assert [t["id"] for t in result["assigned_tasks"]] == ["1", "4"] + + +def test_my_tasks_assigned_resilient_when_backend_errors(): + svc = _my_tasks_svc([]) + svc.list_tasks_for_assignee.side_effect = RuntimeError("tasks table missing") + result = _call_my_tasks(svc) + # Worklist still succeeds; the assigned section degrades to empty. + assert result["success"] is True + assert result["assigned_tasks"] == [] + + +def test_my_tasks_assigned_empty_without_email(): + svc = _my_tasks_svc([]) + svc.list_tasks_for_assignee.return_value = [{"id": "1", "status": "open"}] + # app_role "" short-circuits roles to admin, but an empty email must + # skip the assignee lookup entirely. + result = _call_my_tasks(svc, email="") + assert result["assigned_tasks"] == [] + svc.list_tasks_for_assignee.assert_not_called() From 61d48b3438309ed7e94671851c90cb3c6e660200 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Fri, 19 Jun 2026 17:57:05 +0200 Subject: [PATCH 18/54] feat(ui): add Discussion button to Data Sources and Documents pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Exposed openDomainDiscussion() globally from domain-collaboration.js (delegates to resolveDomainContext + OntoComments.openThread, same pattern as openThreadFor but callable from onclick). Added the onto-discuss-btn to: - _domain_metadata.html (Data Sources) — alongside Reset + Add Data Source - _domain_documents.html (Document Management) — new header action --- .../static/domain/js/domain-collaboration.js | 15 +++++++++++++++ .../partials/domain/_domain_documents.html | 4 ++++ .../partials/domain/_domain_metadata.html | 4 ++++ 3 files changed, 23 insertions(+) diff --git a/src/front/static/domain/js/domain-collaboration.js b/src/front/static/domain/js/domain-collaboration.js index 910e802a..93f0c6bf 100644 --- a/src/front/static/domain/js/domain-collaboration.js +++ b/src/front/static/domain/js/domain-collaboration.js @@ -498,6 +498,21 @@ }); } + // Global entry point so any domain-page template can call it via onclick. + window.openDomainDiscussion = function () { + resolveDomainContext().then(function (dc) { + if (!dc.folder || !dc.hasRegistry) { + if (typeof window.showNotification === 'function') { + window.showNotification( + 'Save this domain to the registry to start a discussion.', 'warning'); + } + return; + } + if (!window.OntoComments) return; + OntoComments.openThread({ folder: dc.folder, version: dc.version }); + }); + }; + // ---- tiny html helpers -------------------------------------------------- function spinner(label) { diff --git a/src/front/templates/partials/domain/_domain_documents.html b/src/front/templates/partials/domain/_domain_documents.html index d61c7bc3..2f6698e0 100644 --- a/src/front/templates/partials/domain/_domain_documents.html +++ b/src/front/templates/partials/domain/_domain_documents.html @@ -6,6 +6,10 @@

    Document Management

    Upload and manage domain documents stored in the Unity Catalog volume

    +
    diff --git a/src/front/templates/partials/domain/_domain_metadata.html b/src/front/templates/partials/domain/_domain_metadata.html index 50f96a26..b1473b86 100644 --- a/src/front/templates/partials/domain/_domain_metadata.html +++ b/src/front/templates/partials/domain/_domain_metadata.html @@ -13,6 +13,10 @@

    Data Sources

    +
    From d29a53e08981c8ea7ec07417961c5d176a6bd6ba Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Fri, 19 Jun 2026 17:59:11 +0200 Subject: [PATCH 19/54] feat(ux): open discussion panel immediately on click, load content async MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously the panel only appeared after async context resolution + data fetch, causing a noticeable blank delay on click. comments-panel.js: - Added showLoadingPanel() — opens the offcanvas right away with a spinner in the list area; exposed on window.OntoComments. - openThread() — skips show() if panel is already visible (no flicker). - openForSelection() — calls showLoadingPanel() first, then resolves domain context and fetches comments behind the open panel. domain-collaboration.js: - openDomainDiscussion() — calls OntoComments.showLoadingPanel() immediately before the async resolveDomainContext() call. --- .../static/domain/js/domain-collaboration.js | 12 ++-- src/front/static/global/js/comments-panel.js | 61 +++++++++++++++---- 2 files changed, 56 insertions(+), 17 deletions(-) diff --git a/src/front/static/domain/js/domain-collaboration.js b/src/front/static/domain/js/domain-collaboration.js index 93f0c6bf..4edbaba4 100644 --- a/src/front/static/domain/js/domain-collaboration.js +++ b/src/front/static/domain/js/domain-collaboration.js @@ -499,16 +499,20 @@ } // Global entry point so any domain-page template can call it via onclick. + // Shows the panel immediately with a spinner, resolves context behind it. window.openDomainDiscussion = function () { + if (window.OntoComments) OntoComments.showLoadingPanel(); resolveDomainContext().then(function (dc) { + if (!window.OntoComments) return; if (!dc.folder || !dc.hasRegistry) { - if (typeof window.showNotification === 'function') { - window.showNotification( - 'Save this domain to the registry to start a discussion.', 'warning'); + const panelEl = document.querySelector('.oc-comments [data-oc-list]'); + if (panelEl) { + panelEl.innerHTML = + '
    ' + + 'Save this domain to the registry to start a discussion.
    '; } return; } - if (!window.OntoComments) return; OntoComments.openThread({ folder: dc.folder, version: dc.version }); }); }; diff --git a/src/front/static/global/js/comments-panel.js b/src/front/static/global/js/comments-panel.js index 212c0068..b8ba5830 100644 --- a/src/front/static/global/js/comments-panel.js +++ b/src/front/static/global/js/comments-panel.js @@ -131,6 +131,29 @@ esc(t.label || t.ref) + '').join('') + '
    '; } + // Open the offcanvas immediately with a spinner so the panel appears on + // click without waiting for any async work. Called by entry points that + // need to resolve domain context before they can call openThread. + function showLoadingPanel() { + build(); + const list = el.querySelector('[data-oc-list]'); + if (list) { + list.innerHTML = + '
    ' + + ' Loading...
    '; + } + const anchor = el.querySelector('[data-oc-anchor]'); + if (anchor) anchor.innerHTML = ''; + if (window.bootstrap) { + offcanvas = bootstrap.Offcanvas.getOrCreateInstance(el); + offcanvas.show(); + setTimeout(() => { + document.querySelectorAll('.offcanvas-backdrop.show') + .forEach((b) => b.classList.add('oc-comments-backdrop')); + }, 0); + } + } + async function openThread(opts) { opts = opts || {}; if (!opts.folder || !opts.version) { @@ -139,9 +162,6 @@ } build(); lastListSig = ''; - // Discussions are domain-wide: every entry point opens the single - // Domain thread (no per-anchor separation, no entity/relationship tags). - // The caller's anchor hints (type/ref/label/taggable) are ignored. ctx = { folder: opts.folder, version: opts.version, @@ -150,13 +170,15 @@ if (window.bootstrap) { offcanvas = bootstrap.Offcanvas.getOrCreateInstance(el); - offcanvas.show(); - // Lift the shared backdrop above the navbar (z-index:1050) so - // the whole screen dims behind the panel (see review-modals.css). - setTimeout(() => { - document.querySelectorAll('.offcanvas-backdrop.show') - .forEach((b) => b.classList.add('oc-comments-backdrop')); - }, 0); + // Only call show() if not already visible (showLoadingPanel may + // have already opened it, avoiding a flicker/re-animation). + if (!el.classList.contains('show')) { + offcanvas.show(); + setTimeout(() => { + document.querySelectorAll('.offcanvas-backdrop.show') + .forEach((b) => b.classList.add('oc-comments-backdrop')); + }, 0); + } } await reload(); loadMembers(); @@ -563,18 +585,31 @@ * discussions are domain-wide. */ async function openForSelection() { + // Open the panel immediately — the spinner is visible while we resolve + // the domain context and fetch comments asynchronously. + showLoadingPanel(); const dc = await resolveDomainContext(); if (!dc.folder || !dc.hasRegistry) { - notify('Save this domain to the registry to start a discussion.', - 'warning'); + const list = el.querySelector('[data-oc-list]'); + if (list) { + list.innerHTML = + '
    ' + + 'Save this domain to the registry to start a discussion.
    '; + } return; } - openThread({ folder: dc.folder, version: dc.version }); + lastListSig = ''; + ctx = { folder: dc.folder, version: dc.version }; + renderAnchorBadge(); + await reload(); + loadMembers(); + loadCurrentUser(); } window.OntoComments = { openThread: openThread, openForSelection: openForSelection, + showLoadingPanel: showLoadingPanel, taggableFromOntology: taggableFromOntology, // Split a stored comment body into { text, tags } (strips the // internal tag marker). Shared with the Domain → Discussions timeline. From 7a7f7bc37150a400a4f3943dcabf8d823bbdc6bd Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Fri, 19 Jun 2026 18:00:02 +0200 Subject: [PATCH 20/54] =?UTF-8?q?fix:=20typo=20resolveDomainContext=20?= =?UTF-8?q?=E2=86=92=20resolveDomainCtx=20in=20openDomainDiscussion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/front/static/domain/js/domain-collaboration.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/front/static/domain/js/domain-collaboration.js b/src/front/static/domain/js/domain-collaboration.js index 4edbaba4..48c04ebd 100644 --- a/src/front/static/domain/js/domain-collaboration.js +++ b/src/front/static/domain/js/domain-collaboration.js @@ -502,7 +502,7 @@ // Shows the panel immediately with a spinner, resolves context behind it. window.openDomainDiscussion = function () { if (window.OntoComments) OntoComments.showLoadingPanel(); - resolveDomainContext().then(function (dc) { + resolveDomainCtx().then(function (dc) { if (!window.OntoComments) return; if (!dc.folder || !dc.hasRegistry) { const panelEl = document.querySelector('.oc-comments [data-oc-list]'); From 18cca481469b0d27e919cf446712cce76614839b Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Fri, 19 Jun 2026 18:04:23 +0200 Subject: [PATCH 21/54] feat(ux): copy comment text as task name with 200-char truncation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When 'Create task' is opened from a comment thread, a clipboard button appears next to the title input. Clicking it copies the comment's raw text (stripped of tags) into the title field, truncated to 200 chars with a trailing ellipsis (…) if longer. Implementation: - threadHtml: stores raw comment text in data-raw-text attribute - taskFormHtml(heading, withCancel, commentText): renders copy button with data-tk-copy-text when commentText is provided - wireTaskForm: wires copy button → fills [data-tk-title], focuses it - toggleTask: reads data-raw-text from thread element, passes to form - TASK_TITLE_MAX = 200 constant --- src/front/static/global/js/comments-panel.js | 37 +++++++++++++++++--- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/src/front/static/global/js/comments-panel.js b/src/front/static/global/js/comments-panel.js index b8ba5830..cbb0731b 100644 --- a/src/front/static/global/js/comments-panel.js +++ b/src/front/static/global/js/comments-panel.js @@ -280,7 +280,9 @@ function threadHtml(root, replies) { const replyHtml = replies.map((r) => bubble(r, true)).join(''); const resolvedCls = root.resolved ? ' oc-resolved' : ''; - return '
    ' + + const rawText = parseBody(root.body).text; + return '
    ' + bubble(root, false) + '
    ' + replyHtml + '
    ' + '
    ' + @@ -348,7 +350,9 @@ // Build the inner markup of a task-creation form. Shared by the // per-comment task box and the standalone "New task" box in the header. - function taskFormHtml(heading, withCancel) { + const TASK_TITLE_MAX = 200; + + function taskFormHtml(heading, withCancel, commentText) { const members = membersCache[ctx.folder + '/' + ctx.version] || []; const opts = members.map((m) => { const label = esc(m.display_name || m.principal) + @@ -359,10 +363,18 @@ const cancel = withCancel ? '' : ''; + const copyBtn = commentText + ? '' + : ''; return '
    ' + '
    ' + esc(heading) + '
    ' + - '' + + '
    ' + + '' + + copyBtn + '
    ' + '
    ' + '' + '
    ${attributes.length > 0 - ? '
    ' + epOntologyRows + '
    #AttributeMapped
    ' + ? '
    ' + epOntologyRows + '
    AttributeMapped
    ' : ''}
    @@ -1195,10 +1205,20 @@ function loadRelationshipPanelContent(ontologyProperty, targetPanelBody = null) ${relAttributes.length > 0 ? `${statusIcon(mappedAttrCount === relAttributes.length)}Attributes${mappedAttrCount} / ${relAttributes.length} assigned` : ''} `; - const rpOntologyRows = relAttributes.map((a, i) => { + const rpExcludedAttrs = existingMapping?.excluded_attributes || []; + const rpOntologyRows = relAttributes.map((a) => { const name = a.name || a.localName || ''; - const assigned = !!(name && relAttrMap[name]); - return `${i + 1}${name}${statusIcon(assigned)}`; + const isExcluded = rpExcludedAttrs.includes(name); + const assigned = !!(name && relAttrMap[name]) && !isExcluded; + const nameCell = isExcluded ? `${name}` : name; + const mappedCell = isExcluded + ? '' + : statusIcon(assigned); + return ` + + ${nameCell} + ${mappedCell} + `; }).join(''); panelBody.innerHTML = ` @@ -1254,7 +1274,7 @@ function loadRelationshipPanelContent(ontologyProperty, targetPanelBody = null)
    ${relAttributes.length > 0 - ? '
    ' + rpOntologyRows + '
    #AttributeMapped
    ' + ? '
    ' + rpOntologyRows + '
    AttributeMapped
    ' : ''}
    @@ -1334,6 +1354,7 @@ const EntityPanelState = { labelColumn: null, attributeMappings: {}, attributes: [], + excludedAttributes: [], _generation: 0, _autoLoadTimer: null }; @@ -1353,6 +1374,7 @@ function initEntityPanel(classUri, className, existingMapping, classInfo) { EntityPanelState.labelColumn = existingMapping?.label_column || null; EntityPanelState.attributeMappings = existingMapping?.attribute_mappings ? {...existingMapping.attribute_mappings} : {}; EntityPanelState.attributes = classInfo?.dataProperties || []; + EntityPanelState.excludedAttributes = existingMapping?.excluded_attributes ? [...existingMapping.excluded_attributes] : []; updateEntityPanelSaveBtn(); @@ -1365,7 +1387,32 @@ function initEntityPanel(classUri, className, existingMapping, classInfo) { toggleEntityExclusion(classUri, !this.checked, 'entity'); }); } - + + // Per-attribute include/exclude checkboxes + document.querySelectorAll('.ep-attr-include-cb').forEach(cb => { + cb.addEventListener('change', function() { + const attrName = this.dataset.attr; + if (this.checked) { + EntityPanelState.excludedAttributes = EntityPanelState.excludedAttributes.filter(a => a !== attrName); + } else { + if (!EntityPanelState.excludedAttributes.includes(attrName)) { + EntityPanelState.excludedAttributes.push(attrName); + } + delete EntityPanelState.attributeMappings[attrName]; + } + const row = this.closest('tr'); + const nameCell = row.querySelector('td:nth-child(2)'); + const mappedCell = row.querySelector('td:nth-child(3)'); + if (this.checked) { + nameCell.innerHTML = attrName; + mappedCell.innerHTML = ''; + } else { + nameCell.innerHTML = `${attrName}`; + mappedCell.innerHTML = ''; + } + }); + }); + // Auto-load query data in background when there is an existing mapping with SQL if (existingMapping?.sql_query) { EntityPanelState._autoLoadTimer = setTimeout(() => { @@ -1613,7 +1660,8 @@ const RelPanelState = { sourceIdColumn: null, targetIdColumn: null, attributeMappings: {}, - attributes: [] + attributes: [], + excludedAttributes: [] }; function initRelationshipPanel(ontologyProperty, existingMapping) { @@ -1623,6 +1671,7 @@ function initRelationshipPanel(ontologyProperty, existingMapping) { RelPanelState.targetIdColumn = existingMapping?.target_id_column || null; RelPanelState.attributeMappings = existingMapping?.attribute_mappings ? {...existingMapping.attribute_mappings} : {}; RelPanelState.attributes = ontologyProperty?.properties || []; + RelPanelState.excludedAttributes = existingMapping?.excluded_attributes ? [...existingMapping.excluded_attributes] : []; updateRelPanelSaveBtn(); @@ -1635,7 +1684,32 @@ function initRelationshipPanel(ontologyProperty, existingMapping) { toggleEntityExclusion(ontologyProperty.uri, !this.checked, 'relationship'); }); } - + + // Per-attribute include/exclude checkboxes + document.querySelectorAll('.rp-attr-include-cb').forEach(cb => { + cb.addEventListener('change', function() { + const attrName = this.dataset.attr; + if (this.checked) { + RelPanelState.excludedAttributes = RelPanelState.excludedAttributes.filter(a => a !== attrName); + } else { + if (!RelPanelState.excludedAttributes.includes(attrName)) { + RelPanelState.excludedAttributes.push(attrName); + } + delete RelPanelState.attributeMappings[attrName]; + } + const row = this.closest('tr'); + const nameCell = row.querySelector('td:nth-child(2)'); + const mappedCell = row.querySelector('td:nth-child(3)'); + if (this.checked) { + nameCell.innerHTML = attrName; + mappedCell.innerHTML = ''; + } else { + nameCell.innerHTML = `${attrName}`; + mappedCell.innerHTML = ''; + } + }); + }); + // Auto-load query data in background when there is an existing mapping with SQL if (existingMapping?.sql_query) { setTimeout(() => { @@ -1885,14 +1959,20 @@ function saveEntityPanelMapping() { const existingIndex = MappingState.config.entities.findIndex(m => m.ontology_class === classUri); + const filteredAttrMappings = Object.fromEntries( + Object.entries(EntityPanelState.attributeMappings).filter(([k]) => !EntityPanelState.excludedAttributes.includes(k)) + ); const newMapping = { ontology_class: classUri, ontology_class_label: classLabel, sql_query: sqlQuery, id_column: EntityPanelState.idColumn, label_column: EntityPanelState.labelColumn, - attribute_mappings: {...EntityPanelState.attributeMappings} + attribute_mappings: filteredAttrMappings }; + if (EntityPanelState.excludedAttributes.length > 0) { + newMapping.excluded_attributes = [...EntityPanelState.excludedAttributes]; + } if (existingIndex >= 0) { MappingState.config.entities[existingIndex] = newMapping; @@ -1937,6 +2017,9 @@ function saveRelPanelMapping() { const existingIndex = MappingState.config.relationships.findIndex(m => m.property === propertyUri); + const filteredRelAttrMappings = Object.fromEntries( + Object.entries(RelPanelState.attributeMappings).filter(([k]) => !RelPanelState.excludedAttributes.includes(k)) + ); const newMapping = { property: propertyUri, property_label: propertyLabel, @@ -1947,9 +2030,12 @@ function saveRelPanelMapping() { source_class_label: sourceClassLabel, target_class: targetClassUri, target_class_label: targetClassLabel, - attribute_mappings: {...RelPanelState.attributeMappings}, + attribute_mappings: filteredRelAttrMappings, direction: propertyInfo?.direction || 'forward' }; + if (RelPanelState.excludedAttributes.length > 0) { + newMapping.excluded_attributes = [...RelPanelState.excludedAttributes]; + } if (existingIndex >= 0) { MappingState.config.relationships[existingIndex] = newMapping; From fbb2a515e646b5d8d1d01a072695fd458caae5f1 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Sat, 20 Jun 2026 08:15:42 +0200 Subject: [PATCH 24/54] fix: preserve attribute mapping state when toggling exclude checkbox MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When unchecking (excluding) an attribute, do not delete it from attributeMappings — the save function already filters exclusions. On re-check, read attributeMappings to restore the correct icon (green checkmark if the attribute was mapped, red cross if not). --- src/front/static/mapping/js/mapping-design.js | 34 +++++++++---------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/front/static/mapping/js/mapping-design.js b/src/front/static/mapping/js/mapping-design.js index 15ac28fc..cdfaa2f7 100644 --- a/src/front/static/mapping/js/mapping-design.js +++ b/src/front/static/mapping/js/mapping-design.js @@ -1392,21 +1392,20 @@ function initEntityPanel(classUri, className, existingMapping, classInfo) { document.querySelectorAll('.ep-attr-include-cb').forEach(cb => { cb.addEventListener('change', function() { const attrName = this.dataset.attr; - if (this.checked) { - EntityPanelState.excludedAttributes = EntityPanelState.excludedAttributes.filter(a => a !== attrName); - } else { - if (!EntityPanelState.excludedAttributes.includes(attrName)) { - EntityPanelState.excludedAttributes.push(attrName); - } - delete EntityPanelState.attributeMappings[attrName]; - } const row = this.closest('tr'); const nameCell = row.querySelector('td:nth-child(2)'); const mappedCell = row.querySelector('td:nth-child(3)'); if (this.checked) { + EntityPanelState.excludedAttributes = EntityPanelState.excludedAttributes.filter(a => a !== attrName); + const isMapped = !!EntityPanelState.attributeMappings[attrName]; nameCell.innerHTML = attrName; - mappedCell.innerHTML = ''; + mappedCell.innerHTML = isMapped + ? '' + : ''; } else { + if (!EntityPanelState.excludedAttributes.includes(attrName)) { + EntityPanelState.excludedAttributes.push(attrName); + } nameCell.innerHTML = `${attrName}`; mappedCell.innerHTML = ''; } @@ -1689,21 +1688,20 @@ function initRelationshipPanel(ontologyProperty, existingMapping) { document.querySelectorAll('.rp-attr-include-cb').forEach(cb => { cb.addEventListener('change', function() { const attrName = this.dataset.attr; - if (this.checked) { - RelPanelState.excludedAttributes = RelPanelState.excludedAttributes.filter(a => a !== attrName); - } else { - if (!RelPanelState.excludedAttributes.includes(attrName)) { - RelPanelState.excludedAttributes.push(attrName); - } - delete RelPanelState.attributeMappings[attrName]; - } const row = this.closest('tr'); const nameCell = row.querySelector('td:nth-child(2)'); const mappedCell = row.querySelector('td:nth-child(3)'); if (this.checked) { + RelPanelState.excludedAttributes = RelPanelState.excludedAttributes.filter(a => a !== attrName); + const isMapped = !!RelPanelState.attributeMappings[attrName]; nameCell.innerHTML = attrName; - mappedCell.innerHTML = ''; + mappedCell.innerHTML = isMapped + ? '' + : ''; } else { + if (!RelPanelState.excludedAttributes.includes(attrName)) { + RelPanelState.excludedAttributes.push(attrName); + } nameCell.innerHTML = `${attrName}`; mappedCell.innerHTML = ''; } From bf178dc458e08cd0b42080ac3974e67d9b6225f7 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Sat, 20 Jun 2026 08:21:13 +0200 Subject: [PATCH 25/54] fix: show Attributes table when dataProperties absent but attribute_mappings exist When ontology classes lack dataProperties (e.g. sync_class_data_properties was not applied to the stored config), entities with existing attribute_mappings still show the Attributes table by synthesizing attribute objects from the mapping keys. Applies to both entity and relationship panels, and to EntityPanelState/RelPanelState so the Mapping-tab dropdown also works. --- src/front/static/mapping/js/mapping-design.js | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/src/front/static/mapping/js/mapping-design.js b/src/front/static/mapping/js/mapping-design.js index cdfaa2f7..621c6ac3 100644 --- a/src/front/static/mapping/js/mapping-design.js +++ b/src/front/static/mapping/js/mapping-design.js @@ -1004,9 +1004,15 @@ function loadEntityPanelContent(classUri, className, targetPanelBody = null) { const existingMapping = MappingState.config.entities.find(m => m.ontology_class === classUri); const classInfo = MappingState.loadedOntology?.classes?.find(c => c.uri === classUri); - const attributes = classInfo?.dataProperties || []; - const epAttrMap = existingMapping?.attribute_mappings || {}; + // Primary source: ontology dataProperties. Fallback: synthesize from already-saved + // attribute_mappings so mapped attributes always appear even if the ontology config + // hasn't had sync_class_data_properties applied. + const ontologyAttrs = classInfo?.dataProperties || []; + const mappedOnlyAttrs = Object.keys(epAttrMap) + .filter(k => !ontologyAttrs.some(a => (a.name || a.localName) === k)) + .map(k => ({ name: k })); + const attributes = [...ontologyAttrs, ...mappedOnlyAttrs]; const epHasSql = !!(existingMapping?.sql_query); const epHasId = !!(existingMapping?.id_column); const epHasLabel = !!(existingMapping?.label_column); @@ -1179,7 +1185,12 @@ function loadRelationshipPanelContent(ontologyProperty, targetPanelBody = null) const hasSrcId = !!(existingMapping?.source_id_column); const hasTgtId = !!(existingMapping?.target_id_column); const relAttrMap = existingMapping?.attribute_mappings || {}; - const relAttributes = ontologyProperty?.properties || []; + // Primary source: ontology properties. Fallback: synthesize from saved attribute_mappings. + const ontologyRelAttrs = ontologyProperty?.properties || []; + const relMappedOnlyAttrs = Object.keys(relAttrMap) + .filter(k => !ontologyRelAttrs.some(a => (a.name || a.localName) === k)) + .map(k => ({ name: k })); + const relAttributes = [...ontologyRelAttrs, ...relMappedOnlyAttrs]; const mappedAttrCount = relAttributes.filter(a => { const n = a.name || a.localName || ''; return n && relAttrMap[n]; @@ -1373,7 +1384,11 @@ function initEntityPanel(classUri, className, existingMapping, classInfo) { EntityPanelState.idColumn = existingMapping?.id_column || null; EntityPanelState.labelColumn = existingMapping?.label_column || null; EntityPanelState.attributeMappings = existingMapping?.attribute_mappings ? {...existingMapping.attribute_mappings} : {}; - EntityPanelState.attributes = classInfo?.dataProperties || []; + const _epOntAttrs = classInfo?.dataProperties || []; + const _epMappedOnly = Object.keys(EntityPanelState.attributeMappings) + .filter(k => !_epOntAttrs.some(a => (a.name || a.localName) === k)) + .map(k => ({ name: k })); + EntityPanelState.attributes = [..._epOntAttrs, ..._epMappedOnly]; EntityPanelState.excludedAttributes = existingMapping?.excluded_attributes ? [...existingMapping.excluded_attributes] : []; updateEntityPanelSaveBtn(); @@ -1669,7 +1684,11 @@ function initRelationshipPanel(ontologyProperty, existingMapping) { RelPanelState.sourceIdColumn = existingMapping?.source_id_column || null; RelPanelState.targetIdColumn = existingMapping?.target_id_column || null; RelPanelState.attributeMappings = existingMapping?.attribute_mappings ? {...existingMapping.attribute_mappings} : {}; - RelPanelState.attributes = ontologyProperty?.properties || []; + const _rpOntAttrs = ontologyProperty?.properties || []; + const _rpMappedOnly = Object.keys(RelPanelState.attributeMappings) + .filter(k => !_rpOntAttrs.some(a => (a.name || a.localName) === k)) + .map(k => ({ name: k })); + RelPanelState.attributes = [..._rpOntAttrs, ..._rpMappedOnly]; RelPanelState.excludedAttributes = existingMapping?.excluded_attributes ? [...existingMapping.excluded_attributes] : []; updateRelPanelSaveBtn(); From 11a22d9ad0a6c6958c8d8481d760d10bfbdce6e6 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Sat, 20 Jun 2026 08:26:24 +0200 Subject: [PATCH 26/54] fix: agent must not map attributes absent from the ontology MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two-layer guard against the LLM inventing attribute_mappings for columns that have no corresponding ontology data property: 1. Prompt (engine.py): explicit rules — if entity 'attributes' list is empty, submit attribute_mappings:{} and select only ID+Label columns. Never invent mappings for attributes not in the list. 2. Server-side (mapping.py / tool_submit_entity_mapping): filter attribute_mappings against the entity's declared attributes from ctx.ontology. If the entity has no attributes, all invented mappings are discarded with a warning log. Ensures Invoice/Payment etc. (no dataProperties) get a clean SELECT id AS ID, name AS Label query. --- src/agents/agent_auto_assignment/engine.py | 8 +++++-- src/agents/tools/mapping.py | 27 +++++++++++++++++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/agents/agent_auto_assignment/engine.py b/src/agents/agent_auto_assignment/engine.py index 460eb4ad..7aec5bf6 100644 --- a/src/agents/agent_auto_assignment/engine.py +++ b/src/agents/agent_auto_assignment/engine.py @@ -94,7 +94,9 @@ class AgentResult: • Always use full table names from get_metadata (catalog.schema.table). • The FIRST column MUST be aliased AS ID (the entity identifier). • The SECOND column MUST be aliased AS Label (human-readable name). -• Additional columns for each data-property attribute (use original column names). +• If the entity has attributes (non-empty "attributes" list), add one column per \ +attribute after ID and Label (use original column names, no alias). +• If the entity has NO attributes, select ONLY ID and Label — no extra columns. • If the same column serves as both an alias and an attribute, include it twice: \ once with the alias (AS ID) and once with its original name. • Add WHERE IS NOT NULL to filter null keys. @@ -111,7 +113,9 @@ class AgentResult: • In submit_entity_mapping, provide attribute_mappings: a JSON object mapping each \ ontology attribute name to the corresponding SQL column name. • Match by name similarity (e.g. ontology "firstName" → column "first_name"). -• Map ALL attributes from the ontology entity to available columns. +• Map ONLY attributes listed in the entity's "attributes" list from get_ontology. \ +If that list is empty, submit attribute_mappings: {} and do NOT add extra SQL columns. +• NEVER invent attribute mappings for columns not listed as ontology attributes. GENERAL RULES • Process ALL entities and ALL relationships — do not skip any. diff --git a/src/agents/tools/mapping.py b/src/agents/tools/mapping.py index f2eaa19a..19a6edec 100644 --- a/src/agents/tools/mapping.py +++ b/src/agents/tools/mapping.py @@ -42,13 +42,38 @@ def tool_submit_entity_mapping( .rstrip(";") ) + # Restrict attribute_mappings to attributes declared in the ontology for this entity. + # This prevents the LLM from inventing mappings for columns that are not ontology + # data properties (e.g. mapping all table columns when the entity has none). + declared_attrs: set = set() + for entity in (ctx.ontology or {}).get("entities", []): + if entity.get("uri") == class_uri or entity.get("name") == class_name: + declared_attrs = set(entity.get("attributes", [])) + break + + raw_attr_mappings = attribute_mappings or {} + if declared_attrs: + filtered_mappings = {k: v for k, v in raw_attr_mappings.items() if k in declared_attrs} + else: + # Entity has no ontology attributes — discard anything the LLM may have invented. + filtered_mappings = {} + + if len(filtered_mappings) < len(raw_attr_mappings): + discarded = set(raw_attr_mappings) - set(filtered_mappings) + logger.warning( + "tool_submit_entity_mapping: '%s' — discarded %d non-ontology attribute mapping(s): %s", + class_name, + len(discarded), + discarded, + ) + mapping = { "ontology_class": class_uri, "class_name": class_name, "sql_query": clean_sql, "id_column": id_column, "label_column": label_column, - "attribute_mappings": attribute_mappings or {}, + "attribute_mappings": filtered_mappings, } logger.debug( From 275ca01b5c9f1f644e29990f856d26da6f39b5cc Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Sat, 20 Jun 2026 08:41:50 +0200 Subject: [PATCH 27/54] feat: warn user about missing metadata descriptions in Auto-Map Add a metadata quality check in the Auto-Map section. On init, fetches GET /domain/metadata and checks each table and column for a missing comment/description. If any are found, a collapsible warning banner is rendered above the gauges listing: - tables with no table-level description - columns with no column-level description The banner links directly to /domain/?section=metadata so the user can fill in descriptions before running the agent. --- .../static/mapping/js/mapping-autoassign.js | 85 ++++++++++++++++++- .../partials/mapping/_mapping_autoassign.html | 5 +- 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/src/front/static/mapping/js/mapping-autoassign.js b/src/front/static/mapping/js/mapping-autoassign.js index c3f959f6..9c4b9da9 100644 --- a/src/front/static/mapping/js/mapping-autoassign.js +++ b/src/front/static/mapping/js/mapping-autoassign.js @@ -77,8 +77,91 @@ window.AutoAssignModule = { this.initialized = true; this.updateStatus(); + this.checkMetadataQuality(); }, - + + /** + * Fetch catalog metadata and warn when table/column descriptions are missing. + * Missing descriptions reduce AI mapping accuracy. + */ + checkMetadataQuality: async function() { + const warningEl = document.getElementById('metadataQualityWarning'); + if (!warningEl) return; + + let metadata; + try { + const resp = await fetch('/domain/metadata', { credentials: 'same-origin' }); + const data = await resp.json(); + if (!data.success || !data.has_metadata) { + warningEl.style.display = 'none'; + return; + } + metadata = data.metadata; + } catch (e) { + console.warn('[AutoAssign] Could not fetch metadata for quality check:', e); + return; + } + + const tables = metadata.tables || []; + if (tables.length === 0) { + warningEl.style.display = 'none'; + return; + } + + const tablesNoDesc = []; + const columnsNoDesc = []; + + for (const t of tables) { + const tName = t.full_name || t.name || '?'; + if (!t.comment || !t.comment.trim()) { + tablesNoDesc.push(tName); + } + for (const col of (t.columns || [])) { + if (!col.comment || !col.comment.trim()) { + columnsNoDesc.push({ table: tName, column: col.name || '?' }); + } + } + } + + const totalMissing = tablesNoDesc.length + columnsNoDesc.length; + if (totalMissing === 0) { + warningEl.style.display = 'none'; + return; + } + + const collapseId = 'metaQualityDetails'; + const tableRows = tablesNoDesc.map(t => + `
  • ${t} — no table description
  • ` + ).join(''); + const colRows = columnsNoDesc.map(c => + `
  • ${c.table}${c.column} — no column description
  • ` + ).join(''); + + warningEl.innerHTML = ` +
    +
    + +
    + Incomplete data source descriptions may reduce mapping accuracy. + ${tablesNoDesc.length} table(s) and ${columnsNoDesc.length} column(s) are missing descriptions. + + + Edit descriptions + +
    +
      + ${tableRows}${colRows} +
    +
    +
    +
    +
    `; + warningEl.style.display = 'block'; + }, + /** * Check if a saved task is still running and resume monitoring */ diff --git a/src/front/templates/partials/mapping/_mapping_autoassign.html b/src/front/templates/partials/mapping/_mapping_autoassign.html index 89552a5d..5b839fb5 100644 --- a/src/front/templates/partials/mapping/_mapping_autoassign.html +++ b/src/front/templates/partials/mapping/_mapping_autoassign.html @@ -28,7 +28,10 @@

    Batch Auto-Map

    Auto-Map will automatically generate SQL queries and map columns for all unmapped entities and relationships using the AI wizard.
    - + + + +
    From 71e059a8522187536c105130944dd57bc863de06 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Sat, 20 Jun 2026 08:44:24 +0200 Subject: [PATCH 28/54] feat: Exclude unmapped button auto-excludes unassigned attributes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add an 'Exclude unmapped' button above the Attributes table in the Status tab of both entity and relationship panels. Clicking it finds all attributes with no column assignment in the current session and marks them as excluded in one action — updating the checkboxes, row styling (strikethrough) and EntityPanelState/RelPanelState in place. Already-mapped (green) attributes are left untouched. --- src/front/static/mapping/js/mapping-design.js | 107 +++++++++++++++++- 1 file changed, 105 insertions(+), 2 deletions(-) diff --git a/src/front/static/mapping/js/mapping-design.js b/src/front/static/mapping/js/mapping-design.js index 621c6ac3..a09480ca 100644 --- a/src/front/static/mapping/js/mapping-design.js +++ b/src/front/static/mapping/js/mapping-design.js @@ -1091,7 +1091,24 @@ function loadEntityPanelContent(classUri, className, targetPanelBody = null) {
    ${attributes.length > 0 - ? '
    ' + epOntologyRows + '
    AttributeMapped
    ' + ? `
    +
    + Attributes + +
    +
    + + + + + ${epOntologyRows} +
    AttributeMapped
    +
    +
    ` : ''}
    @@ -1285,7 +1302,24 @@ function loadRelationshipPanelContent(ontologyProperty, targetPanelBody = null)
    ${relAttributes.length > 0 - ? '
    ' + rpOntologyRows + '
    AttributeMapped
    ' + ? `
    +
    + Attributes + +
    +
    + + + + + ${rpOntologyRows} +
    AttributeMapped
    +
    +
    ` : ''}
    @@ -2067,6 +2101,75 @@ function saveRelPanelMapping() { refreshMappingDesign(); } +// ========================================================================== +// AUTO-EXCLUDE UNMAPPED ATTRIBUTES +// ========================================================================== + +/** + * Exclude all entity attributes that have no column assigned in the current session. + * Mapped attributes (green checkmark) are left untouched. + */ +function autoExcludeUnmappedEntityAttrs() { + const attrs = EntityPanelState.attributes || []; + let changed = 0; + attrs.forEach(a => { + const name = a.name || a.localName || ''; + if (!name) return; + const isMapped = !!EntityPanelState.attributeMappings[name]; + const isAlreadyExcluded = EntityPanelState.excludedAttributes.includes(name); + if (!isMapped && !isAlreadyExcluded) { + EntityPanelState.excludedAttributes.push(name); + const cb = document.querySelector(`.ep-attr-include-cb[data-attr="${CSS.escape(name)}"]`); + if (cb) { + cb.checked = false; + const row = cb.closest('tr'); + const nameCell = row?.querySelector('td:nth-child(2)'); + const mappedCell = row?.querySelector('td:nth-child(3)'); + if (nameCell) nameCell.innerHTML = `${name}`; + if (mappedCell) mappedCell.innerHTML = ''; + } + changed++; + } + }); + if (changed > 0) { + showNotification(`${changed} unmapped attribute(s) excluded`, 'info', 2000); + } else { + showNotification('No unmapped attributes to exclude', 'info', 2000); + } +} + +/** + * Exclude all relationship attributes that have no column assigned in the current session. + */ +function autoExcludeUnmappedRelAttrs() { + const attrs = RelPanelState.attributes || []; + let changed = 0; + attrs.forEach(a => { + const name = a.name || a.localName || ''; + if (!name) return; + const isMapped = !!RelPanelState.attributeMappings[name]; + const isAlreadyExcluded = RelPanelState.excludedAttributes.includes(name); + if (!isMapped && !isAlreadyExcluded) { + RelPanelState.excludedAttributes.push(name); + const cb = document.querySelector(`.rp-attr-include-cb[data-attr="${CSS.escape(name)}"]`); + if (cb) { + cb.checked = false; + const row = cb.closest('tr'); + const nameCell = row?.querySelector('td:nth-child(2)'); + const mappedCell = row?.querySelector('td:nth-child(3)'); + if (nameCell) nameCell.innerHTML = `${name}`; + if (mappedCell) mappedCell.innerHTML = ''; + } + changed++; + } + }); + if (changed > 0) { + showNotification(`${changed} unmapped attribute(s) excluded`, 'info', 2000); + } else { + showNotification('No unmapped attributes to exclude', 'info', 2000); + } +} + // ========================================================================== // RESET PANEL FUNCTIONALITY // ========================================================================== From dc7458d8a32cc5896c5591431670f234fb4f6469 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Sat, 20 Jun 2026 08:48:25 +0200 Subject: [PATCH 29/54] fix: autoExcludeAll only excludes unmapped entities/relationships Previous logic excluded any entity that was mapped but had no object-property relationships (pure standalone tables). This was over-aggressive. New rule: 'not normal' = no SQL query defined yet. - Mapped entities and relationships always stay, regardless of topology. - Only unmapped items (no sql_query) are candidates for auto-exclusion. Updated the button tooltip accordingly. --- src/front/static/mapping/js/mapping-design.js | 43 +++---------------- .../partials/mapping/_mapping_design.html | 2 +- 2 files changed, 6 insertions(+), 39 deletions(-) diff --git a/src/front/static/mapping/js/mapping-design.js b/src/front/static/mapping/js/mapping-design.js index a09480ca..a2ad6022 100644 --- a/src/front/static/mapping/js/mapping-design.js +++ b/src/front/static/mapping/js/mapping-design.js @@ -2911,35 +2911,8 @@ async function autoExcludeAll() { const allProperties = MappingState.loadedOntology?.properties || []; const objectProperties = _filterObjectProperties(allProperties); - // Build the same node-resolution map as buildMappingGraph() so domain/range - // references (which may be local-names or full URIs) resolve correctly. - const validNodeIds = new Set(classes.map(c => c.name || c.localName)); - const nodeIdByLower = new Map(classes.map(c => [(c.name || c.localName).toLowerCase(), c.name || c.localName])); - const resolveNodeId = id => { - if (!id) return null; - if (validNodeIds.has(id)) return id; - const lower = id.toLowerCase(); - if (nodeIdByLower.has(lower)) return nodeIdByLower.get(lower); - const localPart = id.includes('#') ? id.split('#').pop() : id.includes('/') ? id.split('/').pop() : null; - if (localPart) { - if (validNodeIds.has(localPart)) return localPart; - if (nodeIdByLower.has(localPart.toLowerCase())) return nodeIdByLower.get(localPart.toLowerCase()); - } - return null; - }; - - // Collect node IDs connected by at least one non-excluded ObjectProperty. - const nodesWithRelationships = new Set(); - objectProperties.forEach(prop => { - if (!prop.excluded && prop.domain && prop.range) { - const srcId = resolveNodeId(prop.domain); - const tgtId = resolveNodeId(prop.range); - if (srcId) nodesWithRelationships.add(srcId); - if (tgtId) nodesWithRelationships.add(tgtId); - } - }); - - // Mirror the graph's "truly mapped" definition (sql_query entries only). + // "Not normal" = not yet mapped (no SQL query defined). + // Mapped entities and relationships always stay visible regardless of topology. const mappedEntityUris = new Set( (MappingState.config.entities || []) .filter(m => m.sql_query) @@ -2953,18 +2926,12 @@ async function autoExcludeAll() { .filter(Boolean) ); - // Candidate entities: not already excluded AND (unmapped OR no relationships). - // Entities that are both mapped AND connected stay visible. + // Candidate entities: not already excluded AND not mapped. const candidateEntityUris = classes - .filter(c => { - if (c.excluded) return false; - const isMapped = mappedEntityUris.has(c.uri); - const hasRelationships = nodesWithRelationships.has(c.name || c.localName); - return !(isMapped && hasRelationships); - }) + .filter(c => !c.excluded && !mappedEntityUris.has(c.uri)) .map(c => c.uri); - // Candidate relationships: unmapped ObjectProperties not already excluded. + // Candidate relationships: not already excluded AND not mapped. const candidateRelUris = objectProperties .filter(p => !p.excluded && !mappedRelUris.has(p.uri)) .map(p => p.uri); diff --git a/src/front/templates/partials/mapping/_mapping_design.html b/src/front/templates/partials/mapping/_mapping_design.html index a632be5b..d474998f 100644 --- a/src/front/templates/partials/mapping/_mapping_design.html +++ b/src/front/templates/partials/mapping/_mapping_design.html @@ -36,7 +36,7 @@

    Visual Mapping Designer
    -
    -
    - @@ -1270,7 +1274,7 @@ function loadRelationshipPanelContent(ontologyProperty, targetPanelBody = null) @@ -1617,7 +1621,7 @@ function showEntityColumnMenu(th, column) { if (action === 'id') EntityPanelState.idColumn = column; else if (action === 'label') EntityPanelState.labelColumn = column; else if (action === 'attr') EntityPanelState.attributeMappings[item.dataset.attr] = column; - + menu.remove(); renderEntityPanelGrid(); }); @@ -1683,18 +1687,29 @@ function autoMapEntityColumns(columns) { function updateEntityPanelSaveBtn() { const saveBtn = document.getElementById('savePanelBtn'); const statusEl = document.getElementById('epMappingStatus'); - + if (window.isActiveVersion === false) { if (saveBtn) saveBtn.disabled = true; return; } - if (EntityPanelState.idColumn) { - saveBtn.disabled = false; - if (statusEl) statusEl.innerHTML = ' ID: ' + EntityPanelState.idColumn + ''; - } else { - saveBtn.disabled = true; - if (statusEl) statusEl.innerHTML = ' ID required'; + // Save button is always enabled — validation happens on click. + if (saveBtn) saveBtn.disabled = false; + + if (statusEl) { + if (EntityPanelState.idColumn) { + statusEl.innerHTML = ' ID: ' + EntityPanelState.idColumn + ''; + } else { + const classUri = document.getElementById('panelEntityClass')?.value; + const configEntry = classUri + ? MappingState.config.entities.find(m => m.ontology_class === classUri) + : null; + if (configEntry?.id_column) { + statusEl.innerHTML = ' ID: ' + configEntry.id_column + ' (verify in Mapping tab)'; + } else { + statusEl.innerHTML = ' Set SQL + ID column to create mapping'; + } + } } } @@ -1715,6 +1730,7 @@ const RelPanelState = { function initRelationshipPanel(ontologyProperty, existingMapping) { RelPanelState.columns = []; RelPanelState.rows = []; + RelPanelState.propertyUri = ontologyProperty?.uri || null; RelPanelState.sourceIdColumn = existingMapping?.source_id_column || null; RelPanelState.targetIdColumn = existingMapping?.target_id_column || null; RelPanelState.attributeMappings = existingMapping?.attribute_mappings ? {...existingMapping.attribute_mappings} : {}; @@ -1901,7 +1917,7 @@ function showRelColumnMenu(th, column) { if (action === 'source') RelPanelState.sourceIdColumn = column; else if (action === 'target') RelPanelState.targetIdColumn = column; else if (action === 'attr') RelPanelState.attributeMappings[item.dataset.attr] = column; - + menu.remove(); renderRelPanelGrid(); }); @@ -1967,18 +1983,29 @@ function autoMapRelColumns(columns) { function updateRelPanelSaveBtn() { const saveBtn = document.getElementById('savePanelBtn'); const statusEl = document.getElementById('rpMappingStatus'); - + if (window.isActiveVersion === false) { if (saveBtn) saveBtn.disabled = true; return; } - if (RelPanelState.sourceIdColumn && RelPanelState.targetIdColumn) { - saveBtn.disabled = false; - if (statusEl) statusEl.innerHTML = ' Source: ' + RelPanelState.sourceIdColumn + ' | Target: ' + RelPanelState.targetIdColumn + ''; - } else { - saveBtn.disabled = true; - if (statusEl) statusEl.innerHTML = ' Source & Target required'; + // Save button is always enabled — validation happens on click. + if (saveBtn) saveBtn.disabled = false; + + if (statusEl) { + if (RelPanelState.sourceIdColumn && RelPanelState.targetIdColumn) { + statusEl.innerHTML = ' Source: ' + RelPanelState.sourceIdColumn + ' | Target: ' + RelPanelState.targetIdColumn + ''; + } else { + const propUri = RelPanelState.propertyUri; + const configEntry = propUri + ? MappingState.config.relationships.find(m => m.property === propUri) + : null; + if (configEntry?.source_id_column && configEntry?.target_id_column) { + statusEl.innerHTML = ' Source/Target IDs from saved mapping (verify in Mapping tab)'; + } else { + statusEl.innerHTML = ' Set SQL + Source & Target ID columns to create mapping'; + } + } } } @@ -1999,32 +2026,57 @@ function saveEntityPanelMapping() { const classUri = document.getElementById('panelEntityClass')?.value; const sqlQueryRaw = document.getElementById('epSqlQuery')?.value?.trim(); const sqlQuery = stripLimitClause(sqlQueryRaw); - - if (!sqlQuery || !EntityPanelState.idColumn) { - showNotification('Please complete the mapping', 'warning'); - return; - } - + const classInfo = MappingState.loadedOntology?.classes?.find(c => c.uri === classUri); const classLabel = classInfo ? (classInfo.label || classInfo.name) : 'Unknown'; - const existingIndex = MappingState.config.entities.findIndex(m => m.ontology_class === classUri); - + const existingInConfig = existingIndex >= 0 ? MappingState.config.entities[existingIndex] : null; + + // Fall back to previously saved values when the Mapping tab hasn't been opened yet + const effectiveSql = sqlQuery || existingInConfig?.sql_query || ''; + const effectiveIdCol = EntityPanelState.idColumn || existingInConfig?.id_column || ''; + + if (!effectiveSql || !effectiveIdCol) { + // No full mapping yet — save only the attribute exclusion state (no warning). + const excl = EntityPanelState.excludedAttributes; + if (existingInConfig) { + if (excl.length > 0) { + existingInConfig.excluded_attributes = [...excl]; + } else { + delete existingInConfig.excluded_attributes; + } + } else { + // Lightweight stub — backend skips it for R2RML / gap computation (no sql_query). + MappingState.config.entities.push({ + ontology_class: classUri, + ontology_class_label: classLabel, + sql_query: '', + ...(excl.length > 0 && { excluded_attributes: [...excl] }) + }); + } + autoSaveMappings(); + showNotification('Attribute selections saved', 'success', 2000); + closeMappingPanel(); + refreshMappingDesign(); + return; + } + const filteredAttrMappings = Object.fromEntries( Object.entries(EntityPanelState.attributeMappings).filter(([k]) => !EntityPanelState.excludedAttributes.includes(k)) ); const newMapping = { ontology_class: classUri, ontology_class_label: classLabel, - sql_query: sqlQuery, - id_column: EntityPanelState.idColumn, + sql_query: effectiveSql, + id_column: effectiveIdCol, label_column: EntityPanelState.labelColumn, attribute_mappings: filteredAttrMappings }; + if (existingInConfig?.excluded) newMapping.excluded = existingInConfig.excluded; if (EntityPanelState.excludedAttributes.length > 0) { newMapping.excluded_attributes = [...EntityPanelState.excludedAttributes]; } - + if (existingIndex >= 0) { MappingState.config.entities[existingIndex] = newMapping; showNotification(`Mapping for "${classLabel}" updated`, 'success', 2000); @@ -2032,7 +2084,7 @@ function saveEntityPanelMapping() { MappingState.config.entities.push(newMapping); showNotification(`Mapping created for "${classLabel}"`, 'success', 2000); } - + autoSaveMappings(); closeMappingPanel(); refreshMappingDesign(); @@ -2042,41 +2094,65 @@ function saveRelPanelMapping() { const propertyUri = document.getElementById('panelPropertyUri')?.value; const sqlQueryRaw = document.getElementById('rpSqlQuery')?.value?.trim(); const sqlQuery = stripLimitClause(sqlQueryRaw); - - if (!sqlQuery || !RelPanelState.sourceIdColumn || !RelPanelState.targetIdColumn) { - showNotification('Please complete the mapping', 'warning'); + + const existingIndex = MappingState.config.relationships.findIndex(m => m.property === propertyUri); + const existingInConfig = existingIndex >= 0 ? MappingState.config.relationships[existingIndex] : null; + + // Fall back to previously saved values when the Mapping tab hasn't been opened yet + const effectiveSql = sqlQuery || existingInConfig?.sql_query || ''; + const effectiveSrc = RelPanelState.sourceIdColumn || existingInConfig?.source_id_column || ''; + const effectiveTgt = RelPanelState.targetIdColumn || existingInConfig?.target_id_column || ''; + + if (!effectiveSql || !effectiveSrc || !effectiveTgt) { + // No full mapping yet — save only the attribute exclusion state (no warning). + const excl = RelPanelState.excludedAttributes; + if (existingInConfig) { + if (excl.length > 0) { + existingInConfig.excluded_attributes = [...excl]; + } else { + delete existingInConfig.excluded_attributes; + } + } else { + MappingState.config.relationships.push({ + property: propertyUri, + sql_query: '', + ...(excl.length > 0 && { excluded_attributes: [...excl] }) + }); + } + autoSaveMappings(); + showNotification('Attribute selections saved', 'success', 2000); + closeMappingPanel(); + refreshMappingDesign(); return; } - + const propertyInfo = MappingState.loadedOntology?.properties?.find(p => p.uri === propertyUri); const propertyLabel = propertyInfo ? (propertyInfo.label || propertyInfo.name) : 'Unknown'; - + const sourceEntityId = propertyInfo?.sourceEntityId || propertyInfo?.domain || propertyInfo?.source || ''; const targetEntityId = propertyInfo?.targetEntityId || propertyInfo?.range || propertyInfo?.target || ''; - - const sourceClass = MappingState.loadedOntology?.classes?.find(c => + + const sourceClass = MappingState.loadedOntology?.classes?.find(c => c.id === sourceEntityId || c.uri === sourceEntityId || c.name === sourceEntityId || c.localName === sourceEntityId ); - const targetClass = MappingState.loadedOntology?.classes?.find(c => + const targetClass = MappingState.loadedOntology?.classes?.find(c => c.id === targetEntityId || c.uri === targetEntityId || c.name === targetEntityId || c.localName === targetEntityId ); - + const sourceClassLabel = sourceClass ? (sourceClass.label || sourceClass.name || sourceClass.localName || '') : ''; const targetClassLabel = targetClass ? (targetClass.label || targetClass.name || targetClass.localName || '') : ''; const sourceClassUri = sourceClass?.uri || ''; const targetClassUri = targetClass?.uri || ''; - - const existingIndex = MappingState.config.relationships.findIndex(m => m.property === propertyUri); - + const filteredRelAttrMappings = Object.fromEntries( Object.entries(RelPanelState.attributeMappings).filter(([k]) => !RelPanelState.excludedAttributes.includes(k)) ); const newMapping = { property: propertyUri, property_label: propertyLabel, - sql_query: sqlQuery, - source_id_column: RelPanelState.sourceIdColumn, - target_id_column: RelPanelState.targetIdColumn, + sql_query: effectiveSql, + source_id_column: effectiveSrc, + target_id_column: effectiveTgt, source_class: sourceClassUri, source_class_label: sourceClassLabel, target_class: targetClassUri, @@ -2084,10 +2160,11 @@ function saveRelPanelMapping() { attribute_mappings: filteredRelAttrMappings, direction: propertyInfo?.direction || 'forward' }; + if (existingInConfig?.excluded) newMapping.excluded = existingInConfig.excluded; if (RelPanelState.excludedAttributes.length > 0) { newMapping.excluded_attributes = [...RelPanelState.excludedAttributes]; } - + if (existingIndex >= 0) { MappingState.config.relationships[existingIndex] = newMapping; showNotification(`Mapping for "${propertyLabel}" updated`, 'success', 2000); @@ -2095,12 +2172,85 @@ function saveRelPanelMapping() { MappingState.config.relationships.push(newMapping); showNotification(`Mapping created for "${propertyLabel}"`, 'success', 2000); } - + autoSaveMappings(); closeMappingPanel(); refreshMappingDesign(); } +// ========================================================================== +// ATTRIBUTE EXCLUSION PERSISTENCE HELPERS +// ========================================================================== + +/** + * Persist EntityPanelState.excludedAttributes into MappingState.config and auto-save. + * Works whether or not the entity has a full mapping (stub entry is created if needed). + */ +function _syncEntityAttrExclusions(classUri) { + if (!classUri) return; + const existing = MappingState.config.entities.find(m => m.ontology_class === classUri); + if (!existing) return; // no mapping yet — exclusions live in EntityPanelState until Save + const excl = [...EntityPanelState.excludedAttributes]; + if (excl.length > 0) { + existing.excluded_attributes = excl; + } else { + delete existing.excluded_attributes; + } + autoSaveMappings(); +} + +/** + * Persist RelPanelState.excludedAttributes into MappingState.config and auto-save. + */ +function _syncRelAttrExclusions(propertyUri) { + if (!propertyUri) return; + const existing = MappingState.config.relationships.find(m => m.property === propertyUri); + if (!existing) return; // no mapping yet — exclusions live in RelPanelState until Save + const excl = [...RelPanelState.excludedAttributes]; + if (excl.length > 0) { + existing.excluded_attributes = excl; + } else { + delete existing.excluded_attributes; + } + autoSaveMappings(); +} + +/** + * Persist column assignment state (id/label/attribute→column) from EntityPanelState + * into the matching MappingState.config entry and auto-save. + * Only operates when an existing mapping is present (won't create stubs). + */ +function _syncEntityColAssignments() { + const classUri = document.getElementById('panelEntityClass')?.value; + if (!classUri) return; + const existing = MappingState.config.entities.find(m => m.ontology_class === classUri); + if (!existing) return; + if (EntityPanelState.idColumn) existing.id_column = EntityPanelState.idColumn; + if (EntityPanelState.labelColumn !== undefined) existing.label_column = EntityPanelState.labelColumn || ''; + const excl = EntityPanelState.excludedAttributes || []; + existing.attribute_mappings = Object.fromEntries( + Object.entries(EntityPanelState.attributeMappings).filter(([k]) => !excl.includes(k)) + ); + autoSaveMappings(); +} + +/** + * Persist column assignment state from RelPanelState into the matching config entry and auto-save. + */ +function _syncRelColAssignments() { + const propertyUri = RelPanelState.propertyUri; + if (!propertyUri) return; + const existing = MappingState.config.relationships.find(m => m.property === propertyUri); + if (!existing) return; + if (RelPanelState.sourceIdColumn) existing.source_id_column = RelPanelState.sourceIdColumn; + if (RelPanelState.targetIdColumn) existing.target_id_column = RelPanelState.targetIdColumn; + const excl = RelPanelState.excludedAttributes || []; + existing.attribute_mappings = Object.fromEntries( + Object.entries(RelPanelState.attributeMappings).filter(([k]) => !excl.includes(k)) + ); + autoSaveMappings(); +} + // ========================================================================== // AUTO-EXCLUDE UNMAPPED ATTRIBUTES // ========================================================================== @@ -2132,7 +2282,7 @@ function autoExcludeUnmappedEntityAttrs() { } }); if (changed > 0) { - showNotification(`${changed} unmapped attribute(s) excluded`, 'info', 2000); + showNotification(`${changed} unmapped attribute(s) excluded — click Save to persist`, 'info', 2500); } else { showNotification('No unmapped attributes to exclude', 'info', 2000); } @@ -2164,7 +2314,7 @@ function autoExcludeUnmappedRelAttrs() { } }); if (changed > 0) { - showNotification(`${changed} unmapped attribute(s) excluded`, 'info', 2000); + showNotification(`${changed} unmapped attribute(s) excluded — click Save to persist`, 'info', 2500); } else { showNotification('No unmapped attributes to exclude', 'info', 2000); } @@ -2345,7 +2495,11 @@ function _buildAgentEntityItem(uri) { const lookupUri = uri || currentPanelUri; const classInfo = MappingState.loadedOntology?.classes?.find(c => c.uri === lookupUri); if (!classInfo) return null; - const attributes = (classInfo.dataProperties || []).map(a => a.name || a.localName || a); + const existingMapping = MappingState.config.entities.find(m => m.ontology_class === lookupUri); + const excluded = new Set(existingMapping?.excluded_attributes || []); + const attributes = (classInfo.dataProperties || []) + .map(a => a.name || a.localName || a) + .filter(a => !excluded.has(a)); return { uri: classInfo.uri, name: classInfo.label || classInfo.name || classInfo.localName, @@ -2415,6 +2569,11 @@ async function _pollSingleTask(taskId) { function _saveEntityAgentResult(targetUri, itemName, m) { const classInfo = MappingState.loadedOntology?.classes?.find(c => c.uri === targetUri); const classLabel = classInfo ? (classInfo.label || classInfo.name) : itemName; + const existingEntry = MappingState.config.entities.find(x => x.ontology_class === targetUri); + // Preserve excluded_attributes: agent result takes precedence, then existing config. + const excl = (m.excluded_attributes && m.excluded_attributes.length > 0) + ? m.excluded_attributes + : (existingEntry?.excluded_attributes || []); const mapping = { ontology_class: m.ontology_class || targetUri, ontology_class_label: m.class_name || classLabel, @@ -2423,6 +2582,7 @@ function _saveEntityAgentResult(targetUri, itemName, m) { label_column: m.label_column, attribute_mappings: m.attribute_mappings || {} }; + if (excl.length > 0) mapping.excluded_attributes = excl; const idx = MappingState.config.entities.findIndex(x => x.ontology_class === targetUri); if (idx >= 0) MappingState.config.entities[idx] = mapping; else MappingState.config.entities.push(mapping); @@ -2434,6 +2594,10 @@ function _saveEntityAgentResult(targetUri, itemName, m) { function _saveRelAgentResult(targetUri, itemName, m) { const propInfo = MappingState.loadedOntology?.properties?.find(p => p.uri === targetUri); const propLabel = propInfo ? (propInfo.label || propInfo.name) : itemName; + const existingEntry = MappingState.config.relationships.find(x => x.property === targetUri); + const excl = (m.excluded_attributes && m.excluded_attributes.length > 0) + ? m.excluded_attributes + : (existingEntry?.excluded_attributes || []); const mapping = { property: m.property || targetUri, property_label: m.property_label || m.property_name || propLabel, @@ -2447,6 +2611,7 @@ function _saveRelAgentResult(targetUri, itemName, m) { attribute_mappings: m.attribute_mappings || {}, direction: m.direction || propInfo?.direction || 'forward' }; + if (excl.length > 0) mapping.excluded_attributes = excl; const idx = MappingState.config.relationships.findIndex(x => x.property === targetUri); if (idx >= 0) MappingState.config.relationships[idx] = mapping; else MappingState.config.relationships.push(mapping); @@ -2772,10 +2937,21 @@ async function contextMenuAutoAssignEntity(entityData) { function contextMenuUnassignEntity(entityData) { const uri = entityData.uri; const displayName = entityData.label || entityData.name; - + const existingIndex = MappingState.config.entities.findIndex(m => m.ontology_class === uri); if (existingIndex >= 0) { - MappingState.config.entities.splice(existingIndex, 1); + const excl = MappingState.config.entities[existingIndex].excluded_attributes; + if (excl && excl.length > 0) { + // Keep a stub so attribute exclusions survive the unmap. + MappingState.config.entities[existingIndex] = { + ontology_class: uri, + ontology_class_label: MappingState.config.entities[existingIndex].ontology_class_label || '', + sql_query: '', + excluded_attributes: [...excl] + }; + } else { + MappingState.config.entities.splice(existingIndex, 1); + } showNotification(`Mapping for "${displayName}" removed`, 'success', 2000); autoSaveMappings(); refreshMappingDesign(); @@ -2810,10 +2986,20 @@ async function contextMenuAutoAssignRelationship(relData) { function contextMenuUnassignRelationship(relData) { const uri = relData.uri; const displayName = relData.label || relData.name; - + const existingIndex = MappingState.config.relationships.findIndex(m => m.property === uri); if (existingIndex >= 0) { - MappingState.config.relationships.splice(existingIndex, 1); + const excl = MappingState.config.relationships[existingIndex].excluded_attributes; + if (excl && excl.length > 0) { + MappingState.config.relationships[existingIndex] = { + property: uri, + property_label: MappingState.config.relationships[existingIndex].property_label || '', + sql_query: '', + excluded_attributes: [...excl] + }; + } else { + MappingState.config.relationships.splice(existingIndex, 1); + } showNotification(`Mapping for "${displayName}" removed`, 'success', 2000); autoSaveMappings(); refreshMappingDesign(); diff --git a/src/front/templates/partials/mapping/_mapping_design.html b/src/front/templates/partials/mapping/_mapping_design.html index ec3f5f47..79d5b71f 100644 --- a/src/front/templates/partials/mapping/_mapping_design.html +++ b/src/front/templates/partials/mapping/_mapping_design.html @@ -107,7 +107,7 @@

    Select It
    -
    diff --git a/tests/units/mapping/test_attribute_exclusion.py b/tests/units/mapping/test_attribute_exclusion.py new file mode 100644 index 00000000..ab1d8a0a --- /dev/null +++ b/tests/units/mapping/test_attribute_exclusion.py @@ -0,0 +1,564 @@ +""" +Tests for per-attribute include/exclude functionality. + +Covers every layer that touches excluded_attributes: + - Mapping.build_entity_mapping / build_relationship_mapping (model layer) + - Mapping.compute_mapping_gaps (gap reporting) + - R2RMLGenerator._add_entity_mapping (R2RML export) + - tool_submit_entity_mapping (agent tool) + - tool_submit_relationship_mapping (agent tool) + - tool_get_ontology (agent tool) +""" + +import json +import pytest + +from back.objects.mapping import Mapping +from back.core.w3c.r2rml.R2RMLGenerator import R2RMLGenerator +from agents.tools.mapping import ( + tool_submit_entity_mapping, + tool_submit_relationship_mapping, +) +from agents.tools.ontology import tool_get_ontology +from agents.tools.context import ToolContext + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +def _ctx(**kwargs) -> ToolContext: + """Build a minimal ToolContext for agent-tool tests.""" + return ToolContext(host="https://test.databricks.com", token="tok", **kwargs) + + +# --------------------------------------------------------------------------- +# 1. Mapping.build_entity_mapping +# --------------------------------------------------------------------------- + +class TestBuildEntityMappingExcludedAttributes: + def test_excluded_attributes_propagated(self): + data = { + "ontology_class": "http://t/A", + "excluded_attributes": ["age", "score"], + } + m = Mapping.build_entity_mapping(data) + assert m["excluded_attributes"] == ["age", "score"] + + def test_excluded_attributes_empty_list_not_added(self): + data = {"ontology_class": "http://t/A", "excluded_attributes": []} + m = Mapping.build_entity_mapping(data) + assert "excluded_attributes" not in m + + def test_excluded_attributes_absent_not_added(self): + data = {"ontology_class": "http://t/A"} + m = Mapping.build_entity_mapping(data) + assert "excluded_attributes" not in m + + def test_excluded_attributes_is_a_copy(self): + """Mutating the original list must not affect the built mapping.""" + original = ["age"] + data = {"ontology_class": "http://t/A", "excluded_attributes": original} + m = Mapping.build_entity_mapping(data) + original.append("score") + assert m["excluded_attributes"] == ["age"] + + def test_excluded_and_entity_excluded_flag_coexist(self): + data = { + "ontology_class": "http://t/A", + "excluded": True, + "excluded_attributes": ["x"], + } + m = Mapping.build_entity_mapping(data) + assert m["excluded"] is True + assert m["excluded_attributes"] == ["x"] + + +# --------------------------------------------------------------------------- +# 2. Mapping.build_relationship_mapping +# --------------------------------------------------------------------------- + +class TestBuildRelationshipMappingExcludedAttributes: + def test_excluded_attributes_propagated(self): + data = {"property": "http://t/p", "excluded_attributes": ["note"]} + m = Mapping.build_relationship_mapping(data) + assert m["excluded_attributes"] == ["note"] + + def test_excluded_attributes_empty_not_added(self): + data = {"property": "http://t/p", "excluded_attributes": []} + m = Mapping.build_relationship_mapping(data) + assert "excluded_attributes" not in m + + def test_excluded_attributes_absent_not_added(self): + data = {"property": "http://t/p"} + m = Mapping.build_relationship_mapping(data) + assert "excluded_attributes" not in m + + def test_excluded_attributes_is_a_copy(self): + original = ["note"] + data = {"property": "http://t/p", "excluded_attributes": original} + m = Mapping.build_relationship_mapping(data) + original.append("extra") + assert m["excluded_attributes"] == ["note"] + + +# --------------------------------------------------------------------------- +# 3. Mapping.compute_mapping_gaps +# --------------------------------------------------------------------------- + +class TestComputeMappingGapsExcludedAttributes: + """Excluded attributes must NOT appear in unmapped_attributes.""" + + _BASE_CLASS = { + "uri": "http://t/A", + "name": "A", + "label": "A", + "dataProperties": [ + {"name": "age"}, + {"name": "score"}, + {"name": "name"}, + ], + } + + def test_no_exclusions_all_unmapped_appear(self): + classes = [self._BASE_CLASS] + props = [] + entity_mappings = [ + { + "ontology_class": "http://t/A", + "sql_query": "SELECT id FROM t", + "attribute_mappings": {}, # nothing mapped + } + ] + _, _, unmapped_attrs, *_ = Mapping.compute_mapping_gaps( + classes, props, entity_mappings, [] + ) + attr_names = [u["attribute"] for u in unmapped_attrs] + assert "age" in attr_names + assert "score" in attr_names + assert "name" in attr_names + + def test_excluded_attribute_not_in_gaps(self): + classes = [self._BASE_CLASS] + entity_mappings = [ + { + "ontology_class": "http://t/A", + "sql_query": "SELECT id FROM t", + "attribute_mappings": {}, + "excluded_attributes": ["age"], + } + ] + _, _, unmapped_attrs, *_ = Mapping.compute_mapping_gaps( + classes, [], entity_mappings, [] + ) + attr_names = [u["attribute"] for u in unmapped_attrs] + assert "age" not in attr_names + assert "score" in attr_names + + def test_multiple_excluded_attributes_not_in_gaps(self): + classes = [self._BASE_CLASS] + entity_mappings = [ + { + "ontology_class": "http://t/A", + "sql_query": "SELECT id FROM t", + "attribute_mappings": {}, + "excluded_attributes": ["age", "score"], + } + ] + _, _, unmapped_attrs, *_ = Mapping.compute_mapping_gaps( + classes, [], entity_mappings, [] + ) + attr_names = [u["attribute"] for u in unmapped_attrs] + assert "age" not in attr_names + assert "score" not in attr_names + assert "name" in attr_names + + def test_all_excluded_means_no_gaps(self): + classes = [self._BASE_CLASS] + entity_mappings = [ + { + "ontology_class": "http://t/A", + "sql_query": "SELECT id FROM t", + "attribute_mappings": {}, + "excluded_attributes": ["age", "score", "name"], + } + ] + _, _, unmapped_attrs, *_ = Mapping.compute_mapping_gaps( + classes, [], entity_mappings, [] + ) + assert unmapped_attrs == [] + + def test_mapped_attribute_never_appears_regardless_of_exclusion(self): + """An attribute that is both excluded AND mapped should not appear in gaps.""" + classes = [self._BASE_CLASS] + entity_mappings = [ + { + "ontology_class": "http://t/A", + "sql_query": "SELECT id FROM t", + "attribute_mappings": {"age": "age_col"}, + "excluded_attributes": ["age"], + } + ] + _, _, unmapped_attrs, *_ = Mapping.compute_mapping_gaps( + classes, [], entity_mappings, [] + ) + attr_names = [u["attribute"] for u in unmapped_attrs] + assert "age" not in attr_names + + def test_entity_not_mapped_attrs_not_checked(self): + """Attributes of an unmapped entity are never reported as gaps.""" + classes = [self._BASE_CLASS] + _, _, unmapped_attrs, *_ = Mapping.compute_mapping_gaps( + classes, [], [], [] # no entity_mappings + ) + assert unmapped_attrs == [] + + +# --------------------------------------------------------------------------- +# 4. R2RMLGenerator — excluded attributes not emitted +# --------------------------------------------------------------------------- + +class TestR2RMLExcludedAttributes: + _BASE_URI = "http://test.org/onto/" + + def _mapping(self, *, excl=None, attr_map=None): + return { + "entities": [ + { + "ontology_class": f"{self._BASE_URI}Customer", + "ontology_class_label": "Customer", + "sql_query": "SELECT id AS ID, name AS Label, age, score FROM t", + "id_column": "ID", + "label_column": "Label", + "attribute_mappings": attr_map or {"age": "age", "score": "score"}, + **({"excluded_attributes": excl} if excl else {}), + } + ], + "relationships": [], + } + + def test_included_attribute_is_in_r2rml(self): + gen = R2RMLGenerator(self._BASE_URI) + r2rml = gen.generate_mapping(self._mapping()) + assert "age" in r2rml + assert "score" in r2rml + + def test_excluded_attribute_mapping_absent_when_not_in_attr_map(self): + """If the attr was excluded before mapping, it won't be in attribute_mappings + and therefore won't appear as a rr:column or predicate in R2RML. + + Note: 'score' may still appear inside the rr:sqlQuery literal — what must + be absent is a rr:column "score" or ont:score predicate reference. + """ + gen = R2RMLGenerator(self._BASE_URI) + r2rml = gen.generate_mapping(self._mapping(attr_map={"age": "age"})) + assert 'rr:column "age"' in r2rml or "age" in r2rml + # 'score' must not be emitted as a column or predicate + assert 'rr:column "score"' not in r2rml + assert "ont:score" not in r2rml + + def test_full_pipeline_excluded_then_partial_r2rml(self): + """End-to-end: excluded attribute is absent from predicate/column in R2RML + even when the excluded_attributes field is present in the mapping config.""" + gen = R2RMLGenerator(self._BASE_URI) + mapping = self._mapping(attr_map={"age": "age"}, excl=["score"]) + r2rml = gen.generate_mapping(mapping) + assert 'rr:column "age"' in r2rml or "age" in r2rml + # score excluded → no column or predicate reference + assert 'rr:column "score"' not in r2rml + assert "ont:score" not in r2rml + + +# --------------------------------------------------------------------------- +# 5. tool_submit_entity_mapping — excluded_attributes preservation & filtering +# --------------------------------------------------------------------------- + +class TestToolSubmitEntityMappingExcludedAttributes: + _URI = "http://t/Customer" + _ONTOLOGY = { + "entities": [ + {"uri": _URI, "name": "Customer", "attributes": ["age", "score", "name"]} + ] + } + + def _ctx(self, existing_excl=None): + entity_mappings = [] + if existing_excl is not None: + entity_mappings = [ + { + "ontology_class": self._URI, + "excluded_attributes": existing_excl, + } + ] + return _ctx(ontology=self._ONTOLOGY, entity_mappings=entity_mappings) + + def test_no_existing_excluded_attrs_no_field_added(self): + ctx = self._ctx() + tool_submit_entity_mapping( + ctx, + class_uri=self._URI, + class_name="Customer", + sql_query="SELECT id AS ID, name AS Label FROM t", + id_column="ID", + label_column="Label", + attribute_mappings={"age": "age_col"}, + ) + assert ctx.entity_mappings[0].get("excluded_attributes") is None + + def test_existing_excluded_attrs_preserved_in_new_mapping(self): + ctx = self._ctx(existing_excl=["score"]) + tool_submit_entity_mapping( + ctx, + class_uri=self._URI, + class_name="Customer", + sql_query="SELECT id AS ID, name AS Label FROM t", + id_column="ID", + label_column="Label", + attribute_mappings={"age": "age_col"}, + ) + m = ctx.entity_mappings[0] + assert m["excluded_attributes"] == ["score"] + + def test_agent_mapping_for_excluded_attr_is_stripped(self): + """Even if the agent tries to map a user-excluded attribute, it must be removed.""" + ctx = self._ctx(existing_excl=["score"]) + tool_submit_entity_mapping( + ctx, + class_uri=self._URI, + class_name="Customer", + sql_query="SELECT id AS ID, name AS Label, score FROM t", + id_column="ID", + label_column="Label", + attribute_mappings={"age": "age_col", "score": "score_col"}, + ) + m = ctx.entity_mappings[0] + assert "score" not in m["attribute_mappings"] + assert "age" in m["attribute_mappings"] + + def test_multiple_excluded_attrs_all_stripped(self): + ctx = self._ctx(existing_excl=["score", "name"]) + tool_submit_entity_mapping( + ctx, + class_uri=self._URI, + class_name="Customer", + sql_query="SELECT id AS ID, label AS Label, age, score, name FROM t", + id_column="ID", + label_column="Label", + attribute_mappings={"age": "age_col", "score": "score_col", "name": "name_col"}, + ) + m = ctx.entity_mappings[0] + assert "score" not in m["attribute_mappings"] + assert "name" not in m["attribute_mappings"] + assert "age" in m["attribute_mappings"] + + def test_excluded_attrs_preserved_when_no_attr_mappings_submitted(self): + ctx = self._ctx(existing_excl=["score"]) + tool_submit_entity_mapping( + ctx, + class_uri=self._URI, + class_name="Customer", + sql_query="SELECT id AS ID, label AS Label FROM t", + id_column="ID", + label_column="Label", + attribute_mappings={}, + ) + m = ctx.entity_mappings[0] + assert m["excluded_attributes"] == ["score"] + assert m["attribute_mappings"] == {} + + def test_updates_existing_entry_preserving_excluded(self): + """Re-running auto-map updates the existing entry, not appends.""" + ctx = self._ctx(existing_excl=["score"]) + # First call + tool_submit_entity_mapping( + ctx, + class_uri=self._URI, + class_name="Customer", + sql_query="SELECT id AS ID, label AS Label FROM t", + id_column="ID", + label_column="Label", + attribute_mappings={}, + ) + # Second call — re-map + tool_submit_entity_mapping( + ctx, + class_uri=self._URI, + class_name="Customer", + sql_query="SELECT id2 AS ID, label2 AS Label FROM t2", + id_column="ID", + label_column="Label", + attribute_mappings={"age": "age_col"}, + ) + assert len(ctx.entity_mappings) == 1 + m = ctx.entity_mappings[0] + assert m["excluded_attributes"] == ["score"] + assert m["sql_query"] == "SELECT id2 AS ID, label2 AS Label FROM t2" + + +# --------------------------------------------------------------------------- +# 6. tool_submit_relationship_mapping — excluded_attributes preservation +# --------------------------------------------------------------------------- + +class TestToolSubmitRelationshipMappingExcludedAttributes: + _URI = "http://t/hasOrder" + + def _ctx(self, existing_excl=None): + relationships = [] + if existing_excl is not None: + relationships = [ + { + "property": self._URI, + "excluded_attributes": existing_excl, + } + ] + return _ctx(relationships=relationships) + + def test_no_existing_excluded_no_field_added(self): + ctx = self._ctx() + tool_submit_relationship_mapping( + ctx, + property_uri=self._URI, + property_name="hasOrder", + sql_query="SELECT src AS source_id, tgt AS target_id FROM t", + source_id_column="source_id", + target_id_column="target_id", + domain="Customer", + range_class="Order", + ) + assert ctx.relationships[0].get("excluded_attributes") is None + + def test_existing_excluded_attrs_preserved(self): + ctx = self._ctx(existing_excl=["note"]) + tool_submit_relationship_mapping( + ctx, + property_uri=self._URI, + property_name="hasOrder", + sql_query="SELECT src AS source_id, tgt AS target_id FROM t", + source_id_column="source_id", + target_id_column="target_id", + domain="Customer", + range_class="Order", + ) + m = ctx.relationships[0] + assert m["excluded_attributes"] == ["note"] + + def test_updates_existing_entry_preserving_excluded(self): + ctx = self._ctx(existing_excl=["note"]) + # First submit + tool_submit_relationship_mapping( + ctx, + property_uri=self._URI, + property_name="hasOrder", + sql_query="SELECT a AS source_id, b AS target_id FROM t", + source_id_column="source_id", + target_id_column="target_id", + domain="Customer", + range_class="Order", + ) + # Re-submit (auto-map re-run) + tool_submit_relationship_mapping( + ctx, + property_uri=self._URI, + property_name="hasOrder", + sql_query="SELECT c AS source_id, d AS target_id FROM t2", + source_id_column="source_id", + target_id_column="target_id", + domain="Customer", + range_class="Order", + ) + assert len(ctx.relationships) == 1 + m = ctx.relationships[0] + assert m["excluded_attributes"] == ["note"] + assert "t2" in m["sql_query"] + + +# --------------------------------------------------------------------------- +# 7. tool_get_ontology — excluded attrs stripped before the agent sees them +# --------------------------------------------------------------------------- + +class TestToolGetOntologyExcludedAttributes: + _URI = "http://t/Customer" + + def _ctx(self, existing_excl=None): + ontology = { + "entities": [ + { + "uri": self._URI, + "name": "Customer", + "attributes": ["age", "score", "name"], + } + ], + "relationships": [], + } + entity_mappings = [] + if existing_excl: + entity_mappings = [ + { + "ontology_class": self._URI, + "excluded_attributes": existing_excl, + } + ] + return _ctx(ontology=ontology, entity_mappings=entity_mappings) + + def test_no_exclusions_all_attributes_visible(self): + ctx = self._ctx() + result = json.loads(tool_get_ontology(ctx)) + attrs = result["entities"][0]["attributes"] + assert "age" in attrs + assert "score" in attrs + assert "name" in attrs + + def test_excluded_attribute_hidden_from_agent(self): + ctx = self._ctx(existing_excl=["score"]) + result = json.loads(tool_get_ontology(ctx)) + attrs = result["entities"][0]["attributes"] + assert "score" not in attrs + assert "age" in attrs + assert "name" in attrs + + def test_multiple_excluded_attributes_all_hidden(self): + ctx = self._ctx(existing_excl=["age", "score"]) + result = json.loads(tool_get_ontology(ctx)) + attrs = result["entities"][0]["attributes"] + assert "age" not in attrs + assert "score" not in attrs + assert "name" in attrs + + def test_all_excluded_returns_empty_attribute_list(self): + ctx = self._ctx(existing_excl=["age", "score", "name"]) + result = json.loads(tool_get_ontology(ctx)) + attrs = result["entities"][0]["attributes"] + assert attrs == [] + + def test_entity_count_unchanged_when_attributes_excluded(self): + """Excluding attributes must not drop the entity from the response.""" + ctx = self._ctx(existing_excl=["age"]) + result = json.loads(tool_get_ontology(ctx)) + assert result["entity_count"] == 1 + assert len(result["entities"]) == 1 + + def test_exclusion_scoped_to_correct_entity(self): + """Exclusions for one entity must not affect a different entity.""" + uri_a = "http://t/A" + uri_b = "http://t/B" + ontology = { + "entities": [ + {"uri": uri_a, "name": "A", "attributes": ["foo", "bar"]}, + {"uri": uri_b, "name": "B", "attributes": ["foo", "bar"]}, + ], + "relationships": [], + } + entity_mappings = [ + {"ontology_class": uri_a, "excluded_attributes": ["bar"]} + ] + ctx = _ctx(ontology=ontology, entity_mappings=entity_mappings) + result = json.loads(tool_get_ontology(ctx)) + entities_by_name = {e["name"]: e for e in result["entities"]} + + # A: bar excluded + assert "bar" not in entities_by_name["A"]["attributes"] + assert "foo" in entities_by_name["A"]["attributes"] + + # B: unaffected + assert "bar" in entities_by_name["B"]["attributes"] + assert "foo" in entities_by_name["B"]["attributes"] diff --git a/tests/units/mapping/test_r2rml_generator.py b/tests/units/mapping/test_r2rml_generator.py index ed1c781e..856313bf 100644 --- a/tests/units/mapping/test_r2rml_generator.py +++ b/tests/units/mapping/test_r2rml_generator.py @@ -249,3 +249,70 @@ def test_default_base_uri_when_example_org(self): ontology = {"base_uri": "http://example.org/"} r2rml = generate_r2rml_from_config(mapping, ontology) assert r2rml is not None + + +class TestQuoteColumn: + """Unit tests for _quote_column helper.""" + + def setup_method(self): + self.gen = R2RMLGenerator("http://test.org/ontology/") + + def test_plain_identifier_unchanged(self): + assert self.gen._quote_column("customer_id") == "customer_id" + + def test_already_quoted_unchanged(self): + assert self.gen._quote_column('"customer id"') == '"customer id"' + + def test_space_gets_quoted(self): + assert self.gen._quote_column("customer id") == '"customer id"' + + def test_hyphen_gets_quoted(self): + assert self.gen._quote_column("my-col") == '"my-col"' + + def test_dot_gets_quoted(self): + assert self.gen._quote_column("first.name") == '"first.name"' + + def test_empty_string_unchanged(self): + assert self.gen._quote_column("") == "" + + def test_column_with_space_in_entity_template(self): + """rr:template should contain double-quoted column when name has a space. + + rdflib serialises the inner double-quotes as \\\" in the Turtle literal, + so we check for the escaped representation in the raw Turtle string. + """ + gen = R2RMLGenerator("http://test.org/ontology/") + mapping_config = { + "entities": [{ + "ontology_class": "http://test.org/ontology/Customer", + "ontology_class_label": "Customer", + "sql_query": 'SELECT `customer id` AS "customer id", name AS Label FROM t', + "id_column": "customer id", + "label_column": "Label", + "attribute_mappings": {} + }], + "relationships": [] + } + r2rml = gen.generate_mapping(mapping_config) + # rdflib escapes inner " as \" in the Turtle literal — check both forms + assert '\\"customer id\\"' in r2rml or '"customer id"' in r2rml + + def test_column_with_space_in_attribute_mapping(self): + """rr:column for an attribute with spaces must be double-quoted. + + rdflib serialises the inner double-quotes as \\\" in the Turtle literal. + """ + gen = R2RMLGenerator("http://test.org/ontology/") + mapping_config = { + "entities": [{ + "ontology_class": "http://test.org/ontology/Customer", + "ontology_class_label": "Customer", + "sql_query": 'SELECT id AS ID, name AS Label, `full name` FROM t', + "id_column": "ID", + "label_column": "Label", + "attribute_mappings": {"fullName": "full name"} + }], + "relationships": [] + } + r2rml = gen.generate_mapping(mapping_config) + assert '\\"full name\\"' in r2rml or '"full name"' in r2rml From 0e2507142d3c82881b5b3cf0734880012ee178d0 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Sun, 21 Jun 2026 10:38:06 +0200 Subject: [PATCH 35/54] fix: always double-quote column names in R2RML, always backtick in agent SQL MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit R2RMLGenerator._quote_column now unconditionally wraps every column name in double-quotes (R2RML spec §7.4) instead of only quoting non-plain identifiers. This avoids edge cases with SQL reserved words and digit-leading names. R2RMLParser gains _unquote_column() to strip the double-quotes when reading id_column, label_column, attribute, and relationship target columns back. Agent system prompt updated to instruct always-backtick-quoting every column name in generated SQL. 108/108 mapping unit tests pass. --- .../v0.6.0/benoitcayladbx_2026-06-20.log | 43 +++++++++++++++++++ src/agents/agent_auto_assignment/engine.py | 12 +++--- src/back/core/w3c/r2rml/R2RMLGenerator.py | 14 +++--- src/back/core/w3c/r2rml/R2RMLParser.py | 16 +++++-- tests/units/mapping/test_r2rml_generator.py | 13 ++++-- 5 files changed, 78 insertions(+), 20 deletions(-) diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-20.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-20.log index 6d260a49..ba7db232 100644 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-20.log +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-20.log @@ -37,3 +37,46 @@ No code changes were made in this session — documentation only. ## Test Results 108 / 108 passed (`tests/units/mapping/`) — no regressions. + +--- + +# Always-Quote Column Names in R2RML and Agent SQL + +## Context + +User noted that the conditional quoting in `_quote_column` (only quote when not a plain +identifier) could still miss edge cases: SQL reserved words, digit-leading names, or any +future naming convention. Simpler and safer to always quote. + +## Changes + +1. `src/back/core/w3c/r2rml/R2RMLGenerator.py` + - `_quote_column`: removed the conditional check — now unconditionally wraps every + column name in double-quotes per R2RML spec §7.4. + +2. `src/back/core/w3c/r2rml/R2RMLParser.py` + - Added `_unquote_column()` helper that strips double-quotes when reading column names + back from R2RML. + - Applied `_unquote_column` to `id_column` (from `rr:template`), `object_column` + (from `rr:column`), and `target_id_column` (from relationship templates). + +3. `src/agents/agent_auto_assignment/engine.py` + - Updated `COLUMN NAME QUOTING` section of the system prompt: agent is now instructed + to ALWAYS backtick-quote every column name in SQL, even plain identifiers. + +4. `tests/units/mapping/test_r2rml_generator.py` + - `test_plain_identifier_unchanged` renamed to `test_plain_identifier_always_quoted`; + expectation updated to `"customer_id"`. + - Relationship URI template assertion updated to check presence of the class path + and column name rather than the exact unquoted template string. + +## Modified Files + +- `src/back/core/w3c/r2rml/R2RMLGenerator.py` +- `src/back/core/w3c/r2rml/R2RMLParser.py` +- `src/agents/agent_auto_assignment/engine.py` +- `tests/units/mapping/test_r2rml_generator.py` + +## Test Results + +108 / 108 passed (`tests/units/mapping/`) — no regressions. diff --git a/src/agents/agent_auto_assignment/engine.py b/src/agents/agent_auto_assignment/engine.py index 682968d5..906ba198 100644 --- a/src/agents/agent_auto_assignment/engine.py +++ b/src/agents/agent_auto_assignment/engine.py @@ -105,13 +105,13 @@ class AgentResult: • Write simple, flat SELECT statements. COLUMN NAME QUOTING (CRITICAL) -• Always wrap column names that contain spaces, hyphens, dots or other non-alphanumeric \ -characters with backticks: `column name`, `my-col`, `first.name`. -• When a column name would be unsafe in a URI or as a mapping key, alias it to a \ -safe snake_case name without spaces: `customer name` AS customer_name. +• ALWAYS wrap EVERY column name in backticks in your SQL — even plain names: \ +`customer_id`, `name`, `first_name`, `column name`, `my-col`. +• When a column name contains spaces or non-alphanumeric characters, also alias \ +it to a safe snake_case name: `customer name` AS customer_name. • The values passed to submit_entity_mapping for id_column, label_column, and \ attribute_mappings keys MUST be the final output column name as it appears in \ -the SELECT result — use the alias when you aliased the column. +the SELECT result — use the alias (without backticks) when you aliased the column. • Never pass a column name with spaces or special characters as an id_column, \ label_column, or attribute_mapping key — always alias it first. @@ -119,7 +119,7 @@ class AgentResult: • SELECT exactly 2 columns: source identifier AS source_id, target identifier AS target_id. • If both columns are in the SAME table, query only that table (no joins). • Do NOT add LIMIT or ORDER BY. -• Apply the same backtick-quoting rules as for entity SQL. +• Apply the same always-backtick-quote rule as for entity SQL. ATTRIBUTE MAPPING • In submit_entity_mapping, provide attribute_mappings: a JSON object mapping each \ diff --git a/src/back/core/w3c/r2rml/R2RMLGenerator.py b/src/back/core/w3c/r2rml/R2RMLGenerator.py index 58ee7837..6a2b2726 100644 --- a/src/back/core/w3c/r2rml/R2RMLGenerator.py +++ b/src/back/core/w3c/r2rml/R2RMLGenerator.py @@ -649,9 +649,11 @@ def _resolve_class_name( return "UnknownEntity" def _quote_column(self, col: str) -> str: - """Return the column name, double-quoted per R2RML spec when it is not a - plain SQL identifier (i.e. contains spaces, hyphens, dots, or any other - character outside [A-Za-z0-9_]). + """Return the column name always double-quoted per R2RML spec §7.4. + + Double-quoting every column name is unconditionally safe and avoids + edge cases with reserved words, digit-leading names, or any future + column naming convention. Already-quoted names (surrounded by double-quotes) are returned as-is. Empty strings are returned unchanged. @@ -660,10 +662,8 @@ def _quote_column(self, col: str) -> str: return col if col.startswith('"') and col.endswith('"'): return col - if not re.match(r'^[A-Za-z_][A-Za-z0-9_]*$', col): - inner = col.replace('"', '""') # escape any embedded double-quotes - return f'"{inner}"' - return col + inner = col.replace('"', '""') # escape any embedded double-quotes + return f'"{inner}"' def _sanitize_name(self, name: str) -> str: """Sanitize a name for use in URIs.""" diff --git a/src/back/core/w3c/r2rml/R2RMLParser.py b/src/back/core/w3c/r2rml/R2RMLParser.py index 30f11036..1e3c2e66 100644 --- a/src/back/core/w3c/r2rml/R2RMLParser.py +++ b/src/back/core/w3c/r2rml/R2RMLParser.py @@ -72,7 +72,7 @@ def _extract_triples_map(self, triples_map): subject_template = str(template) match = re.search(r"\{([^}]+)\}", subject_template) if match: - id_column = match.group(1) + id_column = self._unquote_column(match.group(1)) for cls in self.graph.objects(subject_map, self.RR["class"]): subject_class = str(cls) @@ -114,7 +114,7 @@ def _extract_triples_map(self, triples_map): for template in self.graph.objects(obj_map, self.RR.template): object_template = str(template) for col in self.graph.objects(obj_map, self.RR.column): - object_column = str(col) + object_column = self._unquote_column(str(col)) if not predicate: continue @@ -153,6 +153,16 @@ def _extract_triples_map(self, triples_map): return info + def _unquote_column(self, col: str) -> str: + """Strip surrounding double-quotes from a column name. + + R2RMLGenerator always emits double-quoted column names. When parsing + back, we strip the quotes so callers receive the bare name. + """ + if col and col.startswith('"') and col.endswith('"') and len(col) > 1: + return col[1:-1].replace('""', '"') + return col + def _parse_table_name(self, table_name): """Parse table name into catalog, schema, table.""" if not table_name: @@ -175,7 +185,7 @@ def _extract_relationship( return None target_class = template_match.group(1) - target_id_column = template_match.group(2) + target_id_column = self._unquote_column(template_match.group(2)) prop_name = ( predicate.split("#")[-1] if "#" in predicate else predicate.split("/")[-1] ) diff --git a/tests/units/mapping/test_r2rml_generator.py b/tests/units/mapping/test_r2rml_generator.py index 856313bf..e78e518b 100644 --- a/tests/units/mapping/test_r2rml_generator.py +++ b/tests/units/mapping/test_r2rml_generator.py @@ -219,8 +219,12 @@ def test_relationship_uris_match_entity_uris_when_label_differs(self): assert f"{base}Cust/" in r2rml assert f"{base}Ord/" in r2rml # Relationship subject/object URIs must use the SAME namespace. - assert f"{base}Cust/{{customer_id}}" in r2rml - assert f"{base}Ord/{{order_id}}" in r2rml + # Columns are always double-quoted; rdflib escapes inner " as \" in Turtle. + assert f"{base}Cust/" in r2rml + assert f"{base}Ord/" in r2rml + # Template must contain the column reference (quoted form) + assert "customer_id" in r2rml + assert "order_id" in r2rml # And must NOT fall back to the label namespace (the bug). assert f"{base}Customer/" not in r2rml assert f"{base}Order/" not in r2rml @@ -257,8 +261,9 @@ class TestQuoteColumn: def setup_method(self): self.gen = R2RMLGenerator("http://test.org/ontology/") - def test_plain_identifier_unchanged(self): - assert self.gen._quote_column("customer_id") == "customer_id" + def test_plain_identifier_always_quoted(self): + # Always double-quote every column name — plain identifiers included. + assert self.gen._quote_column("customer_id") == '"customer_id"' def test_already_quoted_unchanged(self): assert self.gen._quote_column('"customer id"') == '"customer id"' From 8aa78a1205728ef93af76258a51809bc7b6dd7e0 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Sun, 21 Jun 2026 14:51:43 +0200 Subject: [PATCH 36/54] fix: update SparqlQueryRunner template regex to handle double-quoted column names R2RMLGenerator now always emits double-quoted column names inside rr:template (e.g. {"customer_id"}). The previous regex \{(\w+)\} did not match the quoted form, leaving id_column=None which caused "Column 'None' not found" during view creation. Updated both template regexes in SparqlQueryRunner to \{"?([^"{}]+)"?\}, which extracts the bare name from both {col} and {"col"} forms. Added regression test test_id_column_not_none_after_always_quoted_template to guard against future regressions. 109/109 unit tests pass. --- src/back/core/w3c/sparql/SparqlQueryRunner.py | 4 ++-- tests/units/mapping/test_workflow_sparql.py | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/back/core/w3c/sparql/SparqlQueryRunner.py b/src/back/core/w3c/sparql/SparqlQueryRunner.py index 69b66c1c..5a9c33c7 100644 --- a/src/back/core/w3c/sparql/SparqlQueryRunner.py +++ b/src/back/core/w3c/sparql/SparqlQueryRunner.py @@ -105,7 +105,7 @@ def extract_r2rml_mappings(r2rml_content): template_str = str(template) mapping["uri_template"] = template_str subject_template = template_str - col_match = re.search(r"\{(\w+)\}", template_str) + col_match = re.search(r'\{"?([^"{}]+)"?\}', template_str) if col_match: mapping["id_column"] = col_match.group(1) subject_column = col_match.group(1) @@ -130,7 +130,7 @@ def extract_r2rml_mappings(r2rml_content): for template in g.objects(om, RR.template): object_template = str(template) - col_match = re.search(r"\{(\w+)\}", object_template) + col_match = re.search(r'\{"?([^"{}]+)"?\}', object_template) if col_match: object_column = col_match.group(1) diff --git a/tests/units/mapping/test_workflow_sparql.py b/tests/units/mapping/test_workflow_sparql.py index 457be311..4d43eca8 100644 --- a/tests/units/mapping/test_workflow_sparql.py +++ b/tests/units/mapping/test_workflow_sparql.py @@ -45,3 +45,25 @@ def test_select_label_query(self, sample_ontology_config, sample_mapping_config) relationship_mappings=relationship_mappings, ) assert "success" in result + + def test_id_column_not_none_after_always_quoted_template( + self, sample_ontology_config, sample_mapping_config + ): + """R2RMLGenerator now always double-quotes column names inside rr:template + (e.g. {"customer_id"}). SparqlQueryRunner must still extract a non-None + id_column so the view builder doesn't emit 'Column None not found'. + """ + base_uri = sample_ontology_config["base_uri"] + gen = R2RMLGenerator(base_uri) + r2rml = gen.generate_mapping(sample_mapping_config, sample_ontology_config) + + entity_mappings, _ = extract_r2rml_mappings(r2rml) + + for class_uri, mapping in entity_mappings.items(): + assert mapping.get("id_column") is not None, ( + f"id_column is None for {class_uri} — double-quoted template " + f"was not parsed correctly" + ) + assert mapping["id_column"] != "None", ( + f"id_column is the string 'None' for {class_uri}" + ) From d964e853aa86b4de0ab313e4cb49cec5f0c7e852 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Sun, 21 Jun 2026 15:49:45 +0200 Subject: [PATCH 37/54] fix: strip backticks from submitted column names; clarify alias quoting in prompt The LLM sometimes passes backtick-quoted values (e.g. \`ID\`) for id_column, label_column, source_id_column, target_id_column, and attribute_mappings even though aliases after AS should be plain names. This caused 5 mappings to not be stored correctly. - Added _strip_backticks() helper in mapping.py, applied to all submitted column-name parameters in tool_submit_entity_mapping and tool_submit_relationship_mapping. - Rewrote the COLUMN NAME QUOTING section of the system prompt to explicitly prohibit backtick-quoting alias names (AS ID not AS `ID`), with examples. 109/109 unit tests pass. --- .../v0.6.0/benoitcayladbx_2026-06-20.log | 32 ++++++++++ .../v0.6.0/benoitcayladbx_2026-06-21.log | 26 ++++++++ src/agents/agent_auto_assignment/engine.py | 16 ++--- src/agents/tools/mapping.py | 17 +++++ src/front/static/domain/js/domain-metadata.js | 63 +++++++++++++++++++ .../partials/domain/_domain_metadata.html | 3 + 6 files changed, 150 insertions(+), 7 deletions(-) create mode 100644 changelogs/v0.6.0/benoitcayladbx_2026-06-21.log diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-20.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-20.log index ba7db232..61b35c65 100644 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-20.log +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-20.log @@ -80,3 +80,35 @@ future naming convention. Simpler and safer to always quote. ## Test Results 108 / 108 passed (`tests/units/mapping/`) — no regressions. + +--- + +# Fix: strip backticks from submitted column names, clarify alias quoting in prompt + +## Context + +After the "always backtick every column" change, the LLM sometimes passed backtick- +quoted values for id_column/label_column/source_id_column/target_id_column/attribute_mappings +(e.g. `ID` instead of ID), causing 5 mappings to not be generated or stored incorrectly. + +## Changes + +1. `src/agents/tools/mapping.py` + - Added `_strip_backticks()` helper. + - Applied it to `id_column`, `label_column`, and all `attribute_mappings` values in + `tool_submit_entity_mapping`. + - Applied it to `source_id_column` and `target_id_column` in + `tool_submit_relationship_mapping`. + +2. `src/agents/agent_auto_assignment/engine.py` + - Rewrote the COLUMN NAME QUOTING section of the system prompt to explicitly state + that alias names (after AS) must NEVER be backtick-quoted, with concrete examples. + +## Modified Files + +- `src/agents/tools/mapping.py` +- `src/agents/agent_auto_assignment/engine.py` + +## Test Results + +109 / 109 passed (`tests/units/mapping/`) — no regressions. diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-21.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-21.log new file mode 100644 index 00000000..779032a3 --- /dev/null +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-21.log @@ -0,0 +1,26 @@ +## Data Sources — missing description warning + +### Context +Users editing Data Sources had no visibility into how many tables and columns were missing descriptions. +Description completeness directly affects AI mapping accuracy. Added an inline warning banner (consistent +with the one already present on the Mapping → Auto-Map page) that counts and surfaces missing descriptions +as soon as data sources are loaded or edited. + +### Changes + +1. `src/front/templates/partials/domain/_domain_metadata.html` + - Added `
    ` placeholder below the status banner + +2. `src/front/static/domain/js/domain-metadata.js` + - Added `checkMetadataDescriptions(metadata)` function: counts tables without `comment`, counts + columns without `comment`, renders a Bootstrap `alert-warning` with a collapsible table list + - Called from `loadMetadataStatus()` when metadata is present (shows/hides warning on page load) + - Called from `saveTableDetails()` so the warning updates immediately after editing a table + - Hides the warning div when no metadata is loaded + +### Modified files +- `src/front/templates/partials/domain/_domain_metadata.html` +- `src/front/static/domain/js/domain-metadata.js` + +### Test results +2615 passed, 57 skipped — 5 pre-existing failures (lakebase dependency + SHACL service, unrelated) diff --git a/src/agents/agent_auto_assignment/engine.py b/src/agents/agent_auto_assignment/engine.py index 906ba198..6de853d1 100644 --- a/src/agents/agent_auto_assignment/engine.py +++ b/src/agents/agent_auto_assignment/engine.py @@ -105,15 +105,17 @@ class AgentResult: • Write simple, flat SELECT statements. COLUMN NAME QUOTING (CRITICAL) -• ALWAYS wrap EVERY column name in backticks in your SQL — even plain names: \ +• In SQL, ALWAYS wrap EVERY source column name in backticks: \ `customer_id`, `name`, `first_name`, `column name`, `my-col`. -• When a column name contains spaces or non-alphanumeric characters, also alias \ +• Alias names (after AS) must NEVER be backtick-quoted: write AS ID, AS Label, \ +AS customer_name — NOT AS `ID`, NOT AS `Label`. +• When a source column name contains spaces or non-alphanumeric characters, alias \ it to a safe snake_case name: `customer name` AS customer_name. -• The values passed to submit_entity_mapping for id_column, label_column, and \ -attribute_mappings keys MUST be the final output column name as it appears in \ -the SELECT result — use the alias (without backticks) when you aliased the column. -• Never pass a column name with spaces or special characters as an id_column, \ -label_column, or attribute_mapping key — always alias it first. +• The values you pass to submit_entity_mapping for id_column, label_column, and \ +attribute_mappings values are the alias names (no backticks). \ +Example: id_column="ID", label_column="Label", attribute_mappings={"name": "name"}. +• Never pass a value with backticks to id_column, label_column, source_id_column, \ +target_id_column, or attribute_mappings — always use the plain alias name. SQL RULES FOR RELATIONSHIPS (CRITICAL) • SELECT exactly 2 columns: source identifier AS source_id, target identifier AS target_id. diff --git a/src/agents/tools/mapping.py b/src/agents/tools/mapping.py index 7610794f..e54ff80f 100644 --- a/src/agents/tools/mapping.py +++ b/src/agents/tools/mapping.py @@ -19,6 +19,13 @@ # ===================================================== +def _strip_backticks(value: str) -> str: + """Remove surrounding backticks from a column name if present.""" + if value and value.startswith("`") and value.endswith("`") and len(value) > 1: + return value[1:-1] + return value + + def tool_submit_entity_mapping( ctx: ToolContext, *, @@ -31,6 +38,12 @@ def tool_submit_entity_mapping( **_kwargs, ) -> str: """Record a completed entity mapping.""" + # Normalise column names: strip any surrounding backticks the LLM may have added. + id_column = _strip_backticks(id_column) + label_column = _strip_backticks(label_column) + if attribute_mappings: + attribute_mappings = {k: _strip_backticks(v) for k, v in attribute_mappings.items()} + logger.info("tool_submit_entity_mapping: '%s' (uri=%s)", class_name, class_uri) if not class_uri or not sql_query: logger.warning("tool_submit_entity_mapping: missing required fields") @@ -152,6 +165,10 @@ def tool_submit_relationship_mapping( **_kwargs, ) -> str: """Record a completed relationship mapping.""" + # Normalise column names: strip any surrounding backticks the LLM may have added. + source_id_column = _strip_backticks(source_id_column) + target_id_column = _strip_backticks(target_id_column) + logger.info( "tool_submit_relationship_mapping: '%s' (uri=%s)", property_name, property_uri ) diff --git a/src/front/static/domain/js/domain-metadata.js b/src/front/static/domain/js/domain-metadata.js index 17061f10..9c4b7c6f 100644 --- a/src/front/static/domain/js/domain-metadata.js +++ b/src/front/static/domain/js/domain-metadata.js @@ -83,6 +83,7 @@ async function loadMetadataStatus() { // Show preview and Update Mappings button displayMetadataPreview(data.metadata); + checkMetadataDescriptions(data.metadata); const updateMappingsBtn = document.getElementById('updateMappingsBtn'); if (updateMappingsBtn) updateMappingsBtn.classList.remove('d-none'); } else { @@ -91,6 +92,8 @@ async function loadMetadataStatus() { statusDiv.className = 'alert alert-secondary mb-4'; statusText.innerHTML = ' No data sources loaded'; previewDiv.classList.add('d-none'); + const warningEl = document.getElementById('metadataDescriptionWarning'); + if (warningEl) warningEl.style.display = 'none'; const updateMappingsBtn = document.getElementById('updateMappingsBtn'); if (updateMappingsBtn) updateMappingsBtn.classList.add('d-none'); } @@ -775,6 +778,7 @@ function saveTableDetails() { // Refresh the display displayMetadataPreview(metadataCache); + checkMetadataDescriptions(metadataCache); showNotification('Table details updated. Click "Save Changes" to persist.', 'info', 2000); } @@ -1061,3 +1065,62 @@ async function updateMetadataFromUC() { } document.addEventListener('DOMContentLoaded', bind); })(); + +function checkMetadataDescriptions(metadata) { + const warningEl = document.getElementById('metadataDescriptionWarning'); + if (!warningEl) return; + + const tables = metadata?.tables || []; + if (tables.length === 0) { + warningEl.style.display = 'none'; + return; + } + + const tablesNoDesc = []; + let columnsNoDescCount = 0; + + for (const t of tables) { + const tName = t.full_name || t.name || '?'; + if (!t.comment || !t.comment.trim()) { + tablesNoDesc.push(tName); + } + for (const col of (t.columns || [])) { + if (!col.comment || !col.comment.trim()) { + columnsNoDescCount++; + } + } + } + + const totalMissing = tablesNoDesc.length + columnsNoDescCount; + if (totalMissing === 0) { + warningEl.style.display = 'none'; + return; + } + + const collapseId = 'metaDescQualityDetails'; + const tableRows = tablesNoDesc.map(t => + `
  • ${t} — no table description
  • ` + ).join(''); + + warningEl.innerHTML = ` +
    +
    + +
    + ${tablesNoDesc.length} table(s) and ${columnsNoDescCount} column(s) are missing descriptions. + Adding descriptions improves AI mapping accuracy. + ${tablesNoDesc.length > 0 ? ` + +
    +
      + ${tableRows} +
    +
    ` : ''} +
    +
    +
    `; + warningEl.style.display = 'block'; +} diff --git a/src/front/templates/partials/domain/_domain_metadata.html b/src/front/templates/partials/domain/_domain_metadata.html index b1473b86..f11ccabe 100644 --- a/src/front/templates/partials/domain/_domain_metadata.html +++ b/src/front/templates/partials/domain/_domain_metadata.html @@ -31,6 +31,9 @@

    Data Sources

    No data sources loaded
    + + +
    From 818ea787650e6685ff6572d537e6e6b39554f88b Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Sun, 21 Jun 2026 16:56:54 +0200 Subject: [PATCH 38/54] test: fix TestLakebaseCollab failures by stubbing _require_psycopg _collab_store mocked _connect but not _require_psycopg. Without psycopg installed, _require_psycopg raises InfrastructureError which is swallowed by the broad except-clause in each collab method, returning None/[]. Stub _require_psycopg -> (None, None) in _collab_store; _ScriptedConn.cursor already ignores row_factory so None is a safe placeholder for dict_row. 2418 passed, 15 skipped, 0 failed. --- tests/units/registry/test_registry_store.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/units/registry/test_registry_store.py b/tests/units/registry/test_registry_store.py index 330e9588..f4f9b853 100644 --- a/tests/units/registry/test_registry_store.py +++ b/tests/units/registry/test_registry_store.py @@ -1260,8 +1260,13 @@ def test_distinct_databases_have_distinct_cache_entries(self, monkeypatch): def _collab_store(monkeypatch, cur): """A Lakebase store whose ``_connect`` yields *cur* and whose collab tables are already marked present (skips the lazy DDL probe). + + Also stubs ``_require_psycopg`` so the tests pass without psycopg + installed: _ScriptedConn.cursor() already accepts and ignores the + ``row_factory`` kwarg, so (None, None) is a safe stub. """ from contextlib import contextmanager + import back.objects.registry.store.lakebase.store as _store_mod store = _make_lakebase_store(monkeypatch) store._registry_id = "rid-1" # skip registry-id resolution @@ -1272,6 +1277,9 @@ def fake_connect(): yield _ScriptedConn(cur) monkeypatch.setattr(store, "_connect", fake_connect) + # Stub out the psycopg import guard — _ScriptedConn.cursor() ignores + # row_factory so None is a safe placeholder for dict_row. + monkeypatch.setattr(_store_mod, "_require_psycopg", lambda: (None, None)) return store From 4accebcb4d8432cc37f9bd28c306931d62330533 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Sun, 21 Jun 2026 17:00:11 +0200 Subject: [PATCH 39/54] feat: Mapping Information KPI now honours excluded_attributes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updateMappingCompletionStatus in mapping-information.js now skips excluded_attributes when computing totalAttributes/mappedAttributes, matching the Auto-Map page behaviour. - Attribute gauge percentage and count only cover included attributes. - Entity/relationship/attribute count spans show "· N excl." when items are excluded (same _excl() helper pattern as mapping-autoassign.js). - Entity detail-list badge shows attrMapped / includedProps.length and appends "· N excl." when the entity has excluded attributes. - isMapped now requires sql_query (stub-only mappings no longer count). 2418/2418 unit tests pass. --- .../v0.6.0/benoitcayladbx_2026-06-21.log | 32 +++++++++++ .../static/global/js/mapping-information.js | 57 +++++++++++++------ 2 files changed, 71 insertions(+), 18 deletions(-) diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-21.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-21.log index 779032a3..4cadc8f8 100644 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-21.log +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-21.log @@ -24,3 +24,35 @@ as soon as data sources are loaded or edited. ### Test results 2615 passed, 57 skipped — 5 pre-existing failures (lakebase dependency + SHACL service, unrelated) + +--- + +# Mapping Information page: attribute KPI now honours excluded_attributes + +## Context + +The Mapping Information page (mapping-information.js) was computing +totalAttributes/mappedAttributes across all dataProperties, ignoring +excluded_attributes — showing wrong percentages and counts in the gauges. + +## Changes + +1. `src/front/static/global/js/mapping-information.js` + - `updateMappingCompletionStatus`: excluded attributes are now skipped + when computing totalAttributes/mappedAttributes, matching the Auto-Map + page logic. + - Added `· N excl.` badges on entity, relationship, and attribute count + spans when items are excluded (same pattern as mapping-autoassign.js). + - `renderSummaryDetailLists`: entity detail-list badge now shows + `attrMapped / includedProps.length` (excluded attrs stripped), and + appends `· N excl.` when the entity has excluded attributes. + - `isMapped` check now requires `em.sql_query` (a stub mapping with only + excluded_attributes no longer counts as "mapped"). + +## Modified Files + +- `src/front/static/global/js/mapping-information.js` + +## Test Results + +2418 / 2418 passed — no regressions. diff --git a/src/front/static/global/js/mapping-information.js b/src/front/static/global/js/mapping-information.js index a3127301..2ed5863e 100644 --- a/src/front/static/global/js/mapping-information.js +++ b/src/front/static/global/js/mapping-information.js @@ -220,29 +220,42 @@ function updateMappingCompletionStatus() { ).length; } - // Count attribute mappings across all mapped non-excluded entities + // Count attribute mappings across all mapped non-excluded entities. + // Excluded attributes (excluded_attributes in the mapping) are not counted. let totalAttributes = 0; let mappedAttributes = 0; + let excludedAttrCount = 0; for (const cls of activeClasses) { const dataProps = cls.dataProperties || []; if (dataProps.length === 0) continue; - totalAttributes += dataProps.length; const em = mappingByClass[cls.uri]; - if (em) { - const attrMap = em.attribute_mappings || {}; - for (const dp of dataProps) { - const attrName = dp.name || dp.localName || ''; - if (attrName && attrMap[attrName]) { - mappedAttributes++; - } - } + const exclAttrs = new Set((em && em.excluded_attributes) || []); + excludedAttrCount += exclAttrs.size; + const attrMap = (em && em.attribute_mappings) || {}; + for (const dp of dataProps) { + const attrName = dp.name || dp.localName || ''; + if (!attrName) continue; + if (exclAttrs.has(attrName)) continue; // excluded — skip + totalAttributes++; + if (attrMap[attrName]) mappedAttributes++; } } - + + // Reusable helper: render "· N excl." badge + const _excl = (n) => n > 0 + ? ` · ${n} excl.` + : ''; + + // Count excluded entities / relationships for badges + const excludedEntityCount = allClasses.filter(c => c.excluded).length; + const excludedRelCount = allObjectProperties.filter(p => + p.excluded || excludedClassNames.has(p.domain) || excludedClassNames.has(p.range) + ).length; + // Update counts - entityCountEl.textContent = `${mappedClasses} / ${totalClasses}`; - relationshipCountEl.textContent = `${mappedProperties} / ${totalProperties}`; - if (attributeCountEl) attributeCountEl.textContent = `${mappedAttributes} / ${totalAttributes}`; + entityCountEl.innerHTML = `${mappedClasses} / ${totalClasses}${_excl(excludedEntityCount)}`; + relationshipCountEl.innerHTML = `${mappedProperties} / ${totalProperties}${_excl(excludedRelCount)}`; + if (attributeCountEl) attributeCountEl.innerHTML = `${mappedAttributes} / ${totalAttributes}${_excl(excludedAttrCount)}`; // Draw gauges const entityPct = totalClasses > 0 ? (mappedClasses / totalClasses) * 100 : null; @@ -255,7 +268,7 @@ function updateMappingCompletionStatus() { // Populate entity/relationship detail lists renderSummaryDetailLists(mappingByClass, allObjectProperties, excludedClassNames); - // Determine status + // Determine status (only included attrs count towards completeness) const totalItems = totalClasses + totalProperties + totalAttributes; const mappedItems = mappedClasses + mappedProperties + mappedAttributes; const entitiesComplete = mappedClasses >= totalClasses; @@ -308,23 +321,31 @@ function renderSummaryDetailLists(mappingByClass, objectProperties, excludedClas const isExcluded = !!cls.excluded; const em = mappingByClass[cls.uri]; const dataProps = cls.dataProperties || []; + const exclAttrs = new Set((em && em.excluded_attributes) || []); + // Only count included attributes (same logic as gauges) + const includedProps = dataProps.filter(dp => { + const n = dp.name || dp.localName || ''; + return n && !exclAttrs.has(n); + }); let attrMapped = 0; if (em) { const attrMap = em.attribute_mappings || {}; - for (const dp of dataProps) { + for (const dp of includedProps) { if (attrMap[dp.name || dp.localName || '']) attrMapped++; } } - const isMapped = !!em; + const isMapped = !!(em && em.sql_query); + const exclCount = exclAttrs.size; const cbId = `excludeEntity_${idx}`; const checked = isExcluded ? '' : 'checked'; const checkbox = ``; + const exclBit = exclCount > 0 ? ` · ${exclCount} excl.` : ''; const badge = isExcluded ? 'excluded' : isMapped - ? `${attrMapped}/${dataProps.length} attr` + ? `${attrMapped}/${includedProps.length} attr${exclBit}` : 'not mapped'; const rowClass = isExcluded ? 'summary-detail-row excluded' : 'summary-detail-row'; From ecda6393c1f3aaf7e2163c8ad516995a2db3cdeb Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Mon, 22 Jun 2026 09:44:38 +0200 Subject: [PATCH 40/54] fix: align Mapping Information relationship/entity counts with Auto-Map MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Information page was counting from config→ontology direction without requiring m.sql_query, which could: 1. Include stub mappings (excluded_attributes only, no SQL) as "mapped" 2. Miss a property if the config m.property URI differed slightly from p.uri Fix: rewrite to use the same ontology→config direction as Auto-Map, requiring m.sql_query for both entity and relationship counts: assignedRelUris = config.filter(m => m.sql_query).map(m => m.property) mappedProperties = activeProperties.filter(p => assignedRelUris.has(p.uri)) 2418/2418 unit tests pass. --- .../static/global/js/mapping-information.js | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/front/static/global/js/mapping-information.js b/src/front/static/global/js/mapping-information.js index 2ed5863e..7e7f19ec 100644 --- a/src/front/static/global/js/mapping-information.js +++ b/src/front/static/global/js/mapping-information.js @@ -197,28 +197,30 @@ function updateMappingCompletionStatus() { const totalClasses = activeClasses.length; const totalProperties = activeProperties.length; - // Count entity mappings that match existing non-excluded ontology classes - let mappedClasses = 0; + // Build lookup maps (same pattern as Auto-Map page) + // Only count entities / relationships that have a real SQL query — stubs + // (excluded_attributes only, no sql_query) must not inflate the mapped count. + const entityMappings = MappingState.config.entities || []; + const relationshipMappings = MappingState.config.relationships || []; + + const assignedEntityUris = new Set( + entityMappings.filter(m => m.sql_query).map(m => m.ontology_class || m.class_uri) + ); + const assignedRelUris = new Set( + relationshipMappings.filter(m => m.sql_query).map(m => m.property) + ); + + // Build mappingByClass from ALL config entries (needed for attribute lookup) const mappingByClass = {}; - if (MappingState.config.entities && activeClasses.length > 0) { - const classUris = new Set(activeClasses.map(c => c.uri)); - MappingState.config.entities.forEach(m => { - const uri = m.ontology_class || m.class_uri; - if (classUris.has(uri)) { - mappedClasses++; - mappingByClass[uri] = m; - } - }); - } - - // Count relationship mappings that match existing non-excluded ObjectProperties - let mappedProperties = 0; - if (MappingState.config.relationships && activeProperties.length > 0) { - const propUris = new Set(activeProperties.map(p => p.uri)); - mappedProperties = MappingState.config.relationships.filter(m => - propUris.has(m.property) - ).length; - } + entityMappings.forEach(m => { + const uri = m.ontology_class || m.class_uri; + if (uri) mappingByClass[uri] = m; + }); + + // Count from the ONTOLOGY side (same direction as Auto-Map) so any URI + // mismatch or stub entry can't inflate the denominator. + const mappedClasses = activeClasses.filter(c => assignedEntityUris.has(c.uri)).length; + const mappedProperties = activeProperties.filter(p => assignedRelUris.has(p.uri)).length; // Count attribute mappings across all mapped non-excluded entities. // Excluded attributes (excluded_attributes in the mapping) are not counted. From 2c1c6e5ff91118551d1e2e9454ddbf08db2c7394 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Mon, 22 Jun 2026 10:10:30 +0200 Subject: [PATCH 41/54] fix(mcp-server): retry on 502/503 to handle Databricks Apps cold-start Add automatic retry with progressive backoff (5s, 10s, 20s) in _get and _post helpers for 502/503 responses, which occur when the OntoBricks app is sleeping or starting up on Databricks Apps. --- .../v0.6.0/benoitcayladbx_2026-06-22.log | 23 ++++ src/mcp-server/server/app.py | 102 +++++++++++++----- 2 files changed, 101 insertions(+), 24 deletions(-) create mode 100644 changelogs/v0.6.0/benoitcayladbx_2026-06-22.log diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-22.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-22.log new file mode 100644 index 00000000..2c89c27c --- /dev/null +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-22.log @@ -0,0 +1,23 @@ +## MCP Server — 502/503 retry logic + +### Context +When the OntoBricks Databricks App is in a cold-start or sleeping state, the +proxy returns 502 Bad Gateway. The MCP server was propagating this immediately +as an `HTTPStatusError`, causing every MCP tool call (`select_domain`, +`list_domains`, etc.) to fail without recovery. + +### Changes +1. `src/mcp-server/server/app.py` — added `import asyncio` to imports +2. `src/mcp-server/server/app.py` — added constants `_RETRYABLE_STATUSES` + (502, 503) and `_RETRY_DELAYS` (5 s, 10 s, 20 s) +3. `src/mcp-server/server/app.py` — added `_retryable()` helper +4. `src/mcp-server/server/app.py` — `_get()` retries up to 3 times on 502/503 + with progressive delays before re-raising +5. `src/mcp-server/server/app.py` — `_post()` retries up to 3 times on 502/503 + with progressive delays before re-raising + +### Modified files +- `src/mcp-server/server/app.py` + +### Test results +2418 passed, 15 skipped — 0 failures diff --git a/src/mcp-server/server/app.py b/src/mcp-server/server/app.py index 9d56c845..51f78329 100644 --- a/src/mcp-server/server/app.py +++ b/src/mcp-server/server/app.py @@ -35,6 +35,7 @@ from __future__ import annotations +import asyncio import json import logging import os @@ -423,6 +424,14 @@ def _get_auth_headers(mode: str) -> dict: return {} +_RETRYABLE_STATUSES = {502, 503} +_RETRY_DELAYS = (5, 10, 20) # seconds between successive attempts (3 retries) + + +def _retryable(status: int) -> bool: + return status in _RETRYABLE_STATUSES + + async def _get( client: httpx.AsyncClient, path: str, params: dict | None = None ) -> dict: @@ -433,37 +442,82 @@ async def _get( empty payloads in the Apps log stream. On non-2xx responses we log a body excerpt before re-raising so the caller (and the LLM) sees an actionable error instead of a bare ``HTTPStatusError``. + + 502/503 responses (Databricks Apps cold-start / proxy transient + errors) are retried up to 3 times with increasing delays before + the error is propagated. """ - logger.info("GET %s%s params=%s", client.base_url, path, params or {}) - resp = await client.get(path, params=params, timeout=120) - if resp.status_code >= 400: - body_excerpt = resp.text[:500].replace("\n", " ") if resp.text else "" - logger.warning( - "GET %s%s → %s body=%r", - client.base_url, - path, - resp.status_code, - body_excerpt, + delays = list(_RETRY_DELAYS) + attempt = 0 + while True: + logger.info( + "GET %s%s params=%s (attempt %d)", client.base_url, path, params or {}, attempt + 1 ) - else: - logger.info("GET %s%s → %s", client.base_url, path, resp.status_code) - resp.raise_for_status() - return resp.json() + resp = await client.get(path, params=params, timeout=120) + if resp.status_code >= 400: + body_excerpt = resp.text[:500].replace("\n", " ") if resp.text else "" + logger.warning( + "GET %s%s → %s body=%r", + client.base_url, + path, + resp.status_code, + body_excerpt, + ) + if _retryable(resp.status_code) and delays: + delay = delays.pop(0) + logger.info( + "Retrying in %ds (status=%s, attempt %d/%d)…", + delay, + resp.status_code, + attempt + 1, + len(_RETRY_DELAYS) + 1, + ) + await asyncio.sleep(delay) + attempt += 1 + continue + else: + logger.info("GET %s%s → %s", client.base_url, path, resp.status_code) + resp.raise_for_status() + return resp.json() async def _post( client: httpx.AsyncClient, path: str, json: dict | None = None ) -> dict: - """POST *path* on *client* with optional JSON body and return the JSON response.""" - logger.info("POST %s%s", client.base_url, path) - resp = await client.post(path, json=json or {}, timeout=120) - if resp.status_code >= 400: - body_excerpt = resp.text[:500].replace("\n", " ") if resp.text else "" - logger.warning("POST %s%s → %s body=%r", client.base_url, path, resp.status_code, body_excerpt) - else: - logger.info("POST %s%s → %s", client.base_url, path, resp.status_code) - resp.raise_for_status() - return resp.json() + """POST *path* on *client* with optional JSON body and return the JSON response. + + 502/503 responses are retried up to 3 times with increasing delays. + """ + delays = list(_RETRY_DELAYS) + attempt = 0 + while True: + logger.info("POST %s%s (attempt %d)", client.base_url, path, attempt + 1) + resp = await client.post(path, json=json or {}, timeout=120) + if resp.status_code >= 400: + body_excerpt = resp.text[:500].replace("\n", " ") if resp.text else "" + logger.warning( + "POST %s%s → %s body=%r", + client.base_url, + path, + resp.status_code, + body_excerpt, + ) + if _retryable(resp.status_code) and delays: + delay = delays.pop(0) + logger.info( + "Retrying in %ds (status=%s, attempt %d/%d)…", + delay, + resp.status_code, + attempt + 1, + len(_RETRY_DELAYS) + 1, + ) + await asyncio.sleep(delay) + attempt += 1 + continue + else: + logger.info("POST %s%s → %s", client.base_url, path, resp.status_code) + resp.raise_for_status() + return resp.json() # ── Factory ─────────────────────────────────────────────────────────────── From 6a32a38fa47919560dd522899a9ed1827fb1afd6 Mon Sep 17 00:00:00 2001 From: Hugues Journeau Date: Mon, 22 Jun 2026 13:36:18 +0200 Subject: [PATCH 42/54] docs(contributors): use full name for hugues journeau in contributors table --- CONTRIBUTORS.md | 2 +- changelogs/v0.6.0/hourdays_2026-06-22.log | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 changelogs/v0.6.0/hourdays_2026-06-22.log diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index a781c638..29556c57 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -8,7 +8,7 @@ Thank you to everyone who has contributed to OntoBricks! |------|--------|------| | Benoit Cayla | [@benoitcayladbx](https://github.com/benoitcayladbx) | Creator & Lead Maintainer | | Dermot Smyth | [@dermotsmyth-db](https://github.com/dermotsmyth-db) | Contributor | -| hourdays | [@hourdays](https://github.com/hourdays) | Contributor | +| Hugues Journeau | [@hourdays](https://github.com/hourdays) | Contributor | ## How to Contribute diff --git a/changelogs/v0.6.0/hourdays_2026-06-22.log b/changelogs/v0.6.0/hourdays_2026-06-22.log new file mode 100644 index 00000000..8d9e963f --- /dev/null +++ b/changelogs/v0.6.0/hourdays_2026-06-22.log @@ -0,0 +1,11 @@ +## List Hugues Journeau by full name in CONTRIBUTORS.md + +**Context:** The contributor table in `CONTRIBUTORS.md` lists Benoit Cayla and Dermot Smyth with their full names in the **Name** column, but the third row used the GitHub handle `hourdays` instead of the contributor's full name. Aligns the table for consistency. + +**Changes:** +1. `CONTRIBUTORS.md` — row 3, `Name` column: `hourdays` → `Hugues Journeau` (GitHub handle column unchanged). + +**Modified files:** +- `CONTRIBUTORS.md` + +**Test result:** N/A — documentation-only change. From f41142baff2edb96271d55fcd7c578d93e9b97b9 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Mon, 22 Jun 2026 14:46:40 +0200 Subject: [PATCH 43/54] version change v0.5.2 --- README.md | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index acfdc5df..6b4efde9 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ OntoBricks Logo

    -

    OntoBricks 0.5.1

    +

    OntoBricks 0.5.2

    Digital Twin Builder for Databricks diff --git a/pyproject.toml b/pyproject.toml index 262f5e19..2459ba5e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ontobricks" -version = "0.5.1" +version = "0.5.2" description = "Ontology Management Tool for Databricks" requires-python = ">=3.10" dependencies = [ From c4bf3d1e61a0d9769c904d9ba8b3267f6f3f4fa9 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Mon, 22 Jun 2026 14:58:29 +0200 Subject: [PATCH 44/54] fix(mcp): retry on 502/503 to survive Databricks Apps cold-start MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both _get and _post now retry up to 3 times on 502/503 with back-off 5s → 10s → 20s (~35s total), covering the typical Apps cold-start window. Each retry is logged at WARNING level. All other status codes still fail immediately. Also adds pytest/pytest-asyncio/anyio as dev dependencies to the mcp-server package so `uv run pytest` works out of the box. --- .../v0.5.2/benoitcayladbx_2026-06-22.log | 24 + src/mcp-server/pyproject.toml | 7 + src/mcp-server/server/app.py | 59 +- src/mcp-server/uv.lock | 2026 +++++++++++++++++ 4 files changed, 2109 insertions(+), 7 deletions(-) create mode 100644 changelogs/v0.5.2/benoitcayladbx_2026-06-22.log create mode 100644 src/mcp-server/uv.lock diff --git a/changelogs/v0.5.2/benoitcayladbx_2026-06-22.log b/changelogs/v0.5.2/benoitcayladbx_2026-06-22.log new file mode 100644 index 00000000..95ef4214 --- /dev/null +++ b/changelogs/v0.5.2/benoitcayladbx_2026-06-22.log @@ -0,0 +1,24 @@ +# MCP Server: retry on 502/503 (Databricks Apps cold-start) + +## Context +When the MCP server calls the main OntoBricks app during a Databricks Apps +cold-start or idle-sleep window, the platform proxy returns 502 before the +app is ready. Previously `_get` and `_post` raised immediately on any 4xx/5xx, +so a single cold-start would fail the entire MCP tool call. + +## Changes + +1. `src/mcp-server/server/app.py` — added `import asyncio` (top-level imports) +2. `src/mcp-server/server/app.py` — added module-level constants `_RETRY_STATUSES = {502, 503}` + and `_RETRY_DELAYS = (5, 10, 20)` (seconds between attempts) +3. `src/mcp-server/server/app.py` — `_get`: retry loop up to 3 times on 502/503, + sleeping 5 s → 10 s → 20 s; each retry logged at WARNING level; final attempt + still raises via `raise_for_status()` +4. `src/mcp-server/server/app.py` — `_post`: same retry logic as `_get` + +## Modified files +- `src/mcp-server/server/app.py` + +## Test results +2283 passed, 15 skipped (units only — e2e skipped, Python 3.9 union-type syntax +incompatibility in conftest.py unrelated to this change) diff --git a/src/mcp-server/pyproject.toml b/src/mcp-server/pyproject.toml index a2f267ce..f87b62a0 100644 --- a/src/mcp-server/pyproject.toml +++ b/src/mcp-server/pyproject.toml @@ -21,3 +21,10 @@ build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["server"] + +[dependency-groups] +dev = [ + "anyio>=4.13.0", + "pytest>=9.1.0", + "pytest-asyncio>=1.4.0", +] diff --git a/src/mcp-server/server/app.py b/src/mcp-server/server/app.py index 9d56c845..2345c2ab 100644 --- a/src/mcp-server/server/app.py +++ b/src/mcp-server/server/app.py @@ -35,6 +35,7 @@ from __future__ import annotations +import asyncio import json import logging import os @@ -423,6 +424,10 @@ def _get_auth_headers(mode: str) -> dict: return {} +_RETRY_STATUSES = {502, 503} +_RETRY_DELAYS = (5, 10, 20) # seconds between attempts; total max ~35 s + + async def _get( client: httpx.AsyncClient, path: str, params: dict | None = None ) -> dict: @@ -433,17 +438,35 @@ async def _get( empty payloads in the Apps log stream. On non-2xx responses we log a body excerpt before re-raising so the caller (and the LLM) sees an actionable error instead of a bare ``HTTPStatusError``. + + Retries up to 3 times on 502/503 (Databricks Apps cold-start window) + with exponential back-off: 5 s → 10 s → 20 s. """ logger.info("GET %s%s params=%s", client.base_url, path, params or {}) - resp = await client.get(path, params=params, timeout=120) + resp: httpx.Response | None = None + for attempt, delay in enumerate((*_RETRY_DELAYS, None), start=1): + resp = await client.get(path, params=params, timeout=120) + if resp.status_code not in _RETRY_STATUSES: + break + body_excerpt = resp.text[:300].replace("\n", " ") if resp.text else "" + if delay is None: + logger.warning( + "GET %s%s → %s (attempt %d/%d, giving up) body=%r", + client.base_url, path, resp.status_code, + attempt, len(_RETRY_DELAYS) + 1, body_excerpt, + ) + else: + logger.warning( + "GET %s%s → %s (attempt %d/%d, retrying in %ds) body=%r", + client.base_url, path, resp.status_code, + attempt, len(_RETRY_DELAYS) + 1, delay, body_excerpt, + ) + await asyncio.sleep(delay) if resp.status_code >= 400: body_excerpt = resp.text[:500].replace("\n", " ") if resp.text else "" logger.warning( "GET %s%s → %s body=%r", - client.base_url, - path, - resp.status_code, - body_excerpt, + client.base_url, path, resp.status_code, body_excerpt, ) else: logger.info("GET %s%s → %s", client.base_url, path, resp.status_code) @@ -454,9 +477,31 @@ async def _get( async def _post( client: httpx.AsyncClient, path: str, json: dict | None = None ) -> dict: - """POST *path* on *client* with optional JSON body and return the JSON response.""" + """POST *path* on *client* with optional JSON body and return the JSON response. + + Retries up to 3 times on 502/503 (Databricks Apps cold-start window) + with exponential back-off: 5 s → 10 s → 20 s. + """ logger.info("POST %s%s", client.base_url, path) - resp = await client.post(path, json=json or {}, timeout=120) + resp: httpx.Response | None = None + for attempt, delay in enumerate((*_RETRY_DELAYS, None), start=1): + resp = await client.post(path, json=json or {}, timeout=120) + if resp.status_code not in _RETRY_STATUSES: + break + body_excerpt = resp.text[:300].replace("\n", " ") if resp.text else "" + if delay is None: + logger.warning( + "POST %s%s → %s (attempt %d/%d, giving up) body=%r", + client.base_url, path, resp.status_code, + attempt, len(_RETRY_DELAYS) + 1, body_excerpt, + ) + else: + logger.warning( + "POST %s%s → %s (attempt %d/%d, retrying in %ds) body=%r", + client.base_url, path, resp.status_code, + attempt, len(_RETRY_DELAYS) + 1, delay, body_excerpt, + ) + await asyncio.sleep(delay) if resp.status_code >= 400: body_excerpt = resp.text[:500].replace("\n", " ") if resp.text else "" logger.warning("POST %s%s → %s body=%r", client.base_url, path, resp.status_code, body_excerpt) diff --git a/src/mcp-server/uv.lock b/src/mcp-server/uv.lock new file mode 100644 index 00000000..c77cf23f --- /dev/null +++ b/src/mcp-server/uv.lock @@ -0,0 +1,2026 @@ +version = 1 +revision = 3 +requires-python = ">=3.10" +resolution-markers = [ + "python_full_version >= '3.11'", + "python_full_version < '3.11'", +] + +[[package]] +name = "aiofile" +version = "3.9.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +dependencies = [ + { name = "caio", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/67/e2/d7cb819de8df6b5c1968a2756c3cb4122d4fa2b8fc768b53b7c9e5edb646/aiofile-3.9.0.tar.gz", hash = "sha256:e5ad718bb148b265b6df1b3752c4d1d83024b93da9bd599df74b9d9ffcf7919b", upload-time = "2024-10-08T10:39:35.846Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/50/25/da1f0b4dd970e52bf5a36c204c107e11a0c6d3ed195eba0bfbc664c312b2/aiofile-3.9.0-py3-none-any.whl", hash = "sha256:ce2f6c1571538cbdfa0143b04e16b208ecb0e9cb4148e528af8a640ed51cc8aa", upload-time = "2024-10-08T10:39:32.955Z" }, +] + +[[package]] +name = "aiofile" +version = "3.11.1" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +resolution-markers = [ + "python_full_version >= '3.11'", +] +dependencies = [ + { name = "caio", marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/48/41/2fea7e193e061ce54eacc3b7bc0e6a99e4fcff43c78cf0a76dd781ed8334/aiofile-3.11.1.tar.gz", hash = "sha256:1f91912c6643d2a4e49ca4ae3514f0bf3867ce948a36d99a6411b8f4755f4cf9", upload-time = "2026-05-16T08:18:33.538Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/67/cd/0d76dfc5de72bde52f55f53e925c7d152d9c7906634ec1e0cbc7e8d4ad93/aiofile-3.11.1-py3-none-any.whl", hash = "sha256:ce77d14ac07f77bc2b757834a5c129321f3f705c474593deed5ab209079a52c9", upload-time = "2026-05-16T08:18:32.051Z" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.13.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "idna" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", upload-time = "2026-03-24T12:59:09.671Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", upload-time = "2026-03-24T12:59:08.246Z" }, +] + +[[package]] +name = "attrs" +version = "26.1.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", upload-time = "2026-03-19T14:22:25.026Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", upload-time = "2026-03-19T14:22:23.645Z" }, +] + +[[package]] +name = "authlib" +version = "1.7.2" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "joserfc" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/36/98/7d93f30d029643c0275dbc0bd6d5a6f670661ee6c9a94d93af7ab4887600/authlib-1.7.2.tar.gz", hash = "sha256:2cea25fefcd4e7173bdf1372c0afc265c8034b23a8cd5dcb6a9164b826c64231", upload-time = "2026-05-06T08:10:23.116Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/fb/95/adcb68e20c34162e9135f370d6e31737719c2b6f94bc953fe7ed1f10fe21/authlib-1.7.2-py2.py3-none-any.whl", hash = "sha256:3e1faedc9d87e7d56a164eca3ccb6ace0d61b94abe83e92242f8dc8bba9b4a9f", upload-time = "2026-05-06T08:10:21.436Z" }, +] + +[[package]] +name = "backports-asyncio-runner" +version = "1.2.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/8e/ff/70dca7d7cb1cbc0edb2c6cc0c38b65cba36cccc491eca64cabd5fe7f8670/backports_asyncio_runner-1.2.0.tar.gz", hash = "sha256:a5aa7b2b7d8f8bfcaa2b57313f70792df84e32a2a746f585213373f900b42162", upload-time = "2025-07-02T02:27:15.685Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/a0/59/76ab57e3fe74484f48a53f8e337171b4a2349e506eabe136d7e01d059086/backports_asyncio_runner-1.2.0-py3-none-any.whl", hash = "sha256:0da0a936a8aeb554eccb426dc55af3ba63bcdc69fa1a600b5bb305413a4477b5", upload-time = "2025-07-02T02:27:14.263Z" }, +] + +[[package]] +name = "backports-tarfile" +version = "1.2.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", upload-time = "2024-05-28T17:01:54.731Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", upload-time = "2024-05-28T17:01:53.112Z" }, +] + +[[package]] +name = "beartype" +version = "0.22.9" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/c7/94/1009e248bbfbab11397abca7193bea6626806be9a327d399810d523a07cb/beartype-0.22.9.tar.gz", hash = "sha256:8f82b54aa723a2848a56008d18875f91c1db02c32ef6a62319a002e3e25a975f", upload-time = "2025-12-13T06:50:30.72Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/71/cc/18245721fa7747065ab478316c7fea7c74777d07f37ae60db2e84f8172e8/beartype-0.22.9-py3-none-any.whl", hash = "sha256:d16c9bbc61ea14637596c5f6fbff2ee99cbe3573e46a716401734ef50c3060c2", upload-time = "2025-12-13T06:50:28.266Z" }, +] + +[[package]] +name = "cachetools" +version = "7.1.4" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/f4/8b/0d3945a13955303b81272f759a0331e54c5c793da455e6f5706b89d2639c/cachetools-7.1.4.tar.gz", hash = "sha256:437f55a4e0c1b01a4f3077cc470e6991d47430970e36fbcb77e2be0df4fc1cd6", upload-time = "2026-05-21T22:40:43.376Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/8c/7b/1fc1c09cc0756cf25861a3be10565915953876da48bb228fb9a672b20a42/cachetools-7.1.4-py3-none-any.whl", hash = "sha256:323dc4127934744db5b54eb4924482d7edafbf9554e820d1531c2e08c0e4ef54", upload-time = "2026-05-21T22:40:41.845Z" }, +] + +[[package]] +name = "caio" +version = "0.9.25" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/92/88/b8527e1b00c1811db339a1df8bd1ae49d146fcea9d6a5c40e3a80aaeb38d/caio-0.9.25.tar.gz", hash = "sha256:16498e7f81d1d0f5a4c0ad3f2540e65fe25691376e0a5bd367f558067113ed10", upload-time = "2025-12-26T15:21:36.501Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/6a/80/ea4ead0c5d52a9828692e7df20f0eafe8d26e671ce4883a0a146bb91049e/caio-0.9.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ca6c8ecda611478b6016cb94d23fd3eb7124852b985bdec7ecaad9f3116b9619", upload-time = "2025-12-26T15:22:04.662Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/17/b9/36715c97c873649d1029001578f901b50250916295e3dddf20c865438865/caio-0.9.25-cp310-cp310-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db9b5681e4af8176159f0d6598e73b2279bb661e718c7ac23342c550bd78c241", upload-time = "2025-12-26T15:22:18.818Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0b/ab/07080ecb1adb55a02cbd8ec0126aa8e43af343ffabb6a71125b42670e9a1/caio-0.9.25-cp310-cp310-manylinux_2_34_aarch64.whl", hash = "sha256:bf61d7d0c4fd10ffdd98ca47f7e8db4d7408e74649ffaf4bef40b029ada3c21b", upload-time = "2026-03-04T22:08:16.024Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/88/95/dd55757bb671eb4c376e006c04e83beb413486821f517792ea603ef216e9/caio-0.9.25-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:ab52e5b643f8bbd64a0605d9412796cd3464cb8ca88593b13e95a0f0b10508ae", upload-time = "2026-03-04T22:08:17.202Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ec/90/543f556fcfcfa270713eef906b6352ab048e1e557afec12925c991dc93c2/caio-0.9.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d6956d9e4a27021c8bd6c9677f3a59eb1d820cc32d0343cea7961a03b1371965", upload-time = "2025-12-26T15:21:40.267Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/51/3b/36f3e8ec38dafe8de4831decd2e44c69303d2a3892d16ceda42afed44e1b/caio-0.9.25-cp311-cp311-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bf84bfa039f25ad91f4f52944452a5f6f405e8afab4d445450978cd6241d1478", upload-time = "2025-12-26T15:22:20.271Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/df/ce/65e64867d928e6aff1b4f0e12dba0ef6d5bf412c240dc1df9d421ac10573/caio-0.9.25-cp311-cp311-manylinux_2_34_aarch64.whl", hash = "sha256:ae3d62587332bce600f861a8de6256b1014d6485cfd25d68c15caf1611dd1f7c", upload-time = "2026-03-04T22:08:20.402Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/46/90/e278863c47e14ec58309aa2e38a45882fbe67b4cc29ec9bc8f65852d3e45/caio-0.9.25-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:fc220b8533dcf0f238a6b1a4a937f92024c71e7b10b5a2dfc1c73604a25709bc", upload-time = "2026-03-04T22:08:21.368Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d3/25/79c98ebe12df31548ba4eaf44db11b7cad6b3e7b4203718335620939083c/caio-0.9.25-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fb7ff95af4c31ad3f03179149aab61097a71fd85e05f89b4786de0359dffd044", upload-time = "2025-12-26T15:21:36.075Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a3/2b/21288691f16d479945968a0a4f2856818c1c5be56881d51d4dac9b255d26/caio-0.9.25-cp312-cp312-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:97084e4e30dfa598449d874c4d8e0c8d5ea17d2f752ef5e48e150ff9d240cd64", upload-time = "2025-12-26T15:22:20.983Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/03/c4/8a1b580875303500a9c12b9e0af58cb82e47f5bcf888c2457742a138273c/caio-0.9.25-cp312-cp312-manylinux_2_34_aarch64.whl", hash = "sha256:4fa69eba47e0f041b9d4f336e2ad40740681c43e686b18b191b6c5f4c5544bfb", upload-time = "2026-03-04T22:08:22.381Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d1/1c/0fe770b8ffc8362c48134d1592d653a81a3d8748d764bec33864db36319d/caio-0.9.25-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:6bebf6f079f1341d19f7386db9b8b1f07e8cc15ae13bfdaff573371ba0575d69", upload-time = "2026-03-04T22:08:23.382Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/31/57/5e6ff127e6f62c9f15d989560435c642144aa4210882f9494204bc892305/caio-0.9.25-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d6c2a3411af97762a2b03840c3cec2f7f728921ff8adda53d7ea2315a8563451", upload-time = "2025-12-26T15:21:35.484Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a3/9f/f21af50e72117eb528c422d4276cbac11fb941b1b812b182e0a9c70d19c5/caio-0.9.25-cp313-cp313-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0998210a4d5cd5cb565b32ccfe4e53d67303f868a76f212e002a8554692870e6", upload-time = "2025-12-26T15:22:21.919Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9c/12/c39ae2a4037cb10ad5eb3578eb4d5f8c1a2575c62bba675f3406b7ef0824/caio-0.9.25-cp313-cp313-manylinux_2_34_aarch64.whl", hash = "sha256:1a177d4777141b96f175fe2c37a3d96dec7911ed9ad5f02bac38aaa1c936611f", upload-time = "2026-03-04T22:08:25.187Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/22/59/f8f2e950eb4f1a5a3883e198dca514b9d475415cb6cd7b78b9213a0dd45a/caio-0.9.25-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:9ed3cfb28c0e99fec5e208c934e5c157d0866aa9c32aa4dc5e9b6034af6286b7", upload-time = "2026-03-04T22:08:26.449Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/69/ca/a08fdc7efdcc24e6a6131a93c85be1f204d41c58f474c42b0670af8c016b/caio-0.9.25-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fab6078b9348e883c80a5e14b382e6ad6aabbc4429ca034e76e730cf464269db", upload-time = "2025-12-26T15:21:41.055Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5e/6c/d4d24f65e690213c097174d26eda6831f45f4734d9d036d81790a27e7b78/caio-0.9.25-cp314-cp314-manylinux2010_x86_64.manylinux2014_x86_64.manylinux_2_12_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:44a6b58e52d488c75cfaa5ecaa404b2b41cc965e6c417e03251e868ecd5b6d77", upload-time = "2025-12-26T15:22:22.757Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/87/a4/e534cf7d2d0e8d880e25dd61e8d921ffcfe15bd696734589826f5a2df727/caio-0.9.25-cp314-cp314-manylinux_2_34_aarch64.whl", hash = "sha256:628a630eb7fb22381dd8e3c8ab7f59e854b9c806639811fc3f4310c6bd711d79", upload-time = "2026-03-04T22:08:27.483Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3f/ed/bf81aeac1d290017e5e5ac3e880fd56ee15e50a6d0353986799d1bc5cfd5/caio-0.9.25-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:0ba16aa605ccb174665357fc729cf500679c2d94d5f1458a6f0d5ca48f2060a7", upload-time = "2026-03-04T22:08:28.751Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/86/93/1f76c8d1bafe3b0614e06b2195784a3765bbf7b0a067661af9e2dd47fc33/caio-0.9.25-py3-none-any.whl", hash = "sha256:06c0bb02d6b929119b1cfbe1ca403c768b2013a369e2db46bfa2a5761cf82e40", upload-time = "2025-12-26T15:22:00.221Z" }, +] + +[[package]] +name = "certifi" +version = "2026.5.20" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", upload-time = "2026-05-20T11:46:50.073Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", upload-time = "2026-05-20T11:46:48.578Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", upload-time = "2025-09-08T23:22:08.01Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", upload-time = "2025-09-08T23:22:10.637Z" }, + { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-09-08T23:22:12.267Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", upload-time = "2025-09-08T23:22:13.455Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", upload-time = "2025-09-08T23:22:14.596Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", upload-time = "2025-09-08T23:22:15.769Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", upload-time = "2025-09-08T23:22:17.427Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", upload-time = "2025-09-08T23:22:19.069Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", upload-time = "2025-09-08T23:22:20.588Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", upload-time = "2025-09-08T23:22:22.143Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", upload-time = "2025-09-08T23:22:23.328Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", upload-time = "2025-09-08T23:22:24.752Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", upload-time = "2025-09-08T23:22:26.456Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", upload-time = "2025-09-08T23:22:28.197Z" }, + { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", upload-time = "2025-09-08T23:22:32.507Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", upload-time = "2025-09-08T23:22:34.132Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", upload-time = "2025-09-08T23:22:38.436Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", upload-time = "2025-09-08T23:22:39.776Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", upload-time = "2025-09-08T23:22:40.95Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", upload-time = "2025-09-08T23:22:42.463Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", upload-time = "2025-09-08T23:22:43.623Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", upload-time = "2025-09-08T23:23:43.004Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.7" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/26/08/0f303cb0b529e456bb116f2d50565a482694fbb94340bf56d44677e7ed03/charset_normalizer-3.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d", upload-time = "2026-04-02T09:25:40.673Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/24/47/b192933e94b546f1b1fe4df9cc1f84fcdbf2359f8d1081d46dd029b50207/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8", upload-time = "2026-04-02T09:25:42.354Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c2/b4/01fa81c5ca6141024d89a8fc15968002b71da7f825dd14113207113fabbd/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790", upload-time = "2026-04-02T09:25:44.281Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/20/f7/7b991776844dfa058017e600e6e55ff01984a063290ca5622c0b63162f68/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc", upload-time = "2026-04-02T09:25:45.475Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/20/e7/bed0024a0f4ab0c8a9c64d4445f39b30c99bd1acd228291959e3de664247/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf29836da5119f3c8a8a70667b0ef5fdca3bb12f80fd06487cfa575b3909b393", upload-time = "2026-04-02T09:25:46.58Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e2/ab/b18f0ab31cdd7b3ddb8bb76c4a414aeb8160c9810fdf1bc62f269a539d87/charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153", upload-time = "2026-04-02T09:25:48.031Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/82/e5/7e9440768a06dfb3075936490cb82dbf0ee20a133bf0dd8551fa096914ec/charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d560742f3c0d62afaccf9f41fe485ed69bd7661a241f86a3ef0f0fb8b1a397af", upload-time = "2026-04-02T09:25:49.245Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/71/94/8c61d8da9f062fdf457c80acfa25060ec22bf1d34bbeaca4350f13bcfd07/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34", upload-time = "2026-04-02T09:25:50.671Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/66/cd/6e9889c648e72c0ab2e5967528bb83508f354d706637bc7097190c874e13/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1", upload-time = "2026-04-02T09:25:51.802Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/92/2e/7a951d6a08aefb7eb8e1b54cdfb580b1365afdd9dd484dc4bee9e5d8f258/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752", upload-time = "2026-04-02T09:25:53.388Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/58/d5/abcf2d83bf8e0a1286df55cd0dc1d49af0da4282aa77e986df343e7de124/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53", upload-time = "2026-04-02T09:25:54.765Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/47/3a/7d4cd7ed54be99973a0dc176032cba5cb1f258082c31fa6df35cff46acfc/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616", upload-time = "2026-04-02T09:25:55.904Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1d/98/3a45bf8247889cf28262ebd3d0872edff11565b2a1e3064ccb132db3fbb0/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a", upload-time = "2026-04-02T09:25:57.074Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ad/80/2e8b7f8915ed5c9ef13aa828d82738e33888c485b65ebf744d615040c7ea/charset_normalizer-3.4.7-cp310-cp310-win32.whl", hash = "sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374", upload-time = "2026-04-02T09:25:58.199Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/35/1b/3b8c8c77184af465ee9ad88b5aea46ea6b2e1f7b9dc9502891e37af21e30/charset_normalizer-3.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943", upload-time = "2026-04-02T09:25:59.322Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/be/c1/feb40dca40dbb21e0a908801782d9288c64fc8d8e562c2098e9994c8c21b/charset_normalizer-3.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008", upload-time = "2026-04-02T09:26:00.756Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7", upload-time = "2026-04-02T09:26:02.191Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5a/53/58c29116c340e5456724ecd2fff4196d236b98f3da97b404bc5e51ac3493/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7", upload-time = "2026-04-02T09:26:03.583Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b2/02/e8146dc6591a37a00e5144c63f29fb7c97a734ea8a111190783c0e60ab63/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e", upload-time = "2026-04-02T09:26:04.738Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fb/73/77486c4cd58f1267bf17db420e930c9afa1b3be3fe8c8b8ebbebc9624359/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c", upload-time = "2026-04-02T09:26:06.36Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df", upload-time = "2026-04-02T09:26:08.347Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/dc/92/42bd3cefcf7687253fb86694b45f37b733c97f59af3724f356fa92b8c344/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265", upload-time = "2026-04-02T09:26:09.823Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4c/3d/069e7184e2aa3b3cddc700e3dd267413dc259854adc3380421c805c6a17d/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4", upload-time = "2026-04-02T09:26:10.953Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/62/51/9d56feb5f2e7074c46f93e0ebdbe61f0848ee246e2f0d89f8e20b89ebb8f/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e", upload-time = "2026-04-02T09:26:12.142Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d2/59/893d8f99cc4c837dda1fe2f1139079703deb9f321aabcb032355de13b6c7/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38", upload-time = "2026-04-02T09:26:13.711Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7d/1d/ee6f3be3464247578d1ed5c46de545ccc3d3ff933695395c402c21fa6b77/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c", upload-time = "2026-04-02T09:26:14.941Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/54/bb/8fb0a946296ea96a488928bdce8ef99023998c48e4713af533e9bb98ef07/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b", upload-time = "2026-04-02T09:26:16.478Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9a/bc/015b2387f913749f82afd4fcba07846d05b6d784dd16123cb66860e0237d/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c", upload-time = "2026-04-02T09:26:17.751Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/17/ab/63133691f56baae417493cba6b7c641571a2130eb7bceba6773367ab9ec5/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d", upload-time = "2026-04-02T09:26:18.981Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/06/6d/3be70e827977f20db77c12a97e6a9f973631a45b8d186c084527e53e77a4/charset_normalizer-3.4.7-cp311-cp311-win32.whl", hash = "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad", upload-time = "2026-04-02T09:26:20.295Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00", upload-time = "2026-04-02T09:26:21.74Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ca/83/6413f36c5a34afead88ce6f66684d943d91f233d76dd083798f9602b75ae/charset_normalizer-3.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1", upload-time = "2026-04-02T09:26:22.901Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", upload-time = "2026-04-02T09:26:24.331Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", upload-time = "2026-04-02T09:26:25.568Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", upload-time = "2026-04-02T09:26:26.865Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", upload-time = "2026-04-02T09:26:28.044Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", upload-time = "2026-04-02T09:26:29.239Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", upload-time = "2026-04-02T09:26:30.5Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", upload-time = "2026-04-02T09:26:31.709Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", upload-time = "2026-04-02T09:26:33.282Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", upload-time = "2026-04-02T09:26:34.845Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", upload-time = "2026-04-02T09:26:36.152Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", upload-time = "2026-04-02T09:26:37.672Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", upload-time = "2026-04-02T09:26:38.93Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", upload-time = "2026-04-02T09:26:40.17Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", upload-time = "2026-04-02T09:26:41.416Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", upload-time = "2026-04-02T09:26:42.554Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", upload-time = "2026-04-02T09:26:44.075Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", upload-time = "2026-04-02T09:26:45.198Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", upload-time = "2026-04-02T09:26:46.824Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", upload-time = "2026-04-02T09:26:48.397Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", upload-time = "2026-04-02T09:26:49.684Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", upload-time = "2026-04-02T09:26:50.915Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", upload-time = "2026-04-02T09:26:52.197Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", upload-time = "2026-04-02T09:26:53.49Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", upload-time = "2026-04-02T09:26:54.975Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", upload-time = "2026-04-02T09:26:56.303Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", upload-time = "2026-04-02T09:26:57.554Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", upload-time = "2026-04-02T09:26:58.843Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", upload-time = "2026-04-02T09:27:00.437Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", upload-time = "2026-04-02T09:27:02.021Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", upload-time = "2026-04-02T09:27:03.192Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", upload-time = "2026-04-02T09:27:04.454Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", upload-time = "2026-04-02T09:27:05.971Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", upload-time = "2026-04-02T09:27:07.194Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", upload-time = "2026-04-02T09:27:08.749Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", upload-time = "2026-04-02T09:27:09.951Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", upload-time = "2026-04-02T09:27:11.175Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", upload-time = "2026-04-02T09:27:12.446Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", upload-time = "2026-04-02T09:27:13.721Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", upload-time = "2026-04-02T09:27:15.272Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", upload-time = "2026-04-02T09:27:16.834Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", upload-time = "2026-04-02T09:27:18.229Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", upload-time = "2026-04-02T09:27:19.445Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", upload-time = "2026-04-02T09:27:20.79Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", upload-time = "2026-04-02T09:27:22.063Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", upload-time = "2026-04-02T09:27:23.486Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", upload-time = "2026-04-02T09:27:25.146Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", upload-time = "2026-04-02T09:27:26.642Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", upload-time = "2026-04-02T09:27:28.271Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", upload-time = "2026-04-02T09:27:29.474Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", upload-time = "2026-04-02T09:27:30.793Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", upload-time = "2026-04-02T09:27:32.44Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", upload-time = "2026-04-02T09:27:34.03Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", upload-time = "2026-04-02T09:27:35.369Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", upload-time = "2026-04-02T09:27:36.661Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", upload-time = "2026-04-02T09:27:38.019Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", upload-time = "2026-04-02T09:27:39.37Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", upload-time = "2026-04-02T09:27:40.722Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", upload-time = "2026-04-02T09:27:42.33Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", upload-time = "2026-04-02T09:27:43.924Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", upload-time = "2026-04-02T09:27:45.348Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", upload-time = "2026-04-02T09:27:46.706Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", upload-time = "2026-04-02T09:27:48.053Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", upload-time = "2026-04-02T09:27:49.795Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", upload-time = "2026-04-02T09:27:51.116Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", upload-time = "2026-04-02T09:28:37.794Z" }, +] + +[[package]] +name = "click" +version = "8.4.1" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/9b/98/518d8e5081007684232226f475082b30087d0f585e8457db087298259f49/click-8.4.1.tar.gz", hash = "sha256:918b5633eddf6b41c32d4f454bf0de810065c74e3f7dbf8ee5452f8be88d3e96", upload-time = "2026-05-22T04:08:37.769Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/c7/0d/67e5b4109ea4a837e80daa87c2c696711955e40449a97e8926672534def2/click-8.4.1-py3-none-any.whl", hash = "sha256:482be17c6991b8c19c5429a1e995d9b0efdbb63172824c41f99965dc0ade8ec2", upload-time = "2026-05-22T04:08:35.26Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "cryptography" +version = "49.0.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz", hash = "sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493", upload-time = "2026-06-12T20:02:30.512Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/9b/22/adf66990e63584a68dfb50c24f48a125c07b1699899381c8151e63ed458c/cryptography-49.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db", upload-time = "2026-06-12T20:02:32.143Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/09/41/3797cfaf69cae04a13ee78ebd83f0678d9c02b4779d21ce24445326f1a69/cryptography-49.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db", upload-time = "2026-06-12T20:01:21.305Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e6/8b/43011f7ebe515a8aa20d61f290a326cd890c2e738e16e59eaff8d9c3a412/cryptography-49.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e959b578856a3924bc0cbb710fc12c387b9412a951389f3ca61704a9e25f325", upload-time = "2026-06-12T20:01:48.566Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4a/91/01ce7303a4579e6d3a6abef01bd322848e9ea7a219adcabc5048b9033571/cryptography-49.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:53ecee2e23f7169b6117e99fc8a944e5e50f79e69758a83b52a00cb98ab2b2d2", upload-time = "2026-06-12T20:02:47.091Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/62/99/a2c95cf8293f07491e9e27c20cc4dcd18176d944e674679adeb1d0173fd6/cryptography-49.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2eda353d8a27bcbcaa4cbed18994a74ab4d19a2ca897db188ea269ab9b71419b", upload-time = "2026-06-12T20:02:08.987Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/20/2c/0622f20ff02b2ef32558733443805dc82fd4c275be01b2d19d14676f3a1b/cryptography-49.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6", upload-time = "2026-06-12T20:02:03.335Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a3/5b/c5246635d5fd3b64e0d45ae10e99fd32fe9676a79915ccfe5a61ba9af1a5/cryptography-49.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:0b82e28ee398a386f0807bba7884d30f25218855690f45115831bcce5d90822c", upload-time = "2026-06-12T20:02:54.323Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6d/88/05563c7fe2e914e87d1a536d06fe83e66b4e1d95cb593e05aea375531da8/cryptography-49.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ccac2bfebc306b862133e3bb71f3f6ee8bb525240089b2d952e4144b3a6d5da7", upload-time = "2026-06-12T20:01:34.822Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c4/b6/d7696e4e890d6ae1469935164c9e5215c557671cb78d6e3f458ccceaa632/cryptography-49.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d0527ce944105f257f605a827d6ebead966c752038b6e8656abb9c5edee6fc68", upload-time = "2026-06-12T20:01:24.09Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a9/3c/f3ad17eecc1a57b0ba236dc01f90e783c51f4a2f35f64777cc4f47a184b2/cryptography-49.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:cbc77da8c523d5abd028635ba850a6966fcee2c82e2bf65a41d1d8afe0f98be9", upload-time = "2026-06-12T20:01:30.848Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4f/01/339573cf1023163a400b0b5d16f6d507de413b9f60be6fd1b77feeaf6737/cryptography-49.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b87e65d263b3e5d3bb92a57e2a6638e2f31110fa7aa890c7b2dbba42248d0a3f", upload-time = "2026-06-12T20:01:29.246Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/71/fd/577302e213a1be9468f92d1afef66fcf1ef83d516819d9992ca547f592bd/cryptography-49.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:66ec79c3904820572d7e987abdf304281f141d37ad9a489b8e97066e7b9b6459", upload-time = "2026-06-12T20:01:42.853Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1f/09/f42b1d190c5ba75f72062a387f8030d1d75f6ab035788f1d9c4b01de6525/cryptography-49.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:e5dfc1e64de5677cec922ffa8da89c546d0415bf6efdf081842e5d44c84e1f0e", upload-time = "2026-06-12T20:02:39.262Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ec/9e/db72b3ae7fc9cfad53e630e56c6ae83b9b6ff0bf3718ffb8012d20b3aabf/cryptography-49.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:73a205dce83953d131a4aa1e0fd917a2fd1c5b1eef251e9d7152efefcbf5caf7", upload-time = "2026-06-12T20:02:10.735Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/86/12/c48a424f38db03027be9f7ed5c7dc5de9933dbee992865f98b13727a009d/cryptography-49.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:196ecd6a36e4e9aa10270393bb98d8df88fccee0bf1e5128b91ae4eb4375896d", upload-time = "2026-06-12T20:02:48.743Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/68/28/8a3ad4653662c93fc44dc4e5d8fd374c25c42e07b34bbfbadf49cf57a5a8/cryptography-49.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7abcee80084cda3f7691f3eb1ce480d8df49cec637b429aa35986c1de71738aa", upload-time = "2026-06-12T20:02:56.03Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a8/b2/2193fc74f81aee4f9b62733133b73b5176718932ed8f2e4b03fa040480a6/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:4ae387c9cb68ea569ca17e490d66d8142b81c3cc814bf179974b7d146e490bbb", upload-time = "2026-06-12T20:02:50.666Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/47/f1/1d3eaa243bfc5de4a187b22aa8c048b3e4980bfbe830ac46e6bac2e66947/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:f37d847238971164fdbc68ade6f6574aecc9c0af714190e2083429ff68f4ce9d", upload-time = "2026-06-12T20:01:46.468Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/58/39/2d51306721330c486495853eda1c567880ff036de15a14c4b74f399934af/cryptography-49.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:c2bc30226390d60ea19d9f82b19db005fe0452154a23c1c410c12ea801e43561", upload-time = "2026-06-12T20:02:16.832Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/17/50/983e838c7fd0d87fd8c969bcdd328edaf5f756e38df5281637424c155873/cryptography-49.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:07cab27cc7b7e0fd28e5e26bb9eeedde5c135c868b46de4a27845abe94af6122", upload-time = "2026-06-12T20:02:52.611Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a7/f5/8f571d7e27c55bce9f76f026143bcb1e040a4233149ecca0bea5fa5dd5f7/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:b20133d204d2bb56ba047642199603876c872026ca53e79c35b83772ab2cc505", upload-time = "2026-06-12T20:02:07.282Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e7/84/0e27016a6fc5a0886f797018b26aa42f40c09a82332bff77822a451deaaa/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:b970c6da94d5bb18629db453d14f2a1300f6bf59b61e9b82377931ef95504866", upload-time = "2026-06-12T20:01:32.439Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/11/2d/5e1fb307cb5931881516b464c98774b3f2c36b5d4bb9a2830253cf553cad/cryptography-49.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:d8ecde755e2e91bf773fc94e8c9d730cd7f2007004cb492263a794ec3899a1c8", upload-time = "2026-06-12T20:02:01.469Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e4/c0/bff5a02ee731d207d6a1ed51732549d8c53d2bc8da1d10ec6f2844201d68/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e3fb64c420688e5319ae25113a354015abbd8dffbfbc41781a1ea66fc7622ac3", upload-time = "2026-06-12T20:01:36.574Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b9/26/814681d14248d95d73d5c3eea0c39a94eb8302df966f670a2c60de90974b/cryptography-49.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32703d93296f5c1f4b53349ad3a250c2cae0fdecd3a3dd5d47e616d8d616af27", upload-time = "2026-06-12T20:02:18.688Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4c/fe/93ecac273d3738939d023612ad12cca9a3740a5345d69fda04134c43fd96/cryptography-49.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:33cd0565932807baddb67b96dbee92f2c374b5c89dee09fd74079aeb8c8dba61", upload-time = "2026-06-12T20:01:39.059Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/19/2a/5bb823f5bedcf80718cea7fbc95ec5515cca3769633c4b01a32be7f30e7c/cryptography-49.0.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ec5e529fb80935c94fe7b729f9972b50e351a0e6b50aa294fd5cabb109fcc29a", upload-time = "2026-06-12T20:01:25.745Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3d/df/40577043ca124e17012f408ddddaeb213b856336ac82ddb3bc915f39e29f/cryptography-49.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f78ff2c9ed8dc2d036b0f4d640e22522213d047c1b14e61205a7e55c80a494d4", upload-time = "2026-06-12T20:01:53.628Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2c/99/2d13299eb3dd27b02dcfaafcc91d6b5cb3329f7cbd6d8f51921acd566c1a/cryptography-49.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:35b151772baff2c74cba7fa290ceaff4c3b11c0c881eb93eb5dbc05a7cfbba18", upload-time = "2026-06-12T20:02:45.383Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a5/4d/9c0cd02f95e2602dd5e563da149ee0830abef3537be8b34dc56281ebe27a/cryptography-49.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0f21641cf4b30fca7aee061ced0ec7ad7b073518088b7c9969a297c0ae796c69", upload-time = "2026-06-12T20:01:41.13Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/24/01/186c825898477d77e2324d5360fefe622ff1d8d1963ec0554e2cada8ec77/cryptography-49.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9e82dcc8e56052715fb18b2429e3bca4823b1629136a2084fc45a9a5cecb9b64", upload-time = "2026-06-12T20:02:24.579Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b8/7b/62cbbab75d0659865bf0273790031544a0b16c8072d258f9428dcd8190dc/cryptography-49.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6f2debedf9ca60cf1d5bd466475638af5130f89965605cd818484d19987d3a21", upload-time = "2026-06-12T20:01:50.14Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6c/72/3e798c064bc39e471008075d0f9bc9daf77a80879c092e4a8e170c585ed4/cryptography-49.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:8c25ceb16df5b9435f3f6a9829204985b0e0cbee3b48aacd432c7d2c850b44d9", upload-time = "2026-06-12T20:01:44.743Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f0/ee/6fca21d1ac73e06f8bef71940abfd4d2f6472b4bca284d770f32bd4086f6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:28d8b15e6275f12c8a207dc309dfa957903c927d08d0cc937ee3f63f200693cc", upload-time = "2026-06-12T20:02:20.918Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/67/d0/a5fcd3515f0bae49a7b6d0413cc1bdccdcc1fc0047037a0d480642cdc5d6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6fc361c34fb6aac015ce19435876635e5c6d21db31998b0920f675f131e043b8", upload-time = "2026-06-12T20:02:22.737Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a0/84/84fe36f19caf857d61cb7fc9c63035a47ffabd84ea12d1d393148efa3615/cryptography-49.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2400ef9c9e2299a25614eb1dea3db54a69b1349efd043bfac9c67630d136df36", upload-time = "2026-06-12T20:02:41.389Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6c/a0/db537264e234f7273a73ec020873d6d6b39dfd8a53db78b550ca8320440e/cryptography-49.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:67e1d20ad9ef3a563c59ef22e7a8a0b8210bd26604369ea4a30a7c66aefe504e", upload-time = "2026-06-12T20:01:51.847Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/93/77/8df9eb486495979bccecd1062e2eaf435250e84437040295b57d09048b0b/cryptography-49.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:42b0684e0e40cf26122427802486f6d93aea593612603a94fbf260c7eb1e9c1b", upload-time = "2026-06-12T20:02:12.524Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c2/e6/f60198ea8d9dfa15fff9ed4ca02ce362f6eadd9ba757dcc50634c4257b63/cryptography-49.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:026ac7423e6fa66872d3bf889be5974507da3944f866f704fa200eadacd00001", upload-time = "2026-06-12T20:02:26.847Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/63/d3/4a83af35d65e3fad632c926fad684c193ea4398569ccb0bbbc7fe8f5dc9a/cryptography-49.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:fc1e275c2f1d97b1a6450b8b0ea3ebfa6e087a611c2b26cb2404d48588abab7b", upload-time = "2026-06-12T20:02:14.883Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d6/a7/f9dac0ab7f80368c56993a7bf638ef9935f825c91902798481fac0898138/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83782480a4a9da4d0feb51950131ba32e12e70813848b3343f6e18c28a66838", upload-time = "2026-06-12T20:02:28.793Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d7/70/2ba3769dd0ae167e2f33dfa9592d45db6ff9a61d62ca1a5b3d1bdd09068f/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b39efa323140595abd3ecca8529d321ae50f55f3aa3ba9cc81ea56a6011953d5", upload-time = "2026-06-12T20:01:27.495Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/94/64/2923570ac1c0bd3a737aa366ac3abbbbde273042308b8cde95e2364a6e6a/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:b47db11c2c3525083296069b98ac5221907455e989ae0c2e3008bde851921615", upload-time = "2026-06-12T20:01:55.49Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ab/f8/614dc7e051418cfe53d55173c1e24c6b0085e89996fe90508c2fdf769aef/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:084ef1af862eb07ec46d25f68689f2102a9fc0e05ce7b80f14f5fe51e4eef0f6", upload-time = "2026-06-12T20:02:05.469Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/aa/50/a9caea39ad19c431c1a3f8a31114df65b260cdfe67786b6c7e7c040c4c44/cryptography-49.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be9fcb48a55f023493482827d4f459bd263cc20efde64f204b97c123201850c6", upload-time = "2026-06-12T20:02:43.319Z" }, +] + +[[package]] +name = "cyclopts" +version = "4.18.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "attrs" }, + { name = "docstring-parser" }, + { name = "rich" }, + { name = "rich-rst" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/9a/19/5c438b428b3dca208eb920804dc16aeb3ca1e85d6163d17e8fb0785ead19/cyclopts-4.18.0.tar.gz", hash = "sha256:fb7b730f21932e0784f7e54462df0447aaa1fbf034d65b605bd8a25dce58b188", upload-time = "2026-06-11T19:55:05.326Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/5d/9f/b67f14c6b686ca90d317c0358f1a52ae171f43f83c808683fae3ba0b1f90/cyclopts-4.18.0-py3-none-any.whl", hash = "sha256:18ba2912e48e890a97ecc8a05c9beddf30a407b43f4e14cccfd40efddc41f029", upload-time = "2026-06-11T19:55:03.773Z" }, +] + +[[package]] +name = "databricks-sdk" +version = "0.118.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "protobuf" }, + { name = "requests" }, + { name = "urllib3" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/57/55/776f868cfe97821aafdee3a387badf4468c6205be97d18144738cfc94f66/databricks_sdk-0.118.0.tar.gz", hash = "sha256:cd049b7a9612d957e53d842631800f1974406fc3bec78bc51d429387046a0287", upload-time = "2026-06-18T14:09:35.16Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/8c/7b/b0ce4a5d544d28df9b86d63305bfad7f09409c0a0ce52f4ad29d2098d9fd/databricks_sdk-0.118.0-py3-none-any.whl", hash = "sha256:7931c7147315902e4347863074c2e2bc1d389338e15d1b60bbf49bc5ebabcbe0", upload-time = "2026-06-18T14:09:33.064Z" }, +] + +[[package]] +name = "dnspython" +version = "2.8.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", upload-time = "2025-09-07T18:58:00.022Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", upload-time = "2025-09-07T18:57:58.071Z" }, +] + +[[package]] +name = "docstring-parser" +version = "0.18.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/e0/4d/f332313098c1de1b2d2ff91cf2674415cc7cddab2ca1b01ae29774bd5fdf/docstring_parser-0.18.0.tar.gz", hash = "sha256:292510982205c12b1248696f44959db3cdd1740237a968ea1e2e7a900eeb2015", upload-time = "2026-04-14T04:09:19.867Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/a7/5f/ed01f9a3cdffbd5a008556fc7b2a08ddb1cc6ace7effa7340604b1d16699/docstring_parser-0.18.0-py3-none-any.whl", hash = "sha256:b3fcbed555c47d8479be0796ef7e19c2670d428d72e96da63f3a40122860374b", upload-time = "2026-04-14T04:09:18.638Z" }, +] + +[[package]] +name = "email-validator" +version = "2.3.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "dnspython" }, + { name = "idna" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/f5/22/900cb125c76b7aaa450ce02fd727f452243f2e91a61af068b40adba60ea9/email_validator-2.3.0.tar.gz", hash = "sha256:9fc05c37f2f6cf439ff414f8fc46d917929974a82244c20eb10231ba60c54426", upload-time = "2025-08-26T13:09:06.831Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/de/15/545e2b6cf2e3be84bc1ed85613edd75b8aea69807a71c26f4ca6a9258e82/email_validator-2.3.0-py3-none-any.whl", hash = "sha256:80f13f623413e6b197ae73bb10bf4eb0908faf509ad8362c5edeb0be7fd450b4", upload-time = "2025-08-26T13:09:05.858Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[package]] +name = "fastapi" +version = "0.137.1" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/d5/b1/e5b92c59d2c37817e77c1a8c2fc1f79cdcc04c68253e5406b43e3204cba7/fastapi-0.137.1.tar.gz", hash = "sha256:822360704230d9533d8d9475399613525968aa2f0b5bd2a3ccc9f18c88fd541c", upload-time = "2026-06-15T11:28:20.79Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/da/35/380b9a5922f4340e51c309cde09e5bd32e62f02302971bee30dc15aa0624/fastapi-0.137.1-py3-none-any.whl", hash = "sha256:64f6983c59e45c4b9fdc44e57cb8035c2451ee91ea8e8ec042aca37de7cf6b69", upload-time = "2026-06-15T11:28:19.523Z" }, +] + +[[package]] +name = "fastmcp" +version = "3.4.2" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "fastmcp-slim", extra = ["client", "server"] }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/29/18/46beaec18c9f86a599ae3f9cdf6677dd6b50240cfd844d18233710b47f13/fastmcp-3.4.2.tar.gz", hash = "sha256:b468722946fc467c3796a6572f7a14d93d48c014cf8fea12910245220cbbe4e1", upload-time = "2026-06-06T01:30:35.694Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/58/4d/8b1ba42251160e11ca34686344572121432c23a082d56ef6bbdec5888fc1/fastmcp-3.4.2-py3-none-any.whl", hash = "sha256:c87a62b029f0c5400ada85f683629345d2466c39169f0cb853e487b2f7308c08", upload-time = "2026-06-06T01:30:38.118Z" }, +] + +[[package]] +name = "fastmcp-slim" +version = "3.4.2" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "pydantic", extra = ["email"] }, + { name = "pydantic-settings" }, + { name = "python-dotenv" }, + { name = "rich" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/a3/2e/d627b28b7403ecc526991ef732921b08bde010006e6148635f053fd29f4c/fastmcp_slim-3.4.2.tar.gz", hash = "sha256:290646e0955a516235a317151034559aa48336cb843d3f006131aedad8759bb4", upload-time = "2026-06-06T01:30:12.553Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/f7/58/22afebf18df7260b09148199cbeb90cdcc4b3a4e1b5d7460e3591c3a7add/fastmcp_slim-3.4.2-py3-none-any.whl", hash = "sha256:bdc72492212681ca502755fa8acc0457f559295da1fc3dfc0599adc1c04b82f3", upload-time = "2026-06-06T01:30:11.22Z" }, +] + +[package.optional-dependencies] +client = [ + { name = "authlib" }, + { name = "exceptiongroup" }, + { name = "httpx" }, + { name = "mcp" }, + { name = "opentelemetry-api" }, + { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"] }, + { name = "starlette" }, +] +server = [ + { name = "authlib" }, + { name = "cyclopts" }, + { name = "exceptiongroup" }, + { name = "griffelib" }, + { name = "httpx" }, + { name = "joserfc" }, + { name = "jsonref" }, + { name = "jsonschema-path" }, + { name = "mcp" }, + { name = "openapi-pydantic" }, + { name = "opentelemetry-api" }, + { name = "packaging" }, + { name = "py-key-value-aio", extra = ["filetree", "keyring", "memory"] }, + { name = "pyperclip" }, + { name = "python-multipart" }, + { name = "pyyaml" }, + { name = "starlette" }, + { name = "uncalled-for" }, + { name = "uvicorn" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "google-auth" +version = "2.54.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "pyasn1-modules" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/15/f6/494e18317546d7def90c957b71d68b025d24f0e22e486c2606bc57765c48/google_auth-2.54.0.tar.gz", hash = "sha256:130f6fd5e3f497fdad897a23ed9489973437edf561238c4b92a4d02c435f8af9", upload-time = "2026-06-12T18:03:17.606Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/70/c5/d53bddd2c0949833fcb4ea06f9d5dd1c40575a1a4214cd1021eff57ba301/google_auth-2.54.0-py3-none-any.whl", hash = "sha256:784e9837f92244141250470d47c893df50cbab485ce491aca5e9deb558ad2b48", upload-time = "2026-06-12T18:02:57.58Z" }, +] + +[[package]] +name = "griffelib" +version = "2.0.2" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/9d/82/74f4a3310cdabfbb10da554c3a672847f1ed33c6f61dd472681ce7f1fe67/griffelib-2.0.2.tar.gz", hash = "sha256:3cf20b3bc470e83763ffbf236e0076b1211bac1bc67de13daf494640f2de707e", upload-time = "2026-03-27T11:34:51.091Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/11/8c/c9138d881c79aa0ea9ed83cbd58d5ca75624378b38cee225dcf5c42cc91f/griffelib-2.0.2-py3-none-any.whl", hash = "sha256:925c857658fb1ba40c0772c37acbc2ab650bd794d9c1b9726922e36ea4117ea1", upload-time = "2026-03-27T11:34:46.275Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "httpx-sse" +version = "0.4.3" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/0f/4c/751061ffa58615a32c31b2d82e8482be8dd4a89154f003147acee90f2be9/httpx_sse-0.4.3.tar.gz", hash = "sha256:9b1ed0127459a66014aec3c56bebd93da3c1bc8bb6618c8082039a44889a755d", upload-time = "2025-10-10T21:48:22.271Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/d2/fd/6668e5aec43ab844de6fc74927e155a3b37bf40d7c3790e49fc0406b6578/httpx_sse-0.4.3-py3-none-any.whl", hash = "sha256:0ac1c9fe3c0afad2e0ebb25a934a59f4c7823b60792691f779fad2c5568830fc", upload-time = "2025-10-10T21:48:21.158Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "9.0.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/a9/01/15bb152d77b21318514a96f43af312635eb2500c96b55398d020c93d86ea/importlib_metadata-9.0.0.tar.gz", hash = "sha256:a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc", upload-time = "2026-03-20T06:42:56.999Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl", hash = "sha256:2d21d1cc5a017bd0559e36150c21c830ab1dc304dedd1b7ea85d20f45ef3edd7", upload-time = "2026-03-20T06:42:55.665Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "jaraco-classes" +version = "3.4.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", upload-time = "2024-03-31T07:27:36.643Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", upload-time = "2024-03-31T07:27:34.792Z" }, +] + +[[package]] +name = "jaraco-context" +version = "6.1.2" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "backports-tarfile", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", upload-time = "2026-03-20T22:13:33.922Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl", hash = "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", upload-time = "2026-03-20T22:13:32.808Z" }, +] + +[[package]] +name = "jaraco-functools" +version = "4.5.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/36/cf/ea4ef2920830dea3f5ab2ea4da6fb67724e6dca80ee2553788c3607243d0/jaraco_functools-4.5.0.tar.gz", hash = "sha256:3bb5665ea4a020cf78a7040e89154c77edadb3ca74f366479669c5999aa70b03", upload-time = "2026-05-15T21:34:10.025Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/96/9a/982e48afcffcd727a9144506720ffd4224b6b7e355c98641866f38b7c043/jaraco_functools-4.5.0-py3-none-any.whl", hash = "sha256:79ce39246eddbde4b3a03b77ea5f0f7878dc669b166a66cf3fa8e266aa3fa2f4", upload-time = "2026-05-15T21:34:08.595Z" }, +] + +[[package]] +name = "jeepney" +version = "0.9.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", upload-time = "2025-02-27T18:51:01.684Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", upload-time = "2025-02-27T18:51:00.104Z" }, +] + +[[package]] +name = "joserfc" +version = "1.7.1" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "cryptography" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/44/90/25cb27518750218e4f850be63d8bbb2343efaad1c01c3571aaa4b3c33bd7/joserfc-1.7.1.tar.gz", hash = "sha256:77d0b76514879c68c6f433bc5b7357a4ab72008ff1e33d8379fd11d72bd8ca81", upload-time = "2026-06-08T07:21:33.412Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/b3/00/fa62404c3e347f946faa13aa21085205f9cc06ad17671e37f81a51662ae8/joserfc-1.7.1-py3-none-any.whl", hash = "sha256:b3e3d655612e2e1ef67b2600f2f420e12e537b020208fab1761fad647319c164", upload-time = "2026-06-08T07:21:32.001Z" }, +] + +[[package]] +name = "jsonref" +version = "1.1.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/aa/0d/c1f3277e90ccdb50d33ed5ba1ec5b3f0a242ed8c1b1a85d3afeb68464dca/jsonref-1.1.0.tar.gz", hash = "sha256:32fe8e1d85af0fdefbebce950af85590b22b60f9e95443176adbde4e1ecea552", upload-time = "2023-01-16T16:10:04.455Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/0c/ec/e1db9922bceb168197a558a2b8c03a7963f1afe93517ddd3cf99f202f996/jsonref-1.1.0-py3-none-any.whl", hash = "sha256:590dc7773df6c21cbf948b5dac07a72a251db28b0238ceecce0a2abfa8ec30a9", upload-time = "2023-01-16T16:10:02.255Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version < '3.11'" }, + { name = "rpds-py", version = "2026.5.1", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", upload-time = "2026-01-07T13:41:07.246Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", upload-time = "2026-01-07T13:41:05.306Z" }, +] + +[[package]] +name = "jsonschema-path" +version = "0.5.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "attrs" }, + { name = "pathable" }, + { name = "pyyaml" }, + { name = "referencing" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/39/79/cd02a4df6d9270efdc7d3feefe6edd730b0820c39eeaa107a2faee8322d5/jsonschema_path-0.5.0.tar.gz", hash = "sha256:493b156ba895c97602655b620a8456caa2ce08c1aa389f5a7addec065e6e855c", upload-time = "2026-05-19T20:45:00.971Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/04/2c/9e69d73c4297508be9e3b64a970ea3971b3eb8db64ffc5802d40bd25981f/jsonschema_path-0.5.0-py3-none-any.whl", hash = "sha256:2790a070bc7abb08ea3dbe4d340ece4efadf639223001f020c7503229ba068e2", upload-time = "2026-05-19T20:44:59.225Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "keyring" +version = "25.7.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.12'" }, + { name = "jaraco-classes" }, + { name = "jaraco-context" }, + { name = "jaraco-functools" }, + { name = "jeepney", marker = "sys_platform == 'linux'" }, + { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, + { name = "secretstorage", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", upload-time = "2025-11-16T16:26:09.482Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", upload-time = "2025-11-16T16:26:08.402Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[package]] +name = "mcp" +version = "1.27.2" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "anyio" }, + { name = "httpx" }, + { name = "httpx-sse" }, + { name = "jsonschema" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "python-multipart" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, + { name = "sse-starlette" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, + { name = "uvicorn", marker = "sys_platform != 'emscripten'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/27/3c/347cf965d313f5d41764e7d46bea6ffe7d9ef13b983cc429b0340962a082/mcp-1.27.2.tar.gz", hash = "sha256:8e02db104096d1c25b28e64bde29a5c32b31bc241710213e12fd4d84985bdfef", upload-time = "2026-05-29T17:16:04.039Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/c9/11/252c6f971dc4f16af1d98a1c469d8ba523aab00d1bb76b4d3bc1ff32eacc/mcp-1.27.2-py3-none-any.whl", hash = "sha256:d6ff5160c6ca65d93013626efb3fc249de683c30b2d8570755ceddd490344de5", upload-time = "2026-05-29T17:16:02.442Z" }, +] + +[[package]] +name = "mcp-ontobricks" +version = "1.0.0" +source = { editable = "." } +dependencies = [ + { name = "databricks-sdk" }, + { name = "fastapi" }, + { name = "fastmcp" }, + { name = "httpx" }, + { name = "pydantic" }, + { name = "uvicorn" }, +] + +[package.dev-dependencies] +dev = [ + { name = "anyio" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, +] + +[package.metadata] +requires-dist = [ + { name = "databricks-sdk", specifier = ">=0.20.0" }, + { name = "fastapi", specifier = ">=0.115.0" }, + { name = "fastmcp", specifier = ">=2.3.1" }, + { name = "httpx", specifier = ">=0.25.0" }, + { name = "pydantic", specifier = ">=2" }, + { name = "uvicorn", specifier = ">=0.34.0" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "anyio", specifier = ">=4.13.0" }, + { name = "pytest", specifier = ">=9.1.0" }, + { name = "pytest-asyncio", specifier = ">=1.4.0" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "more-itertools" +version = "11.1.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/de/1d/f4da6f02cdffe04d6362210b807146a26044c88d839208aec273bb0d9184/more_itertools-11.1.0.tar.gz", hash = "sha256:48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d", upload-time = "2026-05-22T14:14:29.909Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl", hash = "sha256:4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192", upload-time = "2026-05-22T14:14:28.824Z" }, +] + +[[package]] +name = "openapi-pydantic" +version = "0.5.1" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "pydantic" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/02/2e/58d83848dd1a79cb92ed8e63f6ba901ca282c5f09d04af9423ec26c56fd7/openapi_pydantic-0.5.1.tar.gz", hash = "sha256:ff6835af6bde7a459fb93eb93bb92b8749b754fc6e51b2f1590a19dc3005ee0d", upload-time = "2025-01-08T19:29:27.083Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/12/cf/03675d8bd8ecbf4445504d8071adab19f5f993676795708e36402ab38263/openapi_pydantic-0.5.1-py3-none-any.whl", hash = "sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146", upload-time = "2025-01-08T19:29:25.275Z" }, +] + +[[package]] +name = "opentelemetry-api" +version = "1.42.1" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b4/1c/125e1c936c0873796771b7f04f6c93b9f1bf5d424cea90fda94a99f61da8/opentelemetry_api-1.42.1.tar.gz", hash = "sha256:56c63bea9f77b62856be8c47600474acad853b2924b99b1687c4cb6297166716", upload-time = "2026-05-21T16:32:49.335Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/a3/ca/9520cc1f3dfbbd03ac5903bbf55833e257bc64b1cf30fa8b0d6df374d821/opentelemetry_api-1.42.1-py3-none-any.whl", hash = "sha256:51a69edacadbc03a8950ace1c4c21099cacc538820ac2c9e36277e78cebba714", upload-time = "2026-05-21T16:32:28.822Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pathable" +version = "0.6.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/66/f3/5a20387de9bcd0607871bfc2198ee0e15836da7baa4592ccd7f24c27c986/pathable-0.6.0.tar.gz", hash = "sha256:6404b8b82aef5ff0fd478934137128b99b12212ba35afdde5525ca4f8388ea58", upload-time = "2026-05-19T18:15:11.911Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/a2/e8/6d75ffd9784bce2e93d1ae4415649427e39a53bb172d4672b2b59c6f0a7b/pathable-0.6.0-py3-none-any.whl", hash = "sha256:82c4ca6c98c502ad12e0d4e9779b6210afee93c38990988c8c5d1b49bdcdf566", upload-time = "2026-05-19T18:15:10.728Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.10.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", upload-time = "2026-05-28T03:32:53.587Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", upload-time = "2026-05-28T03:32:52.175Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "protobuf" +version = "6.33.6" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/66/70/e908e9c5e52ef7c3a6c7902c9dfbb34c7e29c25d2f81ade3856445fd5c94/protobuf-6.33.6.tar.gz", hash = "sha256:a6768d25248312c297558af96a9f9c929e8c4cee0659cb07e780731095f38135", upload-time = "2026-03-18T19:05:00.988Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/fc/9f/2f509339e89cfa6f6a4c4ff50438db9ca488dec341f7e454adad60150b00/protobuf-6.33.6-cp310-abi3-win32.whl", hash = "sha256:7d29d9b65f8afef196f8334e80d6bc1d5d4adedb449971fefd3723824e6e77d3", upload-time = "2026-03-18T19:04:48.373Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/76/5d/683efcd4798e0030c1bab27374fd13a89f7c2515fb1f3123efdfaa5eab57/protobuf-6.33.6-cp310-abi3-win_amd64.whl", hash = "sha256:0cd27b587afca21b7cfa59a74dcbd48a50f0a6400cfb59391340ad729d91d326", upload-time = "2026-03-18T19:04:50.381Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5c/01/a3c3ed5cd186f39e7880f8303cc51385a198a81469d53d0fdecf1f64d929/protobuf-6.33.6-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:9720e6961b251bde64edfdab7d500725a2af5280f3f4c87e57c0208376aa8c3a", upload-time = "2026-03-18T19:04:51.866Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ee/90/b3c01fdec7d2f627b3a6884243ba328c1217ed2d978def5c12dc50d328a3/protobuf-6.33.6-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:e2afbae9b8e1825e3529f88d514754e094278bb95eadc0e199751cdd9a2e82a2", upload-time = "2026-03-18T19:04:53.096Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9b/ca/25afc144934014700c52e05103c2421997482d561f3101ff352e1292fb81/protobuf-6.33.6-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c96c37eec15086b79762ed265d59ab204dabc53056e3443e702d2681f4b39ce3", upload-time = "2026-03-18T19:04:54.616Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/16/92/d1e32e3e0d894fe00b15ce28ad4944ab692713f2e7f0a99787405e43533a/protobuf-6.33.6-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:e9db7e292e0ab79dd108d7f1a94fe31601ce1ee3f7b79e0692043423020b0593", upload-time = "2026-03-18T19:04:55.768Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c4/72/02445137af02769918a93807b2b7890047c32bfb9f90371cbc12688819eb/protobuf-6.33.6-py3-none-any.whl", hash = "sha256:77179e006c476e69bf8e8ce866640091ec42e1beb80b213c3900006ecfba6901", upload-time = "2026-03-18T19:04:59.826Z" }, +] + +[[package]] +name = "py-key-value-aio" +version = "0.4.5" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "beartype" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/fb/e2/d689d922894a7ecde73b6daeaf9b13dab5aae06fe6aaaf7514722644d382/py_key_value_aio-0.4.5.tar.gz", hash = "sha256:c6563a2c6abe5da5e20f4f9e875c2a9b425a2244a54fadbf46cf140a9eea45d7", upload-time = "2026-05-27T16:37:08.107Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/f6/95/b8ba862968712caa12a19666175334fa979e1f198b896a430adb3bacfe87/py_key_value_aio-0.4.5-py3-none-any.whl", hash = "sha256:ab862adbcb8c72547d1c57821f22cbbb71ab86509039c96f36e914e0336c8dd7", upload-time = "2026-05-27T16:37:06.629Z" }, +] + +[package.optional-dependencies] +filetree = [ + { name = "aiofile", version = "3.9.0", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version < '3.11'" }, + { name = "aiofile", version = "3.11.1", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "anyio" }, +] +keyring = [ + { name = "keyring" }, +] +memory = [ + { name = "cachetools" }, +] + +[[package]] +name = "pyasn1" +version = "0.6.3" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", upload-time = "2026-03-17T01:06:53.382Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", upload-time = "2026-03-17T01:06:52.036Z" }, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", upload-time = "2025-03-28T02:41:22.17Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", upload-time = "2025-03-28T02:41:19.028Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pydantic" +version = "2.13.4" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", upload-time = "2026-05-06T13:43:05.343Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", upload-time = "2026-05-06T13:43:02.641Z" }, +] + +[package.optional-dependencies] +email = [ + { name = "email-validator" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.4" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/e7/08/f1ba952f1c8ae5581c70fa9c6da89f247b83e3dd8c09c035d5d7931fc23d/pydantic_core-2.46.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a396dcc17e5a0b164dbe026896245a4fa9ff402edca1dff0be3d53a517f74de4", upload-time = "2026-05-06T13:37:36.537Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/56/c6/65f646c7ff09bd257f660434adb45c4dfcbbcebcc030562fecf6f5bf887d/pydantic_core-2.46.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da4b951fe36dc7c3a1ccb4e3cd1747c3542b8c9ceede8fc86cae054e764485f5", upload-time = "2026-05-06T13:37:46.365Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/64/ba/bfb1d928fd5b49e1258935ff104ae356e9fd89384a55bf9f847e9193ad40/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63e0198ca18aad131c089b9204c23079c3afa95487e561f4c522d519e55aba", upload-time = "2026-05-06T13:37:28.611Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4e/74/76223bfb117b64af743c9b6670d1364516f5c0604f96b48f3272f6af6cc6/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f47286a97f0bc9b8859519809077b91b2cefe4ae47fcbf5e466a009c1c5d742b", upload-time = "2026-05-06T13:36:55.216Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/cb/7b/848732968bc8f48f3187542f08358b9d842db564147b256669426ebb1652/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:905a0ed8ea6f2d61c1738835f99b699348d7857379083e5fc497fa0c967a407c", upload-time = "2026-05-06T13:38:25.455Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b5/2f/e90b63ee2e14bd8d3db8f705a6d75d64e6ee1b7c2c8833747ce706e1e0ce/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea793e075b70290d89d8142074262885d3f7da19634845135751bd6344f73b50", upload-time = "2026-05-06T13:37:53.304Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ba/1e/acc4d70f88a0a277e4a1fa77ebb985ceabaf900430f875bf9338e11c9420/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395aebd9183f9d112f569aeb5b2214d1a10a33bec8456447f7fbdfa51d38d4cd", upload-time = "2026-05-06T13:38:46.981Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a9/da/0a422b57bf8504102bf3c4ccea9c41bab5a5cee6a54650acf8faf67f5a24/pydantic_core-2.46.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:b078afbc25f3a1436c7a1d2cd3e322497ee99615ba97c563566fdf46aff1ee01", upload-time = "2026-05-06T13:39:23.146Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/bd/2a/2ac13c3af305843e23c5078c53d135656b3f05a2fd78cb7bbbb12e97b473/pydantic_core-2.46.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f747929cf940cddb5b3668a390056ddd5ba2e5010615ea2dcf4f9c4f3ab8791d", upload-time = "2026-05-06T13:40:08.06Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/72/04/2beacf7e1607e93eefe4aed1b4709f079b905fb77530179d4f7c71745f22/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:daa27d92c36f24388fe3ad306b174781c747627f134452e4f128ea00ce1fe8c4", upload-time = "2026-05-06T13:38:13.901Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9e/29/d2b9fd9f539133548eaf622c06a4ce176cb46ac59f32d0359c4abc0de047/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:19e51f073cd3df251856a8a4189fbdf1de4012c3ebacfb1884f94f1eb406079f", upload-time = "2026-05-06T13:39:08.24Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7c/af/0f7a5b85fec6075bea96e3ef9187de38fccced0de92c1e7feda8d5cc7bb9/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1747f85cee84c26985853c6f3d9bd3e75da5212912443fa111c113b9c246f39", upload-time = "2026-05-06T13:38:43.2Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/25/a4/73363fec545fd3ec025490bdda2743c56d0dd5b6266b1a53bbe9e4265375/pydantic_core-2.46.4-cp310-cp310-win32.whl", hash = "sha256:2f84c03c8607173d16b5a854ec68a2f9079ae03237a54fb506d13af47e1d018d", upload-time = "2026-05-06T13:39:25.497Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/01/aa/62f082da2c91fac1c234bc9ee0066257ce83f0604abd72e4c9d5991f2d84/pydantic_core-2.46.4-cp310-cp310-win_amd64.whl", hash = "sha256:8358a950c8909158e3df31538a7e4edc2d7265a7c54b47f0864d9e5bae9dcebf", upload-time = "2026-05-06T13:39:59.922Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594", upload-time = "2026-05-06T13:40:27.596Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", upload-time = "2026-05-06T13:39:12.574Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", upload-time = "2026-05-06T13:38:19.841Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", upload-time = "2026-05-06T13:38:10.447Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", upload-time = "2026-05-06T13:40:13.089Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", upload-time = "2026-05-06T13:38:59.224Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", upload-time = "2026-05-06T13:38:17.762Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", upload-time = "2026-05-06T13:37:58.195Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/99/61/de4f55db8dfd57bfdfa9a12ec90fe1b57c4f41062f7ca86f08586b3e0ac0/pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3", upload-time = "2026-05-06T13:37:01.167Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", upload-time = "2026-05-06T13:38:45.04Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", upload-time = "2026-05-06T13:37:15.539Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", upload-time = "2026-05-06T13:37:30.099Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c4/67/6acaa1be2567f9256b056d8477158cac7240813956ce86e49deae8e173b4/pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda", upload-time = "2026-05-06T13:38:15.669Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33", upload-time = "2026-05-06T13:40:35.416Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0f/da/7a263a96d965d9d0df5e8de8a475f33495451117035b09acb110288c381f/pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d", upload-time = "2026-05-06T13:38:29.754Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/51/a2/5d30b469c5267a17b39dec53208222f76a8d351dfac4af661888c5aee77d/pydantic_core-2.46.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:5d5902252db0d3cedf8d4a1bc68f70eeb430f7e4c7104c8c476753519b423008", upload-time = "2026-05-06T13:37:48.029Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c1/81/4fa520eaffa8bd7d1525e644cd6d39e7d60b1592bc5b516693c7340b50f1/pydantic_core-2.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c94f0688e7b8d0a67abf40e57a7eaaecd17cc9586706a31b76c031f63df052b4", upload-time = "2026-05-06T13:37:17.012Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/03/d5/fd02da45b659668b05923b17ba3a0100a0a3d5541e3bd8fcc4ecb711309e/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f027324c56cd5406ca49c124b0db10e56c69064fec039acc571c29020cc87c76", upload-time = "2026-05-06T13:37:35.113Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/21/f2/95727e1368be3d3ed485eaab7adbd7dda408f33f7a36e8b48e0144002b91/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e739fee756ba1010f8bcccb534252e85a35fe45ae92c295a06059ce58b74ccd3", upload-time = "2026-05-06T13:37:12.313Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9c/86/5d99feea3f77c7234b8718075b23db11532773c1a0dbd9b9490215dc2eeb/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d56801be94b86a9da183e5f3766e6310752b99ff647e38b09a9500d88e46e76", upload-time = "2026-05-06T13:39:01.149Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d2/3a/508ac615935ef7588cf6d9e9b91309fdc2da751af865e02a9098de88258c/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2412e734dcb48da14d4e4006b82b46b74f2518b8a26ee7e58c6844a6cd6d03c4", upload-time = "2026-05-06T13:37:41.406Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/07/f8/41db9de19d7987d6b04715a02b3b40aea467000275d9d758ffaa31af7d50/pydantic_core-2.46.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9551187363ffc0de2a00b2e47c25aeaeb1020b69b668762966df15fc5659dd5a", upload-time = "2026-05-06T13:39:18.847Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2c/e2/f35033184cb11d0052daf4416e8e10a502ea2ac006fc4f459aee872727d1/pydantic_core-2.46.4-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:0186750b482eefa11d7f435892b09c5c606193ef3375bcf94aa00ae6bfb66262", upload-time = "2026-05-06T13:40:17.944Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7e/7b/6ceeb1cc90e193862f444ebe373d8fdf613f0a82572dde03fb10734c6c71/pydantic_core-2.46.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5855698a4856556d86e8e6cd8434bc3ac0314ee8e12089ae0e143f64c6256e4e", upload-time = "2026-05-06T13:40:32.618Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5a/f2/c8d7773ede6af08036423a00ae0ceffce266c3c52a096c435d68c896083f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cbaf13819775b7f769bf4a1f066cb6df7a28d4480081a589828ef190226881cd", upload-time = "2026-05-06T13:36:51.018Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/59/31/0c864784e31f09f05cdd87606f08923b9c9e7f6e51dd27f20f62f975ce9f/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:633147d34cf4550417f12e2b1a0383973bdf5cdfde212cb09e9a581cf10820be", upload-time = "2026-05-06T13:40:37.764Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c2/eb/4f6c8a41efa30baa755590f4141abf3a8c370fab610915733e74134a7270/pydantic_core-2.46.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:82cf5301172168103724d49a1444d3378cb20cdee30b116a1bd6031236298a5d", upload-time = "2026-05-06T13:39:34.152Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5b/24/b375a480d53113860c299764bfe9f349a3dc9108b3adc0d7f0d786492ebf/pydantic_core-2.46.4-cp313-cp313-win32.whl", hash = "sha256:9fa8ae11da9e2b3126c6426f147e0fba88d96d65921799bb30c6abd1cb2c97fb", upload-time = "2026-05-06T13:37:55.072Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7e/e8/cff247591966f2d22ec8c003cd7587e27b7ba7b81ab2fb888e3ab75dc285/pydantic_core-2.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:6b3ace8194b0e5204818c92802dcdca7fc6d88aabbb799d7c795540d9cd6d292", upload-time = "2026-05-06T13:38:49.139Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c6/1a/f4aee670d5670e9e148e0c82c7db98d780be566c6e6a97ee8035528ca0b3/pydantic_core-2.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:184c081504d17f1c1066e430e117142b2c77d9448a97f7b65c6ac9fd9aee238d", upload-time = "2026-05-06T13:40:45.796Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8d/74/228a26ddad29c6672b805d9fd78e8d251cd04004fa7eed0e622096cd0250/pydantic_core-2.46.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:428e04521a40150c85216fc8b85e8d39fece235a9cf5e383761238c7fa9b96fb", upload-time = "2026-05-06T13:38:41.019Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ad/1f/8970b150a4b4365623ae00fc88603491f763c627311ae8031e3111356d6e/pydantic_core-2.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23ace664830ee0bfe014a0c7bc248b1f7f25ed7ad103852c317624a1083af462", upload-time = "2026-05-06T13:36:59.812Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/95/30/5211a831ae054928054b2f79731661087a2bc5c01e825c672b3a4a8f1b3e/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce5c1d2a8b27468f433ca974829c44060b8097eedc39933e3c206a90ee49c4a9", upload-time = "2026-05-06T13:37:39.933Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/57/e9/689668733b1eb67adeef047db3c2e8788fcf65a7fd9c9e2b46b7744fe245/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7283d57845ecf5a163403eb0702dfc220cc4fbdd18919cb5ccea4f95ee1cdab4", upload-time = "2026-05-06T13:38:01.995Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/60/d9/6715260422ff50a2109878fd24d948a6c3446bb2664f34ee78cd972b3acd/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8daafc69c93ee8a0204506a3b6b30f586ef54028f52aeeeb5c4cfc5184fd5914", upload-time = "2026-05-06T13:40:50.371Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/18/ae/fdb2f64316afca925640f8e70bb1a564b0ec2721c1389e25b8eb4bf9a299/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2213145bcc2ba85884d0ac63d222fece9209678f77b9b4d76f054c561adb28", upload-time = "2026-05-06T13:37:21.531Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/89/1d/8eff589b45bb8190a9d12c49cfad0f176a5cbd1534908a6b5125e2886239/pydantic_core-2.46.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a5f930472650a82629163023e630d160863fce524c616f4e5186e5de9d9a49b", upload-time = "2026-05-06T13:39:31.942Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/06/d5/ee5a3366637fee41dee51a1fc91562dcf12ddbc68fda34e6b253da2324bb/pydantic_core-2.46.4-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:c1b3f518abeca3aa13c712fd202306e145abf59a18b094a6bafb2d2bbf59192c", upload-time = "2026-05-06T13:37:25.033Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/94/33/2414be571d2c6a6c4d08be21f9292b6d3fdb08949a97b6dfe985017821db/pydantic_core-2.46.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a7dd0b3ee80d90150e3495a3a13ac34dbcbfd4f012996a6a1d8900e91b5c0fb", upload-time = "2026-05-06T13:37:14.046Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7b/79/7daa95be995be0eecc4cf75064cb33f9bbbfe3fe0158caf2f0d4a996a5c7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:3fb702cd90b0446a3a1c5e470bfa0dd23c0233b676a9099ddcc964fa6ca13898", upload-time = "2026-05-06T13:36:53.615Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9f/cb/d0a382f5c0de8a222dc61c65348e0ce831b1f68e0a018450d31c2cace3a5/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b8458003118a712e66286df6a707db01c52c0f52f7db8e4a38f0da1d3b94fc4e", upload-time = "2026-05-06T13:40:29.971Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/05/db/d9ba624cc4a5aced1598e88c04fdbd8310c8a69b9d38b9a3d39ce3a61ed7/pydantic_core-2.46.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:372429a130e469c9cd698925ce5fc50940b7a1336b0d82038e63d5bbc4edc519", upload-time = "2026-05-06T13:37:23.027Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f2/20/d15df15ba918c423461905802bfd2981c3af0bfa0e40d05e13edbfa48bc3/pydantic_core-2.46.4-cp314-cp314-win32.whl", hash = "sha256:85bb3611ff1802f3ee7fdd7dbff26b56f343fb432d57a4728fdd49b6ef35e2f4", upload-time = "2026-05-06T13:38:03.499Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fc/b6/6b8de4c0a7d7ab3004c439c80c5c1e0a3e8d78bbae19379b01960383d9e5/pydantic_core-2.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:811ff8e9c313ab425368bcbb36e5c4ebd7108c2bbf4e4089cfbb0b01eff63fac", upload-time = "2026-05-06T13:39:40.807Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/32/36/51eb763beec1f4cf59b1db243a7dcc39cbb41230f050a09b9d69faaf0a48/pydantic_core-2.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:bfec22eab3c8cc2ceec0248aec886624116dc079afa027ecc8ad4a7e62010f8a", upload-time = "2026-05-06T13:37:26.72Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e8/91/855af51d625b23aa987116a19e231d2aaef9c4a415273ddc189b79a45fee/pydantic_core-2.46.4-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:af8244b2bef6aaad6d92cda81372de7f8c8d36c9f0c3ea36e827c60e7d9467a0", upload-time = "2026-05-06T13:39:47.682Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fb/1b/8784a54c65edb5f49f0a14d6977cf1b209bba85a4c77445b255c2de58ab3/pydantic_core-2.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a4330cdbc57162e4b3aa303f588ba752257694c9c9be3e7ebb11b4aca659b5d", upload-time = "2026-05-06T13:40:40.428Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e8/e7/1955d28d1afc56dd4b3ad7cc0cf39df1b9852964cf16e5d13912756d6d6b/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29c61fc04a3d840155ff08e475a04809278972fe6aef51e2720554e96367e34b", upload-time = "2026-05-06T13:37:32.029Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/93/e2/3fedbf0ba7a22850e6e9fd78117f1c0f10f950182344d8a6c535d468fdd8/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c50f2528cf200c5eed56faf3f4e22fcd5f38c157a8b78576e6ba3168ec35f000", upload-time = "2026-05-06T13:38:55.239Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f8/61/46be275fcaaba0b4f5b9669dd852267ce1ff616592dccf7a7845588df091/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cbe8b01f948de4286c74cdd6c667aceb38f5c1e26f0693b3983d9d74887c65e", upload-time = "2026-05-06T13:37:08.096Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/60/db/12e93e46a8bac9988be3c016860f83293daea8c716c029c9ace279036f2f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:617d7e2ca7dcb8c5cf6bcb8c59b8832c94b36196bbf1cbd1bfb56ed341905edd", upload-time = "2026-05-06T13:40:20.221Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e2/4a/4d8b19008f38d31c53b8219cfedc2e3d5de5fe99d90076b7e767de29274f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7027560ee92211647d0d34e3f7cd6f50da56399d26a9c8ad0da286d3869a53f3", upload-time = "2026-05-06T13:38:12.153Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/88/70/3cbc40978fefb7bb09c6708d40d4ad1a5d70fd7213c3d17f971de868ec1f/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:f99626688942fb746e545232e7726926f3be91b5975f8b55327665fafda991c7", upload-time = "2026-05-06T13:40:02.971Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9d/20/b8d36736216e29491125531685b2f9e61aa5b4b2599893f8268551da3338/pydantic_core-2.46.4-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fc3e9034a63de20e15e8ade85358bc6efc614008cab72898b4b4952bea0509ff", upload-time = "2026-05-06T13:39:27.506Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1d/a2/367df868eb584dacf6bf82a389272406d7178e301c4ac82545ab98bc2dd9/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:97e7cf2be5c77b7d1a9713a05605d49460d02c6078d38d8bef3cbe323c548424", upload-time = "2026-05-06T13:38:31.93Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c1/b8/4460f77f7e201893f649a29ab355dddd3beee8a97bcb1a320db414f9a06e/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:3bf92c5d0e00fefaab325a4d27828fe6b6e2a21848686b5b60d2d9eeb09d76c6", upload-time = "2026-05-06T13:37:44.717Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/64/c4/be2639293acd87dc8ddbcec41a73cee9b2ebf996fe6d892a1a74e88ad3f7/pydantic_core-2.46.4-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:3ecbc122d18468d06ca279dc26a8c2e2d5acb10943bb35e36ae92096dc3b5565", upload-time = "2026-05-06T13:37:05.645Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/30/a6/9f9f380dbb301f67023bf8f707aaa75daadf84f7152d95c410fd7e81d994/pydantic_core-2.46.4-cp314-cp314t-win32.whl", hash = "sha256:e846ae7835bf0703ae43f534ab79a867146dadd59dc9ca5c8b53d5c8f7c9ef02", upload-time = "2026-05-06T13:38:51.116Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/40/1f/f1eb9eb350e795d1af8586289746f5c5677d16043040d63710e22abc43c9/pydantic_core-2.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:2108ba5c1c1eca18030634489dc544844144ee36357f2f9f780b93e7ddbb44b5", upload-time = "2026-05-06T13:38:21.672Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f6/d2/42dd53d0a85c27606f316d3aa5d2869c4e8470a5ed6dec30e4a1abe19192/pydantic_core-2.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:4fcbe087dbc2068af7eda3aa87634eba216dbda64d1ae73c8684b621d33f6596", upload-time = "2026-05-06T13:40:52.723Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ee/a4/73995fd4ebbb46ba0ee51e6fa049b8f02c40daebb762208feda8a6b7894d/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c", upload-time = "2026-05-06T13:37:10.817Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", upload-time = "2026-05-06T13:36:56.717Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", upload-time = "2026-05-06T13:39:06.207Z" }, + { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-05-06T13:39:45.476Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-05-06T13:39:29.883Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/11/cb/428de0385b6c8d44b716feba566abfacfbd23ee3c4439faa789a1456242f/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0", upload-time = "2026-05-06T13:37:04.016Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", upload-time = "2026-05-06T13:39:43.092Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", upload-time = "2026-05-06T13:36:58.124Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/de/df/5e5ffc085ed07cc22d298134d3d911c63e91f6a0eb91fe646750a3209910/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9", upload-time = "2026-05-06T13:37:49.88Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", upload-time = "2026-05-06T13:37:43.053Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", upload-time = "2026-05-06T13:37:56.694Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", upload-time = "2026-05-06T13:40:05.667Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", upload-time = "2026-05-06T13:38:08.682Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.14.1" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/07/60/1d1e59c9c90d54591469ada7d268251f71c24bdb765f1a8a832cee8c6653/pydantic_settings-2.14.1.tar.gz", hash = "sha256:e874d3bec7e787b0c9958277956ed9b4dd5de6a80e162188fdaff7c5e26fd5fa", upload-time = "2026-05-08T13:40:06.542Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/ae/8d/f1af3832f5e6eb13ba94ee809e72b8ecb5eef226d27ee0bef7d963d943c7/pydantic_settings-2.14.1-py3-none-any.whl", hash = "sha256:6e3c7edfd8277687cdc598f56e5cff0e9bfff0910a3749deaa8d4401c3a2b9de", upload-time = "2026-05-08T13:40:04.958Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pyjwt" +version = "2.13.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/3b/81/58d0ac84e1ef3a3843791d6954d94c0b33d526c75eeb1efbce9d0a4c4077/pyjwt-2.13.0.tar.gz", hash = "sha256:41571c89ca91598c79e8ef18a2d07367d4810fbbd6f637794879baf1b7703423", upload-time = "2026-05-21T19:54:36.618Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/a3/5e/ecf12fdb62546d64385c158514e9b2b671f7832108ef2ecd2020ce0af2d1/pyjwt-2.13.0-py3-none-any.whl", hash = "sha256:66adcc2aff09b3f1bbd95fc1e1577df8ac8723c978552fd43304c8a290ac5728", upload-time = "2026-05-21T19:54:35.362Z" }, +] + +[package.optional-dependencies] +crypto = [ + { name = "cryptography" }, +] + +[[package]] +name = "pyperclip" +version = "1.11.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/e8/52/d87eba7cb129b81563019d1679026e7a112ef76855d6159d24754dbd2a51/pyperclip-1.11.0.tar.gz", hash = "sha256:244035963e4428530d9e3a6101a1ef97209c6825edab1567beac148ccc1db1b6", upload-time = "2025-09-26T14:40:37.245Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/df/80/fc9d01d5ed37ba4c42ca2b55b4339ae6e200b456be3a1aaddf4a9fa99b8c/pyperclip-1.11.0-py3-none-any.whl", hash = "sha256:299403e9ff44581cb9ba2ffeed69c7aa96a008622ad0c46cb575ca75b5b84273", upload-time = "2025-09-26T14:40:36.069Z" }, +] + +[[package]] +name = "pytest" +version = "9.1.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/84/0e/b5858858d74958632c49b72cb25a3976ff9f632397626715be71c89d3971/pytest-9.1.0.tar.gz", hash = "sha256:41dd9148c08072446394cefd3d79701701335a9f4cae69ba92e39f6c7f5c061c", upload-time = "2026-06-13T18:52:45.983Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/8b/5a/ba30a81239b909821b3153e303e7def45178bf353da4f72380e6c5e8793b/pytest-9.1.0-py3-none-any.whl", hash = "sha256:8ebb0e7888bdf2bdfc602ec51f8f62d50200af37356c74e503c79a94f5c81f32", upload-time = "2026-06-13T18:52:44.045Z" }, +] + +[[package]] +name = "pytest-asyncio" +version = "1.4.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "backports-asyncio-runner", marker = "python_full_version < '3.11'" }, + { name = "pytest" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/43/7c/d36d04db312ecf4298932ef77e6e4a9e8ad017906e24e34f0b0c361a2473/pytest_asyncio-1.4.0.tar.gz", hash = "sha256:c6c0d2259945122819f171a32ecea2c349ead889ee28176caaf492143424be42", upload-time = "2026-05-26T09:56:04.083Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/03/e2/08a497ef684b88559c9cc5f4ad53a37e7b99e727094a86d6ea32536d5d3c/pytest_asyncio-1.4.0-py3-none-any.whl", hash = "sha256:933ca923a23075a87fb7070c0ec272a6848489824d887c85c812670932835aa1", upload-time = "2026-05-26T09:56:02.576Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.2.2" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", upload-time = "2026-03-01T16:00:26.196Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", upload-time = "2026-03-01T16:00:25.09Z" }, +] + +[[package]] +name = "python-multipart" +version = "0.0.32" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/5b/42/55c32bb9b12693c092ad250a0e82edb5b31ddeda6eb772de5f308b3804ad/python_multipart-0.0.32.tar.gz", hash = "sha256:be54b7f3fa167bb83e4fcd936b887b708f4e57fe75911c02aebf53efaf8d938e", upload-time = "2026-06-04T16:18:58.647Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/e1/04/e8135ebd1ad02c56ec633277529b2602ff99ff634be76cdba5744cf554fd/python_multipart-0.0.32-py3-none-any.whl", hash = "sha256:ff6d3f776f16878c894e52e107296ffc890e913c611b1a4ec6c44e2821fe2e23", upload-time = "2026-06-04T16:18:57.319Z" }, +] + +[[package]] +name = "pywin32" +version = "312" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/fe/1b/9cfdeac80ee45bebbbcb31f1b7b99a0d81a1c72de48d837be984e0e88b1d/pywin32-312-cp310-cp310-win32.whl", hash = "sha256:772235332b5d1024c696f11cea1ae4be7930f0a8b894bb43db14e3f435f1ff7e", upload-time = "2026-06-04T07:49:14.329Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/33/b1/7afc96d041d982c27bc2df6f853d43f01fd273e3d39d04be3647ddeb533d/pywin32-312-cp310-cp310-win_amd64.whl", hash = "sha256:5dbc35d2b5320dc07f25fa31269cfb767471002b17de5eb067d03da68c7cb2db", upload-time = "2026-06-04T07:49:16.881Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ce/3a/4140da9ad54108e517f4a16b2d83da3033e08662144623e1239587cb7db6/pywin32-312-cp310-cp310-win_arm64.whl", hash = "sha256:3020656e34f1cf7faeb7bccd2b84653a607c6ff0c55ada85e6487d61716deabd", upload-time = "2026-06-04T07:49:18.993Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1f/f5/10a6e845a00fc5e7afd0a988b744f403d4d57162a28d160a093c4d9322f0/pywin32-312-cp311-cp311-win32.whl", hash = "sha256:17948aeadbdb091f0ced6ef0841620794e68327b94ee415571c1203594b7215c", upload-time = "2026-06-04T07:49:21.349Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/35/c4/dcd2d62b5944b6d5db53413a5899016ccd57ffcb7278f3f81655d25d2027/pywin32-312-cp311-cp311-win_amd64.whl", hash = "sha256:d11417d84412f859b722fad0841b3614459ed0047f7542d8362e77884f6b6e8a", upload-time = "2026-06-04T07:49:23.934Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b7/56/3cbb433fe4501cdba2eb9040f56a4e1a8243faa4186b25295564d1a7a79d/pywin32-312-cp311-cp311-win_arm64.whl", hash = "sha256:b2200a054ca6d6625c4842fc56a4976a4b47f96b73dbe5538c3f813a80359f47", upload-time = "2026-06-04T07:49:26.416Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/83/ff/32aa7d2ed0ab12b323aaa64f9b75e6ad4f8fd09f9ccfc28c79414d46838d/pywin32-312-cp312-cp312-win32.whl", hash = "sha256:dab4f65ac9c4e48400a2a0530c46c3c579cd5905ecd11b80692373915269208b", upload-time = "2026-06-04T07:49:28.836Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/03/d9/77040d3b43df3f3be32ea289433d660d2727f5ba327bc73be835127d9d60/pywin32-312-cp312-cp312-win_amd64.whl", hash = "sha256:b457f6d628a47e8a7346ce22acb7e1a46a4a78b52e1d17e1af56871bd19a93bc", upload-time = "2026-06-04T07:49:31.85Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e3/cc/7b1ec671775756020a0ee7f4feeaf3c568f0ab86bd3900088cf986937a92/pywin32-312-cp312-cp312-win_arm64.whl", hash = "sha256:6017c58e12f6809fbb0555b75df144c2922a9ffd18e4b9b5afa863b6c1a9d950", upload-time = "2026-06-04T07:49:34.244Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2d/41/12fbfd7f36ed2146d8bc9de96c2741296bf0d490b98508496cff322e274c/pywin32-312-cp313-cp313-win32.whl", hash = "sha256:7a27df850933d16a8eabfbaeb73d52b273e2da667f80d70b01a89d1f6828d02c", upload-time = "2026-06-04T07:49:36.253Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ba/db/36a78e3403099d31d9746d13fdcde5accc43c1155f375a34d15983a479a7/pywin32-312-cp313-cp313-win_amd64.whl", hash = "sha256:c53e878d15a1c44788082bfe712a905433473aa38f86375b7cf8b45e3acbaaf9", upload-time = "2026-06-04T07:49:38.876Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/84/37/c1697194092b76de9ed47ca124323f02c57ffc8a45c06f88a3d5acaf01eb/pywin32-312-cp313-cp313-win_arm64.whl", hash = "sha256:59aba5d5940842075343a5ddc6b11f1cdf0d1567fe745290359dfbcc7c2eb831", upload-time = "2026-06-04T07:49:41.083Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fc/2b/1f3cded5822fd49c02f40544cbb5f58c7cfd6b1694869fd476cb6170ee97/pywin32-312-cp314-cp314-win32.whl", hash = "sha256:a77a90fbb6881238d2ca9c6fd797b25817f3768fe78d214a90137ff055a75f5b", upload-time = "2026-06-04T07:49:43.188Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/21/82/3bf86d2e2808902013132e1ce905a7da0da53790f3836c64bf44d55e24f3/pywin32-312-cp314-cp314-win_amd64.whl", hash = "sha256:a4dd3a848290ef724347b19f301045831d8e802fa4464f491b98b1e0a081432e", upload-time = "2026-06-04T07:49:45.34Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a4/0e/73f6d6800b4f27655abd9e9f6aaeaefcddb2b946e4674efa2bab184a7f7b/pywin32-312-cp314-cp314-win_arm64.whl", hash = "sha256:9fce94568364e0155e6dfb781ac5d95903be8baf28670632beab1b523f300daa", upload-time = "2026-06-04T07:49:47.613Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/eb/61/caa39686032d2ebdd04ff0ab5cbe163126c0066d98e00c9018646e42393b/pywin32-312-cp315-cp315-win32.whl", hash = "sha256:5c1fbe4a937a73ae9297384a3da38518cbc694c68ad8a809b2e19acd350f03ed", upload-time = "2026-06-04T07:49:50.035Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0f/cd/7e1de64a4a6f69c04214169657ccab0d93a670ea50e35eb8f489d7378249/pywin32-312-cp315-cp315-win_amd64.whl", hash = "sha256:c2f03a0f73f804a13c2735b99392b0cd426bb4f2c4d0178e5ac966a0f21618d5", upload-time = "2026-06-04T07:49:54.857Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/23/ed/4532e9388e65fa16b46776ef47ad631a64eda1631884488af707666350ed/pywin32-312-cp315-cp315-win_arm64.whl", hash = "sha256:a8597d28f267b39074aef51fa593530082b39cbe5a074226096857b1fed2dfb9", upload-time = "2026-06-04T07:49:57.531Z" }, +] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", upload-time = "2024-08-14T10:15:34.626Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", upload-time = "2024-08-14T10:15:33.187Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version < '3.11'" }, + { name = "rpds-py", version = "2026.5.1", source = { registry = "https://pypi-proxy.dev.databricks.com/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", upload-time = "2025-10-13T15:30:48.871Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", upload-time = "2025-10-13T15:30:47.625Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "rich-rst" +version = "2.0.1" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "pygments" }, + { name = "rich" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/57/56/3191bae66b08ccc637ea8120426068bcb361cc323c96404c310886937067/rich_rst-2.0.1.tar.gz", hash = "sha256:cbe236ed0901d1ec8427cc6a50bf0a34353ba28ad014dc24def68bfe7f3b9e68", upload-time = "2026-05-16T00:47:57.362Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/a0/3d/55c17d3ebdf3cd81356002afe5bef9bb8af631db2819785b6eac845b925b/rich_rst-2.0.1-py3-none-any.whl", hash = "sha256:7ee15f345ce25fa02b582c272a6cdbaf0c21243e38061cea273cff659bf3ef61", upload-time = "2026-05-16T00:47:55.508Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.30.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +resolution-markers = [ + "python_full_version < '3.11'", +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", upload-time = "2025-11-30T20:24:38.837Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", upload-time = "2025-11-30T20:21:33.256Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", upload-time = "2025-11-30T20:21:34.591Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", upload-time = "2025-11-30T20:21:36.122Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", upload-time = "2025-11-30T20:21:37.728Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", upload-time = "2025-11-30T20:21:38.92Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", upload-time = "2025-11-30T20:21:40.407Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", upload-time = "2025-11-30T20:21:42.17Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", upload-time = "2025-11-30T20:21:43.769Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", upload-time = "2025-11-30T20:21:44.994Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", upload-time = "2025-11-30T20:21:46.91Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", upload-time = "2025-11-30T20:21:48.709Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", upload-time = "2025-11-30T20:21:50.024Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", upload-time = "2025-11-30T20:21:51.32Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", upload-time = "2025-11-30T20:21:52.505Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", upload-time = "2025-11-30T20:21:53.789Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", upload-time = "2025-11-30T20:21:55.475Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", upload-time = "2025-11-30T20:21:57.079Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/42/bb/1463f0b1722b7f45431bdd468301991d1328b16cffe0b1c2918eba2c4eee/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f", upload-time = "2025-11-30T20:21:58.47Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/99/ee/2520700a5c1f2d76631f948b0736cdf9b0acb25abd0ca8e889b5c62ac2e3/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4", upload-time = "2025-11-30T20:21:59.699Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e0/ad/bd0331f740f5705cc555a5e17fdf334671262160270962e69a2bdef3bf76/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97", upload-time = "2025-11-30T20:22:00.991Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", upload-time = "2025-11-30T20:22:02.723Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ab/2b/d88bb33294e3e0c76bc8f351a3721212713629ffca1700fa94979cb3eae8/rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d", upload-time = "2025-11-30T20:22:04.367Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/50/32/c759a8d42bcb5289c1fac697cd92f6fe01a018dd937e62ae77e0e7f15702/rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038", upload-time = "2025-11-30T20:22:05.814Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", upload-time = "2025-11-30T20:22:07.713Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/14/f6/69066a924c3557c9c30baa6ec3a0aa07526305684c6f86c696b08860726c/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed", upload-time = "2025-11-30T20:22:09.312Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", upload-time = "2025-11-30T20:22:11.309Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/22/16/cd3027c7e279d22e5eb431dd3c0fbc677bed58797fe7581e148f3f68818b/rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c", upload-time = "2025-11-30T20:22:13.101Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825", upload-time = "2025-11-30T20:22:14.853Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/14/a6/364bba985e4c13658edb156640608f2c9e1d3ea3c81b27aa9d889fff0e31/rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229", upload-time = "2025-11-30T20:22:16.577Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", upload-time = "2025-11-30T20:22:17.93Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", upload-time = "2025-11-30T20:22:19.297Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", upload-time = "2025-11-30T20:22:21.661Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", upload-time = "2025-11-30T20:22:23.408Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", upload-time = "2025-11-30T20:22:25.16Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", upload-time = "2025-11-30T20:22:26.505Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", upload-time = "2025-11-30T20:22:27.934Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", upload-time = "2025-11-30T20:22:29.341Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", upload-time = "2025-11-30T20:22:31.469Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", upload-time = "2025-11-30T20:22:32.997Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", upload-time = "2025-11-30T20:22:34.419Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", upload-time = "2025-11-30T20:22:35.903Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", upload-time = "2025-11-30T20:22:37.271Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", upload-time = "2025-11-30T20:22:39.021Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", upload-time = "2025-11-30T20:22:40.493Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", upload-time = "2025-11-30T20:22:41.812Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", upload-time = "2025-11-30T20:22:43.479Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", upload-time = "2025-11-30T20:22:44.819Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", upload-time = "2025-11-30T20:22:46.103Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", upload-time = "2025-11-30T20:22:47.458Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", upload-time = "2025-11-30T20:22:48.872Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", upload-time = "2025-11-30T20:22:50.196Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", upload-time = "2025-11-30T20:22:51.87Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", upload-time = "2025-11-30T20:22:53.341Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", upload-time = "2025-11-30T20:22:54.778Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", upload-time = "2025-11-30T20:22:56.212Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", upload-time = "2025-11-30T20:22:58.2Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", upload-time = "2025-11-30T20:23:00.209Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", upload-time = "2025-11-30T20:23:02.008Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", upload-time = "2025-11-30T20:23:03.43Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", upload-time = "2025-11-30T20:23:04.878Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", upload-time = "2025-11-30T20:23:06.342Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", upload-time = "2025-11-30T20:23:07.825Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", upload-time = "2025-11-30T20:23:09.228Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", upload-time = "2025-11-30T20:23:11.186Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", upload-time = "2025-11-30T20:23:12.864Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", upload-time = "2025-11-30T20:23:14.638Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", upload-time = "2025-11-30T20:23:16.105Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", upload-time = "2025-11-30T20:23:17.539Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", upload-time = "2025-11-30T20:23:19.029Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", upload-time = "2025-11-30T20:23:20.885Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", upload-time = "2025-11-30T20:23:22.488Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", upload-time = "2025-11-30T20:23:24.449Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", upload-time = "2025-11-30T20:23:25.908Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", upload-time = "2025-11-30T20:23:27.316Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", upload-time = "2025-11-30T20:23:29.151Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", upload-time = "2025-11-30T20:23:30.785Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", upload-time = "2025-11-30T20:23:32.209Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", upload-time = "2025-11-30T20:23:33.742Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", upload-time = "2025-11-30T20:23:35.253Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", upload-time = "2025-11-30T20:23:36.842Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", upload-time = "2025-11-30T20:23:38.343Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", upload-time = "2025-11-30T20:23:40.263Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", upload-time = "2025-11-30T20:23:42.186Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", upload-time = "2025-11-30T20:23:44.086Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", upload-time = "2025-11-30T20:23:46.004Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", upload-time = "2025-11-30T20:23:47.696Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", upload-time = "2025-11-30T20:23:49.501Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", upload-time = "2025-11-30T20:23:50.96Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", upload-time = "2025-11-30T20:23:52.494Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", upload-time = "2025-11-30T20:23:54.036Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", upload-time = "2025-11-30T20:23:55.556Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", upload-time = "2025-11-30T20:23:57.033Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", upload-time = "2025-11-30T20:23:58.637Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", upload-time = "2025-11-30T20:24:00.2Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", upload-time = "2025-11-30T20:24:01.759Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", upload-time = "2025-11-30T20:24:03.687Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", upload-time = "2025-11-30T20:24:05.232Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", upload-time = "2025-11-30T20:24:06.878Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", upload-time = "2025-11-30T20:24:08.445Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", upload-time = "2025-11-30T20:24:10.956Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", upload-time = "2025-11-30T20:24:12.735Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", upload-time = "2025-11-30T20:24:14.634Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/69/71/3f34339ee70521864411f8b6992e7ab13ac30d8e4e3309e07c7361767d91/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58", upload-time = "2025-11-30T20:24:16.537Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", upload-time = "2025-11-30T20:24:18.086Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", upload-time = "2025-11-30T20:24:20.092Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/49/5c/31ef1afd70b4b4fbdb2800249f34c57c64beb687495b10aec0365f53dfc4/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c", upload-time = "2025-11-30T20:24:22.231Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e3/63/0cfbea38d05756f3440ce6534d51a491d26176ac045e2707adc99bb6e60a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3", upload-time = "2025-11-30T20:24:24.302Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/42/e6/01e1f72a2456678b0f618fc9a1a13f882061690893c192fcad9f2926553a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5", upload-time = "2025-11-30T20:24:25.916Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", upload-time = "2025-11-30T20:24:27.834Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4a/b4/0a771378c5f16f8115f796d1f437950158679bcd2a7c68cf251cfb00ed5b/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f", upload-time = "2025-11-30T20:24:29.457Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/36/d8/456dbba0af75049dc6f63ff295a2f92766b9d521fa00de67a2bd6427d57a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877", upload-time = "2025-11-30T20:24:31.22Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", upload-time = "2025-11-30T20:24:32.934Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/20/91/092bacadeda3edf92bf743cc96a7be133e13a39cdbfd7b5082e7ab638406/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4", upload-time = "2025-11-30T20:24:35.169Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", upload-time = "2025-11-30T20:24:36.853Z" }, +] + +[[package]] +name = "rpds-py" +version = "2026.5.1" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +resolution-markers = [ + "python_full_version >= '3.11'", +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/2e/43/25a8dcd3feedd735039a8f0b5b7e3b118232b5eae288c4fd9ab200d41094/rpds_py-2026.5.1.tar.gz", hash = "sha256:07b24fea40541e28570e5b795a4a38fbdcd12550c06bd0748005ecc8116ca256", upload-time = "2026-05-28T12:02:13.232Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/4f/a0/acf8b6fc20bfdcd3a45bd3f57680fb198e157b7e997b9123b10763798bd2/rpds_py-2026.5.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3397a5ed7174dc2786bb214030232fc36fe8e5584fec43a9952cc542b1a12036", upload-time = "2026-05-28T11:58:50.78Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b6/95/f8203fd997484b1690a6869cd0e503b6c3c6be55b0ecc36d1a491fe742f0/rpds_py-2026.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:99ab6ba7bfa2cb0f96a04e3652355bf04e3f51aceb1e943b8541dab7ba4828cc", upload-time = "2026-05-28T11:58:52.374Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/33/8c/b47326ad2f0be545a5e5c1a55937a12afaea7d392ba2837bb9680f57e6c9/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0efbe45632665e53e3db8fe1e5692db58fc5cb9bab4459d570b83efefe11164", upload-time = "2026-05-28T11:58:53.775Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/22/0b/e83bbd97ffac6f6389b605cd4e1c8ac5761dc7e977769c9255d8c5adb7bd/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:01d17b29c0c23d82b1f4751147ec49cf451f1fc2554eb9ef5f957e55d2656ead", upload-time = "2026-05-28T11:58:55.243Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fd/0e/d285d1bc8864245919c61e1ca82263e4a66d337759c3a4cef72766ff9afc/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7559f72b94ae52659086c595dfa017cde03155f7832071d30959049052cb3ece", upload-time = "2026-05-28T11:58:56.788Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/86/06/ccb2109a1e543437b5e43816f2b43b9554cc6783145528a4e3711e05c011/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9e25b7088f9ccbfc0dfcaa52bf969300ca229e10ecf758974ebcbb080a4b37bb", upload-time = "2026-05-28T11:58:58.298Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3d/33/237173db1cfef10105b3839a24de00eb8d2a523711add4632447cdf0aedd/rpds_py-2026.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613fc4ee9eaef26dc5840666214dd6fbcebcf32f46e76f4abc473059f4e13dda", upload-time = "2026-05-28T11:58:59.589Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/97/64/1eae54e34d5161f9969295e80bd6b62a55f2b6ac5f2a5b60d02c2140e758/rpds_py-2026.5.1-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:85264a90ff4c05c1568dd65f5921c837614b67c60358fb4c17df3b7f2e90690a", upload-time = "2026-05-28T11:59:01.104Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d8/34/5bb334a5a0f65d77869217c4654f34c78a7d11b93938a3c076a2edeafc52/rpds_py-2026.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe71bca7d547acb17027c7fd1624ff8aae623499c498d3e7011182c4de5c25e0", upload-time = "2026-05-28T11:59:02.433Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/16/0f/007ec21283b5b040b4ec3bd95e0402591e22bfa7d5c93dfe01c465c2d2d7/rpds_py-2026.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05fa4f41f37ec97c9c260441a940450a192f78d774d2b097eee1379f1e1246a", upload-time = "2026-05-28T11:59:04.012Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ff/10/5437c94508169b6b22d8418fef7a66e9ffb5f3b9e9c94460f2eedafe06ff/rpds_py-2026.5.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df1d2a1996755b24b9ecee92cb4d36c28f86f464a6a173349c26bab41e94b8c2", upload-time = "2026-05-28T11:59:05.485Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e0/d5/9937dce4d6bda74157b954e7d1460db05a22f5929dccfeeba1ed27a93df0/rpds_py-2026.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8895840ac4809e5f60c88fd07617cd71326e73d6e5a8aa783c5c0f7c24985de2", upload-time = "2026-05-28T11:59:06.837Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6c/31/750617dd0ae1752471bf43f9e41d263398fae7cde7849d23b8574a70e617/rpds_py-2026.5.1-cp311-cp311-win32.whl", hash = "sha256:3684a59b158a7683aaeb8e25352e9a9dd2122cec78f2d8530266e4f91b4c7b3f", upload-time = "2026-05-28T11:59:08.402Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3c/bb/3dcab0e1d9516303f2eb672a5d6f62eca5a69e2886301e9c8c54b520c39b/rpds_py-2026.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:7bd530e6a530bb3ea892f194fafa455f3516ac25ecf7143fd33c09be62b0470a", upload-time = "2026-05-28T11:59:09.786Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/49/d6/c6bbf5cb1cf12b9732df8074b57f6ef8341ba884c95d40632ae8bddb44e4/rpds_py-2026.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:0a5ae4dbe43c1076983b72616496919872ae7bbe7a1e21cc48336bc3154d130b", upload-time = "2026-05-28T11:59:11.079Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d4/e7/a78582dc57caa592dcc7d4fb69b61390561e908eb3d2f5df5928a8e354c0/rpds_py-2026.5.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3abe24a66e57adcfa645d718063a5fa5103ecc71ddbf26d78af8f9368018ff1d", upload-time = "2026-05-28T11:59:12.531Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a3/43/35e3f136343aef451e545ce8c38d36c2f93c0ed88703db8b64ba2b205c68/rpds_py-2026.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58b1d94308ddf0b1982f61f2eb54bf92997c9ece8a8093ef014250f4a517906c", upload-time = "2026-05-28T11:59:13.827Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/20/e1/0f2160c5982d3157734d5cb3ed63d8b2d583a73c9864f77b666449f32cf8/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fa92420128dadce7f54bd73ba1825a273e9268fe9e35dbf7e6362890efa4e08", upload-time = "2026-05-28T11:59:15.271Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d0/11/ee0ba42aff83bf4effdbc576673c6be64c5e173978c3f6d537e94482f77d/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ca653c6546386227cd9800d1bef6a348099acf8db4250341da6d90f663d6dfcb", upload-time = "2026-05-28T11:59:16.665Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/11/df/d94aa6a499d4ac40afe2d7620f2c597fd3c0f182e854ad7cf3f596a81cb6/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66c93681c4729e4e3ecba31b8179fae083ff3118841672835140338b4b9867c1", upload-time = "2026-05-28T11:59:17.991Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1f/75/33d30f43bb2f458de11979486a591b1bf6e5651765ed1704c6197c2dc773/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40ff257542e04796880e011e15cd4dc21c2599975df2aaa8f2c8495ca574e1a5", upload-time = "2026-05-28T11:59:19.434Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f4/1e/2c9096fc19d5fd084b0184ca2b651e659aa0a37e6fdbecf6ece47f147fe1/rpds_py-2026.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6825cc329b290e93c5f6a9be2393118a763f6ccf6abd83704e0c102ca583644", upload-time = "2026-05-28T11:59:21Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b9/e5/61ec9f8be8211ea7f48448195549e4aaf02004083475493b0e137702ecb2/rpds_py-2026.5.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:de42116e69cb53b911cc34aee5ab98f36c597b822545045d49e938818b99e5e4", upload-time = "2026-05-28T11:59:22.454Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0d/ca/bcec1005c4f4a234f92a29078631fee49206c7265ccae966f18fd332e80e/rpds_py-2026.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0f920015df2a504bebaba6d4c31ccf3fcf942f92655c086da30b671aad19aa6", upload-time = "2026-05-28T11:59:23.845Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/72/e6/4d5718c5cf26c522dc7c9999e238da1e77380b81d0c5d1df11e271ddfeb1/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0408a24e44feb919423dc6d9da677cb5cddb894d2ca9e763967d156d9c60fab4", upload-time = "2026-05-28T11:59:25.184Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d4/25/2ee807bdb3e1f0b7eddf7782acd5665a8b5205a331a7d7244a52c4812fd9/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:cea68bcd53467561ae2f96a6bdad1544299ba97b5b0ddcd5ac3d376e5c781c24", upload-time = "2026-05-28T11:59:26.749Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6a/c1/7d4c26f167f8c41501cc073d30ee22082b16ce358cf5b00ec97cbc7804ea/rpds_py-2026.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4be8b1d2a705cc37d08256004e1d07de143fa0075c8e85a3df020b776f62b732", upload-time = "2026-05-28T11:59:28.11Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/04/1d/9d12b0a337bab46f4769f8857f4007e3b2d639e14f9a44a0efe157696e64/rpds_py-2026.5.1-cp312-cp312-win32.whl", hash = "sha256:6736718bd4fc49cbcb538ba30516fdbef161522acefb739657d48b97bd864fed", upload-time = "2026-05-28T11:59:29.689Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c5/93/e4116f2de7f56bc7406a76033dc501811ddeb22b7f056b92d632871ebb0c/rpds_py-2026.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:0a7d1eec967df0e9b22614a5e177622e0c89611d03727fa0cb48e45028907870", upload-time = "2026-05-28T11:59:31.033Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/cb/53/6c3419d85eb2ec5938a37627c585b42d76a63bb731d6e42ed4b079ebf486/rpds_py-2026.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:1841d067089e117142d79b98aa0df2f08b52f2ecc1819dd2700636c0db74a473", upload-time = "2026-05-28T11:59:32.318Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6c/32/14c961ad295f490eb0849ada8b79683e93a59b9de3afdd983eaf55fa6867/rpds_py-2026.5.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:efef4ac29c6ff495531eb17ee705b62841ecaa291b7c7077e848ea03e237164d", upload-time = "2026-05-28T11:59:33.655Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ca/bb/d1b85117967c11191441a7274ae616c65d93901d082c588f89a50a8da5ae/rpds_py-2026.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c39f5b67a8a2e67179ada2a954227d670fe65fa9098457f698f56ddf248709b3", upload-time = "2026-05-28T11:59:35Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7c/46/d84105f062e626a1b233f863907288a4708c2d833b8b4c6fb2764bc080c0/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5c30f3f04eef4fbd362226a6f31d7c8895ca4fbb6e0b790f6890a98d8da8559", upload-time = "2026-05-28T11:59:36.43Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e2/ae/469d7959ce5b1201e1de135dc735b86db3b35dd0d1734f6a44246d5f061c/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:277f6c82f0580848796c7ecc8a7173aa3bfb928e4ff831261c2f60a81dc270db", upload-time = "2026-05-28T11:59:37.995Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/dc/a2/57853d31a1116a561aa072794602ad3f6341e18d70a8523f1bd5b9fc1e5a/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:63c2c4c213f1a4e3f3de28ecab029dbdee976324e729c0d7a55211be72576b02", upload-time = "2026-05-28T11:59:39.453Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/99/63/3a8eabcad9314b7daf5c65f451d2c33d989235cd8a5762186cf2c3f5a4f8/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3350ec808fb538fe71a1f94dfaa0e29c598dfad805ce49f0caec5ae3183c652b", upload-time = "2026-05-28T11:59:40.896Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4b/25/05678d97fc25e2622df14dc530fb82023174ecfff6733991ed0d78f167bd/rpds_py-2026.5.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1b964e3ab599e718dc46c018d104b1ebc007cbc6567d827c94a687fca56d77e", upload-time = "2026-05-28T11:59:42.626Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/88/d1/8c90b6431e80a3b91b284a5c7c8c0c4f9c006444d90477a740d6e0f9c694/rpds_py-2026.5.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:19cb09fab7b7fc96b2a6e28f2e34b72a3705ff27b37edb77455316e5d3f3dc9b", upload-time = "2026-05-28T11:59:44.124Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ff/99/4638f672ab356682d633ee0da9255f5b67ce6efd0b85eb94ad3e255e65a5/rpds_py-2026.5.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abe76bcdba31e576cb83eeb8797aa0d882b738fef6dc65d0601fc753806a5b46", upload-time = "2026-05-28T11:59:47.177Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/66/3f/3546524b6eb4cc2e1f363a3d638fa52f6c24faae3500c25fb488b02f1740/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8bff7073db3899158fff55ebf57b113a67030af26f80a18978f9f0aa60250ddf", upload-time = "2026-05-28T11:59:48.603Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c6/c3/7b3388c796fcf471bd17194242d4dc1a7608567c0fa422bcc1c5e79f9c1e/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8ba264fa49be666cd9cc56bf34ec7002fb3d27a4aee5bcb4d43d0d18feb1bb6f", upload-time = "2026-05-28T11:59:50.314Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/61/1e/a3cb07f2795075d1d88efddae2f541359fde5f08c81ee114c29c2949c90a/rpds_py-2026.5.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4860b603ddda0475a8885499b3729e90229d480105b42651962a5397d995fa89", upload-time = "2026-05-28T11:59:51.673Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a1/74/e758c03a5ef46f04c37f2651a2893db846d569ba8a7bca469d4b58939bcd/rpds_py-2026.5.1-cp313-cp313-win32.whl", hash = "sha256:7944270ae71383f6e2657dd7d5ce4eeb4ac2d0059a6738f0510583d462ab4842", upload-time = "2026-05-28T11:59:53.148Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/70/ec/a2aca432db9c7359b40fa393eeeaa0d166c2f70175be956e75fa24197c44/rpds_py-2026.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:88647f43a73c4e01be19b04ceef0c8d3a1958153604d13c773becd8016f2a0cf", upload-time = "2026-05-28T11:59:54.505Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/29/60/a73bfdd45b096574556acf303bbd9fa9eed36ca8a818b514e2a5d5fe2b9d/rpds_py-2026.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:453895624ecf7db7063b1004e44037522bbaef9ff6a945e59bc71662d7a03abd", upload-time = "2026-05-28T11:59:56.081Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/18/e2/408105fd611823f00882aea810f3989a30d26b1bab8b6beb20f98c724e0e/rpds_py-2026.5.1-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:b4e4bc98639ec915f512fde3aa7a95e0041d95d9c3cc86eea841fa63cb1e8600", upload-time = "2026-05-28T11:59:57.448Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8d/58/5c4a43436843c90d0f6d19f82c200c80e3843ca9fa07b237623327f6d384/rpds_py-2026.5.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cacedb7a6e167680acba45ad5716e89067d225dc80da0d7040cae8c81d4572fa", upload-time = "2026-05-28T11:59:58.881Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fb/c2/1a71acdacaf4e259b10278fb87b039ded3cf80041bcd89dd8a3ea702ded6/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68700371c5d7ae1412862ddfa719090925c93ecf351c566d66f09d04b136ea00", upload-time = "2026-05-28T12:00:00.516Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c2/c8/535f3d9b65addd8e28aa87b83c6e526799c3717a88273db8ea795beeef7a/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:296c799becfa849c779c8725494fe9ed94959ed886787df4364b058465bad7f0", upload-time = "2026-05-28T12:00:02.394Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1c/91/dc033f313345c354ade914dbe73cdb90b615a4409ea02430d5356794f3d8/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d3858b908218ee108d0bbfb2095ccc237648053c9bf98affad7cb079acaf1d97", upload-time = "2026-05-28T12:00:04.189Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/27/fc/90fcbea459dbb8ddc18a2e0fd1de9412b48bc84ffff2db771cf714bacfd6/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4fb8d2e7cb2f850b169806d61d1b991738acec96500a75c30f49caf064ce7cef", upload-time = "2026-05-28T12:00:05.797Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b2/1d/46cd11a228c9750684a798d98f878be6f614aa762438da7378f035e79e35/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27b74c10ed6a8f190f4287f53bcfea348b92a84a9c9f70d30183d1e6172d580d", upload-time = "2026-05-28T12:00:07.433Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/24/4a/d9b0c6af3a1de03eb93741bbe8be2bdce84d8fda8224f3005451d86df389/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:b9a6528956191c48c52294a592dbd4a8386d7048bdb25c0efcb6b966466c6d83", upload-time = "2026-05-28T12:00:09.227Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c5/b4/db7aaabdda6d020afc87d981bcc2f57a434c7dec60ecfc2ab3dd50b20351/rpds_py-2026.5.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:af03e34e860047bc7a352b842856fcf78798fbb81132cc98bd2f907ab4eb9cd2", upload-time = "2026-05-28T12:00:10.779Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/08/d6/070f6a41cbb343e2ac4171859bf3f3623e0ab002f72619d6d505313ec2de/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fea6e836d10abbe191d557d33bd58bd5987725fe63aa1eefe557d230209855bd", upload-time = "2026-05-28T12:00:12.443Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/75/ab/1a71ea3589c4345dac0a0518f0e6a031cb42689277851b683c46d27463a5/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:fc0c0f878ea770a0a8a462456c5ad36fc9fe6358e6b76fdadc7f17575e0b8bf1", upload-time = "2026-05-28T12:00:14.09Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8a/22/9bf80a56069c0c443fcfefac639a86a744550a2898817a6dfd3e26654924/rpds_py-2026.5.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e0b360f316d966b048b085857630b3cc51f3db2f07b06f440eac8f695374d1e3", upload-time = "2026-05-28T12:00:15.66Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/da/68/3b2c0a75c9e04125696f84ebdbbf304acf5a40b58ba4481cdb98a922c3ba/rpds_py-2026.5.1-cp313-cp313t-win32.whl", hash = "sha256:a2999883eedf72fdfb7520b92c7d4ec2572a71ff40239377aa604cc529eecafc", upload-time = "2026-05-28T12:00:17.291Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e7/8b/609157d5a25d37d4f29f92840ba531f416907c34ae5c5739dd21fc2bef98/rpds_py-2026.5.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e07be2a9d7122bd6e82dea89814ef8dc893feb1aae97fec1630f3263bbb30e55", upload-time = "2026-05-28T12:00:18.73Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d4/6f/19c1918a4b590d8de87e712e4abe4b3875771eff60216fb6153cf6665c68/rpds_py-2026.5.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:1f2c391c3059798093b65df23aca2cac150460ae9c630d99dec83d703d9485b9", upload-time = "2026-05-28T12:00:20.217Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e5/60/a06fe7da34eca79dacbf958a2ba0c6eea85bc2b29de20080bf40f72f66fa/rpds_py-2026.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:413b424f7c4ee65ab5e5be91f5731be0f8b41a1ee2b12dfe810d716312e95a78", upload-time = "2026-05-28T12:00:21.711Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/bf/ec/b2333b97b90e2a6ef6ca8ad386ee284968e74bcfe113b3f1a8d9036429a9/rpds_py-2026.5.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c595a1d9255dce0599e13130d1440ab2506654f2b50294226ee06402f8fef63", upload-time = "2026-05-28T12:00:23.326Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/14/7f/e00aae54067f2b488c4637961d5f58204d470795fc791085fa3f15060d2e/rpds_py-2026.5.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1c27c5f6102eac8c03e7595a00827a53b271ba40a53b59ff8709170e0855ea4a", upload-time = "2026-05-28T12:00:24.89Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/be/cc/423999bbb8ae8dc93c77fc1d5e984ade5eb89d237d3bb884ccfa72ae2890/rpds_py-2026.5.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c7fcf61d44cacecaf3aea542b0e053db77972a4573e7ceda16fb2b399161195", upload-time = "2026-05-28T12:00:26.676Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0f/aa/c671bf660f12e68d3c52ff86c7066ed1372df5a0f4f2ff584e419b8207e7/rpds_py-2026.5.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2c817a189d4ee14290420e5ff051e4dd6baa13f3edf84685071dee07a6d538ee", upload-time = "2026-05-28T12:00:28.577Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/19/c8/d63bb75b68afe77b229e3021c6031bcaf01da5db5b0e69d0d10f9ba679a7/rpds_py-2026.5.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21846aac0ed2e0589f38c12dc44e77bb64e494b771eadbcf169cba00566ba7ba", upload-time = "2026-05-28T12:00:30.304Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/82/35/c51122014d8274ff37dc606d60049c3db7d83da02b5b282511e5a906a9a6/rpds_py-2026.5.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b317c87a13f769a4e787819bd508aaa5d69aa09b0880de9af6d3a8a54571cdec", upload-time = "2026-05-28T12:00:31.764Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e3/f9/2790cb99c136a5363acdeacf5c27c56f3de0d4118a1f48fca83404c99c89/rpds_py-2026.5.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce87129d9f2c14fa6c4a8601fb80eb4488c80d38a20cd13758ef11123e14995d", upload-time = "2026-05-28T12:00:33.247Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e5/1b/e4fb584f8c75d35c38150ff6a332cda949e6f97acba1f4fd123b14ab56fe/rpds_py-2026.5.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9cdddb6c1207d284d94fd1530adf57fbd797fe7c4b8704ba85f49414f2557e7d", upload-time = "2026-05-28T12:00:34.819Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d8/f7/a6731b4216cb3793ea1af5391da240f5683dacc0d13e034fe5fc3503f240/rpds_py-2026.5.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:4e237e139f94d3c036fd28eb9f564c99055476ff4ff05cd42be55ce349b5aa02", upload-time = "2026-05-28T12:00:36.268Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2c/ea/2e051a81d95d8e63f4b35a1c463a87e8766bc3d083c067c5dfb6bf220747/rpds_py-2026.5.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ed0954b524873214369184a9c82b0eaa45a3fbb9a798cd95b17e0d98499e7ea0", upload-time = "2026-05-28T12:00:37.82Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/65/56/b5f6fdb2083e32bca8a8993d89e70db114b4756c9e2c38421328126689d2/rpds_py-2026.5.1-cp314-cp314-win32.whl", hash = "sha256:2d88621d6a7d4dfa633d21abe90f280bb205274e16b1d1e61c6ad4640b2453b7", upload-time = "2026-05-28T12:00:39.492Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fb/80/65a5aa96c155e611d1ed844e4e1f57f3e36b021f396d9f8585d756e6b90d/rpds_py-2026.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:cef8ac28d26f4dda3533060c20fbf80a325458fa9fd23ea72a73cdfa8e978838", upload-time = "2026-05-28T12:00:40.94Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/27/7c/ad185212e87b05f196daef92bc5f3caf07298eb47c295b5585c3dd3093ac/rpds_py-2026.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:eaaea962c68cdc68d4a533ba985ab8e9484277910bbfaa2ab3ef7732667bfed8", upload-time = "2026-05-28T12:00:43.15Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/23/58/e14ae18759020334646b031e708ab4158d653a938822bfb7b95ef2e93aa3/rpds_py-2026.5.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:21942f52dbbd5f8758bf021213d28bd45c39e873e65e2407faf5f1846f5761ad", upload-time = "2026-05-28T12:00:44.638Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/31/9b/5f4a1e2f960bca3ac5d052b139dd31eed97b259f9d909173821760d542e8/rpds_py-2026.5.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f414556f6e3958300ff941e40c9f97e3dc9774ddd1b3434c475d73dd354bbed3", upload-time = "2026-05-28T12:00:46.14Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1a/71/1d9574d6a2fa20ab60eaa55c7467f5aa20cbc770f341a05f09c0876f59e2/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef1013a8625c74043210190b246f5b1551e09757c1f356c6e4160ef96c5bc081", upload-time = "2026-05-28T12:00:47.531Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0c/9a/37e99f4915a80aa71670263c1267f7ae0af95f53a3f61e6c3bdc016d4515/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cc68e231a77a5f0d774ae278a1f8e55c0456501820847c1e4efb3829f3441df6", upload-time = "2026-05-28T12:00:49.216Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a8/ff/6e73f74b89d2e0715e0fc86b7dde893f9a61ae2f9b256ff3bdfe41ac4e94/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9baffb505aff33acc69b422a19f77806680f3c8632227d79f48de8a810d1c2c5", upload-time = "2026-05-28T12:00:51.111Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ea/e0/425faba25f59d74d4638b267f7c7a80e8649d2ef4db10a19b0c4a71e6e6f/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8d2f912928d426e8cfa396f7f3f8d29a59e6689c86dcca3c420730c1096322b", upload-time = "2026-05-28T12:00:52.77Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c6/76/7a41960e3fddae47fab43a28684d5da981401dffd88253de0944148654cb/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90f628283be835db980c941767d41c9a27b5239e54ba0a9c1335247e82406964", upload-time = "2026-05-28T12:00:54.215Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/27/60/5f38dc70824fc6951b51d35377e577a3a3a4c81a6769cc5a2de25ebe0ad1/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:1ebb2f0ab7e16132995a72de805170e0203df0c3dd22e1ef1cd1fdd90bd7a131", upload-time = "2026-05-28T12:00:55.673Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/60/1a/d60a38caa1505f4b9483c3fbbde12c94e1079154f4f401a6da96f7e77621/rpds_py-2026.5.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f3df3d16ded76f1f8c9cdebd0e1ea55fdf4c23b812de189814da7cf229c22a81", upload-time = "2026-05-28T12:00:57.518Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/87/ff/602fd3f174d6425f0bce05ad0dfbec0e96b38d0f7d08a79af5aa20083885/rpds_py-2026.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9af8905b8f854990e40d5206aa5ac58d9b0fe0b7f351ff2bb086c20f6c8c6a47", upload-time = "2026-05-28T12:00:58.978Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b8/c1/1be13327acdbead3eca1fde03b6a34dbb011f1e864e217f0d32cc1779a7f/rpds_py-2026.5.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:036a36a87fb1cd3b214d11c4b3c4f7d2ddad933625dca1c900b56a057c07740a", upload-time = "2026-05-28T12:01:00.656Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f3/d7/afb49b49d7f2be8b7ba1a9f0977fa5168003437b93086726f066544e8351/rpds_py-2026.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:62ae3853454fe9ef283a03c96c2d835d39e84b14643a9d62c82ef0fb87d702ca", upload-time = "2026-05-28T12:01:02.22Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/25/d1/dbef8c1f8a10f07beb62b5f054e20099fd9924b3ec001b8f0b6ac7813a85/rpds_py-2026.5.1-cp314-cp314t-win32.whl", hash = "sha256:6c3d771a46ec18b12af06ce36243a9a80b07a5d0515236332d90863ca8bb326a", upload-time = "2026-05-28T12:01:03.821Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2a/72/bfa4e61ab8e7dc1c8adf397e05e6cbdd4239357bd72b248d3de662f23915/rpds_py-2026.5.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c93c629be4636cf54337bd5f06c104d55e42ced54d681f6fe21ae510a65116f6", upload-time = "2026-05-28T12:01:05.194Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/27/3a/7b5da92b640f67b6717ccafc83cdd06bfa7ff2395c3685c68922bb54d703/rpds_py-2026.5.1-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:3574b55c604b8f75dacb007136508bbc0db406e626301778096a133327e7f2fb", upload-time = "2026-05-28T12:01:06.722Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d7/8a/2aafd7ad355a1bd48ca76e2262b74b15e6432b5a1efe150efd4d779cd55d/rpds_py-2026.5.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:94068eb3ae6d43f5a786b7db96a406a34e6d5c24489feef32fd6e8946ea7b291", upload-time = "2026-05-28T12:01:08.441Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f7/7d/6c9523c1abbe840a1b7fba3c516d48e1d3487cc80fea4366c4071cf56784/rpds_py-2026.5.1-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a5b10e8ce894825f380a8f1b6444cf73c294dfea62afbb2d13e3a9e630cec1", upload-time = "2026-05-28T12:01:09.934Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5a/5d/0b7b03fb1dc509321f01de3149784ab773e34c8573022029af8076afcb9c/rpds_py-2026.5.1-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fc09f82e63d4bcd58149572f857a431bae851dc747e313c3b5bdf7abb907fda8", upload-time = "2026-05-28T12:01:11.48Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d7/e2/8ef6012999ebf1cb1c22f876d9ce5e63d960fd4631d2af3202d3f480aa25/rpds_py-2026.5.1-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e10464d17df3b582745c25cec695cb9558bca2cb6ddb631aee1787fc72c767b2", upload-time = "2026-05-28T12:01:13.051Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/80/af/1eeb029bec67582c226b7809172207cd005073af4ebd906e65ff494f4983/rpds_py-2026.5.1-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ba05adbf15d994c38ec0b7ab32e858e5110c21e9009a00a86545fd220f84e038", upload-time = "2026-05-28T12:01:14.631Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/18/23/ffbe10711c4d766c1cab0557d6906c074f795814863c67b351355d29354a/rpds_py-2026.5.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77c004fdc7b891967106f78ddfd7b076bfe6813c6139c6fff6aed3bcaa960b26", upload-time = "2026-05-28T12:01:16.153Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/bd/3a/30ba4a6ad457e5b070c18d742a33fb77d8d922b565cc881f8a5313d63bfe/rpds_py-2026.5.1-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:83bcf894486c9d78dd290d3c0124ff6dd8875d3025e2090a8ec49fcc37c55fdd", upload-time = "2026-05-28T12:01:17.809Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d3/69/62e242b53ce39c0814bd24e1a6e6eba6c92be716277745f317f9540a2e7b/rpds_py-2026.5.1-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c3df104083952a0e0c6f10de33e440eabe98fb6317d23e1a58c68f6df08d01b9", upload-time = "2026-05-28T12:01:19.419Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/38/c1/a770b9c186928a1ed0f7e6d7ae50e7f3950ed23e3f9e366dbc8e38cb55de/rpds_py-2026.5.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:980450826cf22e133c57e0835070bdd0dd3f73b9b708c3ce223def2cb9469e14", upload-time = "2026-05-28T12:01:21.013Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/21/7c/68e8579b95375b70d2a963103c42e705856cdb98569258bd807f4423891c/rpds_py-2026.5.1-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:205dde846f24332ab0c1188699a043b8d165b79bb84529ce272c45048ff6be01", upload-time = "2026-05-28T12:01:22.548Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/70/a1/a6135aed5730ff03ab957182259987ac11e55fb392a28dc6f0592048a280/rpds_py-2026.5.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:3966b82dd563176396df030f3dd52a6e54cb69b718e95e78bd555ed3d1e0185d", upload-time = "2026-05-28T12:01:24.118Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/09/6e/f24201a76a84e6c49d0bdfdfcb735210e21701e9b21c5bfc0ba497dd62f6/rpds_py-2026.5.1-cp315-cp315-win32.whl", hash = "sha256:7818f8d0a415be74d2be3590b0a1c1f463a642f4d0217e7d10602dceef5b79aa", upload-time = "2026-05-28T12:01:25.522Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9e/e4/966bc240bb0485fc265278f6de44d05834bf0b3618886e0b22e33d54c49a/rpds_py-2026.5.1-cp315-cp315-win_amd64.whl", hash = "sha256:b3cc20c0d800af78fd0fac68086e28c1856cec51ea528bb81ea851aa40d39325", upload-time = "2026-05-28T12:01:27.062Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5c/5c/a15a59269cd5e74472734516c73795c15eccfc841b3d4b0228c3f53f19d0/rpds_py-2026.5.1-cp315-cp315-win_arm64.whl", hash = "sha256:3609e9939a8a76cd904cf98a3f1f13b5dc7e150adeaee89e0ea09652ea213e16", upload-time = "2026-05-28T12:01:28.51Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e0/22/135ce03804e179a71ceb13be095deda4a279bc88f7a6b8fa161c5ad44e12/rpds_py-2026.5.1-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:5d333a7127d4b307601ac37792bee01bb95c867cbfacf21b6375b804d6bbd723", upload-time = "2026-05-28T12:01:30.214Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3b/5f/f1f6d2652eb9d848f6eb369d8db83a2da6249bb49ad2c2a48f45d54538d3/rpds_py-2026.5.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:b5f077b44a4f7808520f66dae234988d867deb9aed9be5da057ce9ba831b2a41", upload-time = "2026-05-28T12:01:31.656Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/88/66/b74182775691ea2290c99e52ac8d5db844e56fbec90ce421f107658c8314/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55d8f9b7b78c9538fc9e04e82ec0e888ff0c3cffcfad152c77e57cd09351a98a", upload-time = "2026-05-28T12:01:33.136Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ff/8f/15e5a61d9f0a43902d36561d4f07cae6ae9f4716be825159fd72717f33af/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e3a8ae58895ac107ed934a6bf51e5846f95c53b9b940c2c6d310838fd5846358", upload-time = "2026-05-28T12:01:34.574Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/02/c3/f859b12763a80540cdf2af0f15b19904cf756a71d7bdd3f82ff3e5b1bbf9/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0957cf3c2b8632ec7aaebffebea8005b353cc2a237b6e2ae3c2cac0820704cfb", upload-time = "2026-05-28T12:01:36.127Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1c/c7/ff27c2ac8411d30b03b1829fd88cae8dad1a4d0da48dd25e57c4038042e6/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c396c1304de421050b3681ea70f371874b54d41b0151e96109758144c231e30b", upload-time = "2026-05-28T12:01:37.635Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6e/67/fe92ee32a6cc05c77228a2f8b1762e7124f386ec20ff83d0757b762d58d0/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad1bff7f666b9598e573815affd666aac6a13a585dde336f843e33350c7fadc", upload-time = "2026-05-28T12:01:39.307Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f8/91/b4d6685c27aba55bd82f25b278be8237038117d05f9659a6213ad3408130/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:656a042550878f12d45752452d47094b7cfe5ad1e9d7b87b5a22ad3ae5ff8015", upload-time = "2026-05-28T12:01:41.043Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/bd/79/2c1d832a53c8e0f8e98fc970ec257b950fecd4f62be2ab7182b500a0cbc8/rpds_py-2026.5.1-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:73c4bd4f70294737b5206a3e8e30ccadbf8a60301831c8ea23eec5dbeea1ecfa", upload-time = "2026-05-28T12:01:43.032Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/78/c4/c98117b03c6a8581ab2c2dfccfe9a5ad82bd8128a3c28b46a6ad2d97c393/rpds_py-2026.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:43bca78665423cabae77146f2fe7ce55272b6c8d55d82cca83effd42c7e13972", upload-time = "2026-05-28T12:01:44.648Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3b/c1/bc479ca069200af730881b1bd525e3114b2b391a351509fcb1b772f28086/rpds_py-2026.5.1-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:42d0f20e85e549c870749d0e247f0c10d318a45b7e9676d575d2dcb04a1b2e66", upload-time = "2026-05-28T12:01:46.337Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/77/65/38ab2f90df44c2febfb63cc10ced40763d9b4bc94d173e734528663fe7f5/rpds_py-2026.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:b1be5c35683684d5331b93600c210e8367c254683d8a6df6bd21bd2da3a334fb", upload-time = "2026-05-28T12:01:48.109Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/15/2d/ce1f605fe036aadd460e5822e578c6c7ec3a860936cca37d6e0f299daa77/rpds_py-2026.5.1-cp315-cp315t-win32.whl", hash = "sha256:75808f6c38ce7749bb68cc2770161aae5045e6c6f6781a9782e74b93304399df", upload-time = "2026-05-28T12:01:49.648Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/79/cb/966040123eb102371559746908ef2c9471f4d43e17ec9a645a2258dab64b/rpds_py-2026.5.1-cp315-cp315t-win_amd64.whl", hash = "sha256:90bd6630002a1c7f09e7843dd79f0d24f3d2897cc25a753480917865d14f15b3", upload-time = "2026-05-28T12:01:51.408Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/42/56/3fe0fb34820ff667be791b3a3c22b85e8bcba54e9c832f47438c191fa7be/rpds_py-2026.5.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:edf2765d84e42447f112ad877af8fe1db0089aaec5b28e88d6eab45e7fe99cea", upload-time = "2026-05-28T12:01:53.43Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8b/f2/3eb9ccdb9f143b8c9b003978898cb497f942a324c077401e6b8834238e63/rpds_py-2026.5.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ad3773236e95f7f33991eb125224b7da66f206504d032a253a02da7e134519fb", upload-time = "2026-05-28T12:01:54.901Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a7/24/dbda232bc4f3ed732120692ab0d2c8402cb020516556d8bee622dcef2413/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a04df86b3f0fade39ec8fd0e0aab089b1da9fbd2b48df778a57ef96f5e7d38df", upload-time = "2026-05-28T12:01:56.601Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/40/30/32e769839a358f78810c234f160f2cc21d1e4e47e1c0e0e0d535be5a0219/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6142dbd80c4df62a5d899f0d616d417f84e0bc8d32526c8e5589019d75d028a7", upload-time = "2026-05-28T12:01:58.212Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ab/86/ec84d243aadb3b34b71dd26a010d0930b2d284ff5fc9a69fec53810ee6fd/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b35217adefe87f2fe4db7e9766cabe84744bfe9616d9667be18988928c7f2dc", upload-time = "2026-05-28T12:01:59.888Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/74/25/b60e52686bbff777a64f9e4f4d3dd57980dc846913777177a2c92e4937aa/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b95d5e11fc712b752081183a55a244c03cd00570489edd7014d8899f8ceb8162", upload-time = "2026-05-28T12:02:01.482Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9b/c7/b3a6a588cc2219510ef3f42e207483a93950bedd1e3a0fd4015c95cff9e5/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141c9498daf2ace9eda35d2b0e376f9ea8b058d84f2aef4f96fccfd449a2f251", upload-time = "2026-05-28T12:02:03.197Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/31/00/c7dba3fc8a3da8cb3f6db1eb3386be4d79c2e97c6890d20eb9ac66ae8c43/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:6f249f8b860a200ad35193af961183ebe9132710484e6f6ce0cf89fd83c63a9a", upload-time = "2026-05-28T12:02:04.817Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/93/dd/472ba494c70753f93745992c99855bee0636daf74e6984e5e003f150316f/rpds_py-2026.5.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e4abbf391a70be864920858bf360f4fb380577c9a0f732438a1996726e2c195b", upload-time = "2026-05-28T12:02:06.401Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1d/6f/93831a3bfe789542ed0c1d0d74b78b440f055d6dc3ea4640eba2d95e6e23/rpds_py-2026.5.1-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:c74005a7bb87752acf351c93897ec63ad77a07a0da7ecad9c050e32e7286ba34", upload-time = "2026-05-28T12:02:08.013Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1f/ff/0b3d604614ffc77522c6b288fdbce68957eb583da1002aa65ba38ac0ee40/rpds_py-2026.5.1-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:8213afbe8a3a906fb9acb2014423fe3359ee783d0bf90995f70623a3217bfa6c", upload-time = "2026-05-28T12:02:09.661Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ea/ea/e7b0251441da9adfeaebcf29601d10f2a1455fcf0772fae9e7e19032bd96/rpds_py-2026.5.1-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8c43a8a973270fd173bf48cdf80bbe66312421cba68d40845034f174f2389049", upload-time = "2026-05-28T12:02:11.47Z" }, +] + +[[package]] +name = "secretstorage" +version = "3.5.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "jeepney" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", upload-time = "2025-11-23T19:02:53.191Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", upload-time = "2025-11-23T19:02:51.545Z" }, +] + +[[package]] +name = "sse-starlette" +version = "3.4.4" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "anyio" }, + { name = "starlette" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/f7/2b/58abc2d1fd397e7dde08e947e05c884d8ef2f78d5e2588c17a12d42d6994/sse_starlette-3.4.4.tar.gz", hash = "sha256:07e0fa0460138baf25cdd5fb28683472c3995dc1642225191b3832d62526bcb0", upload-time = "2026-05-12T17:37:17.019Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/dc/67/805710444ea8cc75fbf70b920ed431a560c4bf9c57f7d5a3117213189399/sse_starlette-3.4.4-py3-none-any.whl", hash = "sha256:3f4dd50d8aed2771a091f3a83000323fc3844541c16b4fe585ae2420cc6df973", upload-time = "2026-05-12T17:37:15.601Z" }, +] + +[[package]] +name = "starlette" +version = "1.3.1" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/eb/e3/7c1dc7381d9f8ab7d854328ebfa884e62cb3f3d8549ddfd37c7814f42afa/starlette-1.3.1.tar.gz", hash = "sha256:05d0213193f2fbaae60e2ecb593b4add4262ad4e46536b54abe36f11a71724e0", upload-time = "2026-06-12T09:23:11.602Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/ec/bb/2799cc2ede3ed41131f8975621e7213dfc7ef4acbbaadfa440f32500c370/starlette-1.3.1-py3-none-any.whl", hash = "sha256:c7372aae11c3c3f26a42df7bd626cec2f47d03483d261d369516a615a53714c6", upload-time = "2026-06-12T09:23:10.017Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", upload-time = "2026-03-25T20:21:31.65Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", upload-time = "2026-03-25T20:21:33.028Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", upload-time = "2026-03-25T20:21:34.51Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", upload-time = "2026-03-25T20:21:36.012Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", upload-time = "2026-03-25T20:21:37.136Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", upload-time = "2026-03-25T20:21:38.298Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", upload-time = "2026-03-25T20:21:39.316Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", upload-time = "2026-03-25T20:21:40.248Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", upload-time = "2026-03-25T20:21:41.219Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", upload-time = "2026-03-25T20:21:42.23Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", upload-time = "2026-03-25T20:21:43.386Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", upload-time = "2026-03-25T20:21:44.474Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", upload-time = "2026-03-25T20:21:45.62Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", upload-time = "2026-03-25T20:21:46.937Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", upload-time = "2026-03-25T20:21:48.467Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", upload-time = "2026-03-25T20:21:49.526Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", upload-time = "2026-03-25T20:21:50.506Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", upload-time = "2026-03-25T20:21:51.474Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", upload-time = "2026-03-25T20:21:52.543Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", upload-time = "2026-03-25T20:21:53.674Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", upload-time = "2026-03-25T20:21:55.129Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", upload-time = "2026-03-25T20:21:56.228Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", upload-time = "2026-03-25T20:21:57.653Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", upload-time = "2026-03-25T20:21:59.089Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", upload-time = "2026-03-25T20:22:00.214Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", upload-time = "2026-03-25T20:22:01.169Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", upload-time = "2026-03-25T20:22:02.137Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "uncalled-for" +version = "0.3.2" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b5/82/345cc927f7fbdae6065e7768759932fcc827fc20b29b45dfbafa2f1f7da4/uncalled_for-0.3.2.tar.gz", hash = "sha256:89f5dbcd71e2b8f47c030b1fa302e6cce2ec795d1ac565eeb6525c5fe55cb8a2", upload-time = "2026-05-06T13:38:25.204Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/3b/25/2c87754f3a9e692315f7b811244090e68f362979fc8886b3fbd2985a1d8c/uncalled_for-0.3.2-py3-none-any.whl", hash = "sha256:0ff60b142c7d1f8070bde9d42afaa70aedc77dcc10998c227687e9c15713418e", upload-time = "2026-05-06T13:38:24.025Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.49.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/c4/1f/fa18009dea8469069cca78a4e877a008ab78f08b064bfc9ab891579077ff/uvicorn-0.49.0.tar.gz", hash = "sha256:ebf4271aa580d9de97f93192d4595176df6e91f9aae919ca73e4fc07df1e66a3", upload-time = "2026-06-03T22:01:30.448Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/88/fa/e1388bbcf24ef3274f45c0c1c7b501fd14971037c1b6ee23610553307497/uvicorn-0.49.0-py3-none-any.whl", hash = "sha256:ba3d14c3ee7e41c6c654c46c9eb489d33213cdd30aa1696eab1374337c13f68f", upload-time = "2026-06-03T22:01:29.037Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.2.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/cd/41/5e1a4bb12aac5f1493fa1bdc11154eca3b258ca4eba65d39c473fe19d8e9/watchfiles-1.2.0.tar.gz", hash = "sha256:c995fba777f1ea992f090f9236e9284cf7a5d1a0130dd5a3d82c598cacd76838", upload-time = "2026-05-18T04:32:04.251Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/0d/5a/2bf22ecb24916983bf1cc0095e7dea2741d14d6553b0d6a2ac8bc96eca93/watchfiles-1.2.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bb68bf4df85abebe5efddc53cf2075520f243a59868d9b3973278b23e76962a9", upload-time = "2026-05-18T04:31:08.908Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/55/70/dea1f6a0e76607841a60fb51af150e70124864673f61704abb62b90cdcc7/watchfiles-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c16cb06dd17d43b9d185094268459eac92c9538356f050e55b54e82cf700e1d4", upload-time = "2026-05-18T04:30:19.845Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/18/52/752dcc7dc817baef5e89518732925795ce52e36a683a9a3c9fb68b21504e/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77a0feab9af4c021c581f695258c642b3d10c5fd4c676e33a0d8606425d82631", upload-time = "2026-05-18T04:30:29.126Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/12/48/366ebbb22fcc504c2f72b45f0b7e72f40a18795cc01752c16066d597b67a/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a16ffe19bf5cf9f5edaa1ad1dd830c5a816e8feec430c522302ab55483a4b994", upload-time = "2026-05-18T04:31:40.85Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ad/44/1f9e1b15e7a729062e0d0c3d0d7225ea4ab98b2267ef87287153be2495fc/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204f299afcbd65918ab78dbc52626b0ae45e9d8cef403fdbf33ecf9e40eac66e", upload-time = "2026-05-18T04:30:58.47Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7e/55/8b1086dcc8a1d6a697a62767bd7ea368e74c61c6fd171683cfe24a3fe5d2/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11743adfa510bfffebe97659fb280182b5c9b238708f667e866f308c3430dc19", upload-time = "2026-05-18T04:30:37.903Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/14/7a/242f400cc77fafa7b18d53d19d9cb64fc6a6f61f28c55913bae7c674d92a/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb72919d93e3a16fc451d3aa3d4b1698423daca1b382d3d959c9ac51297c12a8", upload-time = "2026-05-18T04:30:41.869Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/02/c8/79eee650c62d2c186598489814468e389b5def0ebe755399ff645b35b1b2/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62f042afde2dde21ec1d2c1a74361e804673df86f51e418a999c9acfe671b07", upload-time = "2026-05-18T04:31:13.064Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/81/36/519f6dbb7a95e4fe7c1513ed25b1520295ef9905a27f1f2226a73892bfb7/watchfiles-1.2.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:027ae72bfdfd254862065d8b3e2a815c6ab9b1853ce41e6648ece84afd34a551", upload-time = "2026-05-18T04:30:32.915Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2f/12/951af6b9f89097e02511122258402cb3578443021930b70cf968d6310dc0/watchfiles-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e1cfd51e97e13ff3bd047c140764d277fc9b95b7cb5da59e46a47d167adab310", upload-time = "2026-05-18T04:30:11.539Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/28/cc/0cba1f0a6117b7ec117271bdc3cb3a5a252005959755a2c09a745e0942cc/watchfiles-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:24b2405c0a46738dd9e1cf7135aa5dbdb9d42d024628651b3b13d5117e99f8df", upload-time = "2026-05-18T04:31:53.186Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d0/f2/26347558cc8bf6877845e66b315f644d03c173906aa09e233a3f4fd23928/watchfiles-1.2.0-cp310-cp310-win32.whl", hash = "sha256:8c520725602756229f045b032a1ff33d7ef0f7404189d62f6c2438cb6d8ef6a1", upload-time = "2026-05-18T04:30:18.825Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6d/68/a5e67b6b68e94f4c1511d61c46c55eba0737583620b6febf194c7b9cc23f/watchfiles-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:03b14855c6f35539e2d95c442ae9530a75762f1e26567152b9ed05f96534a74d", upload-time = "2026-05-18T04:32:09.677Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fc/3d/8024c801df84d1587740d0359e7fdd80afeae3d159011f3d5376dd82f18e/watchfiles-1.2.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:704fd259e332e01f9b9c178f4bce9e49027e5587cc2600eeeaf8e76e1c846201", upload-time = "2026-05-18T04:31:19.014Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/87/5b/f4dfd45323e949984a3a7f9dc31d1cbb049921e7d98253488dda72ccdaa9/watchfiles-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6543cf55d170003296d185c0af981f3e1311564907e1f4e08671fc7693a890a5", upload-time = "2026-05-18T04:30:08.46Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/98/d8/19483ef075d601c409bce8bcbb5c0f81a10876fff870400568f08ce484a1/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89d8c2394a065ca86f5d2910ff263ae67c127e1376ccc4f9fc35c71db879f80a", upload-time = "2026-05-18T04:30:45.723Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b1/6a/cc81fbe7ee42f2f22e661a6e12def7807e01b14b2f39e0ff83fd373fd307/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:772b80df316480d894a0e3165fdd19cf77f5d17f9a787f94029465ad0e3529d1", upload-time = "2026-05-18T04:31:29.292Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b1/57/7e669002082c0a0f4fb5113bb70125f7110124b846b0a11bc5ae8e90eac1/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d158cd89df6053823533e06fb1d73c549133bff5f0396170c0e53d9559340717", upload-time = "2026-05-18T04:30:05.44Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/45/7d/f60a2b19807b21fe8281f3a8da4f59eef0d5f96825ac4680ba2d4f2ebf91/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d516b3283a758e087841aedb8031549fb41ced08f3db10aa6d2bf32dc042525b", upload-time = "2026-05-18T04:30:40.568Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/bd/49/77f5b5e6efbcd57482f74948ebb1b97e5c0046d6b61475042d830c84b3ff/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:53b2290c92e0506d102cd448fbc610d87079553f86caa39d67440856a8b8bba5", upload-time = "2026-05-18T04:31:17.942Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ee/5a/73e2959af1b97fd5d556f9a8bdba017be23ceeef731869d5eaa0a753d5a3/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a711b51aec4370d0dcda5b6c09463206f133a5759341d7744b953a7b62e1100e", upload-time = "2026-05-18T04:30:30.182Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/50/57/1bc8c27fad7e6c19bddee15d276dbb6ab72480ec01c127afff1673aee417/watchfiles-1.2.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:e2ca07fa7d89195ec0865d3d285666286740bfa83d83e5cee204043a31ecc165", upload-time = "2026-05-18T04:32:15.897Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/09/6c/3c2e44edba3553c5e3c3b8c8a2a6dee6b9e12ae2cf4bd2378bebf9dc3038/watchfiles-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0618518f282c4ebff60f5e5b1247b6d91bb8b9f4476947563a1e74acc66f3c6", upload-time = "2026-05-18T04:31:37.123Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/30/c2/d8c84a882ab39bbefcc4915ab3e91830b7a7e990c5570b0b69075aba3faf/watchfiles-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d191c054d0715c3c95c99df9b8dbf6fd096d8c1e021e8f212e1bd8bc444ccb5", upload-time = "2026-05-18T04:31:24.62Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a9/07/f97736a5fc605364fe67b25e9fa4a6965dfd4840d50c406ada507e9d735f/watchfiles-1.2.0-cp311-cp311-win32.whl", hash = "sha256:9342472aff9b093c5acd4f6d8f70ae0937964ab56542502bcf5579782da69ae8", upload-time = "2026-05-18T04:31:21.131Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/cf/99/2b04981977fc2608afd60360d928c6aecf6b950292ca221d98f4005f6694/watchfiles-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:dbd6c97045dad81227c8d040173da044c1de08de64a5ea8b555da4aee1d5fa22", upload-time = "2026-05-18T04:31:45.966Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3c/74/f7f58a7075ee9cf612b0cfcddb78b8cd8234f0742d6f0075cf0da2dde1c6/watchfiles-1.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:57a2d9fa4fb4c2ecae57b13dfff2c7ab53e21a2ba674fe9f05506680fcdcc0d7", upload-time = "2026-05-18T04:31:39.126Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b8/2f/e42c992d2afda3108ea1c02acecc991b9f31d05c14adc2a7cee9ee211fc4/watchfiles-1.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:bc13eb17538be00c874699dc0abe4ee2bc8d50bb1166a6b9e175ef3fd7eb8f26", upload-time = "2026-05-18T04:32:02.06Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5f/8f/6af2ea19065c91d8b0ea3516fdfc8c0d349f407e8e9fbf4e5a17360de8ad/watchfiles-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d95ddc1eb6914154253d239089900813f6a767e174b8e6a50e7fdacb7e4236c", upload-time = "2026-05-18T04:30:50.951Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/13/01/b32a967c56fb3e3e5be3db52c3d3b87fa4513aa367d8ed1ad96d42952e5f/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f70d8b291ef6e88d19b1f297a6905ddb978888d9272b0d05e6f53309856bcfc", upload-time = "2026-05-18T04:31:04.231Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/04/98/97557a812180338cb1abd32e1cffcc4588f59b5f23e0cb006b2ba95ba64a/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56d8641cf834c2836922899105bd3ce3d0dfc69291d52edf0b4d0436829b34c0", upload-time = "2026-05-18T04:31:50.377Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e8/a8/b4b08dcb7653b8087c6586f7ce649505900e866bbcfe40dc9587af02e686/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2581a94056e55d7d0a31a823ea92bf73749c489ca2285bfdc0fbe6b2bb49d50c", upload-time = "2026-05-18T04:31:42.485Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/50/94/3dceea03545d2e5ddfd839f0ddd5e1cecbf1697b5a428d5ba11cef6af95d/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41bc1199f7523b3f82843c88cbb979180c949caef0342cf90968f178e5d49b01", upload-time = "2026-05-18T04:31:03.071Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/cc/f2/d39a5450c3532092b91f81d274360e613c2371bc874a89c7a1a3c5e8d138/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7571e4464cb6e434958f867f7f730b8ab0b75e3f8e5eac0499168486ab3c33a8", upload-time = "2026-05-18T04:30:12.701Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/22/24/ed72f68cbc1333ca9b9f2200aa048bb6658ae41709bc1caad4310f4bdffd/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e53a384f76b631c3ae5334ce6a52f0baa3a911eb94a4eac7f160079868b716d5", upload-time = "2026-05-18T04:30:13.784Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0d/64/982ef4a4e5bab5b6e5b6becc8cd5e732f6130a78b855f0abec6439a9a135/watchfiles-1.2.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:d20029a60a71a052a24c4db7673bc4de39ab89adbaccbfb5d67987c5d73f424d", upload-time = "2026-05-18T04:31:52.111Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a0/0c/95282abf4ed680b6096010bcfc30c5fa7a041fc5aa5a2ad17a2cc6c75bba/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2cb93af48550faf1cea04c303107c8b75833de7013e57ce27d3b8d21d8d0f58c", upload-time = "2026-05-18T04:31:25.676Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/30/45/607c1de1530c4bdcf2cf1d1ecc2505ddba5d96bd43ba9f2b0e79876f850f/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2995c176de7692b86a2e4c58d9ec718f753150a979cb4a754e2b4ffa38e70906", upload-time = "2026-05-18T04:30:24.333Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fa/08/d9e2e0f9e8e6791d33aefc694ad7eefa7f901f63caff84a81ded38692f9c/watchfiles-1.2.0-cp312-cp312-win32.whl", hash = "sha256:7a2cffd17d27d2ecbb310c2b1d8174f222a5495b1a721894afa88ec11e25b898", upload-time = "2026-05-18T04:30:31.307Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1c/e6/9d42569c0102645cc8cea5d8c7d8a1e9d4ada2cb7f05f75e554b8aa2202a/watchfiles-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:f155b3a1b2a5fc89cdc70d47ee5d54e3b75e88efa34982028a35daef9ba00379", upload-time = "2026-05-18T04:32:10.745Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0a/26/88e0dc6ee3898169d7fa22bb6a69cabf2502d2ee25cb8c876d1262d204f8/watchfiles-1.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:8fa585ede612ee9f9e91b18bebf9ba11b9ae29a4e3a0d0cf6fca3e382133f0d5", upload-time = "2026-05-18T04:30:22.23Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d1/4d/70a7feced9f87e2ff26dba42667290f41694fc64646c67261fbb8cab5d5c/watchfiles-1.2.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:01ea8d66f0693b9b60a6541c8d10263091ca9a9060d242f3c1f3143f9aad2c98", upload-time = "2026-05-18T04:31:38.162Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/31/3a/0da302f2307aee316922806ebd5726c542cbd787c938271cf14a074c7daf/watchfiles-1.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ba0480b9a74af058f43b337e937a451e109295c420916d68ad24e3dc02f5e44", upload-time = "2026-05-18T04:30:27.051Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/db/ef/d5bdb705c224dbc256aa0c1ec47bf4e61ec52558f2afb44a71a1fe4d7015/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f34e26a19f91f710c08e0183429f0d1d15df734e6bc78c31e77b9ea9c433658", upload-time = "2026-05-18T04:31:11.945Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/71/29/5495f2c1661949ef7a35e4d71111d129cfe7606414a26887a919d0a55406/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4e77f6a55f858504069abd35d336a637555c09bca453dde1ee1e5ada8a6a1fb", upload-time = "2026-05-18T04:30:52.606Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d5/8c/7f9c07c433811c2fffd93e13fdfb7135de9aab5f2ae41be08960fa0047dc/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0cb4d80e212f116474a545c21c912b445f16bb0cef9e6a73a498164223e14e2f", upload-time = "2026-05-18T04:31:36.003Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3c/11/d93632febc52fbc21be90231bb7c17fd5387f46c9076fd40a5f9c2ae6910/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b974946a10af379d425e2eef5b62f5c6ebeaccf91d45eaad6f5b27ecd4f91aa0", upload-time = "2026-05-18T04:31:10.862Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/55/b4/383173e73aabb07ad1d9c7aa859d95437ac46a6d6a1e11005facda0c9d19/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86bc13c25a8d1fcd70b51d0ce7c9b65e90de5666fcbfd3e34957cc73ee19aeb5", upload-time = "2026-05-18T04:30:17.006Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a7/6c/89b1a230a78f57c52dd8893adb1f92f94411721b6ec12596c56d98c74356/watchfiles-1.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca148d73dea36c9763aaa351e4d7a51780ec1584217c45276f4fe8239c768b71", upload-time = "2026-05-18T04:30:35.656Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/24/62/1732118367cfff0a9fce3bf62ff4bfded09ef5df21d9d446b858b3f70a96/watchfiles-1.2.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:c525543d91961c6955b2636b308569e84a1d1c5f5f2932041ab9ef46422f43e3", upload-time = "2026-05-18T04:30:20.846Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/28/96/716f7e5f51339bf22963f3345f9f27d7f3b30e2eadc597e257c881dd3c53/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a204794696ffb8f9b10fba6f7cb5216d42f3b2b71860ccac6b6e42f5f10973b0", upload-time = "2026-05-18T04:31:05.397Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4c/fe/c40783950fd771ccf66ab3ec2722d188a9af1c7f96c6e811f36e40c6e03f/watchfiles-1.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:10d86db20695afe7997ac9e1717637d6714a8d0220458c33f3d2061f54cec427", upload-time = "2026-05-18T04:31:48.22Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/71/72/4508db1856d1d87fcbb3b63f4839bab1b5682cb0e8d224d122263c09654a/watchfiles-1.2.0-cp313-cp313-win32.whl", hash = "sha256:eb283ee99e21ad6443c8cdb06ac5b34b1308c329cbdf03fa02b445363714c799", upload-time = "2026-05-18T04:30:59.57Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f9/36/14b76ca57652e5cc5fd1c11f32a261292c08a0d19a00351013c2549cbfb2/watchfiles-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:a0f27f01bee51861392bb6b7c4fdb290b27d1eb194e9e28788d68102a0e898d9", upload-time = "2026-05-18T04:32:07.937Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/1b/8d/0a85e395398d8d20fadfe5c5d32c726eee17a519e78fb356f2cf7531bffe/watchfiles-1.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:3651aa7058595e9cfb75d35dd5ada2bf9f48a5b8a0f3562821d3e210c507e077", upload-time = "2026-05-18T04:31:54.484Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/37/68/36db056f1fdcc5f07302f56e631774d6835bcd6fa3ace402304621d5f9e5/watchfiles-1.2.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:faea288b6f0ab1902ef08f4ca6de005dccf856c4e0c4f21b8c5fce02d90a1b08", upload-time = "2026-05-18T04:30:44.576Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c1/64/01a9d6f66a82a5c101ce939274106cc72759d62427e153f01edd2b9f87c2/watchfiles-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01859b11fd9fbca670f4d5da00fbac282cfea9bd67a2125d8b2833a3b5617ea9", upload-time = "2026-05-18T04:30:25.413Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/84/2c/0a44fe058cb4bb7b8ede6b6670698bbb7c0400740e378d00022189b7b31d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fff610d7bb2256a317bb1e96f0d7862c7aa8076733ee5df0fd41bbe76a24a4f4", upload-time = "2026-05-18T04:32:14.005Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/67/a1/351e0d56cd35e6488b5c8b4fb11a809a5bc923e8fe8fed9faf8920be0c89/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b141a4891c995a039cd89e9a49e62df1dc8a559a5d1a6e4c7106d16c12777a55", upload-time = "2026-05-18T04:31:22.279Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d5/7d/9d09605187f1b838998624049fcf8bf47b73c1a3b76901fcac1782f62277/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f22943b7770483f6ea0721c6b11d022947a98eb0acae14694de034f4d0d38925", upload-time = "2026-05-18T04:31:43.657Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/60/5d/a17a16eccb182f04188cd308ec24b1a71a9b5c4e7098269cf35d9fa56d02/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1bc6195825b7dcd217968bb1f801a60fd4c16e8eeab5bedc7fe917d7d5995ab4", upload-time = "2026-05-18T04:32:11.875Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d3/3d/4dd457062083ab1938e5dfd45032eb425cee2ac817287ca8ff4356183e5d/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d4a4b147f5dca2a5d325a06a832fb43f345751adfbc63204aec30e0d9ca965a2", upload-time = "2026-05-18T04:30:43.492Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c6/71/ea8c57b128f5383de74d0c7d2d9c57ad7c9a65a930c451bd25d524b295b7/watchfiles-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4543579a9bdb0c9560039b4ffddbdb39545707659fbc430ce4c10f3f68d557f9", upload-time = "2026-05-18T04:30:16.061Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/53/fd/2e812bf938406d7db351f0703ddd3fc6c061cf30d96153a77bc79a943a44/watchfiles-1.2.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:20aa0e708b920bde876a4aa82dc7dd6ebea228a63a67cda6632c2fc87b787efa", upload-time = "2026-05-18T04:31:44.9Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/86/56/d17a7f1dd1bc3035f1072694a551301272f1739c2d8e319c927cb9e29b38/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:d413349d565dab74297f2a63e84a097936be69bf8f3b3801f27f380e32040f44", upload-time = "2026-05-18T04:31:14.141Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/be/06/f1ff66bf5cae50aa4062779a0ecd0bbaf15e466195719074078947d9a17d/watchfiles-1.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:f28b2725eb8cce327b9b3ab02415c853011dc55c95832fe90de6bc56f5315f72", upload-time = "2026-05-18T04:31:47.14Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e7/54/a9c7ea9a82a4ac65e7004c0a03920b5cdd2f9c3b678757d9cd425aa51d53/watchfiles-1.2.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b8c8358484d5fa12ef34f05b7f4168eaf1932f408725ff6d023c33ec17bd79d4", upload-time = "2026-05-18T04:32:05.153Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/aa/5d/c9ab3534374a4a67450696905d6ef16a04405448b8dc52bd752ae50423d4/watchfiles-1.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f04b092229ad2c50126dd3c922c8822e51e605993764a33058d4a791ab42281", upload-time = "2026-05-18T04:30:54.849Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/26/ca/1ad30103535cf0cecd7b993e8d50edc5351b1820e38f2d22e3df58962feb/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7a7ce236284f002a156f70add88efe5c70879cccbb658be0822c54b1306fc09d", upload-time = "2026-05-18T04:30:53.727Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/37/a1/ceee2cdf2afbd715fa07758d39c9859513eae411b23196f7fd039e5feedd/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b9909cc2b48468b575eefa944919e1fe8a36c5849d5c7c168f80a8c1db69398e", upload-time = "2026-05-18T04:30:23.312Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e8/f6/421e30fd1cb3907a84ed92ab3f1983e37ba2dca015e9a894a048418417a2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a37faaed405c67e28e6be45a1fa4f206ef5a2860f27c237db9fa30704c38242", upload-time = "2026-05-18T04:30:47.358Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/41/b0/55ed1b97ed08be7bba6f9a541cac15f2a858e1d74d2b07b6da70a82aab00/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9649193aa27bd9ff2e80ff29bfaa93085496c7a3a377592823cc58b77ee88add", upload-time = "2026-05-18T04:30:38.915Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/d1/cf/d8ae8a80dd7bafab395ea7681c10237311bbf34d37704a8c744e7cf31fc7/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e4ff8e37f99cf1da89e255e07c9c4b37c214038c4283707bdec308cb1b0ea1f", upload-time = "2026-05-18T04:30:09.914Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7c/8a/3076c496ca8dafe0e8cd03fcebdfc47be4b1174b4e5b24ff6e396e6b3af2/watchfiles-1.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:054dc20fd2e3132b4c3883b4a00d72fd6e1f56fdaf89fccd12e8057d74cd74d7", upload-time = "2026-05-18T04:30:14.829Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e5/10/9745e17c98e7b8a86454df0a3c7b5686bd650383f1e9f26e4ebcbd6cc0c0/watchfiles-1.2.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e140ed30ebde76796b686e67c182cff10ea2fbab186fafd1560f74bb5a473a6e", upload-time = "2026-05-18T04:30:28.123Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8f/95/8ef4a95481d3e0cb52d62a06fa6e972e81424be2d9698b91a2fecca9904c/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:bb7e52ecf68ba46d22df23467b87cffeb2146908aa523ebfe803019618cfda06", upload-time = "2026-05-18T04:31:49.304Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fd/e4/3b3bf36b0f829b50c6ebcb8d031583863c59f923d6a6af3d485e470d0fac/watchfiles-1.2.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:23282a321c8baf9b3a3c4afff673f9fe65eb7fdc2338d765ccad9d3d1916a5ba", upload-time = "2026-05-18T04:31:06.497Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/21/b1/6cbbb50c1f3002ab568777d44aa21206dfb8807a840990c4037523b51812/watchfiles-1.2.0-cp314-cp314-win32.whl", hash = "sha256:c0db965c5f79aa49fe672d297cf1febc5ad149b658594944f49a54a2b96270a7", upload-time = "2026-05-18T04:30:06.891Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/92/45/190ce6db8dcb4536682cf75d3889ff1a27182a58cb519d343cb6d9ea63d8/watchfiles-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:71283b39fd17e5408eb123bd37aeecfd9d54c81fc184421943208aadb879d103", upload-time = "2026-05-18T04:32:12.901Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/74/0d/3eae1c2313ab08378431d907c3f8095ecca00f3eda33111cf4f0f2591799/watchfiles-1.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:c5c19526f4e54a00f2666a6c0e9e40d582c09e865055ea7378bf0009aab857b3", upload-time = "2026-05-18T04:31:26.902Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b1/75/fb64e6c25d6b5ca636d03df34ffb1c6e9873303e76d27967e045f8df088f/watchfiles-1.2.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:d73a585accffa5ae39c17264c36ec3166d2fad7000c780f5ef83b2722afb9dd2", upload-time = "2026-05-18T04:32:17.108Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/73/4e/9f7adf01754cbf81843722ccfec169d8f26c69778281a302855cecd2ee08/watchfiles-1.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae99b14c5f21e026e0e9d96f40e07d8570ebee6cafd9d8fc318354606daa7a28", upload-time = "2026-05-18T04:31:07.911Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/47/c8/bec626bcc2d69f44b9acb24ce7d60ed7b16b73628eea747fcbd169d8edda/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4429f3b105524a10b72c3a819b091c495d2811d419c1e1e8df773a5a5974f831", upload-time = "2026-05-18T04:31:20.142Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/00/b7/b6362068e81e7c556d155a34c35d40ac3ef42d747b06d7f6e5bf58e359c2/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:43d818978d06062d9b22c4fab2ebe44cf5213d42dc8e62bda8c2760cfa2eeb33", upload-time = "2026-05-18T04:32:06.219Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/67/f8/9a813fa42afb1e0b4625e75f0479826644d3ee8dc287e093799bc01f390c/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9f732dc58b2dbe69e464ccf8fff7a03b0dd0be439da4c0720d3558527d3d6b4", upload-time = "2026-05-18T04:31:56.034Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/2f/bf/27dfb6094ca4c9aad21298b5525b6c53cb36121ee454331d05161e58d130/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f200104103feb097de4cab8fe4f5dd18a2026934c7dea98c55a2f5fd6d5a33b", upload-time = "2026-05-18T04:31:57.133Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/fb/39/44a096d67270ea93df91d33877dbe91fbda3aa4f8ec2edf799d93eda8736/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63ac26eefbf4af1741247d6fb68b11c49a25b2f7413fbd318a83a12aaa9cf666", upload-time = "2026-05-18T04:30:57.33Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/0e/80/c7472203bad6268e3ef1ad260739704847898938ad7ea8b63a5131f46b50/watchfiles-1.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c4997d4e4a55f0d02b6cde327322daf3a0400e5df6c6b15948994bf72497925", upload-time = "2026-05-18T04:30:48.736Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/51/cf/3b10b268b4b7f0fc26e9debb5eef1998b515887840f444cd3ec80c688755/watchfiles-1.2.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:4c887eba18b7945ac73067a8b4a66f21cd46c2539b2bc68588f7be6c7eb6d26b", upload-time = "2026-05-18T04:31:33.826Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3d/3e/a4302545cd589262a0dc7d140e86f7688eba3f9c72776c27f7e23b8864c4/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:3416ff151bb6b5a8d8d11664974fbef4d9305b9b2957839ab5a270468fd8df30", upload-time = "2026-05-18T04:31:15.596Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/db/99/d5649df0a9a410d45b7c882304d0b790903ac9b6e8f2cfd12114e0c6b9f2/watchfiles-1.2.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:0e831a271c035d89789cffc386b6aa1375f39f1cd25eb7ca0997e4970d152fc5", upload-time = "2026-05-18T04:31:58.707Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/92/b9/362702539275019a54dd2e94511b31a9b89c5f9e6a21966de7eb692549fc/watchfiles-1.2.0-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:37a6721cdf3f65dbb13aa9503510ccb4451603ac837e44d265d7992a597e1374", upload-time = "2026-05-18T04:31:16.879Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8f/75/71d5ba62db781e5587bded1d944c675374bc4aa37ff33d5018d98e8b6538/watchfiles-1.2.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2b37d10b5a63bd4d87e18472d80fa525bd670586fae62e5dd580452764879b65", upload-time = "2026-05-18T04:31:28.058Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3c/01/c66dd95d0423fe30d31820e2d1d5bda773764131bbb6ac0cb1cf303ac328/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a105bc2283f67e8fbec74253ec2d94925de92ed72c0393f1206bf326b7b7b69", upload-time = "2026-05-18T04:31:00.836Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/91/15/2fe99557e72f85627c6a8eed50d889e8d101623e060a22ad75b875cb932d/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5327989a465505f05cfe06f04fa9d0c2fd5432bb243e10e6f012b1bdca3c8579", upload-time = "2026-05-18T04:31:34.96Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ed/23/d4acfa0023367428ed48351b3b9b267893037b6cadae55620c61c24bcfd4/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ecb47f183a8025b2aa18b546725c3657e542112ae9c0613a2af79b4fa8d04ad7", upload-time = "2026-05-18T04:31:59.923Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a4/5f/3164cbdce06c9fb95c4f7b9e2f9760b5e2797af43a9ecc317ef42a23a278/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8520a4ab0e37f770afc34459c4f8f7019e153f9124dc101c15538365875d1ab2", upload-time = "2026-05-18T04:32:00.948Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/41/e6/85d3731c55e65cd7690f3f803d24c139588aaf863e4bf2148fe7a7fa1a19/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71cd71740ed2c15211ebb237ced4e39a1cdf6f80566e5fe95428da1626f4fde6", upload-time = "2026-05-18T04:30:34.298Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f4/7d/562641012b8b09872742c3b8adf9629ec479fd78f8d68ae4a0c13da8add6/watchfiles-1.2.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f88af53d6ddaf72179ef613ddc905e6f4785f712b49b80b3bef9f3525e6194b4", upload-time = "2026-05-18T04:31:23.464Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/56/fe/cb8ef3d6f929d14158fdaaad9925985b7310abc9384dcd4d82dd0016fb59/watchfiles-1.2.0-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:cee9d5efd929efdac5f7e58f72b3376f676b64050a91c5b99a7094c5b2317488", upload-time = "2026-05-18T04:31:30.384Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/25/91/80908e835e100527a9267147b08c0eee1fa6ab0ffec15edc04d1d44885f7/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:b718bf356bbc15e559bd8ef41782b573b8ae0e3f177ab244b440568d7ea02cfb", upload-time = "2026-05-18T04:30:49.89Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/46/4b/95ab2f256bb4af3cb2eb23b9317bda984ee6e0f11733a5c004a6c95b06e3/watchfiles-1.2.0-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:922c0e019fe68b3ae392965a766b02a71ba1168c932cebc3733cd52c5fe5b377", upload-time = "2026-05-18T04:31:32.027Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/23/f4/7513ef1e85fc4c6331b59479d6d72661fc391fbe543678052ac72c8b6c19/watchfiles-1.2.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4674d49eb94706dfe666c069fc0a1b646ffcf920473492e209f6d5f60d3f0cc2", upload-time = "2026-05-18T04:30:36.753Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/27/0b/a54103cfd732bb703c7a749222011a0483ef3705948dae3b203158601119/watchfiles-1.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:094b9b70103d4e963499bdea001ee3c2697b144cd9ae6218a62c0f89ec9e31db", upload-time = "2026-05-18T04:32:03.268Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/5e/2c/73f31a3b893886206c3f54d73e8ad8dee58cdb2f69ad2622e0a8a9e07f4e/watchfiles-1.2.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0ef001f8c25ad0fa9529f914c1600647ecd0f542d11c19b7894768c67b6acb7", upload-time = "2026-05-18T04:31:01.932Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e9/f9/45d021e4a5cc7b9dd567f7cbb06d3b75f751a690063fb6cc7ec60f4e46b7/watchfiles-1.2.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a88fc94e647bc4eec523f1caa540258eb71d14278b9daf72fa1e2658a98df0f0", upload-time = "2026-05-18T04:30:56.331Z" }, +] + +[[package]] +name = "websockets" +version = "16.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", upload-time = "2026-01-10T09:23:47.181Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/20/74/221f58decd852f4b59cc3354cccaf87e8ef695fede361d03dc9a7396573b/websockets-16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04cdd5d2d1dacbad0a7bf36ccbcd3ccd5a30ee188f2560b7a62a30d14107b31a", upload-time = "2026-01-10T09:22:21.28Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/19/0f/22ef6107ee52ab7f0b710d55d36f5a5d3ef19e8a205541a6d7ffa7994e5a/websockets-16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8ff32bb86522a9e5e31439a58addbb0166f0204d64066fb955265c4e214160f0", upload-time = "2026-01-10T09:22:22.696Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/10/40/904a4cb30d9b61c0e278899bf36342e9b0208eb3c470324a9ecbaac2a30f/websockets-16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:583b7c42688636f930688d712885cf1531326ee05effd982028212ccc13e5957", upload-time = "2026-01-10T09:22:23.94Z" }, + { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-01-10T09:22:25.469Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/86/26/d40eaa2a46d4302becec8d15b0fc5e45bdde05191e7628405a19cf491ccd/websockets-16.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df57afc692e517a85e65b72e165356ed1df12386ecb879ad5693be08fac65dde", upload-time = "2026-01-10T09:22:27.101Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b0/ba/6500a0efc94f7373ee8fefa8c271acdfd4dca8bd49a90d4be7ccabfc397e/websockets-16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2b9f1e0d69bc60a4a87349d50c09a037a2607918746f07de04df9e43252c77a3", upload-time = "2026-01-10T09:22:28.293Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/04/b4/96bf2cee7c8d8102389374a2616200574f5f01128d1082f44102140344cc/websockets-16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:335c23addf3d5e6a8633f9f8eda77efad001671e80b95c491dd0924587ece0b3", upload-time = "2026-01-10T09:22:30.394Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/02/8e/81f40fb00fd125357814e8c3025738fc4ffc3da4b6b4a4472a82ba304b41/websockets-16.0-cp310-cp310-win32.whl", hash = "sha256:37b31c1623c6605e4c00d466c9d633f9b812ea430c11c8a278774a1fde1acfa9", upload-time = "2026-01-10T09:22:32.083Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b4/5f/7e40efe8df57db9b91c88a43690ac66f7b7aa73a11aa6a66b927e44f26fa/websockets-16.0-cp310-cp310-win_amd64.whl", hash = "sha256:8e1dab317b6e77424356e11e99a432b7cb2f3ec8c5ab4dabbcee6add48f72b35", upload-time = "2026-01-10T09:22:33.345Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f2/db/de907251b4ff46ae804ad0409809504153b3f30984daf82a1d84a9875830/websockets-16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8", upload-time = "2026-01-10T09:22:34.539Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f3/fa/abe89019d8d8815c8781e90d697dec52523fb8ebe308bf11664e8de1877e/websockets-16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:417b28978cdccab24f46400586d128366313e8a96312e4b9362a4af504f3bbad", upload-time = "2026-01-10T09:22:36.332Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/58/5d/88ea17ed1ded2079358b40d31d48abe90a73c9e5819dbcde1606e991e2ad/websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d", upload-time = "2026-01-10T09:22:37.602Z" }, + { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-01-10T09:22:38.789Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c8/c5/27178df583b6c5b31b29f526ba2da5e2f864ecc79c99dae630a85d68c304/websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b", upload-time = "2026-01-10T09:22:39.893Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/87/05/536652aa84ddc1c018dbb7e2c4cbcd0db884580bf8e95aece7593fde526f/websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5", upload-time = "2026-01-10T09:22:41.016Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6d/e2/d5332c90da12b1e01f06fb1b85c50cfc489783076547415bf9f0a659ec19/websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64", upload-time = "2026-01-10T09:22:42.442Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/77/fb/d3f9576691cae9253b51555f841bc6600bf0a983a461c79500ace5a5b364/websockets-16.0-cp311-cp311-win32.whl", hash = "sha256:5f451484aeb5cafee1ccf789b1b66f535409d038c56966d6101740c1614b86c6", upload-time = "2026-01-10T09:22:43.654Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/54/67/eaff76b3dbaf18dcddabc3b8c1dba50b483761cccff67793897945b37408/websockets-16.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7f0659570eefb578dacde98e24fb60af35350193e4f56e11190787bee77dac", upload-time = "2026-01-10T09:22:44.941Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/84/7b/bac442e6b96c9d25092695578dda82403c77936104b5682307bd4deb1ad4/websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00", upload-time = "2026-01-10T09:22:46.787Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b0/fe/136ccece61bd690d9c1f715baaeefd953bb2360134de73519d5df19d29ca/websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79", upload-time = "2026-01-10T09:22:47.999Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", upload-time = "2026-01-10T09:22:49.809Z" }, + { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-01-10T09:22:51.071Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", upload-time = "2026-01-10T09:22:52.224Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", upload-time = "2026-01-10T09:22:53.443Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", upload-time = "2026-01-10T09:22:55.033Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/91/d6/7d4553ad4bf1c0421e1ebd4b18de5d9098383b5caa1d937b63df8d04b565/websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89", upload-time = "2026-01-10T09:22:56.251Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c3/f0/f3a17365441ed1c27f850a80b2bc680a0fa9505d733fe152fdf5e98c1c0b/websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea", upload-time = "2026-01-10T09:22:57.478Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/cc/9c/baa8456050d1c1b08dd0ec7346026668cbc6f145ab4e314d707bb845bf0d/websockets-16.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:878b336ac47938b474c8f982ac2f7266a540adc3fa4ad74ae96fea9823a02cc9", upload-time = "2026-01-10T09:22:59.333Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7e/0c/8811fc53e9bcff68fe7de2bcbe75116a8d959ac699a3200f4847a8925210/websockets-16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:52a0fec0e6c8d9a784c2c78276a48a2bdf099e4ccc2a4cad53b27718dbfd0230", upload-time = "2026-01-10T09:23:01.171Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/aa/82/39a5f910cb99ec0b59e482971238c845af9220d3ab9fa76dd9162cda9d62/websockets-16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e6578ed5b6981005df1860a56e3617f14a6c307e6a71b4fff8c48fdc50f3ed2c", upload-time = "2026-01-10T09:23:02.341Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/bd/28/0a25ee5342eb5d5f297d992a77e56892ecb65e7854c7898fb7d35e9b33bd/websockets-16.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:95724e638f0f9c350bb1c2b0a7ad0e83d9cc0c9259f3ea94e40d7b02a2179ae5", upload-time = "2026-01-10T09:23:03.756Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f9/66/27ea52741752f5107c2e41fda05e8395a682a1e11c4e592a809a90c6a506/websockets-16.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0204dc62a89dc9d50d682412c10b3542d748260d743500a85c13cd1ee4bde82", upload-time = "2026-01-10T09:23:05.01Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/37/e5/8e32857371406a757816a2b471939d51c463509be73fa538216ea52b792a/websockets-16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52ac480f44d32970d66763115edea932f1c5b1312de36df06d6b219f6741eed8", upload-time = "2026-01-10T09:23:06.301Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9b/67/f926bac29882894669368dc73f4da900fcdf47955d0a0185d60103df5737/websockets-16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6e5a82b677f8f6f59e8dfc34ec06ca6b5b48bc4fcda346acd093694cc2c24d8f", upload-time = "2026-01-10T09:23:07.492Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/3c/a1/3d6ccdcd125b0a42a311bcd15a7f705d688f73b2a22d8cf1c0875d35d34a/websockets-16.0-cp313-cp313-win32.whl", hash = "sha256:abf050a199613f64c886ea10f38b47770a65154dc37181bfaff70c160f45315a", upload-time = "2026-01-10T09:23:09.245Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6b/ae/90366304d7c2ce80f9b826096a9e9048b4bb760e44d3b873bb272cba696b/websockets-16.0-cp313-cp313-win_amd64.whl", hash = "sha256:3425ac5cf448801335d6fdc7ae1eb22072055417a96cc6b31b3861f455fbc156", upload-time = "2026-01-10T09:23:10.483Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f3/1d/e88022630271f5bd349ed82417136281931e558d628dd52c4d8621b4a0b2/websockets-16.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8cc451a50f2aee53042ac52d2d053d08bf89bcb31ae799cb4487587661c038a0", upload-time = "2026-01-10T09:23:12.178Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/f2/78/e63be1bf0724eeb4616efb1ae1c9044f7c3953b7957799abb5915bffd38e/websockets-16.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:daa3b6ff70a9241cf6c7fc9e949d41232d9d7d26fd3522b1ad2b4d62487e9904", upload-time = "2026-01-10T09:23:13.511Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/bb/f4/d3c9220d818ee955ae390cf319a7c7a467beceb24f05ee7aaaa2414345ba/websockets-16.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:fd3cb4adb94a2a6e2b7c0d8d05cb94e6f1c81a0cf9dc2694fb65c7e8d94c42e4", upload-time = "2026-01-10T09:23:14.727Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/63/bc/d3e208028de777087e6fb2b122051a6ff7bbcca0d6df9d9c2bf1dd869ae9/websockets-16.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:781caf5e8eee67f663126490c2f96f40906594cb86b408a703630f95550a8c3e", upload-time = "2026-01-10T09:23:15.939Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/ad/6e/9a0927ac24bd33a0a9af834d89e0abc7cfd8e13bed17a86407a66773cc0e/websockets-16.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:caab51a72c51973ca21fa8a18bd8165e1a0183f1ac7066a182ff27107b71e1a4", upload-time = "2026-01-10T09:23:17.148Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/b9/ca/bf1c68440d7a868180e11be653c85959502efd3a709323230314fda6e0b3/websockets-16.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:19c4dc84098e523fd63711e563077d39e90ec6702aff4b5d9e344a60cb3c0cb1", upload-time = "2026-01-10T09:23:18.372Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c4/f8/fdc34643a989561f217bb477cbc47a3a07212cbda91c0e4389c43c296ebf/websockets-16.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a5e18a238a2b2249c9a9235466b90e96ae4795672598a58772dd806edc7ac6d3", upload-time = "2026-01-10T09:23:19.652Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/dd/d1/574fa27e233764dbac9c52730d63fcf2823b16f0856b3329fc6268d6ae4f/websockets-16.0-cp314-cp314-win32.whl", hash = "sha256:a069d734c4a043182729edd3e9f247c3b2a4035415a9172fd0f1b71658a320a8", upload-time = "2026-01-10T09:23:21.458Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/8a/f1/ae6b937bf3126b5134ce1f482365fde31a357c784ac51852978768b5eff4/websockets-16.0-cp314-cp314-win_amd64.whl", hash = "sha256:c0ee0e63f23914732c6d7e0cce24915c48f3f1512ec1d079ed01fc629dab269d", upload-time = "2026-01-10T09:23:22.715Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/06/9b/f791d1db48403e1f0a27577a6beb37afae94254a8c6f08be4a23e4930bc0/websockets-16.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:a35539cacc3febb22b8f4d4a99cc79b104226a756aa7400adc722e83b0d03244", upload-time = "2026-01-10T09:23:24.523Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/bd/40/53ad02341fa33b3ce489023f635367a4ac98b73570102ad2cdd770dacc9a/websockets-16.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b784ca5de850f4ce93ec85d3269d24d4c82f22b7212023c974c401d4980ebc5e", upload-time = "2026-01-10T09:23:25.781Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/74/9b/6158d4e459b984f949dcbbb0c5d270154c7618e11c01029b9bbd1bb4c4f9/websockets-16.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:569d01a4e7fba956c5ae4fc988f0d4e187900f5497ce46339c996dbf24f17641", upload-time = "2026-01-10T09:23:27.033Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/e5/2d/7583b30208b639c8090206f95073646c2c9ffd66f44df967981a64f849ad/websockets-16.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:50f23cdd8343b984957e4077839841146f67a3d31ab0d00e6b824e74c5b2f6e8", upload-time = "2026-01-10T09:23:28.259Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/45/b0/cce3784eb519b7b5ad680d14b9673a31ab8dcb7aad8b64d81709d2430aa8/websockets-16.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:152284a83a00c59b759697b7f9e9cddf4e3c7861dd0d964b472b70f78f89e80e", upload-time = "2026-01-10T09:23:29.449Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/19/60/b8ebe4c7e89fb5f6cdf080623c9d92789a53636950f7abacfc33fe2b3135/websockets-16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:bc59589ab64b0022385f429b94697348a6a234e8ce22544e3681b2e9331b5944", upload-time = "2026-01-10T09:23:31.368Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/88/a8/a080593f89b0138b6cba1b28f8df5673b5506f72879322288b031337c0b8/websockets-16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:32da954ffa2814258030e5a57bc73a3635463238e797c7375dc8091327434206", upload-time = "2026-01-10T09:23:32.627Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/c2/b6/b9afed2afadddaf5ebb2afa801abf4b0868f42f8539bfe4b071b5266c9fe/websockets-16.0-cp314-cp314t-win32.whl", hash = "sha256:5a4b4cc550cb665dd8a47f868c8d04c8230f857363ad3c9caf7a0c3bf8c61ca6", upload-time = "2026-01-10T09:23:33.816Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9f/3e/28135a24e384493fa804216b79a6a6759a38cc4ff59118787b9fb693df93/websockets-16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b14dc141ed6d2dde437cddb216004bcac6a1df0935d79656387bd41632ba0bbd", upload-time = "2026-01-10T09:23:35.016Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/72/07/c98a68571dcf256e74f1f816b8cc5eae6eb2d3d5cfa44d37f801619d9166/websockets-16.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:349f83cd6c9a415428ee1005cadb5c2c56f4389bc06a9af16103c3bc3dcc8b7d", upload-time = "2026-01-10T09:23:36.166Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/7e/52/93e166a81e0305b33fe416338be92ae863563fe7bce446b0f687b9df5aea/websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03", upload-time = "2026-01-10T09:23:37.409Z" }, + { url = "https://pypi-proxy.dev.databricks.com/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", upload-time = "2026-01-10T09:23:39.158Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/a5/8f/aea9c71cc92bf9b6cc0f7f70df8f0b420636b6c96ef4feee1e16f80f75dd/websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c", upload-time = "2026-01-10T09:23:41.031Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/9a/3f/f70e03f40ffc9a30d817eef7da1be72ee4956ba8d7255c399a01b135902a/websockets-16.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a653aea902e0324b52f1613332ddf50b00c06fdaf7e92624fbf8c77c78fa5767", upload-time = "2026-01-10T09:23:42.259Z" }, + { url = "https://pypi-proxy.dev.databricks.com/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", upload-time = "2026-01-10T09:23:45.395Z" }, +] + +[[package]] +name = "zipp" +version = "4.1.0" +source = { registry = "https://pypi-proxy.dev.databricks.com/simple" } +sdist = { url = "https://pypi-proxy.dev.databricks.com/packages/b9/d8/eab98a517c14134c0b2eb4e2387bc5f457334293ec5d2dd3857ec2966802/zipp-4.1.0.tar.gz", hash = "sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602", upload-time = "2026-05-18T20:08:57.967Z" } +wheels = [ + { url = "https://pypi-proxy.dev.databricks.com/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl", hash = "sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f", upload-time = "2026-05-18T20:08:57.045Z" }, +] From 4742a6e2fc3b92857de0e95c5a4413788de2e9c2 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Tue, 23 Jun 2026 08:09:27 +0200 Subject: [PATCH 45/54] feat: mapping attribute toggle-all, reset exclusion fix, lakeflow cold-start fix, MCP retry - Mapping designer: add Exclude all / Include all toggle button (entity & rel panels) - Mapping reset: call _stampExcludedFlags() so excluded state clears on reset - Build pipeline: force=True on GlobalConfigService reads to prevent managed_synced being silently skipped after a cold-start cache miss - MCP server: retry with exponential backoff on 502/503 (Databricks App cold-start) - Docs: user-guide and lakebase-graphdb updated to reflect the above changes --- .../v0.6.0/benoitcayladbx_2026-06-22.log | 95 +++++++++++ docs/lakebase-graphdb.md | 19 +++ docs/user-guide.md | 5 +- src/api/routers/internal/dtwin.py | 4 +- .../core/triplestore/TripleStoreFactory.py | 28 +++- .../objects/digitaltwin/_build_pipeline.py | 10 +- .../static/global/js/mapping-information.js | 8 + src/front/static/mapping/js/mapping-design.js | 150 ++++++++++++++++-- 8 files changed, 300 insertions(+), 19 deletions(-) diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-22.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-22.log index 2c89c27c..9b01a567 100644 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-22.log +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-22.log @@ -1,3 +1,80 @@ +## Mapping designer — Select/Exclude all attributes toggle button + +### Context +The Attributes table in the bottom panel (entity and relationship) only had an +"Exclude unmapped" shortcut. Users had no way to quickly include or exclude +every attribute in one click. + +### Changes +1. `src/front/static/mapping/js/mapping-design.js` — added `toggleAllEntityAttrs()`, + `toggleAllRelAttrs()`, `_updateEntityAttrToggleBtn()`, `_updateRelAttrToggleBtn()` +2. Entity panel header: added ` +

    + + +
    @@ -1309,11 +1316,18 @@ function loadRelationshipPanelContent(ontologyProperty, targetPanelBody = null) ? `
    Attributes - +
    + + +
    @@ -1462,8 +1476,10 @@ function initEntityPanel(classUri, className, existingMapping, classInfo) { nameCell.innerHTML = `${attrName}`; mappedCell.innerHTML = ''; } + _updateEntityAttrToggleBtn(); }); }); + _updateEntityAttrToggleBtn(); // Auto-load query data in background when there is an existing mapping with SQL if (existingMapping?.sql_query) { @@ -1774,8 +1790,10 @@ function initRelationshipPanel(ontologyProperty, existingMapping) { nameCell.innerHTML = `${attrName}`; mappedCell.innerHTML = ''; } + _updateRelAttrToggleBtn(); }); }); + _updateRelAttrToggleBtn(); // Auto-load query data in background when there is an existing mapping with SQL if (existingMapping?.sql_query) { @@ -2251,6 +2269,116 @@ function _syncRelColAssignments() { autoSaveMappings(); } +// ========================================================================== +// SELECT / UNSELECT ALL ATTRIBUTES +// ========================================================================== + +/** + * Update the entity-panel toggle-all button label to reflect current state. + * - All included → button offers "Exclude all" + * - Any excluded → button offers "Include all" + */ +function _updateEntityAttrToggleBtn() { + const btn = document.getElementById('epAttrToggleAllBtn'); + if (!btn) return; + const anyExcluded = EntityPanelState.excludedAttributes.length > 0; + if (anyExcluded) { + btn.innerHTML = 'Include all'; + btn.title = 'Include all attributes in the mapping'; + } else { + btn.innerHTML = 'Exclude all'; + btn.title = 'Exclude all attributes from the mapping'; + } +} + +/** + * Toggle all entity attributes: include all if any are excluded, otherwise exclude all. + */ +function toggleAllEntityAttrs() { + const cbs = document.querySelectorAll('.ep-attr-include-cb'); + if (!cbs.length) return; + const includeAll = EntityPanelState.excludedAttributes.length > 0; + cbs.forEach(cb => { + const attrName = cb.dataset.attr; + const row = cb.closest('tr'); + const nameCell = row?.querySelector('td:nth-child(2)'); + const mappedCell = row?.querySelector('td:nth-child(3)'); + if (includeAll) { + cb.checked = true; + EntityPanelState.excludedAttributes = EntityPanelState.excludedAttributes.filter(a => a !== attrName); + const isMapped = !!EntityPanelState.attributeMappings[attrName]; + if (nameCell) nameCell.innerHTML = attrName; + if (mappedCell) mappedCell.innerHTML = isMapped + ? '' + : ''; + } else { + cb.checked = false; + if (!EntityPanelState.excludedAttributes.includes(attrName)) { + EntityPanelState.excludedAttributes.push(attrName); + } + if (nameCell) nameCell.innerHTML = `${attrName}`; + if (mappedCell) mappedCell.innerHTML = ''; + } + }); + _updateEntityAttrToggleBtn(); + const classUri = document.getElementById('panelEntityClass')?.value; + _syncEntityAttrExclusions(classUri); + const msg = includeAll ? 'All attributes included' : `${cbs.length} attribute(s) excluded — click Save to persist`; + showNotification(msg, 'info', 2000); +} + +/** + * Update the relationship-panel toggle-all button label to reflect current state. + */ +function _updateRelAttrToggleBtn() { + const btn = document.getElementById('rpAttrToggleAllBtn'); + if (!btn) return; + const anyExcluded = RelPanelState.excludedAttributes.length > 0; + if (anyExcluded) { + btn.innerHTML = 'Include all'; + btn.title = 'Include all attributes in the mapping'; + } else { + btn.innerHTML = 'Exclude all'; + btn.title = 'Exclude all attributes from the mapping'; + } +} + +/** + * Toggle all relationship attributes: include all if any are excluded, otherwise exclude all. + */ +function toggleAllRelAttrs() { + const cbs = document.querySelectorAll('.rp-attr-include-cb'); + if (!cbs.length) return; + const includeAll = RelPanelState.excludedAttributes.length > 0; + cbs.forEach(cb => { + const attrName = cb.dataset.attr; + const row = cb.closest('tr'); + const nameCell = row?.querySelector('td:nth-child(2)'); + const mappedCell = row?.querySelector('td:nth-child(3)'); + if (includeAll) { + cb.checked = true; + RelPanelState.excludedAttributes = RelPanelState.excludedAttributes.filter(a => a !== attrName); + const isMapped = !!RelPanelState.attributeMappings[attrName]; + if (nameCell) nameCell.innerHTML = attrName; + if (mappedCell) mappedCell.innerHTML = isMapped + ? '' + : ''; + } else { + cb.checked = false; + if (!RelPanelState.excludedAttributes.includes(attrName)) { + RelPanelState.excludedAttributes.push(attrName); + } + if (nameCell) nameCell.innerHTML = `${attrName}`; + if (mappedCell) mappedCell.innerHTML = ''; + } + }); + _updateRelAttrToggleBtn(); + const propertyUri = RelPanelState.propertyUri; + _syncRelAttrExclusions(propertyUri); + const msg = includeAll ? 'All attributes included' : `${cbs.length} attribute(s) excluded — click Save to persist`; + showNotification(msg, 'info', 2000); +} + // ========================================================================== // AUTO-EXCLUDE UNMAPPED ATTRIBUTES // ========================================================================== @@ -2281,6 +2409,7 @@ function autoExcludeUnmappedEntityAttrs() { changed++; } }); + _updateEntityAttrToggleBtn(); if (changed > 0) { showNotification(`${changed} unmapped attribute(s) excluded — click Save to persist`, 'info', 2500); } else { @@ -2313,6 +2442,7 @@ function autoExcludeUnmappedRelAttrs() { changed++; } }); + _updateRelAttrToggleBtn(); if (changed > 0) { showNotification(`${changed} unmapped attribute(s) excluded — click Save to persist`, 'info', 2500); } else { From 35380eedf11d8024e3f22ef3ba8370b4454439d5 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Tue, 23 Jun 2026 08:34:05 +0200 Subject: [PATCH 46/54] Delete ISSUE-52-FIX-REPORT.md --- ISSUE-52-FIX-REPORT.md | 143 ----------------------------------------- 1 file changed, 143 deletions(-) delete mode 100644 ISSUE-52-FIX-REPORT.md diff --git a/ISSUE-52-FIX-REPORT.md b/ISSUE-52-FIX-REPORT.md deleted file mode 100644 index 58104062..00000000 --- a/ISSUE-52-FIX-REPORT.md +++ /dev/null @@ -1,143 +0,0 @@ -# Bug Fix Report — Issue #52 - -**Title:** Expanded instances in knowledge graph view are grouped under -identifier instead of entity type -**Issue:** [databrickslabs/ontobricks#52](https://github.com/databrickslabs/ontobricks/issues/52) -**Reported by:** @ulsmo · **Affected version:** 0.4.0 · **Fixed in:** 0.5.0 -**Date:** 2026-06-12 - ---- - -## 1. Summary - -When using the knowledge graph viewer's **right-click → "Expand neighbours"** -action, the newly added nodes showed up in the *View* pane as brand-new entity -types named after their **identifiers** (with freshly randomised colours) -instead of being folded into the entity type they actually belong to. This -made type-based filtering and the colour coding effectively unusable after any -expansion. - -The root cause was a **backend filter dropping `rdf:type` triples**, not a -front-end rendering bug. A one-line condition in the neighbour-expansion -endpoint is responsible. - ---- - -## 2. Reproduction - -1. Run a query to load a graph in the Digital Twin viewer. -2. Right-click any node → **Expand neighbours**. -3. Observe the *View* pane: the expanded nodes appear under new groups keyed by - their identifier rather than under their existing entity type, each with a - new random colour. - ---- - -## 3. Root Cause Analysis - -The expansion calls `GET /dtwin/neighbors` -(`src/api/routers/internal/dtwin.py`). The endpoint BFS-traverses from the seed -URI, collects the set of `visited` **instance** URIs, then fetches every triple -whose subject is in that set and returns the induced subgraph. - -To avoid rendering edges that point at nodes outside the returned subgraph -("ghost endpoints"), it discarded any triple whose object is a URI **not** in -`visited`: - -```python -is_uri_obj = o.startswith("http://") or o.startswith("https://") -if is_uri_obj and o not in visited: - continue # <-- also drops rdf:type triples -``` - -The problem: an `rdf:type` triple's object is the **class** URI -(e.g. `http://…/onto/Person`). A class is part of the ontology schema, never an -*instance*, so it is **never** in the `visited` instance set. As a result every -`rdf:type` triple for the freshly expanded nodes was silently filtered out. - -Downstream, the front-end `buildGraph()` (`query-d3graph.js`) assigns each -node's entity type from its `rdf:type` triple. With that triple missing it -falls back to `inferTypeFromUri()`, which derives a pseudo-type from the URI's -local part — i.e. the node's **identifier**. That pseudo-type becomes a new -group with its own colour, exactly matching the reported symptom. - -The originally-queried nodes were unaffected because the initial query result -*does* include their `rdf:type` triples. - ---- - -## 4. The Fix - -Preserve `rdf:type` triples through neighbour filtering even when the class URI -is not part of the visited subgraph. The inline loop was extracted into a small, -unit-testable helper. - -`src/api/routers/internal/dtwin.py`: - -```python -_RDF_TYPE_URI = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" - - -def _is_type_predicate(predicate: str) -> bool: - if not predicate: - return False - return ( - predicate == _RDF_TYPE_URI - or predicate.endswith("#type") - or predicate.endswith("/type") - ) - - -def _filter_neighbor_triples(rows, visited, limit): - triples, seen = [], set() - for r in rows: - s, p, o = r.get("subject", ""), r.get("predicate", ""), r.get("object", "") - key = (s, p, o) - if key in seen: - continue - is_uri_obj = o.startswith("http://") or o.startswith("https://") - if is_uri_obj and o not in visited and not _is_type_predicate(p): - continue # keep literals, in-subgraph URIs, and rdf:type - seen.add(key) - triples.append({"subject": s, "predicate": p, "object": o}) - if len(triples) >= limit: - break - return triples -``` - -The endpoint now simply calls `triples = _filter_neighbor_triples(rows, visited, limit)`. - -**Why this is safe:** keeping type triples does **not** introduce ghost class -nodes — `buildGraph()`'s pre-pass already detects type/class URIs and excludes -them from the entity set, using them only to assign types. The type-predicate -detection (`#type` / `/type` / full RDF URI) mirrors the logic the front-end -already uses, so backend and front-end stay consistent. - ---- - -## 5. Tests - -Added `TestNeighborTripleFilter` in `tests/units/api/test_routes.py` (6 cases): - -| Test | Asserts | -|------|---------| -| `test_keeps_rdf_type_triple_even_when_class_uri_not_visited` | The #52 regression — type triple survives | -| `test_keeps_short_type_predicate` | `#type` suffix predicates also survive | -| `test_drops_non_type_uri_object_outside_visited` | Ghost-endpoint guard still works | -| `test_keeps_uri_object_within_visited` | In-subgraph edges preserved | -| `test_keeps_literal_object` | Literal attributes preserved | -| `test_dedups_and_respects_limit` | De-dup + `limit` cap intact | - -**Result:** `python -m pytest tests/units` → **2328 passed, 11 skipped**. -(`tests/property/*` is skipped because the optional `hypothesis` package is not -installed in this environment — unrelated to this change.) - ---- - -## 6. Files Changed - -- `src/api/routers/internal/dtwin.py` — added `_RDF_TYPE_URI`, - `_is_type_predicate()`, `_filter_neighbor_triples()`; endpoint now delegates - filtering to the helper. -- `tests/units/api/test_routes.py` — added `TestNeighborTripleFilter`. -- `changelogs/v0.5.0/benoitcayladbx_2026-06-12.log` — changelog entry. From 3a94a18bc338cb969817638bcd247a23fe0eedd0 Mon Sep 17 00:00:00 2001 From: Benoit Cayla Date: Tue, 23 Jun 2026 09:16:43 +0200 Subject: [PATCH 47/54] =?UTF-8?q?rename:=20Digital=20Twin=20=E2=86=92=20Kn?= =?UTF-8?q?owledge=20Graph,=20Knowledge=20Graph=20=E2=86=92=20Graph=20View?= =?UTF-8?q?er?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UI-only label rename across the entire codebase: - Top-level nav section "Digital Twin" is now "Knowledge Graph" - Sigma.js viewer sub-item "Knowledge Graph" is now "Graph Viewer" Internal code identifiers (digitaltwin, dtwin, DigitalTwin, routes) unchanged. All 2418 unit tests pass. --- .cursor/01-expertise-and-principles.mdc | 2 +- .cursor/02-project-overview.mdc | 4 +- .../03-system-components-and-requirements.mdc | 2 +- .cursor/04-project-structure.mdc | 2 +- .cursor/11-frontend-design.mdc | 2 +- README.md | 22 +++--- .../v0.6.0/benoitcayladbx_2026-06-23.log | 50 +++++++++++++ docs/INFO.md | 64 ++++++++-------- docs/README.md | 2 +- docs/api.md | 24 +++--- docs/architecture.md | 40 +++++----- docs/code_organization.md | 16 ++-- docs/cohort_discovery.md | 4 +- docs/dab-reference.md | 2 +- docs/data-access.md | 16 ++-- docs/deployment.md | 30 ++++---- docs/development.md | 20 ++--- docs/examples.md | 18 ++--- docs/features.md | 18 ++--- docs/get-started.md | 14 ++-- docs/graphdb-integration.md | 4 +- docs/import-export.md | 2 +- docs/lakebase-graphdb.md | 14 ++-- docs/mcp.md | 20 ++--- docs/product.md | 62 ++++++++-------- docs/sphinx/api/api_external.rst | 2 +- docs/sphinx/api/app.core.graphdb.lakebase.rst | 2 +- docs/sphinx/changelog.rst | 6 +- docs/sphinx/conf.py | 2 +- docs/sphinx/index.rst | 6 +- docs/sphinx/overview/architecture.rst | 2 +- docs/user-guide.md | 74 +++++++++---------- src/agents/agent_dtwin_chat/__init__.py | 2 +- src/agents/agent_dtwin_chat/engine.py | 2 +- src/agents/agent_dtwin_chat/tools.py | 2 +- src/api/__init__.py | 2 +- src/api/constants.py | 4 +- src/api/external_app.py | 2 +- src/api/routers/digitaltwin.py | 10 +-- src/api/routers/internal/dtwin.py | 20 ++--- src/api/routers/internal/home.py | 2 +- src/back/core/databricks/SQLWarehouse.py | 2 +- src/back/core/graphdb/lakebase/provisioner.py | 2 +- src/back/core/w3c/shacl/SHACLService.py | 2 +- src/back/fastapi/graphql_routes.py | 2 +- src/back/objects/__init__.py | 2 +- src/back/objects/digitaltwin/DigitalTwin.py | 18 ++--- .../objects/digitaltwin/_build_pipeline.py | 10 +-- src/back/objects/digitaltwin/constants.py | 2 +- src/back/objects/digitaltwin/models.py | 2 +- src/back/objects/domain/HomeService.py | 8 +- src/back/objects/domain/SettingsService.py | 2 +- src/back/objects/registry/ReviewService.py | 4 +- src/back/objects/registry/scheduler.py | 2 +- src/back/objects/registry/store/base.py | 4 +- .../registry/store/lakebase/schema.sql | 2 +- .../objects/registry/store/lakebase/store.py | 2 +- .../objects/registry/version_lifecycle.py | 2 +- src/back/objects/session/DomainSession.py | 2 +- src/front/config/menu_config.json | 4 +- src/front/routes/dtwin.py | 2 +- src/front/routes/resolve.py | 4 +- src/front/static/config/js/build-analytics.js | 2 +- src/front/static/config/js/schedule.js | 2 +- .../static/domain/css/domain-validation.css | 2 +- src/front/static/domain/js/domain-review.js | 2 +- .../static/domain/js/domain-validation.js | 8 +- src/front/static/global/css/main.css | 2 +- src/front/static/global/css/permissions.css | 6 +- .../static/global/css/sidebar-layout.css | 2 +- src/front/static/global/js/breadcrumb.js | 2 +- src/front/static/global/js/comments-panel.js | 2 +- src/front/static/global/js/navbar.js | 2 +- src/front/static/global/js/ontology-design.js | 2 +- src/front/static/query/css/query-api.css | 2 +- src/front/static/query/css/query-chat.css | 2 +- .../static/query/css/query-dataquality.css | 2 +- .../static/query/css/query-sigmagraph.css | 2 +- src/front/static/query/css/query-sync.css | 6 +- .../static/query/css/query-visualization.css | 2 +- src/front/static/query/js/query-api.js | 2 +- src/front/static/query/js/query-chat.js | 4 +- src/front/static/query/js/query-cohorts.js | 14 ++-- .../static/query/js/query-dataquality.js | 6 +- src/front/static/query/js/query-graphql.js | 4 +- src/front/static/query/js/query-loaders.js | 2 +- .../static/query/js/query-ontology-viewer.js | 2 +- src/front/static/query/js/query-reasoning.js | 2 +- src/front/static/query/js/query-sigmagraph.js | 4 +- src/front/static/query/js/query-sync.js | 26 +++---- src/front/static/query/js/query.js | 8 +- src/front/templates/about.html | 12 +-- src/front/templates/dtwin.html | 6 +- src/front/templates/ontology.html | 4 +- .../templates/partials/_cohort_modals.html | 2 +- .../partials/domain/_domain_discussions.html | 2 +- .../partials/domain/_domain_information.html | 10 +-- .../partials/domain/_domain_validation.html | 6 +- .../templates/partials/dtwin/_query_api.html | 18 ++--- .../templates/partials/dtwin/_query_chat.html | 12 +-- .../partials/dtwin/_query_cohorts.html | 4 +- .../partials/dtwin/_query_dataquality.html | 2 +- .../partials/dtwin/_query_graphql.html | 4 +- .../partials/dtwin/_query_insights.html | 8 +- .../partials/dtwin/_query_reasoning.html | 2 +- .../partials/dtwin/_query_sigmagraph.html | 8 +- .../templates/partials/dtwin/_query_sync.html | 16 ++-- .../templates/partials/layout/help_modal.html | 40 +++++----- .../mapping/_mapping_diagnostics.html | 2 +- .../partials/ontology/_ontology_cohorts.html | 4 +- .../partials/ontology/_ontology_design.html | 2 +- .../partials/ontology/_ontology_groups.html | 4 +- .../registry/_registry_build_analytics.html | 2 +- .../partials/registry/_registry_schedule.html | 4 +- src/front/templates/settings.html | 4 +- src/mcp-server/app.yaml | 2 +- src/mcp-server/server/app.py | 12 +-- src/shared/fastapi/health.py | 2 +- src/shared/fastapi/main.py | 4 +- tests/e2e/dtwin/test_dtwin_api_flows.py | 4 +- tests/e2e/dtwin/test_dtwin_flows.py | 4 +- tests/e2e/navigation/test_navigation_flows.py | 2 +- tests/units/api/test_ui_rendering.py | 2 +- tests/units/dtwin/test_digitaltwin_api.py | 2 +- 124 files changed, 530 insertions(+), 480 deletions(-) create mode 100644 changelogs/v0.6.0/benoitcayladbx_2026-06-23.log diff --git a/.cursor/01-expertise-and-principles.mdc b/.cursor/01-expertise-and-principles.mdc index ed8652fa..f902bfa7 100644 --- a/.cursor/01-expertise-and-principles.mdc +++ b/.cursor/01-expertise-and-principles.mdc @@ -5,7 +5,7 @@ scope: globs: ["**/*"] --- -You are an expert in **Python, FastAPI, Jinja2, Databricks SDK, Databricks REST APIs, RDF/OWL/SPARQL/SHACL standards, graph databases**, and **knowledge graph engineering**. +You are an expert in **Python, FastAPI, Jinja2, Databricks SDK, Databricks REST APIs, RDF/OWL/SPARQL/SHACL standards, graph databases**, and **graph viewer engineering**. ### Key Principles diff --git a/.cursor/02-project-overview.mdc b/.cursor/02-project-overview.mdc index 60fc1263..62329449 100644 --- a/.cursor/02-project-overview.mdc +++ b/.cursor/02-project-overview.mdc @@ -7,13 +7,13 @@ scope: ### Project Overview -OntoBricks is a **Python FastAPI** web application designed to run as a **Databricks App**. It provides ontology management, knowledge graph engineering, and metadata governance tools on top of Databricks Unity Catalog. +OntoBricks is a **Python FastAPI** web application designed to run as a **Databricks App**. It provides ontology management, graph viewer engineering, and metadata governance tools on top of Databricks Unity Catalog. **Core Features:** - **Ontology Management:** OWL/RDFS/SHACL import/export, class/property CRUD, URI management, industry ontology imports (CDISC, FIBO, IOF). Managed by the `Ontology` domain class. - **Mapping:** Entity/relationship mapping CRUD, R2RML generation/parsing, SQL validation, LLM-assisted auto-assign. Managed by the `Mapping` domain class. -- **Digital Twin:** Knowledge graph build, sync, SPARQL query, quality checks, graph visualization, community detection. Managed by the `DigitalTwin` domain class. +- **Knowledge Graph:** Knowledge graph build, sync, SPARQL query, quality checks, graph visualization, community detection. Managed by the `DigitalTwin` domain class. - **Domain Management:** Unity Catalog save/load, version status, metadata, design layout persistence. Managed by the `Domain` domain class. - **Registry:** Dual-mode domain registry with permissions and scheduled builds. Two storage modes, picked from the Databricks App config and surfaced in the **Settings → Registry** tab: 1. **Volume-only** — everything (metadata, indexes, documents, binaries) lives in a UC Volume. diff --git a/.cursor/03-system-components-and-requirements.mdc b/.cursor/03-system-components-and-requirements.mdc index 2aec1ead..9857c06f 100644 --- a/.cursor/03-system-components-and-requirements.mdc +++ b/.cursor/03-system-components-and-requirements.mdc @@ -12,7 +12,7 @@ scope: - **Domain Classes:** Business logic lives in `back/objects/` (not in route handlers). Current classes: - `Ontology` — OWL/RDFS/SHACL operations, class/property CRUD, URI management. - `Mapping` — entity/relationship mapping CRUD, R2RML, SQL validation, auto-assign. - - `DigitalTwin` — knowledge graph build, sync, query, quality. + - `DigitalTwin` — graph viewer build, sync, query, quality. - `Domain` — UC save/load, version status, metadata, layout persistence. - **Core Infrastructure:** `back/core/` hosts shared infrastructure with no dependency on HTTP/FastAPI types: Databricks clients, triple store, graph DB, W3C parsers, reasoning engines, agents, logging, errors. - **Internal API:** Session-aware JSON endpoints in `api/routers/internal/`, delegating to domain classes. diff --git a/.cursor/04-project-structure.mdc b/.cursor/04-project-structure.mdc index 904dfb6f..69e01839 100644 --- a/.cursor/04-project-structure.mdc +++ b/.cursor/04-project-structure.mdc @@ -49,7 +49,7 @@ back/objects/ ├── domain/ <- Session-scoped UC/metadata/layout operations ├── ontology/ <- Ontology domain class ├── mapping/ <- Mapping domain class -└── digitaltwin/ <- Digital Twin domain class +└── digitaltwin/ <- Knowledge Graph domain class ``` ### Backend Core Infrastructure (`src/back/core/`) diff --git a/.cursor/11-frontend-design.mdc b/.cursor/11-frontend-design.mdc index f473d0bc..125e9929 100644 --- a/.cursor/11-frontend-design.mdc +++ b/.cursor/11-frontend-design.mdc @@ -289,7 +289,7 @@ currently-active sidebar section. (e.g. home, about) keep it hidden — that is intentional, do not force it. - The route hierarchy is fixed in `breadcrumb.js`: - Registry → Domain → Ontology → Mapping → Digital Twin (plus + Registry → Domain → Ontology → Mapping → Knowledge Graph (plus Settings as a flat entry). Adding a new top-level page means extending `_ROUTE_MAP` and `_HIERARCHY` there — not patching templates. diff --git a/README.md b/README.md index 9b637a32..c4f2f99d 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@

    OntoBricks 0.6.0

    - Digital Twin Builder for Databricks + Knowledge Graph Builder for Databricks

    @@ -15,7 +15,7 @@ ## Project Description -OntoBricks is a web application that transforms Databricks tables into a materialized knowledge graph. It lets you design ontologies (OWL), map them to Unity Catalog tables via R2RML, materialize triples into a Delta-backed triple store and a Lakebase Postgres graph engine, reason over the graph (OWL 2 RL, SWRL, SHACL), and query it through an auto-generated GraphQL API. The entire pipeline — from metadata import to a queryable knowledge graph — can run in four clicks using LLM-powered automation. +OntoBricks is a web application that transforms Databricks tables into a materialized graph viewer. It lets you design ontologies (OWL), map them to Unity Catalog tables via R2RML, materialize triples into a Delta-backed triple store and a Lakebase Postgres graph engine, reason over the graph (OWL 2 RL, SWRL, SHACL), and query it through an auto-generated GraphQL API. The entire pipeline — from metadata import to a queryable graph viewer — can run in four clicks using LLM-powered automation. ## Project Support @@ -158,7 +158,7 @@ git push origin main --tags | **1** | **Import Metadata** (Domain > Metadata) | Fetches table and column metadata from Unity Catalog | | **2** | **Generate Ontology** (Ontology > Wizard) | LLM designs entities, relationships, and attributes from your metadata | | **3** | **Auto-Map** (Mapping > Auto-Map) | LLM generates SQL mappings for every entity and relationship | -| **4** | **Synchronize** (Digital Twin > Status) | Executes mappings and populates the triple store | +| **4** | **Synchronize** (Knowledge Graph > Status) | Executes mappings and populates the triple store | ### Domain & registry (0.1.2 UX) @@ -185,11 +185,11 @@ Engine-specific options are stored as global JSON (`graph_engine_config`). For L > | Schema | When to run | Who runs it | > |---|---|---| > | Registry schema (e.g. `ontobricks_registry`) | After `Settings → Registry → Initialize` | `scripts/deploy.sh` automatically on every `dev-lakebase` deploy (coords: `LAKEBASE_PROJECT` / `LAKEBASE_BRANCH` / `LAKEBASE_REGISTRY_DATABASE` / `LAKEBASE_REGISTRY_SCHEMA`) | -> | Graph schema (e.g. `ontobricks_graph`) | After first Digital Twin `Build` | The in-app "Create graph DB" flow, or a manual `bootstrap-lakebase-perms.sh` run | +> | Graph schema (e.g. `ontobricks_graph`) | After first Knowledge Graph `Build` | The in-app "Create graph DB" flow, or a manual `bootstrap-lakebase-perms.sh` run | > > The deploy script is **registry-scoped** — it only grants on the registry schema. The graph DB is configured in-app (`Settings → Graph DB`) and may live in a **different** Lakebase project, so its grant is handled separately. -> **Lakebase build performance.** When the active engine is Lakebase, the Digital Twin build streams warehouse rows in `fetchmany` batches (`SQLWarehouse.iter_rows`) and ingests them via `COPY FROM STDIN` into a per-batch temp table followed by `INSERT … ON CONFLICT DO NOTHING` (and the symmetrical `DELETE … USING` for incremental removes). The FastAPI process never holds the full graph or the full diff: snapshot CTAS and `EXCEPT` execution stay warehouse-side, the app pipes one batch at a time. There is no Volume archive thread — Postgres is the system of record for the graph. +> **Lakebase build performance.** When the active engine is Lakebase, the Knowledge Graph build streams warehouse rows in `fetchmany` batches (`SQLWarehouse.iter_rows`) and ingests them via `COPY FROM STDIN` into a per-batch temp table followed by `INSERT … ON CONFLICT DO NOTHING` (and the symmetrical `DELETE … USING` for incremental removes). The FastAPI process never holds the full graph or the full diff: snapshot CTAS and `EXCEPT` execution stay warehouse-side, the app pipes one batch at a time. There is no Volume archive thread — Postgres is the system of record for the graph. > **Lakebase managed-synced mode.** When `graph_engine_config.sync_mode = "managed_synced"`, the bulk R2RML data movement is moved entirely off the app: a Databricks Lakeflow snapshot pipeline keeps a Postgres synced table in lock-step with the R2RML view, and the FastAPI process only orchestrates (`SyncedTableManager.ensure` + `trigger_and_wait`). Reasoning + cohort writes stay on the direct PG path through a writable companion table; readers see both via a UNION view (back-compat name). PG layout per graph version: `g__v_sync` (Lakeflow), `g__v__app` (app), `g__v` (UNION view). See `docs/graphdb-integration.md §9` for the full architecture. @@ -197,17 +197,17 @@ Engine-specific options are stored as global JSON (`graph_engine_config`). For L 1. **Design** an ontology visually using the OntoViz canvas, or import OWL/RDFS/industry standards (FIBO, CDISC, IOF, HL7 FHIR R4/R4B/R5) 2. **Map** ontology entities to Databricks tables with column-level precision -3. **Build** the Digital Twin — materializes triples into the triple store (incremental by default) -4. **Query** through the GraphQL playground or explore the interactive knowledge graph +3. **Build** the Knowledge Graph — materializes triples into the triple store (incremental by default) +4. **Query** through the GraphQL playground or explore the interactive graph viewer 5. **Reason** over the graph — run OWL 2 RL inference, SWRL rules, SHACL validation, and constraint checks -### Knowledge Graph Features +### Graph Viewer Features - **Two-phase search** — preview matching entities in a flat list, then select specific ones to expand into the full graph with relationships and neighbors - **Configurable search depth** — control the maximum traversal depth and entity cap for graph expansion - **Right-click "Expand neighbours"** — enrich the current graph in place with N-hop neighbours of any selected node (depth follows the right-pane Depth slider, default 2); newly added entities are highlighted and the camera zooms to frame them, with a non-blocking spinner in the canvas top-right while the request runs -- **Bridge navigation** — follow cross-domain bridges to automatically switch domains and focus on the target entity in the knowledge graph -- **Data cluster detection** — detect communities in the knowledge graph using Louvain, Label Propagation, or Greedy Modularity algorithms; available client-side (Graphology) for the visible subgraph and server-side (NetworkX) for the full graph; cluster results can be visualized with color-by-cluster mode and collapsed into super-nodes +- **Bridge navigation** — follow cross-domain bridges to automatically switch domains and focus on the target entity in the graph viewer +- **Data cluster detection** — detect communities in the graph viewer using Louvain, Label Propagation, or Greedy Modularity algorithms; available client-side (Graphology) for the visible subgraph and server-side (NetworkX) for the full graph; cluster results can be visualized with color-by-cluster mode and collapsed into super-nodes - **Cohort discovery** — group entities that travel together using rule-based linkage (shared resources via predicates) and compatibility constraints (same-value, value-equals, value-in, value-range); deterministic, explainable cohorts with live counters, why/why-not explainers, and idempotent materialisation as graph triples (`:inCohort`) or Unity Catalog Delta tables. See [`docs/cohort_discovery.md`](docs/cohort_discovery.md). - **Data quality violation limits** — cap the number of violations displayed per rule (configurable via dropdown, default 10) for faster quality checks - **Per-rule progress tracking** — SWRL inference and data quality checks report progress for each individual rule @@ -227,7 +227,7 @@ The **Ontology Designer** view (**Ontology → Designer**) includes a floating A ### MCP Integration -OntoBricks exposes the knowledge graph to LLM agents via the [Model Context Protocol](https://modelcontextprotocol.io/). Deploy the companion `mcp-ontobricks` app and connect from Cursor, Claude Desktop, or the Databricks Playground. +OntoBricks exposes the graph viewer to LLM agents via the [Model Context Protocol](https://modelcontextprotocol.io/). Deploy the companion `mcp-ontobricks` app and connect from Cursor, Claude Desktop, or the Databricks Playground. ### Registry OBX Export / Import (UI) diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log new file mode 100644 index 00000000..0a8a8467 --- /dev/null +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log @@ -0,0 +1,50 @@ +## UI Rename: Digital Twin → Knowledge Graph / Knowledge Graph → Graph Viewer + +### Context +User-facing rename of two main navigation labels to better reflect their purpose: +- The top-level menu section "Digital Twin" is now "Knowledge Graph". +- The sigma.js graph viewer sub-item (formerly "Knowledge Graph") is now "Graph Viewer". + +Internal code identifiers (`digitaltwin`, `dtwin`, `DigitalTwin`, routes `/dtwin/`) are unchanged. + +### Changes + +1. `src/front/config/menu_config.json` — updated labels: `"Digital Twin"` → `"Knowledge Graph"`, `"Knowledge Graph"` (sigmagraph tab) → `"Graph Viewer"`. +2. `src/front/templates/dtwin.html` — page `` and comments updated. +3. `src/front/templates/partials/dtwin/_query_sigmagraph.html` — section heading updated to "Graph Viewer". +4. `src/front/templates/partials/layout/help_modal.html` — all help text, step descriptions, glossary, and FAQ updated. +5. `src/front/templates/partials/domain/_domain_information.html` — display labels updated. +6. `src/front/templates/partials/domain/_domain_validation.html` — display labels updated. +7. `src/front/templates/partials/dtwin/_query_*.html` — all dtwin partial templates updated. +8. `src/front/templates/partials/ontology/_ontology_*.html` — ontology template references updated. +9. `src/front/templates/partials/registry/_registry_*.html` — registry template references updated. +10. `src/front/templates/about.html`, `settings.html`, `ontology.html` — display labels updated. +11. `src/front/static/query/js/*.js` — JS comments and UI strings updated. +12. `src/front/static/global/js/*.js` — navbar and breadcrumb JS updated. +13. `src/back/objects/digitaltwin/models.py`, `constants.py`, `__init__.py` — module docstrings updated. +14. `src/back/core/graphql/GraphQLSchemaBuilder.py`, `CommunityDetector.py` — docstrings updated. +15. `src/back/fastapi/graphql_routes.py` — route descriptions updated. +16. `src/api/routers/digitaltwin.py`, `internal/dtwin.py` — comments and descriptions updated. +17. `src/agents/agent_dtwin_chat/__init__.py`, `engine.py`, `tools.py` — agent descriptions updated. +18. `src/agents/agent_cohort/engine.py` — docstring updated. +19. `src/mcp-server/server/app.py` — tool docstrings updated. +20. `src/shared/fastapi/main.py` — API description updated. +21. `docs/*.md` — all markdown documentation updated. +22. `README.md` — updated. +23. `.cursor/*.mdc` — cursor rules updated. +24. `tests/units/api/test_ui_rendering.py` — title assertion updated. +25. `tests/e2e/dtwin/*.py`, `tests/e2e/navigation/test_navigation_flows.py` — test docstrings/assertions updated. + +### Modified Files +- src/front/config/menu_config.json +- src/front/templates/ (all dtwin, ontology, registry, domain partials, about, settings, ontology, dtwin) +- src/front/static/query/js/, src/front/static/global/js/ +- src/back/objects/digitaltwin/, src/back/core/, src/back/fastapi/ +- src/api/routers/digitaltwin.py, src/api/routers/internal/dtwin.py +- src/agents/agent_dtwin_chat/, src/agents/agent_cohort/ +- src/mcp-server/server/app.py, src/shared/fastapi/main.py +- docs/*.md, README.md, .cursor/*.mdc +- tests/units/api/test_ui_rendering.py, tests/e2e/dtwin/*.py, tests/e2e/navigation/ + +### Test Results +2418 passed, 15 skipped — all unit tests green. diff --git a/docs/INFO.md b/docs/INFO.md index 1f5403c5..1b68e3cb 100644 --- a/docs/INFO.md +++ b/docs/INFO.md @@ -5,12 +5,12 @@ <h1 align="center">OntoBricks</h1> <p align="center"> - <strong>Digital Twin Builder for Databricks</strong> + <strong>Knowledge Graph Builder for Databricks</strong> </p> <p align="center"> - OntoBricks is a web-based application that turns <strong>Databricks tables into a knowledge graph</strong>.<br> - Design ontologies using OWL or import industry standards (FIBO, CDISC, IOF …), map them to tables (with R2RML behind the scenes), materialize triples into a Delta-backed triple store mirrored on Lakebase Postgres, query them through a typed GraphQL API, and explore your knowledge graph visually. + OntoBricks is a web-based application that turns <strong>Databricks tables into a graph viewer</strong>.<br> + Design ontologies using OWL or import industry standards (FIBO, CDISC, IOF …), map them to tables (with R2RML behind the scenes), materialize triples into a Delta-backed triple store mirrored on Lakebase Postgres, query them through a typed GraphQL API, and explore your graph viewer visually. </p> <p align="center"> @@ -21,7 +21,7 @@ ## How It Works -OntoBricks builds a **materialized knowledge graph** (triple store) from your Databricks tables using semantic web standards, graph databases, and formal reasoning: +OntoBricks builds a **materialized graph viewer** (triple store) from your Databricks tables using semantic web standards, graph databases, and formal reasoning: ``` OntoBricks MCP Server @@ -60,9 +60,9 @@ OntoBricks builds a **materialized knowledge graph** (triple store) from your Da 1. **Design** an ontology (OWL) — visually or via LLM-powered generation 2. **Map** ontology entities to Databricks tables using R2RML mappings 3. **Materialize** triples — Delta view in Unity Catalog (governance) + Lakebase Postgres flat table (queryable Graph DB engine) -4. **Reason** over the knowledge graph — OWL 2 RL deductive closure, SWRL rules, transitive/symmetric expansion, constraint validation, and SHACL data quality shapes -5. **Query** the knowledge graph via GraphQL with a typed schema auto-generated from the ontology -6. **Explore** the knowledge graph with interactive visualization, GraphiQL playground, and quality checks +4. **Reason** over the graph viewer — OWL 2 RL deductive closure, SWRL rules, transitive/symmetric expansion, constraint validation, and SHACL data quality shapes +5. **Query** the graph viewer via GraphQL with a typed schema auto-generated from the ontology +6. **Explore** the graph viewer with interactive visualization, GraphiQL playground, and quality checks ## Screenshots @@ -80,11 +80,11 @@ Map ontology entities to Databricks tables — click any entity on the graph, wr <img src="docs/screenshots/Ontology%20Mapping.png" alt="Ontology Mapping" width="800"> </p> -### Knowledge Graph -Explore your knowledge graph — search, filter, and navigate entities and relationships with full attribute details, up to N levels deep. +### Graph Viewer +Explore your graph viewer — search, filter, and navigate entities and relationships with full attribute details, up to N levels deep. <p align="center"> - <img src="docs/screenshots/Graph%20result.png" alt="Knowledge Graph" width="800"> + <img src="docs/screenshots/Graph%20result.png" alt="Graph Viewer" width="800"> </p> ## Features @@ -109,12 +109,12 @@ Explore your knowledge graph — search, filter, and navigate entities and relat - **📝 R2RML Generation**: Automatic W3C-compliant R2RML mapping generation - **🔀 Unified Panel UI**: Consistent editing experience across Designer and Manual views -### Digital Twin (Sync & Explore) +### Knowledge Graph (Sync & Explore) - **🔄 Triple Store Sync**: Synchronize mapped data to the Delta view + Graph DB engine (Lakebase) with readiness validation - **💾 Two Layers**: **Delta view** (Databricks SQL Warehouse, governance + lineage) plus a pluggable **Graph DB engine** (currently Lakebase Postgres — `app_managed` `COPY FROM STDIN` or `managed_synced` Lakeflow mode) -- **📈 Knowledge Graph**: Interactive sigma.js WebGL-powered graph to explore entities and relationships visually with search, filtering, and entity detail panels -- **🔬 Data Cluster Detection**: Detect communities in the knowledge graph using Louvain, Label Propagation, or Greedy Modularity algorithms — client-side (Graphology) for the visible subgraph, server-side (NetworkX) for the full graph; color-by-cluster visualization, adjustable resolution, cluster collapse/expand into super-nodes with member details on click -- **🗺️ Ontology Designer Viewer**: Read-only D3.js ontology model accessible from Knowledge Graph and GraphQL sections — frozen force-directed graph with pan/zoom in a fullscreen modal +- **📈 Graph Viewer**: Interactive sigma.js WebGL-powered graph to explore entities and relationships visually with search, filtering, and entity detail panels +- **🔬 Data Cluster Detection**: Detect communities in the graph viewer using Louvain, Label Propagation, or Greedy Modularity algorithms — client-side (Graphology) for the visible subgraph, server-side (NetworkX) for the full graph; color-by-cluster visualization, adjustable resolution, cluster collapse/expand into super-nodes with member details on click +- **🗺️ Ontology Designer Viewer**: Read-only D3.js ontology model accessible from Graph Viewer and GraphQL sections — frozen force-directed graph with pan/zoom in a fullscreen modal - **📊 Dashboard Integration**: Embed Databricks dashboards with parameter mapping to entities - **✅ Async Quality Checks**: Validate data against ontology constraints with background processing and progress tracking - **📏 SHACL Data Quality**: Run SHACL-based validation against the triple store — shapes defined in the ontology are compiled to SQL for execution, with violation reporting and PySHACL in-memory validation support @@ -126,7 +126,7 @@ Explore your knowledge graph — search, filter, and navigate entities and relat - **📏 SWRL Rule Engine**: User-defined Horn-clause rules (Antecedent → Consequent) with a **graphical D3-based editor** (fullscreen modal with IF/THEN atom builders, context menu, and live SWRL preview) — compiled to SQL (Spark / Postgres) for violation detection and triple materialization - **🔗 Graph Reasoning**: Automatic transitive closure and symmetric expansion based on OWL property characteristics (`TransitiveProperty`, `SymmetricProperty`) - **✔️ Constraint Validation**: Cardinality checks, functional/inverse-functional property enforcement, value constraints, orphan detection, and label requirements — executed in SQL on the Delta view and the Lakebase graph engine -- **📊 Materialization**: Inferred triples from any reasoning phase can be written back to the triple store, enriching the knowledge graph with derived facts +- **📊 Materialization**: Inferred triples from any reasoning phase can be written back to the triple store, enriching the graph viewer with derived facts ### GraphQL API - **🔮 Auto-Generated Schema**: The GraphQL schema is derived from the ontology — each class becomes a type, each data property a field, each object property a typed relationship @@ -137,8 +137,8 @@ Explore your knowledge graph — search, filter, and navigate entities and relat - **📦 Per-Domain Schemas**: Each domain gets its own GraphQL schema, cached and invalidated on ontology change ### MCP Server (AI Integration) -- **🤖 Model Context Protocol**: Expose the knowledge graph to LLM agents via [MCP](https://modelcontextprotocol.io/) -- **📂 `list_projects` / `select_project`**: Two-step workflow — browse available knowledge graphs, then select one to query +- **🤖 Model Context Protocol**: Expose the graph viewer to LLM agents via [MCP](https://modelcontextprotocol.io/) +- **📂 `list_projects` / `select_project`**: Two-step workflow — browse available graph viewers, then select one to query - **📋 `list_entity_types`**: Discover all entity types, counts, and predicates in human-readable text - **🔍 `describe_entity`**: Search by name or type and get a full-text description with attributes, relationships, and hop-by-hop traversal - **📊 `get_status`**: Retrieve triple store status, readiness, and last-modified timestamp @@ -154,17 +154,17 @@ Explore your knowledge graph — search, filter, and navigate entities and relat - **🧭 Domain Cockpit (Validation)**: Tiles for registry readiness; **Active Version** reflects the version **exposed via API/MCP** (set in Registry → Browse), not only the newest file on disk — with a *(not loaded)* hint when the editor session differs - **⏳ New domain flow**: Full-page loading overlay until Domain Information completes its first round-trip after **New Domain** - **🧱 Save guard**: Duplicate sanitized domain names are rejected before save to the registry (inline + Save-to-UC check) -- **🧩 Digital Twin field preview**: On Domain Information, triple-store / snapshot / local graph paths refresh when the domain name is committed (blur) or the version changes +- **🧩 Knowledge Graph field preview**: On Domain Information, triple-store / snapshot / local graph paths refresh when the domain name is committed (blur) or the version changes ### Registry - **📂 Multi-Domain Registry**: Central registry backed by a UC Volume that indexes all domains, their versions, and status - **🔄 Scheduled Refresh**: Background scheduler keeps the registry cache up-to-date on a configurable interval -- **🔗 Entity URI Resolution**: `/resolve` endpoint resolves entity URIs to the correct domain and redirects into the knowledge graph +- **🔗 Entity URI Resolution**: `/resolve` endpoint resolves entity URIs to the correct domain and redirects into the graph viewer - **✅ Active (API/MCP) version**: In **Registry → Browse**, expand a domain and use **Set as Active** on a version row — this is the only UI for changing which version tools and MCP see; **Domain → Versions** shows the result as a read-only badge ### Navigation & UI - **📋 Centralized Menu Configuration**: Top navbar and sidebar menus are driven from a single JSON config (`menu_config.json`) -- **🔔 Unified Status Indicators**: Ontology, Mapping, and Digital Twin navbar indicators refresh simultaneously via a centralized function +- **🔔 Unified Status Indicators**: Ontology, Mapping, and Knowledge Graph navbar indicators refresh simultaneously via a centralized function - **🏷️ Smart Defaults**: Ontology name defaults to the domain name; version displayed in the top navbar - **🔁 Navbar domain label**: Domain name and version in the navbar invalidate cached consolidated state after domain lifecycle actions so labels stay in sync with the session @@ -226,16 +226,16 @@ MLFLOW_TRACKING_URI=databricks ## Automated Pipeline: From Tables to Triple Store in 4 Clicks -OntoBricks can automatically build a complete knowledge graph from your Databricks tables using LLM-powered automation: +OntoBricks can automatically build a complete graph viewer from your Databricks tables using LLM-powered automation: | Step | Action | What Happens | |------|--------|--------------| | **1** | **Import Metadata** (Domain > Metadata) | Fetches table and column metadata from Unity Catalog | | **2** | **Generate Ontology** (Ontology > Wizard) | LLM designs entities, relationships, and attributes from your metadata | | **3** | **Auto-Map** (Mapping > Auto-Map) | LLM generates SQL mappings for every entity and relationship | -| **4** | **Synchronize** (Digital Twin > Status) | Executes mappings and populates the triple store table | +| **4** | **Synchronize** (Knowledge Graph > Status) | Executes mappings and populates the triple store table | -After a one-time configuration (Databricks connection, LLM endpoint, triple store table), the entire process from raw tables to a queryable knowledge graph is fully automated. +After a one-time configuration (Databricks connection, LLM endpoint, triple store table), the entire process from raw tables to a queryable graph viewer is fully automated. See the **[Automated triple-store pipeline](docs/user-guide.md#automated-triple-store-pipeline-merged)** section in the user guide for detailed steps, tips, and the REST API equivalent. @@ -298,16 +298,16 @@ Domains **never** store: - Authentication tokens or passwords - Query results -### 3. 🔍 Digital Twin +### 3. 🔍 Knowledge Graph -Synchronize, validate, and explore your knowledge graph: +Synchronize, validate, and explore your graph viewer: -- **Build** your Digital Twin — creates a Triple-Store VIEW in Unity Catalog and mirrors the triples into the active Graph DB engine (Lakebase Postgres) +- **Build** your Knowledge Graph — creates a Triple-Store VIEW in Unity Catalog and mirrors the triples into the active Graph DB engine (Lakebase Postgres) - **Readiness Status** validates ontology, entity mappings, relationship mappings, and attribute completeness before sync - **Quality Checks** run asynchronously with progress tracking; validate cardinality, value constraints, property characteristics, and global rules -- **Interactive Knowledge Graph**: Explore entities and relationships as a sigma.js WebGL graph — search, filter, click entities to see all attributes and values -- **View Ontology**: Open a frozen, read-only D3.js ontology model from the Knowledge Graph or GraphQL section to see the full ontology structure while exploring data -- **GraphQL Playground**: Embedded GraphiQL IDE to query the knowledge graph with the auto-generated typed schema — auto-complete, docs explorer, and live results +- **Interactive Graph Viewer**: Explore entities and relationships as a sigma.js WebGL graph — search, filter, click entities to see all attributes and values +- **View Ontology**: Open a frozen, read-only D3.js ontology model from the Graph Viewer or GraphQL section to see the full ontology structure while exploring data +- **GraphQL Playground**: Embedded GraphiQL IDE to query the graph viewer with the auto-generated typed schema — auto-complete, docs explorer, and live results - **API Documentation**: Built-in REST API reference with schema introspection for programmatic access ## Architecture @@ -332,7 +332,7 @@ src/ │ ├── back/ # Core domain, objects, GraphQL (Strawberry) │ ├── core/ # Databricks, W3C, triplestore, reasoning, graph_analysis, registry helpers, … -│ ├── objects/ # Session, project, registry, digital twin models +│ ├── objects/ # Session, project, registry, graph viewer models │ └── fastapi/ # GraphQL wiring with core services │ ├── front/ # HTML UI: routes, templates, static assets @@ -489,7 +489,7 @@ The key insight behind OntoBricks is that you **don't need a separate graph data 5. **SWRL rules** for domain-specific logic 6. **Graph algorithms** (transitive closure, BFS, shortest path) via SQL recursive CTEs on both layers -...OntoBricks delivers a **complete knowledge graph platform** that runs entirely on Databricks infrastructure. +...OntoBricks delivers a **complete graph viewer platform** that runs entirely on Databricks infrastructure. ## Semantic Web Standards @@ -497,7 +497,7 @@ OntoBricks leverages these W3C and semantic web standards: | Standard | Purpose in OntoBricks | |----------|----------------------| -| **RDF** | Data model — all knowledge graph data is expressed as Subject-Predicate-Object triples | +| **RDF** | Data model — all graph viewer data is expressed as Subject-Predicate-Object triples | | **OWL 2** | Ontology language — classes, properties, restrictions, axioms; serialized as Turtle | | **OWL 2 RL** | Reasoning profile — forward-chaining deductive closure via the `owlrl` library | | **RDFS** | Schema vocabulary — `subClassOf`, `domain`, `range`, `label` for class hierarchies | diff --git a/docs/README.md b/docs/README.md index 761ba0cb..5b911649 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ # OntoBricks Documentation -OntoBricks is a **Knowledge Graph Builder** for the Databricks platform. It lets you design ontologies visually, map them to Unity Catalog tables, materialize a triple store, and explore the result as an interactive knowledge graph — all from a single Databricks App. +OntoBricks is a **Graph Viewer Builder** for the Databricks platform. It lets you design ontologies visually, map them to Unity Catalog tables, materialize a triple store, and explore the result as an interactive graph viewer — all from a single Databricks App. **New here?** Start with the [Get Started](get-started.md) guide, then browse the [Examples](examples.md) for end-to-end walkthroughs. diff --git a/docs/api.md b/docs/api.md index d043040c..5dc56fad 100644 --- a/docs/api.md +++ b/docs/api.md @@ -521,13 +521,13 @@ type Query { 2. **Per-domain schemas**: Different domains may have completely different schemas, reflecting their ontology. 3. **Caching**: Schemas are cached per domain and invalidated on ontology changes. 4. **Relationship depth**: Nested relationships are resolved to a configurable depth (default 2, max 5). The depth can be set via the `depth` field in the request body or the depth selector in the GraphiQL playground. -5. **Triple store required**: The domain must have a materialized triple store (synced via Digital Twin) for GraphQL queries to return data. +5. **Triple store required**: The domain must have a materialized triple store (synced via Knowledge Graph) for GraphQL queries to return data. --- -## Digital Twin API +## Knowledge Graph API -The Digital Twin API provides stateless, programmatic access to the knowledge graph — triple store status, entity search, ontology artifacts, and build triggers. All endpoints accept an optional `project_name` query parameter to load a domain from the registry instead of the browser session. +The Knowledge Graph API provides stateless, programmatic access to the graph viewer — triple store status, entity search, ontology artifacts, and build triggers. All endpoints accept an optional `project_name` query parameter to load a domain from the registry instead of the browser session. ### Base URL @@ -796,7 +796,7 @@ This document describes the REST API endpoints available in OntoBricks. | Module | Base Path | Purpose | |--------|-----------|---------| | Domain API | `/api/v1/domains`, `/api/v1/domain` | Registry list, versions, design status, OWL/R2RML/SQL artifacts | -| Digital Twin API | `/api/v1/digitaltwin` | Stateless access to triple store, builds, triple search, quality, reasoning | +| Knowledge Graph API | `/api/v1/digitaltwin` | Stateless access to triple store, builds, triple search, quality, reasoning | | Core/Navbar | `/` | Session status, file browsing | | Settings | `/settings` | Databricks connection, settings | | Scheduled Builds | `/settings/schedules` | Automated triple store build scheduling | @@ -807,7 +807,7 @@ This document describes the REST API endpoints available in OntoBricks. | SHACL Data Quality | `/ontology/dataquality` | SHACL shape CRUD, Turtle import/export | | Mapping | `/mapping` | Entity/relationship mapping, R2RML | | SQL Wizard | `/mapping/wizard` | LLM-assisted SQL generation for mappings | -| Digital Twin | `/dtwin` | Sync, knowledge graph, quality checks, internal query execution | +| Knowledge Graph | `/dtwin` | Sync, graph viewer, quality checks, internal query execution | | Data Quality Execution | `/dtwin/dataquality` | Run SHACL checks against triple store | | Reasoning | `/dtwin/reasoning` | OWL 2 RL + SWRL inference, inferred triples | | GraphQL | `/graphql` (UI); `/api/v1/graphql` (external API mount) | Auto-generated typed GraphQL schema from ontology | @@ -1814,19 +1814,19 @@ POST /mapping/save-to-uc --- -### Digital Twin Endpoints +### Knowledge Graph Endpoints -#### Get Digital Twin Page +#### Get Knowledge Graph Page ```http GET /dtwin ``` -Returns the Digital Twin HTML page (sync, quality, triples, knowledge graph). +Returns the Knowledge Graph HTML page (sync, quality, triples, graph viewer). #### Execute Query (Internal) -Used internally by the sync and knowledge graph features to generate and execute SQL from the ontology mappings. +Used internally by the sync and graph viewer features to generate and execute SQL from the ontology mappings. ```http POST /dtwin/execute @@ -2134,9 +2134,9 @@ type Query { ### External REST API (`/api/v1`) -**Domain** routes (`/api/v1/domains`, `/api/v1/domain/...`) and **Digital Twin** routes (`/api/v1/digitaltwin/...`). Most accept an optional `project_name` (and often `project_version`) to load a domain from the registry instead of the browser session. +**Domain** routes (`/api/v1/domains`, `/api/v1/domain/...`) and **Knowledge Graph** routes (`/api/v1/digitaltwin/...`). Most accept an optional `project_name` (and often `project_version`) to load a domain from the registry instead of the browser session. -**Digital Twin base URL:** `http://localhost:8000/api/v1/digitaltwin` +**Knowledge Graph base URL:** `http://localhost:8000/api/v1/digitaltwin` #### Registry @@ -2467,7 +2467,7 @@ HTML routes are thin; they call **domain objects** under `back/objects/*` and ** | `front/routes/home.py` (settings page served from home), `api/routers/internal/settings.py` | `back/services/settings.py`, `shared/config/settings.py`, `shared/config/constants.py` | Settings & environment UI | | `front/routes/ontology.py`, `api/routers/internal/ontology.py` | `back/objects/ontology/ontology.py`, `back/core/w3c/*` | Ontology design & import | | `front/routes/mapping.py`, `api/routers/internal/mapping.py` | `back/objects/mapping/mapping.py`, `back/core/w3c/r2rml/*` | Table mapping & R2RML | -| `front/routes/dtwin.py`, `api/routers/internal/dtwin.py` | `back/objects/digitaltwin/digitaltwin.py`, `back/core/w3c/sparql/SparqlTranslator.py` | Digital Twin, SPARQL, query UI | +| `front/routes/dtwin.py`, `api/routers/internal/dtwin.py` | `back/objects/digitaltwin/digitaltwin.py`, `back/core/w3c/sparql/SparqlTranslator.py` | Knowledge Graph, SPARQL, query UI | | `front/routes/domain.py`, `api/routers/internal/domain.py` | `back/objects/domain/Domain.py`, `back/objects/session/DomainSession.py` | Domain save/load & registry UX | | `api/routers/internal/tasks.py` | (handlers in routes; registry scheduler via `back/objects/registry`) | Task status / triggers | | `api/routers/v1.py`, `api/routers/domains.py`, `api/routers/digitaltwin.py` | `api/service.py` | External stateless REST | diff --git a/docs/architecture.md b/docs/architecture.md index efa54b63..5a87799a 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -2,12 +2,12 @@ ## Overview -OntoBricks is a web-based **Knowledge Graph Builder** that runs natively on Databricks. The core workflow is: +OntoBricks is a web-based **Graph Viewer Builder** that runs natively on Databricks. The core workflow is: 1. **Design** an ontology visually (or import one from OWL / industry standards). 2. **Map** ontology entities to Unity Catalog tables using R2RML. 3. **Materialize** a triple store (Delta table) and a graph backend (Lakebase Postgres). -4. **Explore** the resulting knowledge graph — visual navigation, SPARQL, GraphQL, data-quality checks, and reasoning. +4. **Explore** the resulting graph viewer — visual navigation, SPARQL, GraphQL, data-quality checks, and reasoning. Under the hood, SPARQL translates ontology mappings into Spark SQL — users never need to write SPARQL themselves. @@ -29,7 +29,7 @@ Under the hood, SPARQL translates ontology mappings into Spark SQL — users nev ## Semantic Web Standards Stack -OntoBricks leverages multiple W3C semantic web standards to bridge relational data and knowledge graphs: +OntoBricks leverages multiple W3C semantic web standards to bridge relational data and graph viewers: ![Semantic Web Stack](images/semantic-web-stack.svg) @@ -187,7 +187,7 @@ LIMIT 100 6. **Generated Spark SQL** - Query with JOINs and UNION ALL 7. **Triple Store Backend Dispatch** - The `TripleStoreFactory` returns a Delta-backed view client (`DeltaTripleStore`) and `GraphDBFactory` returns the active graph engine (`LakebaseFlatStore`). Both expose the same `(subject, predicate, object)` contract. 8. **RDF-style Results** - Uniform (subject, predicate, object) triples from both backends -9. **Knowledge Graph** - Sigma.js WebGL-powered graph with entity details panel, search, filtering, and data cluster detection (Louvain/Label Propagation/Greedy Modularity) +9. **Graph Viewer** - Sigma.js WebGL-powered graph with entity details panel, search, filtering, and data cluster detection (Louvain/Label Propagation/Greedy Modularity) **Generated Spark SQL Example** (for generic triple query): ```sql @@ -337,7 +337,7 @@ src/ │ │ └── dependencies.py # Jinja2 templates & shared dependencies for HTML routes │ ├── config/ │ │ └── menu_config.json # Sidebar navigation structure -│ ├── routes/ # HTML page routers (home, ontology, mapping, digital twin, project) +│ ├── routes/ # HTML page routers (home, ontology, mapping, graph viewer, project) │ ├── templates/ # Consolidated Jinja2 templates (partials per feature area) │ └── static/ # Static assets (css/, js/, img/, ontoviz/, per-area folders) │ @@ -421,7 +421,7 @@ src/ │ ├── ontology/ # Ontology domain (ontology.py, json_views.py) │ ├── mapping/ # Mapping domain (mapping.py, json_views.py) │ ├── domain/ # Saved domain / UC I/O (domain.py, payload.py, version_status.py) -│ ├── digitaltwin/ # Digital Twin domain (DigitalTwin.py, models.py) +│ ├── digitaltwin/ # Knowledge Graph domain (DigitalTwin.py, models.py) │ ├── session/ # Session management │ │ ├── middleware.py # File-based session middleware (cookie + ASGI) │ │ ├── SessionManager.py # Request-scoped session get/set/delete wrapper @@ -438,7 +438,7 @@ src/ │ └── routers/ │ ├── v1.py # /api/v1/* endpoints │ ├── domains.py # Domain registry & artifact endpoints (`/api/v1/domains`, `/api/v1/domain/...`) -│ ├── digitaltwin.py # Digital Twin REST API +│ ├── digitaltwin.py # Knowledge Graph REST API │ └── internal/ # Session-aware JSON routes for the web UI │ ├── home.py, settings.py, domain.py, ontology.py, mapping.py, dtwin.py, tasks.py, … │ @@ -551,7 +551,7 @@ The UI uses a consistent **sidebar layout** across all main pages: ### Page Structure -Each main page (Ontology, Mapping, Digital Twin) follows this pattern: +Each main page (Ontology, Mapping, Knowledge Graph) follows this pattern: ``` page.html @@ -583,8 +583,8 @@ page.html | **Design** | Visual design → Auto-save → Session storage | `OntoViz`, Session middleware | | **Ontology** | Design/Configure → Save → Generate OWL | `OntologyGenerator`, Session middleware | | **Mapping** | Load ontology → Map/Auto-Map → Validate attributes → Generate R2RML | `R2RMLGenerator`, `SQLWizardService`, `TaskManager` | -| **Digital Twin** | Build → Quality Check (async) → Auto-load Triples → Explore Knowledge Graph | `sparql_service`, `TaskManager`, Sigma.js graph | -| **API/MCP** | REST → resolve domain → triple store query → formatted response | Digital Twin API, MCP Server, GraphQL | +| **Knowledge Graph** | Build → Quality Check (async) → Auto-load Triples → Explore Graph Viewer | `sparql_service`, `TaskManager`, Sigma.js graph | +| **API/MCP** | REST → resolve domain → triple store query → formatted response | Knowledge Graph API, MCP Server, GraphQL | ### Asynchronous Task Processing @@ -592,8 +592,8 @@ Long-running operations use the **TaskManager** pattern (`src/back/core/task_man | Task Type | Triggered By | Description | |-----------|-------------|-------------| -| `triplestore_sync` | Digital Twin → Build | Generates and writes triples to Delta and the configured Graph DB engine (Lakebase) | -| `quality_checks` | Digital Twin → Quality | Runs all quality checks sequentially with per-check progress | +| `triplestore_sync` | Knowledge Graph → Build | Generates and writes triples to Delta and the configured Graph DB engine (Lakebase) | +| `quality_checks` | Knowledge Graph → Quality | Runs all quality checks sequentially with per-check progress | | `auto_assign` | Mapping → Auto-Map | Batch-maps entities and relationships via LLM; splits large jobs into chunks of `AUTO_ASSIGN_CHUNK_SIZE` with cooldown between chunks to avoid rate limits | **How it works:** 1. Frontend sends a `POST` to start the task; backend creates a `TaskManager` task and spawns a `threading.Thread` @@ -785,7 +785,7 @@ User Action → OntoViz Event → Debounce → syncDesignToOntology → /ontolog OntoBricks separates two concerns: 1. **Triple Store** — the persistent, governance-controlled view of the triples in **Unity Catalog Delta** (`triplestore_<domain>_V<n>`). Always present, never optional. -2. **Graph DB** — the queryable graph engine used by the Digital Twin, reasoning, and BFS / shortest-path helpers. Pluggable via the `GraphDBFactory` abstraction. +2. **Graph DB** — the queryable graph engine used by the Knowledge Graph, reasoning, and BFS / shortest-path helpers. Pluggable via the `GraphDBFactory` abstraction. | Layer | Key | Storage | Query Language | Source of truth | |-------|-----|---------|----------------|-----------------| @@ -939,7 +939,7 @@ Validates instance data in the triple store against formal ontology constraints: **Execution**: - On Cypher-capable engines (none currently shipped): constraint checks would run as Cypher queries via `ReasoningService`. On the SQL-based engines that ship today the constraint phase short-circuits with a `skipped` reason. -- On **Delta**: Quality checks run as SQL queries via the Digital Twin quality pipeline +- On **Delta**: Quality checks run as SQL queries via the Knowledge Graph quality pipeline ### Reasoning Data Model @@ -973,7 +973,7 @@ Inferred triples from any phase can be **materialized** (written back) to the tr ## Graph Analysis — Community Detection -OntoBricks provides **data cluster detection** on the knowledge graph, allowing users to discover communities of densely connected entities. Detection is available at two levels: +OntoBricks provides **data cluster detection** on the graph viewer, allowing users to discover communities of densely connected entities. Detection is available at two levels: ### Client-Side (Graphology) @@ -1015,7 +1015,7 @@ Detected clusters can be visualized in several ways: ## SHACL Data Quality -OntoBricks includes a **SHACL (Shapes Constraint Language)** module (`src/back/core/w3c/shacl/`) that provides W3C-standard data quality validation for the knowledge graph. +OntoBricks includes a **SHACL (Shapes Constraint Language)** module (`src/back/core/w3c/shacl/`) that provides W3C-standard data quality validation for the graph viewer. ### Architecture @@ -1063,7 +1063,7 @@ Shapes are organized into six data quality categories: ### UI Integration - **Ontology → Data Quality** sidebar section: Define, edit, and manage SHACL shapes visually with category-based organization -- **Digital Twin → Data Quality** sidebar section: Run shapes against the triple store with violation reporting +- **Knowledge Graph → Data Quality** sidebar section: Run shapes against the triple store with violation reporting --- @@ -1091,7 +1091,7 @@ Shapes are organized into six data quality categories: |------------|---------|---------| | Bootstrap | 5.3 | UI framework | | Bootstrap Icons | 1.11 | Icon library | -| Sigma.js | 3.0.2 | Knowledge Graph visualization (WebGL) | +| Sigma.js | 3.0.2 | Graph Viewer visualization (WebGL) | | Graphology | 0.26.0 | Graph data model and algorithms | | D3.js | 7.x | Data-driven DOM manipulation | | Grid.js | latest | Advanced data tables | @@ -1338,7 +1338,7 @@ OntoBricks provides a stateless REST API at `/api/v1/` for external applications | `/api/v1/domain/r2rml` | GET | Get R2RML mapping (Turtle) | | `/api/v1/domain/sparksql` | GET | Get generated Spark SQL | -**Digital Twin API** (`/api/v1/digitaltwin/`): +**Knowledge Graph API** (`/api/v1/digitaltwin/`): | Endpoint | Method | Description | |----------|--------|-------------| @@ -1410,7 +1410,7 @@ See [API Documentation](api.md) for complete endpoint reference. 2. **Custom R2RML Patterns**: Extend `R2RMLGenerator` in `src/back/core/w3c/r2rml/R2RMLGenerator.py` 3. **New Output Formats**: Add serializers in mapping or ontology modules 4. **Additional SPARQL Features**: Extend `SparqlTranslator` in `src/back/core/w3c/sparql/SparqlTranslator.py` -5. **Custom Visualizations**: Extend Sigma.js knowledge graph in query template +5. **Custom Visualizations**: Extend Sigma.js graph viewer in query template 6. **Authentication Providers**: Add new auth methods in `DatabricksClient` 7. **OntoViz Extensions**: Add new entity/relationship types, custom rendering 8. **Graph DB Engines**: Implement `GraphDBBackend` in `src/back/core/graphdb/` (Lakebase Postgres ships today; the `_starter_kit/ExampleStore.py` template plus `GraphDBFactory` make it straightforward to add Neo4j, Memgraph, or other engines). The Delta-backed `TripleStoreBackend` is also extensible for new SQL views. diff --git a/docs/code_organization.md b/docs/code_organization.md index 8b419aeb..aa27fb3d 100644 --- a/docs/code_organization.md +++ b/docs/code_organization.md @@ -91,7 +91,7 @@ back/objects/ ├── domain/ <- Session-scoped UC/metadata/layout operations ├── ontology/ <- Ontology domain class ├── mapping/ <- Mapping domain class -└── digitaltwin/ <- Digital Twin domain class +└── digitaltwin/ <- Knowledge Graph domain class ``` ### 2.5 Backend core infrastructure (`src/back/core/`) @@ -172,15 +172,15 @@ Custom Jinja helpers include **`url_for`** (static + `request.url_for`), a **`ra | `/settings/*` (API) | `api/routers/internal/settings.py` | (mostly JSON) | Load/save Databricks config, test connection, permissions helpers | | `/ontology/*` | `front/routes/ontology.py` | `ontology.html`, fragments | Ontology editor, SHACL, industry catalogs, **agent**-backed flows (chat, OWL generation, icons) | | `/mapping/*` | `front/routes/mapping.py` | mapping templates | R2RML / table–ontology mapping UI | -| `/dtwin/*` | `front/routes/dtwin.py` | dtwin templates | SPARQL, graph exploration, triple-store–backed "digital twin" UI | +| `/dtwin/*` | `front/routes/dtwin.py` | dtwin templates | SPARQL, graph exploration, triple-store–backed "graph viewer" UI | | `/domain/*` | `front/routes/domain.py` | domain templates | Domain JSON in UC volumes, versioning, metadata, documents | | `/registry/*` | `front/routes/registry.py` | `registry.html`, fragments | Multi-domain registry browser, schedules, API endpoint reference | -| `/resolve` | `front/routes/resolve.py` | — (redirect) | Entity URI resolution — finds the owning domain and redirects to the knowledge graph | +| `/resolve` | `front/routes/resolve.py` | — (redirect) | Entity URI resolution — finds the owning domain and redirects to the graph viewer | | `/tasks/*` | `api/routers/internal/tasks.py` | — | Task list/detail JSON for long-running work | **Note:** The **settings HTML page** is served at **`GET /settings`** from **home** routes; **internal settings** routes use the same **`/settings`** prefix for **JSON APIs** (`/settings/current`, `/settings/save`, etc.). -**XHR / JSON:** Besides **`tasks`**, the ontology, mapping, digital twin, and domain UIs call session-aware JSON handlers in **`api/routers/internal/ontology.py`**, **`mapping.py`**, **`dtwin.py`**, and **`domain.py`** (and **`home.py`** for shared navbar/session helpers). Paths align with the same feature areas as the HTML routers above. +**XHR / JSON:** Besides **`tasks`**, the ontology, mapping, graph viewer, and domain UIs call session-aware JSON handlers in **`api/routers/internal/ontology.py`**, **`mapping.py`**, **`dtwin.py`**, and **`domain.py`** (and **`home.py`** for shared navbar/session helpers). Paths align with the same feature areas as the HTML routers above. ### 3.4 Menu and client-side navigation @@ -209,7 +209,7 @@ Apply the same procedure for inline CSS → `src/front/static/<area>/css/`. --- -## 4. API (REST v1, Digital Twin, GraphQL) +## 4. API (REST v1, Knowledge Graph, GraphQL) ### 4.1 Registration @@ -217,7 +217,7 @@ In `src/shared/fastapi/main.py`, `_register_routers` mounts: - **Health** — `shared/fastapi/health.py` (app health; may overlap conceptually with v1 `/health`). - **External REST v1** — `src/api/routers/v1.py` at **`/api/v1`** (stateless; credentials in body or headers), exposed via the mounted external API app (see `api.external_app` and `EXTERNAL_API_MOUNT_PREFIX`). -- **Digital Twin API** — `src/api/routers/digitaltwin.py` at **`/api/v1/digitaltwin`** (registry, domain artifacts, build, triples, quality, reasoning). +- **Knowledge Graph API** — `src/api/routers/digitaltwin.py` at **`/api/v1/digitaltwin`** (registry, domain artifacts, build, triples, quality, reasoning). - **GraphQL** — `src/back/fastapi/graphql_routes.py` at **`/graphql`** and on the external app (see `api.external_app`; per-domain GraphQL execution). The **OpenAPI** document is at `/openapi.json`; interactive docs at `/docs` and `/redoc`. @@ -242,7 +242,7 @@ Defined in `api/routers/domains.py`. Representative paths: | GET | `/api/v1/domain/versions`, `/domain/design-status` | Versions and design readiness | | GET | `/api/v1/domain/ontology`, `/api/v1/domain/r2rml`, `/api/v1/domain/sparksql` | Serialized design artifacts | -### 4.4 `/api/v1/digitaltwin` (Digital Twin) +### 4.4 `/api/v1/digitaltwin` (Knowledge Graph) Defined in `api/routers/digitaltwin.py`. Representative paths: @@ -521,7 +521,7 @@ All logging goes through `back/core/logging/LogManager`. | Internal JSON API (session-aware) | `src/api/routers/internal/*.py` | | REST v1 | `src/api/routers/v1.py`, `src/api/service.py` | | Domain list & artifacts | `src/api/routers/domains.py` | -| Digital Twin REST | `src/api/routers/digitaltwin.py` | +| Knowledge Graph REST | `src/api/routers/digitaltwin.py` | | Graph analysis / clustering | `src/back/core/graph_analysis/` (`CommunityDetector`, models) | | GraphQL | `src/back/fastapi/graphql_routes.py` | | Agents | `src/agents/**` | diff --git a/docs/cohort_discovery.md b/docs/cohort_discovery.md index e3c2eefe..e4c17290 100644 --- a/docs/cohort_discovery.md +++ b/docs/cohort_discovery.md @@ -25,14 +25,14 @@ A cohort is a set of entities that: The user writes this as a **CohortRule** in five small sections. The engine runs it, produces deterministic cohort URIs, and writes the result either -into the knowledge graph (as `:inCohort` triples) or into a Unity Catalog +into the graph viewer (as `:inCohort` triples) or into a Unity Catalog Delta table — or both. --- ## 2. Authoring a rule (UX) -In the Digital Twin, open **Advanced → Cohorts**. The form has five +In the Knowledge Graph, open **Advanced → Cohorts**. The form has five sections, each with live feedback: 1. **Identity** — *Rule name* + optional *Description*. The internal id is diff --git a/docs/dab-reference.md b/docs/dab-reference.md index e29d89d3..d1a3c0e6 100644 --- a/docs/dab-reference.md +++ b/docs/dab-reference.md @@ -10,7 +10,7 @@ See also: [Databricks Asset Bundles docs](https://docs.databricks.com/dev-tools/ | App | Bundle Key | Name | Description | |-----|------------|------|-------------| -| **OntoBricks** | `ontobricks_app` | `ontobricks` | Main FastAPI application — ontology editor, mapping, Digital Twin builder | +| **OntoBricks** | `ontobricks_app` | `ontobricks` | Main FastAPI application — ontology editor, mapping, Knowledge Graph builder | | **MCP Server** | `mcp_ontobricks_app` | `mcp-ontobricks` | Model Context Protocol companion — exposes knowledge-graph tools to the Databricks Playground | ## Quick Start diff --git a/docs/data-access.md b/docs/data-access.md index 8a9af84c..a70ebf2e 100644 --- a/docs/data-access.md +++ b/docs/data-access.md @@ -50,7 +50,7 @@ triple-store backend (`TripleStoreFactory.create(...)`): The selection is made in `back/core/triplestore/TripleStoreFactory.py` and `back/core/graphdb/GraphDBFactory.py`. Both layers are always present: the Delta view is the governance-controlled snapshot, and the Graph DB engine is -the queryable mirror used by the Digital Twin, reasoning and BFS / cohort +the queryable mirror used by the Knowledge Graph, reasoning and BFS / cohort helpers. The user-facing wrappers (REST / GraphQL / SPARQL) don't change when the Graph DB engine is swapped. @@ -125,18 +125,18 @@ and the engine that ultimately runs (column **Engine**). | **R2RML** view | `mapping-r2rml.js` | `/mapping/r2rml/raw` | REST | rdflib serializer | | **Spark SQL** preview | `mapping-sparksql.js` | `POST /dtwin/translate` | REST → SPARQL **translation only** | `SparqlTranslator` (no execution; shows the generated SQL) | -### 4.4 Digital Twin (the core read surface) +### 4.4 Knowledge Graph (the core read surface) -This is where users actually query the knowledge graph. **Knowledge Graph**, -**GraphQL**, and **Graph Chat** all sit under the *Digital Twin* menu; they +This is where users actually query the graph viewer. **Graph Viewer**, +**GraphQL**, and **Graph Chat** all sit under the *Knowledge Graph* menu; they hit different wrappers but eventually share the same Delta / GraphDB storage. | UI Feature | JS file | Endpoint(s) | Wrapper | Engine | |---|---|---|---|---| | **Insight / Overview** | `query-sync.js` (stats panel), `query.js` | `GET /dtwin/sync/stats`, `GET /dtwin/sync/status` | REST | Spark SQL aggregates on the Delta view, or Postgres SQL aggregates on the Lakebase Graph DB | -| **Knowledge Graph** (Sigma.js viz) | `query-sigmagraph.js`, `query-d3graph.js` | `GET /dtwin/groups`, `POST /dtwin/sync/filter`, `GET /dtwin/sync/stats?refresh=true`, `POST /dtwin/clusters/detect`, `GET /dtwin/reasoning/inferred` | REST | Each `/sync/filter` call is a **SPARQL** under the hood, translated to **Spark SQL** (Delta) or **Postgres SQL** (Lakebase Graph DB) | -| **Knowledge Graph → SPARQL panel** | `query-execute.js` | `POST /dtwin/execute` | **SPARQL** | `SparqlQueryRunner` → **Spark SQL** on the SQL Warehouse (Delta view) | +| **Graph Viewer** (Sigma.js viz) | `query-sigmagraph.js`, `query-d3graph.js` | `GET /dtwin/groups`, `POST /dtwin/sync/filter`, `GET /dtwin/sync/stats?refresh=true`, `POST /dtwin/clusters/detect`, `GET /dtwin/reasoning/inferred` | REST | Each `/sync/filter` call is a **SPARQL** under the hood, translated to **Spark SQL** (Delta) or **Postgres SQL** (Lakebase Graph DB) | +| **Graph Viewer → SPARQL panel** | `query-execute.js` | `POST /dtwin/execute` | **SPARQL** | `SparqlQueryRunner` → **Spark SQL** on the SQL Warehouse (Delta view) | | **GraphQL** | `query-graphql.js` | `GET /graphql/{domain}/schema`, `POST /graphql/{domain}`, `GET /graphql/settings/depth` | **GraphQL** | Schema generated from OWL; resolvers call `DomainQueryService` → SPARQL → **Spark SQL** | | **Graph Chat** | `query-chat.js`, agent `agent_dtwin_chat` | `POST /dtwin/assistant/chat`, `GET/DELETE /dtwin/assistant/history` | REST → LLM tool-calling | LLM calls REST + GraphQL + SPARQL tools (see §6) | | **Build** (materialize triple store) | `query-sync.js` | `POST /dtwin/sync/start`, `POST /dtwin/sync/load` | REST | `_BuildPipeline` runs the R2RML SQL on the Warehouse (Delta `CREATE OR REPLACE VIEW`) and streams the rows into the active Graph DB engine via `bulk_insert_iter` (`COPY FROM STDIN` on Lakebase) | @@ -312,7 +312,7 @@ Cursor (stdio) ──FastMCP──▶ src/mcp-server/server/app.py Wrappers in play: REST (transport) → **GraphQL** (query) → SPARQL → **Spark SQL**. -### 9.3 User opens **Knowledge Graph** tab and applies a filter +### 9.3 User opens **Graph Viewer** tab and applies a filter ```text Browser ──POST /dtwin/sync/filter──▶ api/routers/internal/dtwin.py @@ -344,7 +344,7 @@ Wrappers in play: REST → (SPARQL → **Spark SQL** on Delta) and **Postgres SQ | Surface | REST | GraphQL | SPARQL | Spark SQL (Delta) | Postgres SQL (Lakebase) | |---|:---:|:---:|:---:|:---:|:---:| | UI — Registry / Domain / Ontology / Mapping | ✓ | | | sample-only | | -| UI — Knowledge Graph (Sigma) | ✓ | | (via filter) | ✓ | ✓ | +| UI — Graph Viewer (Sigma) | ✓ | | (via filter) | ✓ | ✓ | | UI — SPARQL panel | | | ✓ | ✓ | | | UI — GraphQL tab | | ✓ | (under) | ✓ | | | UI — Graph Chat | ✓ | ✓ | ✓ | ✓ | ✓ | diff --git a/docs/deployment.md b/docs/deployment.md index 4c67d5ef..210ce8e5 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -14,7 +14,7 @@ Deployment uses **Databricks Asset Bundles (DAB)** — a declarative, repeatable │ (Databricks App) │◄─────│ (Databricks App) │ │ │ REST │ │ │ Web UI + REST API │ API │ MCP Server for │ -│ Knowledge Graph │ │ Databricks │ +│ Graph Viewer │ │ Databricks │ │ │ │ Playground │ └──────────┬───────────┘ └──────────────────────┘ │ @@ -47,7 +47,7 @@ Deployment uses **Databricks Asset Bundles (DAB)** — a declarative, repeatable ## Architecture -This section provides detailed diagrams covering the OntoBricks component topology, Lakebase Postgres schema layout, data-flow through the Digital Twin build pipeline, network ports, and all permission layers required for a production deployment. +This section provides detailed diagrams covering the OntoBricks component topology, Lakebase Postgres schema layout, data-flow through the Knowledge Graph build pipeline, network ports, and all permission layers required for a production deployment. ### A. Component Architecture @@ -104,7 +104,7 @@ OntoBricks uses Lakebase Postgres (Autoscaling) as **both** its registry store ( ║ Database (datname): ontobricks_registry (or databricks_postgres in legacy) ║ ╠═══════════════════════════════════════╦════════════════════════════════════════════════╣ ║ Schema: ontobricks_registry ║ Schema: ontobricks_graph ║ -║ Created by: Settings → Initialize ║ Created by: first Digital Twin Build ║ +║ Created by: Settings → Initialize ║ Created by: first Knowledge Graph Build ║ ║ Granted by: make bootstrap-lakebase ║ Granted by: make bootstrap-lakebase ║ ╠═══════════════════════════════════════╣════════════════════════════════════════════════╣ ║ registries ║ Per-domain, per-version triple tables: ║ @@ -131,7 +131,7 @@ OntoBricks uses Lakebase Postgres (Autoscaling) as **both** its registry store ( ╚══════════════════════════════════════════════════════════════════════════════════════════╝ ``` -### C. Digital Twin Build — Data Flow +### C. Knowledge Graph Build — Data Flow ``` UC Source Tables SQL Warehouse Lakebase Postgres @@ -219,7 +219,7 @@ All four layers must be satisfied before the application is fully functional. Th ║ CATALOG <registry_catalog> USE CATALOG all operations ║ ║ SCHEMA <registry_catalog>.<sch> USE SCHEMA all operations ║ ║ CREATE TABLE triplestore ║ -║ CREATE VIEW Digital Twin Sync ║ +║ CREATE VIEW Knowledge Graph Sync ║ ║ VOLUME <cat>.<sch>.<vol> READ VOLUME + WRITE VOLUME artefact storage ║ ║ CATALOG <source_catalog> USE CATALOG Data Source picker ║ ║ SCHEMA <src_cat>.<src_sch> USE SCHEMA R2RML builds ║ @@ -235,7 +235,7 @@ All four layers must be satisfied before the application is fully functional. Th ║ Lakebase project (control-plane) CAN_USE before first deploy ║ ║ Schema: ontobricks_registry USAGE + CREATE + after Settings → Initialize ║ ║ DML on tables (schema created by the app) ║ -║ Schema: ontobricks_graph USAGE + CREATE + after first Digital Twin Build ║ +║ Schema: ontobricks_graph USAGE + CREATE + after first Knowledge Graph Build ║ ║ DML on tables ║ ║ Schema: ontobricks (sync, optional) USAGE + CREATE + after first Lakeflow snapshot ║ ║ DML on tables ║ @@ -260,7 +260,7 @@ All four layers must be satisfied before the application is fully functional. Th ╚═════════════════════════════════════════════════════════════════════════════════════════╝ ``` -> **Deployment order matters.** Layer 1 bootstrap must run before the first user logs in. Layer 2 grants must be in place before any build or sync. Layer 3 grants for `ontobricks_registry` must be applied after the registry schema is initialized (step 14 in the Full Deployment Checklist). Layer 3 grants for `ontobricks_graph` must be applied after the first Digital Twin build creates that schema. +> **Deployment order matters.** Layer 1 bootstrap must run before the first user logs in. Layer 2 grants must be in place before any build or sync. Layer 3 grants for `ontobricks_registry` must be applied after the registry schema is initialized (step 14 in the Full Deployment Checklist). Layer 3 grants for `ontobricks_graph` must be applied after the first Knowledge Graph build creates that schema. --- @@ -277,7 +277,7 @@ All four layers must be satisfied before the application is fully functional. Th (`POST /api/2.0/database/instances`), not the Databricks UI "New project" button. The UI uses `POST /api/2.0/postgres/projects`, which produces an autoscaling-only project that is **incompatible** with the Synced Tables - API (`POST /api/2.0/database/synced_tables`) used by the Digital Twin + API (`POST /api/2.0/database/synced_tables`) used by the Knowledge Graph build. Use `scripts/setup-lakebase.sh` to create the project correctly (see §2 prerequisites below). - `psql` (libpq client) on `PATH` for `scripts/bootstrap-lakebase-perms.sh` @@ -380,7 +380,7 @@ Deployment uses **Databricks Asset Bundles** to deploy both the main app and the > **Critical:** The Databricks UI "New project" button calls > `POST /api/2.0/postgres/projects` which creates an autoscaling-only project. > That API is **incompatible** with the Synced Tables API -> (`POST /api/2.0/database/synced_tables`) used by the Digital Twin build. +> (`POST /api/2.0/database/synced_tables`) used by the Knowledge Graph build. > You must use `scripts/setup-lakebase.sh` instead. ```bash @@ -564,7 +564,7 @@ or a manual `bootstrap-lakebase-perms.sh` run. | Schema | When to bootstrap | Who runs it | |--------|-------------------|-------------| | Registry (`ontobricks_registry`) | After **Settings → Registry → Initialize** has created the schema | `deploy.sh` automatically (`LAKEBASE_REGISTRY_SCHEMA` in `deploy.config.sh`) | -| Graph DB (`ontobricks_graph`) | After the **first Digital Twin Build** has created the schema | In-app "Create graph DB" flow, or manual run with the graph project/branch/database | +| Graph DB (`ontobricks_graph`) | After the **first Knowledge Graph Build** has created the schema | In-app "Create graph DB" flow, or manual run with the graph project/branch/database | The script grants: @@ -789,7 +789,7 @@ The main app's service principal performs the following operations at runtime. E |---|-----------|--------|-----------------------| | 1 | `SHOW CATALOGS`, `SHOW SCHEMAS`, `SHOW TABLES`, `DESCRIBE`, `SHOW VOLUMES`, `information_schema.tables` lookups (Data Source picker) | Source catalogs + registry catalog | `USE CATALOG` + `USE SCHEMA` + `SELECT` on browsed tables | | 2 | `SELECT` on source tables referenced by R2RML `sql_query` entries (VIEW creation + build) | Each source table/view | `SELECT` | -| 3 | `CREATE OR REPLACE VIEW <registry_catalog>.<registry_schema>.triplestore_<domain>_V<n>` (Digital Twin Sync) | Registry schema | Schema `CREATE VIEW`. If an object with the same name already exists from a previous build, additionally `MANAGE` on it or SP ownership. | +| 3 | `CREATE OR REPLACE VIEW <registry_catalog>.<registry_schema>.triplestore_<domain>_V<n>` (Knowledge Graph Sync) | Registry schema | Schema `CREATE VIEW`. If an object with the same name already exists from a previous build, additionally `MANAGE` on it or SP ownership. | | 4 | `SELECT subject, predicate, object FROM <triplestore VIEW>` (SPARQL + Lakebase Graph DB population) | The triplestore VIEW | `SELECT` (inherited by the SP as owner once it created the VIEW in step 3). | | 5 | `CREATE TABLE IF NOT EXISTS <table>(subject STRING, predicate STRING, object STRING) USING DELTA`, `DELETE FROM`, `INSERT INTO` on the optional `DATABRICKS_TRIPLESTORE_TABLE` fallback (reasoning materialisation, MCP session-less calls) | Fallback triple-store table | Schema `CREATE TABLE`. If the table pre-exists, `MODIFY` to `DELETE`/`INSERT` + `SELECT`. | | 6 | File I/O under `/Volumes/<registry_catalog>/<registry_schema>/<registry_volume>/` (projects, domains, history log, registry artefacts) | Registry volume | `READ VOLUME` + `WRITE VOLUME`. | @@ -1225,9 +1225,9 @@ Use your real main app name everywhere **`ontobricks-XXX`** appears (from `datab | Tool | Description | |---|---| -| `list_projects` | List all projects (knowledge graphs) in the registry with names and descriptions | +| `list_projects` | List all projects (graph viewers) in the registry with names and descriptions | | `select_project` | Activate a project by name — subsequent queries operate on its triple store | -| `list_entity_types` | Human-readable overview of the selected project's knowledge graph (entity types, counts, predicates) | +| `list_entity_types` | Human-readable overview of the selected project's graph viewer (entity types, counts, predicates) | | `describe_entity` | Search by name/type and get a full-text description with attributes, relationships, and BFS traversal | | `get_status` | Compact diagnostic: project, backend, table, data availability, triple count | @@ -1488,7 +1488,7 @@ The agents need OAuth credentials to call the Foundation Model API. In a Databri - Check the SP has correct permissions on catalogs/schemas — see [§3 Unity Catalog Permissions for the Service Principal](#3-unity-catalog-permissions-for-the-service-principal) - Review app logs in the Databricks Apps UI -### Digital Twin Sync: `PERMISSION_DENIED` / `Failed to create VIEW` +### Knowledge Graph Sync: `PERMISSION_DENIED` / `Failed to create VIEW` If **Sync** fails with a message like @@ -1505,7 +1505,7 @@ DROP TABLE IF EXISTS `<cat>`.`<schema>`.`triplestore_<domain>_v<n>`; If the failure is a plain `PERMISSION_DENIED` without a pre-existing object, the app SP is missing a UC grant — see [§3.2](#32--registry-catalogschema-grants-minimum-viable-set) for the registry schema and [§3.3](#33--source-data-grants-customer-tablesviews) for source tables. -### Digital Twin Sync: `TABLE_OR_VIEW_NOT_FOUND` +### Knowledge Graph Sync: `TABLE_OR_VIEW_NOT_FOUND` The app SP lacks `USE CATALOG` / `USE SCHEMA` / `SELECT` on one of the source tables referenced in an R2RML mapping. Identify which source from the error message and grant per [§3.3](#33--source-data-grants-customer-tablesviews). diff --git a/docs/development.md b/docs/development.md index 87e934f4..536ab042 100644 --- a/docs/development.md +++ b/docs/development.md @@ -33,7 +33,7 @@ This document describes all external dependencies used by OntoBricks, including | **APScheduler** | ≥3.10.0 | Advanced Python Scheduler for background jobs (used by BuildScheduler for scheduled triple store builds) | MIT | [pypi.org/project/APScheduler](https://pypi.org/project/APScheduler/) | | **owlrl** | ≥7.0.0 | OWL 2 RL forward-chaining reasoner — performs deductive closure on RDFLib graphs for ontology-level inference | W3C | [owl-rl.readthedocs.io](https://owl-rl.readthedocs.io/) | | **pyshacl** | ≥0.26.0 | W3C SHACL validator for RDFLib graphs — validates RDF data against SHACL shapes for data quality checks | Apache-2.0 | [github.com/RDFLib/pySHACL](https://github.com/RDFLib/pySHACL) | -| **NetworkX** | ≥3.0 | Graph analysis library — server-side community detection (Louvain, Label Propagation, Greedy Modularity) on the full knowledge graph | BSD-3-Clause | [networkx.org](https://networkx.org/) | +| **NetworkX** | ≥3.0 | Graph analysis library — server-side community detection (Louvain, Label Propagation, Greedy Modularity) on the full graph viewer | BSD-3-Clause | [networkx.org](https://networkx.org/) | | **strawberry-graphql[fastapi]** | ≥0.220.0 | GraphQL library for Python — auto-generates typed schema from ontology and integrates with FastAPI | MIT | [strawberry.rocks](https://strawberry.rocks/) | | **MLflow** | ≥2.19.0 | ML lifecycle platform — used for agent tracing, evaluation, and the Databricks Agent Framework (ResponsesAgent) | Apache-2.0 | [mlflow.org](https://mlflow.org/) | @@ -197,7 +197,7 @@ Provides the visual foundation for OntoBricks UI including: #### D3.js -Used for data-driven DOM manipulation and graph data processing in the Digital Twin page: +Used for data-driven DOM manipulation and graph data processing in the Knowledge Graph page: - Data array processing for graph node and link construction - SVG element management - Force simulation utilities @@ -217,7 +217,7 @@ const simulation = d3.forceSimulation(nodes) #### Sigma.js + Graphology -Powers the WebGL-accelerated graph visualization in the Digital Twin "Knowledge Graph" view: +Powers the WebGL-accelerated graph visualization in the Knowledge Graph "Graph Viewer" view: - High-performance rendering of large graphs via WebGL - Interactive pan, zoom, hover highlighting, and click selection - ForceAtlas2 layout algorithm (via graphology-library) @@ -366,7 +366,7 @@ tests/ test_sparql_service.py # SPARQL translation and local execution test_ontology_service.py # Ontology domain helpers (Ontology class) test_home_service.py # Home/dashboard service layer - test_dtwin_service.py # Digital Twin domain class (back.objects.digitaltwin) + test_dtwin_service.py # Knowledge Graph domain class (back.objects.digitaltwin) test_mapping_service.py # Mapping domain class (back.objects.mapping.Mapping) test_domain_service.py # Domain class (back.objects.domain.Domain) test_domain_session.py # DomainSession state management @@ -649,14 +649,14 @@ Fast tests that fetch pages via the Starlette `TestClient` and verify DOM struct | Page | What Is Verified | |------|-----------------| -| All pages | Navbar present, brand link, notification container, Bootstrap/utils.js scripts, nav dropdowns (Registry, Domain, Digital Twin), Ontology/Mapping links under Domain dropdown, Settings link, warehouse status, task tracker | +| All pages | Navbar present, brand link, notification container, Bootstrap/utils.js scripts, nav dropdowns (Registry, Domain, Knowledge Graph), Ontology/Mapping links under Domain dropdown, Settings link, warehouse status, task tracker | | Home `/` | Hero section, domain panel, stat items (Entities, Relationships, Mappings), quick links (Settings, About) | | Settings `/settings` | Connection form, host/token/warehouse displays, Test Connection button, base URI field, Save button | | Registry `/registry/` | Registry domains section, schedules table, API endpoint cards | | Ontology `/ontology` | Sidebar section groups: Ontology Editor (Information, Import, Generate, Model, Business Views, Entities, Relationships), Advanced (Data Quality, Business Rules, Expr. & Axioms), W3C Standards (OWL); section divs, OntoViz script | | Mapping `/mapping` | Sidebar with 6 section links (Information, Designer, Manual, Auto-Map, R2RML, Spark SQL), mapping-core.js | | Domain `/domain` | Sidebar with 6 section links (Information, Metadata, Documents, Validation, OWL, R2RML), section divs | -| Digital Twin `/dtwin/` | Sidebar section groups: Navigation (Knowledge Graph, GraphQL), Advanced (Data Quality, Reasoning); Sigma.js script | +| Knowledge Graph `/dtwin/` | Sidebar section groups: Navigation (Graph Viewer, GraphQL), Advanced (Data Quality, Reasoning); Sigma.js script | | About `/about` | Page renders, contains "OntoBricks" | **Run:** @@ -681,7 +681,7 @@ Browser-based tests using Playwright against a live Uvicorn server. Verifies nav | `TestOntologySidebar` | All 11 sidebar items switch to correct section, wizard select-all checkbox exists | | `TestMappingSidebar` | All 6 sidebar items switch to correct section | | `TestProjectSidebar` | All 6 sidebar items switch to correct section | -| `TestDigitalTwinSidebar` | Knowledge Graph section visible by default, sidebar navigation links present | +| `TestDigitalTwinSidebar` | Graph Viewer section visible by default, sidebar navigation links present | | `TestAboutPage` | Page content and R2RML reference present | **Prerequisites:** @@ -766,8 +766,8 @@ A user's effective role is determined by combining all three layers. | Role | Source | Capabilities | |------|--------|--------------| | **Admin** | Databricks App `CAN_MANAGE` permission | Full access. Can view, edit, build, and manage the Settings page including the permission list. | -| **Builder** | In-app permission list | Can view, edit, and **build digital twins**. Cannot access Settings. | -| **Editor** | In-app permission list | Can view all pages, create and modify domains, ontologies, and mappings. **Cannot build digital twins.** Cannot access Settings. | +| **Builder** | In-app permission list | Can view, edit, and **build graph viewers**. Cannot access Settings. | +| **Editor** | In-app permission list | Can view all pages, create and modify domains, ontologies, and mappings. **Cannot build graph viewers.** Cannot access Settings. | | **Viewer** | In-app permission list | Read-only access. Can browse domains, ontologies, and query results. All write operations (POST, PUT, PATCH, DELETE) are blocked. Cannot access Settings. | | **None** | Default when not matched | Completely blocked. Redirected to the Access Denied page. | @@ -821,7 +821,7 @@ Request arrives | `role = none` | JSON 403 (for fetch/XHR) or redirect to `/access-denied` (for page navigation). | | `role = viewer` + write method (POST/PUT/PATCH/DELETE) | JSON 403: "Viewer role does not allow write operations". | | `role != admin` + path starts with `/settings` | JSON 403 or redirect to `/`. Only admins can access the Settings page. | -| Digital twin build + effective domain role < `builder` | JSON 403: "Only builders and admins can build a digital twin". | +| Digital twin build + effective domain role < `builder` | JSON 403: "Only builders and admins can build a graph viewer". | | Otherwise | Request proceeds normally. | --- diff --git a/docs/examples.md b/docs/examples.md index 9d2c9664..b0b64a83 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -1,6 +1,6 @@ # Examples -These walkthroughs take you from raw tables to an explorable knowledge graph. Each one can be completed in 15–30 minutes. +These walkthroughs take you from raw tables to an explorable graph viewer. Each one can be completed in 15–30 minutes. | Example | Difficulty | What you'll learn | |---------|-----------|-------------------| @@ -13,7 +13,7 @@ These walkthroughs take you from raw tables to an explorable knowledge graph. Ea ### What you'll build -A knowledge graph of family relationships (parent–child links) starting from a single CSV table. By the end you will have an OWL ontology, an R2RML mapping, and a navigable graph in the Digital Twin view. +A graph viewer of family relationships (parent–child links) starting from a single CSV table. By the end you will have an OWL ontology, an R2RML mapping, and a navigable graph in the Knowledge Graph view. ### Dataset @@ -274,7 +274,7 @@ ex:person/p7 a family:Person ; ### SPARQL Queries (External API) -The following SPARQL queries can be executed programmatically via the external REST API (`/api/v1/query`). In the OntoBricks UI, triple store data is explored visually through the Digital Twin section without writing queries manually: +The following SPARQL queries can be executed programmatically via the external REST API (`/api/v1/query`). In the OntoBricks UI, triple store data is explored visually through the Knowledge Graph section without writing queries manually: #### Query 1: Find all people @@ -390,7 +390,7 @@ This example demonstrated: - Creating class mappings for ontology classes - Defining relationship mappings for object properties - Generating W3C-compliant R2RML -- Exploring the resulting knowledge graph through the Digital Twin Knowledge Graph +- Exploring the resulting graph viewer through the Knowledge Graph Graph Viewer The same approach can be applied to any relational database schema and target ontology. @@ -401,7 +401,7 @@ The same approach can be applied to any relational database schema and target on ### What you'll build -A full customer-journey knowledge graph for an energy provider — 10 interconnected tables covering customers, contracts, meters, readings, invoices, payments, calls, claims, and interactions. This example exercises the visual Designer, entity and relationship mapping, and the Knowledge Graph explorer. +A full customer-journey graph viewer for an energy provider — 10 interconnected tables covering customers, contracts, meters, readings, invoices, payments, calls, claims, and interactions. This example exercises the visual Designer, entity and relationship mapping, and the Graph Viewer explorer. ### Dataset @@ -587,9 +587,9 @@ FROM your_catalog.your_schema.meter --- -### Step 3: Explore the Data (Digital Twin) +### Step 3: Explore the Data (Knowledge Graph) -In the OntoBricks UI, navigate to the **Digital Twin** page and click **Synchronize** to generate triples, then explore the knowledge graph visually. The SPARQL queries below illustrate the underlying data model and can be used via the external REST API (`/api/v1/query`). +In the OntoBricks UI, navigate to the **Knowledge Graph** page and click **Synchronize** to generate triples, then explore the graph viewer visually. The SPARQL queries below illustrate the underlying data model and can be used via the external REST API (`/api/v1/query`). #### Example Queries (External API) @@ -645,9 +645,9 @@ GROUP BY ?customer ?name ?segment --- -### Knowledge Graph +### Graph Viewer -After synchronization, switch to the **Knowledge Graph** tab to see an interactive graph: +After synchronization, switch to the **Graph Viewer** tab to see an interactive graph: - **Nodes**: Represent entities (Customer, Contract, Meter, etc.) with emoji icons - **Edges**: Represent relationships (hasContract, hasMeter, etc.) diff --git a/docs/features.md b/docs/features.md index 327a979b..6aa8937c 100644 --- a/docs/features.md +++ b/docs/features.md @@ -11,7 +11,7 @@ - **Ontology Pitfalls Detector**: Detect 19 structural, logical, and semantic pitfalls (P1.1–P4.7) in four categories via the **Ontology → Pitfalls** sidebar panel. Fast/graph-only checks run immediately; ML-heavy checks (semantic similarity, NLP naming) require the optional `[pitfalls]` extra (`uv sync --extra pitfalls`). Each check shows a description tooltip and ⚡/💻 speed indicator. Results group by category with an accordion display. - **OWL Generation**: Automatic generation of W3C-compliant OWL/Turtle from visual design. - **LLM-Powered Auto-Map Icons**: Automatically assign emoji icons to entities based on their names using the project's configured LLM serving endpoint (Ontology Designer toolbar). -- **Dashboard Mapping**: Assign Databricks dashboards to entity types with parameter mapping for embedded display in the Knowledge Graph. +- **Dashboard Mapping**: Assign Databricks dashboards to entity types with parameter mapping for embedded display in the Graph Viewer. ## Data Mapping - **Visual Mapping Designer**: Map ontology classes and relationships to Databricks tables with an interactive designer interface. @@ -32,18 +32,18 @@ - **Relationship Direction**: Control forward, reverse, or bidirectional relationships with visual indicators. - **R2RML Generation**: Automatic generation of W3C-compliant R2RML mappings from visual configuration. Excluded attributes are never emitted as `rr:predicateObjectMap` triples. -## Digital Twin (Sync & Explore) +## Knowledge Graph (Sync & Explore) - **Two Layers**: Every build materializes a Delta view (Unity Catalog, governance) and a Graph DB engine (Lakebase Postgres today; pluggable behind `GraphDBFactory`). - **Readiness Status**: Validates ontology, entity mappings, relationship mappings, and attribute mapping completeness before enabling sync and explore actions. - **Triple Store Sync**: Synchronize generated triples to a Unity Catalog table — SQL is generated automatically from R2RML mappings (no manual query writing required). - **Last Updated Timestamp**: Triple store status displays the last modification date and time retrieved from Unity Catalog Delta table metadata (`DESCRIBE DETAIL`). -- **Auto-Load Triple Store**: Triples and Knowledge Graph views automatically load data from the triple store on navigation (no manual button click required). +- **Auto-Load Triple Store**: Triples and Graph Viewer views automatically load data from the triple store on navigation (no manual button click required). - **Async Quality Checks**: Validate data against ontology constraints (cardinality, value, property characteristics, global rules) asynchronously with progress tracking. - **SHACL Validation**: Run SHACL shapes against the triple store — shapes are compiled to SQL for execution with violation reporting, or validated in-memory via PySHACL for small datasets. - **Triples Grid**: Interactive data grid with sorting, filtering, and grouping capabilities to browse triple store contents. -- **Knowledge Graph**: Interactive sigma.js WebGL-powered graph to explore entities and relationships visually with search, filtering, depth control, and entity detail panels. -- **Data Cluster Detection**: Detect communities in the knowledge graph using Louvain, Label Propagation, or Greedy Modularity algorithms — client-side (Graphology) for the visible subgraph and server-side (NetworkX) for the full graph; color-by-cluster mode, adjustable resolution slider, cluster collapse/expand into super-nodes, and cluster member details on click. -- **Dashboard Embedding**: View assigned Databricks dashboards with entity-specific parameters directly in the Knowledge Graph. +- **Graph Viewer**: Interactive sigma.js WebGL-powered graph to explore entities and relationships visually with search, filtering, depth control, and entity detail panels. +- **Data Cluster Detection**: Detect communities in the graph viewer using Louvain, Label Propagation, or Greedy Modularity algorithms — client-side (Graphology) for the visible subgraph and server-side (NetworkX) for the full graph; color-by-cluster mode, adjustable resolution slider, cluster collapse/expand into super-nodes, and cluster member details on click. +- **Dashboard Embedding**: View assigned Databricks dashboards with entity-specific parameters directly in the Graph Viewer. - **Violation Details**: View quality check violations in a detailed modal with entity information. ## Project Management @@ -51,7 +51,7 @@ - **Version Control**: Create, list, and load multiple versions of a project with automatic versioning. Which version is **Active** (exposed via API / MCP) is managed from **Registry → Browse**; the Domain → Versions page shows that status as a read-only badge. - **Domain Cockpit (Validation)**: Readiness tiles including **Active Version** — the version currently exposed via API/MCP (from the registry), with a *(not loaded)* hint when it differs from the version open in the session. Distinct from “latest on disk” vs read-only UI gating (still driven by whether the loaded version is the latest). - **New-domain loading**: After **New Domain** from the navbar, a full-page spinner runs until Domain Information has finished its initial fetches (LLM endpoints, version status, domain info). -- **Domain Information — Digital Twin fields**: Triple-store FQN and Graph DB table name (e.g. Lakebase `g_<domain>_v<version>`) refresh when the domain name is **committed** (blur / `change`) or the version changes, so previews match naming rules before save. +- **Domain Information — Knowledge Graph fields**: Triple-store FQN and Graph DB table name (e.g. Lakebase `g_<domain>_v<version>`) refresh when the domain name is **committed** (blur / `change`) or the version changes, so previews match naming rules before save. - **Duplicate domain names**: Save to registry is blocked when the sanitized name already exists (`/domain/check-name` + guard on **Save to UC**); inline validation clears when the name is cleared or the check errors. - **Navbar domain identity**: Top bar name/version invalidate cached `/navbar/state` (and related caches) after domain mutations so reloads and navigations do not show stale labels for up to 15 seconds. - **Import/Export**: Import OWL and RDFS ontologies, import industry-standard ontologies (FIBO, CDISC, IOF, HL7 FHIR R4/R4B/R5), import/export R2RML mappings, and export OWL files. @@ -73,8 +73,8 @@ - **Per-Project Schemas**: Each project gets its own schema, cached and automatically invalidated on ontology changes. ## MCP Server (AI Integration) -- **Model Context Protocol**: Expose the knowledge graph to LLM agents via MCP (Streamable HTTP + stdio transports). -- **Project Selection**: Two-step workflow — `list_projects` to browse available knowledge graphs, `select_project` to activate one. +- **Model Context Protocol**: Expose the graph viewer to LLM agents via MCP (Streamable HTTP + stdio transports). +- **Project Selection**: Two-step workflow — `list_projects` to browse available graph viewers, `select_project` to activate one. - **Entity Discovery**: `list_entity_types` and `describe_entity` provide human-readable text descriptions with BFS traversal. - **GraphQL via MCP**: `get_graphql_schema` and `query_graphql` tools let LLM agents introspect and query the typed GraphQL API. - **Databricks Playground**: Deployed as `mcp-ontobricks`, auto-discoverable by LLM agents in the Databricks Playground. diff --git a/docs/get-started.md b/docs/get-started.md index 9537527b..181be437 100644 --- a/docs/get-started.md +++ b/docs/get-started.md @@ -1,6 +1,6 @@ # Getting Started with OntoBricks -By the end of this guide you will have OntoBricks running locally and connected to your Databricks workspace, ready to design your first ontology and explore a knowledge graph. +By the end of this guide you will have OntoBricks running locally and connected to your Databricks workspace, ready to design your first ontology and explore a graph viewer. ## Prerequisites @@ -306,12 +306,12 @@ Alternatively, use the traditional form interface: 4. Click **Validate** (in navbar) to verify all mappings are complete -### 6. Explore Your Data (Digital Twin) +### 6. Explore Your Data (Knowledge Graph) -1. Go to the **Digital Twin** page +1. Go to the **Knowledge Graph** page 2. Click **Synchronize** to generate triples from your mappings and write them to the configured Unity Catalog table 3. Once synced, browse the **Triples** tab to see the generated data in a sortable grid -4. Explore the **Knowledge Graph** tab for an interactive graph: +4. Explore the **Graph Viewer** tab for an interactive graph: - Click on entities to see details in the right panel - Use **Find** to search for specific entities - Use **Filters** to narrow down by entity type, field, or depth @@ -319,7 +319,7 @@ Alternatively, use the traditional form interface: 5. Run **Quality** checks to validate your data against ontology constraints 6. Run **Data Quality** (SHACL) checks from the **Data Quality** sidebar section — validates cardinality, datatypes, patterns, and custom SPARQL rules against the triple store 7. Run **Reasoning** from the **Reasoning** sidebar section — executes OWL 2 RL inference and SWRL business rules to discover inferred triples -8. Access the **GraphQL** playground to query your knowledge graph with auto-generated typed queries +8. Access the **GraphQL** playground to query your graph viewer with auto-generated typed queries ## Common Commands @@ -355,7 +355,7 @@ The OntoBricks interface has a navigation bar with status indicators: | **SQL Warehouse** | Dropdown to select/switch SQL warehouses | | **Ontology** | Shows ✓ (green) when ontology is loaded, ✗ (red) otherwise | | **Mapping** | Shows ✓ (green) when R2RML mapping exists, ✗ (red) otherwise | -| **Digital Twin** | Access the sync, knowledge graph, and quality checks interface | +| **Knowledge Graph** | Access the sync, graph viewer, and quality checks interface | | **Settings** | Manage Databricks connection and settings | ## Ontology Sidebar Navigation @@ -412,7 +412,7 @@ rm -rf .venv scripts/setup.sh ``` -### Sync or Knowledge Graph Fails +### Sync or Graph Viewer Fails - Ensure both Ontology and Mapping have green checkmarks in the navbar - Check that the R2RML mapping is generated (visible in Domain → Export) diff --git a/docs/graphdb-integration.md b/docs/graphdb-integration.md index a223dc8a..86dcaafe 100644 --- a/docs/graphdb-integration.md +++ b/docs/graphdb-integration.md @@ -19,7 +19,7 @@ OntoBricks currently ships with one **runtime** graph engine, selectable under * ## 1. Architecture Overview -OntoBricks has two storage layers for knowledge graph data: +OntoBricks has two storage layers for graph viewer data: | Layer | Package | Purpose | |-------|---------|---------| @@ -394,7 +394,7 @@ passes it to `GraphDBFactory`. You only edit `GraphDBFactory`. ## 8. Lakebase build performance -When the active engine is **Lakebase**, the Digital Twin build keeps heavy +When the active engine is **Lakebase**, the Knowledge Graph build keeps heavy data on the Databricks side and never holds the full triple set inside the FastAPI process. diff --git a/docs/import-export.md b/docs/import-export.md index e36eae82..e43c3e94 100644 --- a/docs/import-export.md +++ b/docs/import-export.md @@ -291,7 +291,7 @@ ONTOBRICKS_PROFILE=dst scripts/registry_transfer.sh import-commit \ --conflict rename \ --yes -# 6. On the target env, rebuild the Digital Twin for each imported domain +# 6. On the target env, rebuild the Knowledge Graph for each imported domain # so the Delta view + Lakebase Graph DB tables (which are NOT transferred) # get regenerated. ``` diff --git a/docs/lakebase-graphdb.md b/docs/lakebase-graphdb.md index 5328876f..6cfa39a3 100644 --- a/docs/lakebase-graphdb.md +++ b/docs/lakebase-graphdb.md @@ -19,7 +19,7 @@ For the developer guide on *adding a new engine*, see `docs/graphdb-integration. 6. [Postgres schema layout](#6-postgres-schema-layout) 7. [Scripts reference](#7-scripts-reference) 8. [Permissions bootstrap](#8-permissions-bootstrap) -9. [Digital Twin build — step by step](#9-digital-twin-build--step-by-step) +9. [Knowledge Graph build — step by step](#9-digital-twin-build--step-by-step) 10. [Troubleshooting](#10-troubleshooting) --- @@ -104,7 +104,7 @@ Lakebase has **two project-creation APIs** with different capabilities: The **Databricks UI "New project" button** calls the new API and produces a project that is **incompatible** with `POST /api/2.0/database/synced_tables` (used by the -Digital Twin `managed_synced` build mode). Always use `scripts/setup-lakebase.sh` +Knowledge Graph `managed_synced` build mode). Always use `scripts/setup-lakebase.sh` to provision the project. --- @@ -146,7 +146,7 @@ two scripts by hand. In **Settings → Lakebase → Connection** tab there is a compute capacity, branch, Postgres database, graph schema, and the MCP app name, then click **Create graph DB**. The action runs as an async job (a progress bar + per-step log update live, polling `GET /tasks/{id}` like a -Digital Twin build) and performs the same flow as +Knowledge Graph build) and performs the same flow as `scripts/setup-lakebase.sh` + `scripts/bootstrap-lakebase-perms.sh`: 1. Create the Lakebase instance (via the synced-tables-compatible @@ -335,7 +335,7 @@ OntoBricks uses up to three Postgres schemas in the same Lakebase project: | Schema | Default name | Created by | Purpose | |--------|-------------|-----------|---------| | Registry | `ontobricks_registry` | `Settings → Registry → Initialize` | Project metadata, domain configs, schedule runs | -| Graph DB | `ontobricks_graph` | First Digital Twin Build | Per-domain triple tables (and views in `managed_synced`) | +| Graph DB | `ontobricks_graph` | First Knowledge Graph Build | Per-domain triple tables (and views in `managed_synced`) | | Sync | *(UC registry schema segment)* | First Lakeflow snapshot | Auto-created by Lakeflow; mirrors the UC `<schema>` segment | ### 6.2 — Objects per graph version @@ -456,7 +456,7 @@ Step 2: Open app → Settings → Registry → Initialize → Creates 'ontobricks_registry' schema in Postgres Step 3: make bootstrap-lakebase (or make deploy again — idempotent) → Applies USAGE + DML on 'ontobricks_registry' schema -Step 4: Build a Digital Twin (Settings → Digital Twin → Build) +Step 4: Build a Knowledge Graph (Settings → Knowledge Graph → Build) → Creates 'ontobricks_graph' schema (first build) Step 5: make bootstrap-lakebase (or make deploy again) → Applies USAGE + DML on 'ontobricks_graph' schema @@ -488,7 +488,7 @@ databricks permissions get database-instances/<instance-id> -o json --- -## 9. Digital Twin build — step by step +## 9. Knowledge Graph build — step by step This section describes what the Lakebase engine does during a **Build** for the `managed_synced` mode. For `app_managed`, steps 3–6 are replaced by direct @@ -693,6 +693,6 @@ instead of `window.confirm()`. If you see this on an older deployment, [ ] 8. Open Settings → Graph DB - Engine: lakebase - Config: { "sync_mode": "app_managed" } (or "managed_synced") -[ ] 9. Build your first Digital Twin +[ ] 9. Build your first Knowledge Graph [ ] 10. make bootstrap-lakebase again (grants on ontobricks_graph schema) ``` diff --git a/docs/mcp.md b/docs/mcp.md index b1a26e00..a39d2599 100644 --- a/docs/mcp.md +++ b/docs/mcp.md @@ -1,6 +1,6 @@ # OntoBricks MCP Server -OntoBricks exposes its Digital Twin knowledge-graph capabilities via the +OntoBricks exposes its Knowledge Graph knowledge-graph capabilities via the [Model Context Protocol (MCP)](https://modelcontextprotocol.io/), allowing LLM-based tools to browse domains, discover entity types, look up specific entities with full-text descriptions, and check triple-store health — all @@ -15,8 +15,8 @@ Python package deployed separately from the main OntoBricks web application. The MCP server follows a **two-step workflow**: -1. **Choose a domain** — call `list_domains` to see available knowledge graphs with descriptions, then `select_domain` to activate one. Only domains with the **API / MCP** flag enabled in OntoBricks are listed. -2. **Query the knowledge graph** — use `list_entity_types`, `describe_entity`, or `get_status` on the selected domain. +1. **Choose a domain** — call `list_domains` to see available graph viewers with descriptions, then `select_domain` to activate one. Only domains with the **API / MCP** flag enabled in OntoBricks are listed. +2. **Query the graph viewer** — use `list_entity_types`, `describe_entity`, or `get_status` on the selected domain. **Which version?** For each domain folder, the registry stores exactly one **Active** (MCP/API-enabled) version at a time. Operators set that version in the main OntoBricks app under **Registry → Browse** (expand the domain, then **Set as Active** on a row). **Domain → Versions** shows the outcome as a read-only badge but does not change it. @@ -36,15 +36,15 @@ topic covered by one of the listed domains, the LLM selects it automatically. | Tool | Description | |------|-------------| -| `list_domains` | Lists all domains (knowledge graphs) in the registry with their names and descriptions | +| `list_domains` | Lists all domains (graph viewers) in the registry with their names and descriptions | | `select_domain` | Activates a domain by name — all subsequent queries operate on this domain's triple store | | `list_domain_versions` | Lists registry versions for a named domain (latest first) | | `get_design_status` | Design pipeline readiness (ontology, metadata, assignment, build_ready) for a domain | -| `list_entity_types` | Returns a human-readable overview of the selected domain's knowledge graph: total triples, distinct entities, every entity type with instance count, and predicate usage breakdown | +| `list_entity_types` | Returns a human-readable overview of the selected domain's graph viewer: total triples, distinct entities, every entity type with instance count, and predicate usage breakdown | | `describe_entity` | Searches for an entity by name/type and returns a **full-text description** — identity, attributes, relationships, and related entities discovered hop-by-hop (BFS traversal) | | `get_status` | Compact diagnostic: domain name, view table, graph name, data availability, triple count | | `get_graphql_schema` | Returns the auto-generated GraphQL schema (SDL) for the selected domain — shows types, fields, and relationships | -| `query_graphql` | Executes a GraphQL query against the selected domain's knowledge graph with structured, nested results | +| `query_graphql` | Executes a GraphQL query against the selected domain's graph viewer with structured, nested results | ### Tool Details @@ -62,7 +62,7 @@ Returns formatted text: Available Domains (3) ======================================== • customer360 - Customer 360 knowledge graph with interactions, contracts, and claims + Customer 360 graph viewer with interactions, contracts, and claims • supply_chain Supply chain ontology covering suppliers, products, and logistics • hr_analytics @@ -95,7 +95,7 @@ No arguments. Requires a domain to be selected first. Returns formatted text: ``` -Knowledge Graph — customer360 +Graph Viewer — customer360 ======================================== Total triples: 12,030 Distinct entities: 1,301 @@ -225,7 +225,7 @@ Use query_graphql to execute queries against this schema. Requires a domain to be selected first. -Executes a GraphQL query against the knowledge graph and returns structured, formatted results. Ideal for: +Executes a GraphQL query against the graph viewer and returns structured, formatted results. Ideal for: - Fetching specific fields without over-fetching - Nested relationship traversal in a single request - Filtering with `search`, pagination with `limit`/`offset` @@ -354,7 +354,7 @@ databricks apps deploy mcp-ontobricks \ 2. Navigate to **Playground** 3. **mcp-ontobricks** appears in the MCP Servers list (apps starting with `mcp-` are shown automatically) 4. Select it — you now have access to `list_entity_types`, `describe_entity`, and `get_status` -5. Ask questions like *"What entity types are in the knowledge graph?"* or *"Tell me about Jacob Martinez"* +5. Ask questions like *"What entity types are in the graph viewer?"* or *"Tell me about Jacob Martinez"* --- diff --git a/docs/product.md b/docs/product.md index 7ddb9e71..c0b3d1ca 100644 --- a/docs/product.md +++ b/docs/product.md @@ -32,16 +32,16 @@ Organizations invest heavily in Lakehouse platforms to store and process data at | **Siloed knowledge** | Domain expertise is trapped in documentation, ER diagrams, or the heads of senior engineers -- disconnected from the data itself. | | **Query-only exploration** | Understanding relationships requires ad-hoc SQL joins. There is no visual, graph-based way to navigate across tables. | | **Inaccessible standards** | Industry ontologies (FIBO for finance, CDISC for clinical, IOF for manufacturing) exist but require specialized desktop tools that do not integrate with the data platform. | -| **No schema-to-graph path** | Building a knowledge graph from Lakehouse tables today requires stitching together multiple external tools, custom ETL, and manual RDF generation. | +| **No schema-to-graph path** | Building a graph viewer from Lakehouse tables today requires stitching together multiple external tools, custom ETL, and manual RDF generation. | -**The result:** data is stored but not understood, relationships are implicit but not navigable, and knowledge graph adoption stalls because the infrastructure barrier is too high. +**The result:** data is stored but not understood, relationships are implicit but not navigable, and graph viewer adoption stalls because the infrastructure barrier is too high. --- ### Slide 2: Where OntoBricks Fits -#### A Knowledge Graph Builder that lives inside Databricks. +#### A Graph Viewer Builder that lives inside Databricks. OntoBricks is not a separate platform. It deploys as a **Databricks App** and uses the services you already have. @@ -57,7 +57,7 @@ flowchart LR subgraph ontoBricks ["OntoBricks App"] OD["Ontology Designer<br/>OWL / RDFS"] MA["Mapping<br/>R2RML Mapping"] - DT["Digital Twin<br/>Knowledge Graph"] + DT["Knowledge Graph<br/>Graph Viewer"] end UC -->|metadata| OD @@ -91,7 +91,7 @@ flowchart LR ### Slide 3: The 4-Click Pipeline -#### From raw tables to a queryable knowledge graph in minutes, not months. +#### From raw tables to a queryable graph viewer in minutes, not months. After a one-time setup (Databricks connection, LLM endpoint, triple store table), the entire pipeline is four actions: @@ -105,7 +105,7 @@ flowchart LR S1 -->|"UC tables & columns"| S2 S2 -->|"LLM designs entities"| S3 S3 -->|"LLM maps SQL"| S4 - S4 -->|"Delta materialization"| KG["Knowledge Graph Ready"] + S4 -->|"Delta materialization"| KG["Graph Viewer Ready"] ``` @@ -116,7 +116,7 @@ flowchart LR | **1** | Domain > Metadata | Fetches table and column metadata from Unity Catalog | Unity Catalog API | | **2** | Ontology > Generate | LLM designs entities, relationships, attributes, and inheritance from your metadata | Model Serving | | **3** | Mapping > Auto-Map | LLM generates SQL queries and column mappings for every entity and relationship | Model Serving | -| **4** | Digital Twin > Build | Executes all mappings and populates the triple store table | SQL Warehouse | +| **4** | Knowledge Graph > Build | Executes all mappings and populates the triple store table | SQL Warehouse | **Traditional approach:** weeks of manual ontology design, custom ETL pipelines, separate graph database setup. @@ -153,13 +153,13 @@ flowchart LR | R2RML Generation | W3C-compliant mapping generated automatically -- users never write mapping rules | -#### Digital Twin (Sync and Explore) +#### Knowledge Graph (Sync and Explore) | Capability | Description | | --------------------- | ------------------------------------------------------------------------------------ | | One-Click Sync | Materialize triples into a Delta table stored in Unity Catalog | -| Knowledge Graph | Sigma.js WebGL graph with search, filtering, depth control, and entity detail panels | +| Graph Viewer | Sigma.js WebGL graph with search, filtering, depth control, and entity detail panels | | Quality Checks | Async validation against ontology constraints (cardinality, orphans, value rules) | | Dashboard Integration | Embed Databricks dashboards with parameter mapping to ontology entities | | Triples Grid | Sortable, searchable table view of all materialized triples | @@ -180,7 +180,7 @@ flowchart LR | Capability | Description | | --- | --- | -| REST API (Digital Twin) | Stateless endpoints for triple store status, entity search, ontology/R2RML/SQL retrieval, and build triggers | +| REST API (Knowledge Graph) | Stateless endpoints for triple store status, entity search, ontology/R2RML/SQL retrieval, and build triggers | | GraphQL API | Auto-generated typed schema per domain with configurable depth, GraphiQL playground | | MCP Server | Model Context Protocol server for Databricks Playground and LLM clients (Cursor, Claude Desktop) | | Ontology Assistant | Conversational agent for natural-language ontology editing (add entities, clean orphans, etc.) | @@ -190,17 +190,17 @@ flowchart LR ### Slide 5: Competitive Landscape -#### No existing solution provides an integrated, Databricks-native knowledge graph experience. +#### No existing solution provides an integrated, Databricks-native graph viewer experience. | Solution | What it does | Limitation for Databricks users | | ------------------------------ | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ | | **Palantir Foundry** | Powerful ontology layer (Ontology + AIP) for entity modeling and operational analytics | Proprietary platform; requires Palantir infrastructure; expensive licensing; no W3C standards (OWL/RDF); lock-in | | **Snowflake Cortex + Horizon** | ML functions and governance catalog for the Snowflake ecosystem | No ontology design; no RDF/OWL; no graph visualization; Snowflake-only -- not available on Databricks | -| **Microsoft Fabric + Purview** | Unified analytics with a governance catalog (Purview) for lineage and classification | Governance-focused, not ontology-focused; no knowledge graph materialization; no visual graph exploration; Azure-centric | +| **Microsoft Fabric + Purview** | Unified analytics with a governance catalog (Purview) for lineage and classification | Governance-focused, not ontology-focused; no graph viewer materialization; no visual graph exploration; Azure-centric | | **Neo4j / Amazon Neptune** | Dedicated graph databases optimized for traversal queries | Separate infrastructure; data must be exported from the Lakehouse; no native Delta integration; data duplication | | **Stardog** | Knowledge graph platform with virtual graph and reasoning | Separate server; JDBC connector to Databricks but no native integration; commercial license | -| **TopBraid / Protege** | Enterprise and desktop OWL ontology editors | No Databricks integration; cannot map to tables; no SQL generation; no knowledge graph exploration | +| **TopBraid / Protege** | Enterprise and desktop OWL ontology editors | No Databricks integration; cannot map to tables; no SQL generation; no graph viewer exploration | | **dbt Semantic Layer** | SQL-based semantic modeling for metrics and dimensions | No ontology/OWL; no graph visualization; limited to dimensional modeling concepts | @@ -211,7 +211,7 @@ OntoBricks is the **only** solution that combines all of the following in a sing - Databricks-native (deploys as an App, uses UC + SQL Warehouse) - W3C standards-based (OWL, R2RML, SPARQL) - LLM-automated (ontology generation + data mapping) -- Graph-visualizing (interactive knowledge graph) +- Graph-visualizing (interactive graph viewer) - Industry-standard ready (FIBO, CDISC, IOF) - Open-source (MIT license) @@ -224,7 +224,7 @@ OntoBricks is the **only** solution that combines all of the following in a sing | Benefit | Without OntoBricks | With OntoBricks | | --------------------------- | ------------------------------------------------------------------------- | -------------------------------------------------------------------------- | -| **Time to knowledge graph** | Weeks to months of manual ontology design, custom ETL, and graph DB setup | Minutes -- 4-click LLM-automated pipeline | +| **Time to graph viewer** | Weeks to months of manual ontology design, custom ETL, and graph DB setup | Minutes -- 4-click LLM-automated pipeline | | **Infrastructure cost** | Separate graph database (Neo4j, Neptune, Stardog) + compute + maintenance | Zero -- triples live in Delta, queries run on SQL Warehouse | | **Industry compliance** | Requires Protege or TopBraid + manual import + custom integration | One-click import of FIBO, CDISC, IOF directly from the Databricks platform | | **Knowledge sharing** | ER diagrams in Confluence, tribal knowledge in meetings | Versioned ontology domains in Unity Catalog, shareable across teams | @@ -240,7 +240,7 @@ OntoBricks is the **only** solution that combines all of the following in a sing | -------------------- | --------------------------------------------------------------------- | | **Data Engineers** | Build semantic layers without leaving the Databricks platform | | **Domain Experts** | Model and explore entity relationships visually, without SQL | -| **Data Architects** | Evaluate knowledge graph approaches with zero infrastructure overhead | +| **Data Architects** | Evaluate graph viewer approaches with zero infrastructure overhead | | **Compliance Teams** | Apply industry standards (FIBO, CDISC, IOF) to real data | @@ -248,7 +248,7 @@ OntoBricks is the **only** solution that combines all of the following in a sing ### Slide 7: Conclusion and Next Steps -#### Deploy a knowledge graph on Databricks in minutes. +#### Deploy a graph viewer on Databricks in minutes. **Get started:** @@ -273,7 +273,7 @@ databricks apps deploy --app-name ontobricks | ------------------------ | --------------------------------------------------- | | Source Code | GitHub repository (MIT license) | | Documentation | Full user guide, architecture docs, API reference | -| Automated Pipeline Guide | Step-by-step: tables to knowledge graph in 4 clicks | +| Automated Pipeline Guide | Step-by-step: tables to graph viewer in 4 clicks | | Import Guide | FIBO, CDISC, IOF import instructions | | MCP Server Guide | Deployment, tools, client configuration for Playground, Cursor, Claude Desktop | @@ -288,7 +288,7 @@ databricks apps deploy --app-name ontobricks --- -*OntoBricks -- Bridging relational data and knowledge graphs on Databricks.* +*OntoBricks -- Bridging relational data and graph viewers on Databricks.* --- @@ -296,9 +296,9 @@ databricks apps deploy --app-name ontobricks ### Summary -OntoBricks is a **Knowledge Graph Builder for Databricks** that brings **graph database capabilities and formal reasoning** to the Lakehouse — without requiring separate graph infrastructure. It transforms relational tables stored in Unity Catalog into a structured knowledge graph by leveraging semantic web standards (OWL, R2RML, RDF), a Lakebase Postgres graph engine, OWL 2 RL reasoning, and LLM-powered automation. +OntoBricks is a **Graph Viewer Builder for Databricks** that brings **graph database capabilities and formal reasoning** to the Lakehouse — without requiring separate graph infrastructure. It transforms relational tables stored in Unity Catalog into a structured graph viewer by leveraging semantic web standards (OWL, R2RML, RDF), a Lakebase Postgres graph engine, OWL 2 RL reasoning, and LLM-powered automation. -Users can design ontologies visually or import industry standards (FIBO for finance, CDISC for clinical data, IOF for manufacturing), map ontology entities to Databricks tables, materialize the result into a Delta-backed triple store mirrored on Lakebase Postgres, run **formal reasoning** (OWL 2 RL deductive closure, SWRL rules, transitive/symmetric inference), and explore the knowledge graph through interactive visualization. The entire pipeline — from raw tables to a reasoned, queryable knowledge graph — can be completed in as few as four clicks thanks to LLM-driven ontology generation and automatic data mapping. +Users can design ontologies visually or import industry standards (FIBO for finance, CDISC for clinical data, IOF for manufacturing), map ontology entities to Databricks tables, materialize the result into a Delta-backed triple store mirrored on Lakebase Postgres, run **formal reasoning** (OWL 2 RL deductive closure, SWRL rules, transitive/symmetric inference), and explore the graph viewer through interactive visualization. The entire pipeline — from raw tables to a reasoned, queryable graph viewer — can be completed in as few as four clicks thanks to LLM-driven ontology generation and automatic data mapping. OntoBricks runs as a **Databricks App**, making it natively integrated with the Databricks platform: Unity Catalog for storage and metadata, SQL Warehouses for query execution, and Model Serving endpoints for LLM features. @@ -312,7 +312,7 @@ Organizations on Databricks accumulate large volumes of structured data across c - **Knowledge is siloed**: Domain knowledge about entity relationships (e.g., "a Customer has Contracts, which have Invoices") lives in documentation, tribal knowledge, or ER diagrams disconnected from the actual data. - **Exploration is query-driven**: Understanding how entities connect requires writing ad-hoc SQL joins. There is no visual, graph-based way to navigate data across tables. - **Industry standards are inaccessible**: Established ontologies like FIBO (finance), CDISC (clinical), and IOF (manufacturing) exist but require specialized tooling (Protégé, TopBraid) that doesn't integrate with the Databricks ecosystem. -- **No path from schema to knowledge graph**: Building a knowledge graph from Databricks tables today requires stitching together multiple external tools, custom ETL pipelines, and manual RDF generation — a process that is expensive, fragile, and disconnected from the data platform. +- **No path from schema to graph viewer**: Building a graph viewer from Databricks tables today requires stitching together multiple external tools, custom ETL pipelines, and manual RDF generation — a process that is expensive, fragile, and disconnected from the data platform. --- @@ -347,16 +347,16 @@ OntoBricks provides an end-to-end, web-based solution that runs directly on Data - **Graph Reasoning**: Automatic transitive closure and symmetric expansion based on OWL property characteristics. - **Constraint Validation**: Formal checking of cardinality, functional/inverse-functional properties, value constraints, and global rules (no orphans, require labels). -#### Knowledge Graph Exploration +#### Graph Viewer Exploration -- **Interactive Knowledge Graph**: Sigma.js WebGL-powered graph with search, filtering, depth control, and entity detail panels. +- **Interactive Graph Viewer**: Sigma.js WebGL-powered graph with search, filtering, depth control, and entity detail panels. - **Data Cluster Detection**: Detect communities using Louvain, Label Propagation, or Greedy Modularity — client-side (Graphology) for the visible subgraph, server-side (NetworkX) for the full graph; color-by-cluster mode, adjustable resolution, collapse clusters into navigable super-nodes. - **Triples grid**: Sortable, searchable table view of all materialized triples. - **Dashboard integration**: Embed Databricks SQL dashboards with parameter mapping to ontology entities. #### External & Programmatic Access -- **Digital Twin REST API**: Stateless endpoints for triple store status, ontology/R2RML/SQL retrieval, entity search, and build triggers (`/api/v1/digitaltwin/`). +- **Knowledge Graph REST API**: Stateless endpoints for triple store status, ontology/R2RML/SQL retrieval, entity search, and build triggers (`/api/v1/digitaltwin/`). - **GraphQL API**: Auto-generated typed schema per domain with configurable relationship depth and GraphiQL playground. - **MCP Server**: Model Context Protocol server deployable as a Databricks App (`mcp-ontobricks`) for Databricks Playground integration and LLM client access (Cursor, Claude Desktop). - **Ontology Assistant**: Conversational LLM agent for natural-language ontology editing. @@ -377,7 +377,7 @@ OntoBricks provides an end-to-end, web-based solution that runs directly on Data | **dbt + Semantic Layer** | SQL-based semantic modeling | No ontology/OWL support; no graph visualization; limited to dimensional modeling concepts | -**Gap**: No existing solution provides an integrated, Databricks-native experience that combines ontology design, industry-standard import, LLM-powered automation, **graph database capabilities (embedded Cypher engine)**, **formal OWL 2 RL reasoning**, **SWRL rule evaluation**, **W3C SHACL data quality validation**, triple store materialization in Delta, and visual knowledge graph exploration — all deployable as a Databricks App without requiring separate graph infrastructure. +**Gap**: No existing solution provides an integrated, Databricks-native experience that combines ontology design, industry-standard import, LLM-powered automation, **graph database capabilities (embedded Cypher engine)**, **formal OWL 2 RL reasoning**, **SWRL rule evaluation**, **W3C SHACL data quality validation**, triple store materialization in Delta, and visual graph viewer exploration — all deployable as a Databricks App without requiring separate graph infrastructure. --- @@ -404,14 +404,14 @@ A **production-ready Databricks App** (open-source, MIT license) that: | **Industry compliance** | FIBO, CDISC, and IOF ontologies become accessible directly from the Databricks platform | | **Time to value** | LLM automation reduces the manual effort from weeks of custom development to minutes of guided interaction | | **Reusability** | Saved domains (ontology + mappings) can be versioned, shared, and applied to new datasets | -| **Data quality** | Built-in quality checks and formal constraint validation ensure the knowledge graph adheres to ontology semantics | +| **Data quality** | Built-in quality checks and formal constraint validation ensure the graph viewer adheres to ontology semantics | #### Target Users - **Data engineers** building semantic layers on Databricks - **Domain experts** (finance, healthcare, manufacturing) who need to model and explore entity relationships -- **Data architects** evaluating knowledge graph approaches on Lakehouse platforms +- **Data architects** evaluating graph viewer approaches on Lakehouse platforms - **Field engineers** demonstrating Databricks capabilities for knowledge management and data governance use cases --- @@ -443,9 +443,9 @@ A **production-ready Databricks App** (open-source, MIT license) that: - **Reasoning engine operational**: OWL 2 RL deductive closure, SWRL rule engine (SQL translator) with graphical D3 editor, graph reasoning (transitive closure, symmetric expansion), constraint validation, and SHACL data quality shapes (PySHACL + SQL compilation) - **Triple store + Graph DB layers**: Delta view (Unity Catalog) + Lakebase Postgres flat store, pluggable behind `GraphDBFactory` - MCP server deployed and operational for Databricks Playground -- **Entity Groups**: OWL-compliant class grouping via `owl:equivalentClass` + `owl:unionOf`, with expand/collapse super-nodes in the Knowledge Graph visualization +- **Entity Groups**: OWL-compliant class grouping via `owl:equivalentClass` + `owl:unionOf`, with expand/collapse super-nodes in the Graph Viewer visualization - **Data Cluster Detection**: Client-side Louvain (Graphology) and server-side community detection (NetworkX: Louvain, Label Propagation, Greedy Modularity) with color-by-cluster, resolution control, and cluster collapse/expand super-nodes -- Digital Twin REST API with design status, ontology, R2RML, Spark SQL endpoints +- Knowledge Graph REST API with design status, ontology, R2RML, Spark SQL endpoints - GraphQL API with configurable depth and auto-generated schema - Documentation: README, user guide, architecture, API reference, import guide, automated pipeline guide @@ -454,4 +454,4 @@ A **production-ready Databricks App** (open-source, MIT license) that: - **Databricks workspace** with a SQL Warehouse (Serverless recommended) for demo and testing - **Model Serving endpoint** for LLM features (e.g., Meta Llama 3.3 70B or equivalent) - **Unity Catalog** with sample datasets for demonstration scenarios -- Visibility and feedback from field engineering teams working on knowledge graph, data governance, and semantic layer use cases +- Visibility and feedback from field engineering teams working on graph viewer, data governance, and semantic layer use cases diff --git a/docs/sphinx/api/api_external.rst b/docs/sphinx/api/api_external.rst index 05b6112e..92af2c96 100644 --- a/docs/sphinx/api/api_external.rst +++ b/docs/sphinx/api/api_external.rst @@ -54,7 +54,7 @@ Projects API (list & artifacts) :undoc-members: :show-inheritance: -Digital Twin API +Knowledge Graph API ---------------- .. automodule:: api.routers.digitaltwin diff --git a/docs/sphinx/api/app.core.graphdb.lakebase.rst b/docs/sphinx/api/app.core.graphdb.lakebase.rst index 19b2a52f..363163b7 100644 --- a/docs/sphinx/api/app.core.graphdb.lakebase.rst +++ b/docs/sphinx/api/app.core.graphdb.lakebase.rst @@ -31,7 +31,7 @@ Flat store Bulk ingestion contract ~~~~~~~~~~~~~~~~~~~~~~~ -The Digital Twin build pipeline never holds the full graph in memory when +The Knowledge Graph build pipeline never holds the full graph in memory when the active engine is Lakebase. Triples flow from the Databricks SQL warehouse to Postgres in fixed-size batches via the streaming bulk paths: diff --git a/docs/sphinx/changelog.rst b/docs/sphinx/changelog.rst index 6f126e25..8607cc9c 100644 --- a/docs/sphinx/changelog.rst +++ b/docs/sphinx/changelog.rst @@ -97,10 +97,10 @@ v0.2.0 (Unreleased) -------------------- - **Entity Groups**: group ontology classes and expand/collapse them in the - Digital Twin Knowledge Graph. Groups are stored as OWL defined classes + Knowledge Graph Graph Viewer. Groups are stored as OWL defined classes (``owl:equivalentClass`` + ``owl:unionOf``) with ``ontobricks:isGroup`` annotation for UI differentiation. -- Group CRUD API (``/ontology/groups/*``) and Digital Twin consumption +- Group CRUD API (``/ontology/groups/*``) and Knowledge Graph consumption endpoint (``GET /dtwin/groups``). - Ontology UI: dedicated *Groups* section for creating, editing, and deleting groups with class member selection. @@ -114,7 +114,7 @@ v0.1.0 - OWL ontology design and import (FIBO, CDISC, IOF). - R2RML mapping from Databricks tables to RDF. - Delta-backed triple store mirrored on a Lakebase Postgres graph engine. -- GraphQL typed API over the knowledge graph. +- GraphQL typed API over the graph viewer. - SHACL data quality validation. - OWL 2 RL and SWRL reasoning engine. - LLM agents for ontology assistance. diff --git a/docs/sphinx/conf.py b/docs/sphinx/conf.py index 1aa6b543..532822f3 100644 --- a/docs/sphinx/conf.py +++ b/docs/sphinx/conf.py @@ -92,7 +92,7 @@ html_short_title = "OntoBricks" html_theme_options = { - "description": "Knowledge Graph Builder for Databricks", + "description": "Graph Viewer Builder for Databricks", "github_user": "", "github_repo": "OntoBricks", "fixed_sidebar": True, diff --git a/docs/sphinx/index.rst b/docs/sphinx/index.rst index c38bbaf7..5b7309d1 100644 --- a/docs/sphinx/index.rst +++ b/docs/sphinx/index.rst @@ -1,13 +1,13 @@ OntoBricks Documentation ======================== -**Knowledge Graph Builder for Databricks** +**Graph Viewer Builder for Databricks** OntoBricks is a web-based application that turns Databricks tables into a -knowledge graph. Design ontologies using OWL or import industry standards +graph viewer. Design ontologies using OWL or import industry standards (FIBO, CDISC, IOF), map them to tables via R2RML, materialize triples into a Delta-backed triple store mirrored on Lakebase Postgres, query them through a typed GraphQL API, and -explore your knowledge graph visually. +explore your graph viewer visually. **Topic guides** (Markdown in ``docs/``, included here via MyST) are the canonical narrative documentation. **Developer overviews** below are short diff --git a/docs/sphinx/overview/architecture.rst b/docs/sphinx/overview/architecture.rst index fa19e17d..79e5e826 100644 --- a/docs/sphinx/overview/architecture.rst +++ b/docs/sphinx/overview/architecture.rst @@ -52,7 +52,7 @@ Package Responsibility ``shared.fastapi`` FastAPI app factory, health, shared wiring ``front.fastapi`` UI-specific FastAPI dependencies ``back.fastapi`` GraphQL routes and domain HTTP helpers -``api`` External REST v1 + Digital Twin (mounted at ``/api``) +``api`` External REST v1 + Knowledge Graph (mounted at ``/api``) ``back.core.databricks`` Typed facades for Databricks SDK & SQL ``back.core.triplestore`` Abstract base + Delta view backend ``back.core.graphdb`` Pluggable Graph DB engines (Lakebase Postgres, …) diff --git a/docs/user-guide.md b/docs/user-guide.md index 1ccb561a..7140388b 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -2,7 +2,7 @@ ## Introduction -OntoBricks is a visual tool for designing ontologies, mapping them to Databricks tables, generating R2RML mappings, synchronizing data to a triple store, and exploring your knowledge graph visually. This guide walks you through the complete workflow. +OntoBricks is a visual tool for designing ontologies, mapping them to Databricks tables, generating R2RML mappings, synchronizing data to a triple store, and exploring your graph viewer visually. This guide walks you through the complete workflow. ## Prerequisites @@ -17,7 +17,7 @@ Before starting, ensure you have: OntoBricks follows a 3-step workflow: ``` -1. Design Ontology → 2. Assign Data Sources → 3. Digital Twin (Sync & Explore) +1. Design Ontology → 2. Assign Data Sources → 3. Knowledge Graph (Sync & Explore) ``` --- @@ -239,11 +239,11 @@ Click **Data Quality** in the sidebar to define data quality rules using W3C SHA **Import/Export**: Shapes can be exported as W3C-compliant SHACL Turtle and imported from existing SHACL files. -**Validation**: Shapes are executed against the triple store in the Digital Twin → Data Quality section, either via SQL compilation or PySHACL in-memory validation. +**Validation**: Shapes are executed against the triple store in the Knowledge Graph → Data Quality section, either via SQL compilation or PySHACL in-memory validation. ### Dashboard Mapping -You can assign Databricks dashboards to entity types for embedded visualization in the Digital Twin: +You can assign Databricks dashboards to entity types for embedded visualization in the Knowledge Graph: 1. Go to **Ontology** → **Entities** 2. Select an entity type (e.g., Customer, Meter) @@ -260,7 +260,7 @@ When a dashboard has filter parameters (e.g., customer_id, meter_id), you can ma - `__ID__`: The entity's unique identifier (extracted from URI) - Any attribute defined on the entity type -When viewing an entity in the Digital Twin visualization, the dashboard will be embedded with the correct parameter values. +When viewing an entity in the Knowledge Graph visualization, the dashboard will be embedded with the correct parameter values. ### Option C: AI-Powered Wizard @@ -461,9 +461,9 @@ The R2RML mapping output is available in the **Domain** section under **R2RML**. --- -## Step 3: Digital Twin (Sync & Explore) +## Step 3: Knowledge Graph (Sync & Explore) -Navigate to the **Digital Twin** page by clicking "Digital Twin" in the navigation bar (URL: `/dtwin`). +Navigate to the **Knowledge Graph** page by clicking "Knowledge Graph" in the navigation bar (URL: `/dtwin`). > **Note**: You need both Ontology and Mapping loaded (green checkmarks in navbar). The Sync page shows a readiness status and disables actions until both are ready. @@ -494,9 +494,9 @@ Click **Triples** in the sidebar to view triples in an interactive data grid. Tr - **Result count**: Shown in tab badge - Cells show URIs and literal values -### Knowledge Graph (Sidebar) +### Graph Viewer (Sidebar) -Click **Knowledge Graph** in the sidebar to explore triples as an interactive sigma.js WebGL-powered graph. Triple store data is **automatically loaded** when you navigate to this section: +Click **Graph Viewer** in the sidebar to explore triples as an interactive sigma.js WebGL-powered graph. Triple store data is **automatically loaded** when you navigate to this section: **Main Graph Area (left):** - **Nodes**: Entities (colored by class type with emoji icons in labels) @@ -541,7 +541,7 @@ Right-click any entity node and pick **Expand neighbours (N hops)** to enrich th **Data Clusters:** -The Knowledge Graph includes a **Data Clusters** panel (in the View tab) for detecting communities in the graph: +The Graph Viewer includes a **Data Clusters** panel (in the View tab) for detecting communities in the graph: 1. **Detect clusters (local)**: Runs the Louvain community detection algorithm client-side using Graphology on the currently displayed subgraph. Adjust the **Resolution** slider to control cluster granularity (higher = more clusters). 2. **Full graph (backend)**: Sends a request to the server which loads the entire triple store into NetworkX and runs the selected algorithm (Louvain, Label Propagation, or Greedy Modularity) on the full dataset. Use this for large graphs that exceed the visible subgraph. @@ -599,7 +599,7 @@ Click **Quality** in the sidebar to run automated quality checks on your triple ### Data Quality — SHACL (Sidebar) -Click **Data Quality** in the Digital Twin sidebar to run SHACL shape validations against the triple store: +Click **Data Quality** in the Knowledge Graph sidebar to run SHACL shape validations against the triple store: 1. Shapes defined in **Ontology → Data Quality** are listed with their category, target class, and severity 2. Click **Run Validation** to execute all enabled shapes @@ -609,7 +609,7 @@ Click **Data Quality** in the Digital Twin sidebar to run SHACL shape validation ### Reasoning (Sidebar) -Click **Reasoning** in the Digital Twin sidebar to run the multi-phase reasoning pipeline: +Click **Reasoning** in the Knowledge Graph sidebar to run the multi-phase reasoning pipeline: 1. **OWL 2 RL** — Forward-chaining deductive closure on the ontology (infers subclass hierarchies, domain/range typing, property entailments) 2. **SWRL Rules** — Evaluates user-defined rules (violation detection and optional materialization) @@ -728,7 +728,7 @@ review workflow that collects reviewer sign-offs and keeps a durable audit trail is met). "Review & sign off" loads the domain and opens its Validation workspace. - **Domain → Validation** — the per-version review workspace: - **Consistency checks** — a soft readiness summary (ontology valid, mapping complete, - warehouse configured, Digital Twin built) with shortcuts to the Cockpit and Pitfalls. + warehouse configured, Knowledge Graph built) with shortcuts to the Cockpit and Pitfalls. These checks are advisory and never block publishing. - **Your actions** — context-aware buttons: Submit for review, **Approve** / **Request changes** (with an optional comment for the audit trail), Publish, or Reopen. @@ -812,24 +812,24 @@ Domains are saved in a versioned JSON format and can be stored in Unity Catalog 6. **Quote Special Column Names**: If a source column contains spaces, hyphens, or dots, use backtick quoting in your SQL (`` `column name` AS column_name ``) so the mapping and R2RML export work correctly. 7. **Use Metadata Quality Warning**: Check the Auto-Map page for the metadata quality warning before running Auto-Map — adding table and column descriptions in Domain → Metadata significantly improves mapping accuracy. -### Digital Twin Tips +### Knowledge Graph Tips 1. **Sync After Changes**: Re-synchronize after modifying ontology or mappings 2. **Check Quality**: Run quality checks after syncing to catch constraint violations early -3. **Use Knowledge Graph**: The interactive graph is the best way to explore entity relationships +3. **Use Graph Viewer**: The interactive graph is the best way to explore entity relationships 4. **Review Triples**: Browse the triples grid to verify the generated data looks correct 5. **Performance**: The `/stats` API aggregates all scalar metrics in a single SQL query and the `/triples/find` BFS traversal uses a recursive CTE, minimizing SQL Warehouse round trips -6. **Programmatic Access**: Use the Digital Twin API (`/api/v1/digitaltwin/`) or the MCP server for programmatic and conversational access to your knowledge graph +6. **Programmatic Access**: Use the Knowledge Graph API (`/api/v1/digitaltwin/`) or the MCP server for programmatic and conversational access to your graph viewer --- ## GraphQL API -Once your triple store is materialized (synced via Digital Twin), OntoBricks automatically provides a **typed GraphQL API** for each domain. The schema is auto-generated from the ontology — no manual configuration required. +Once your triple store is materialized (synced via Knowledge Graph), OntoBricks automatically provides a **typed GraphQL API** for each domain. The schema is auto-generated from the ontology — no manual configuration required. ### Accessing GraphQL -1. Navigate to **Digital Twin** → **API** and scroll to the **GraphQL API** section +1. Navigate to **Knowledge Graph** → **API** and scroll to the **GraphQL API** section 2. Alternatively, visit `/graphql/{domain_name}` to open the **GraphiQL Playground** directly ### Available Endpoints @@ -893,7 +893,7 @@ Higher depth values allow deeper nested traversal (e.g., `customer → interacti ## MCP Server (Databricks Playground) -OntoBricks includes an MCP server that exposes knowledge-graph tools to LLM clients via the [Model Context Protocol](https://modelcontextprotocol.io/). This enables conversational access to your knowledge graph from the Databricks Playground, Cursor, Claude Desktop, and other MCP-compatible tools. +OntoBricks includes an MCP server that exposes knowledge-graph tools to LLM clients via the [Model Context Protocol](https://modelcontextprotocol.io/). This enables conversational access to your graph viewer from the Databricks Playground, Cursor, Claude Desktop, and other MCP-compatible tools. ### Available Tools @@ -914,7 +914,7 @@ OntoBricks includes an MCP server that exposes knowledge-graph tools to LLM clie 1. Deploy the MCP server as `mcp-ontobricks` (see [Deployment Guide](deployment.md)) 2. In your Databricks workspace, navigate to **Playground** 3. Select **mcp-ontobricks** from the MCP Servers list -4. Ask questions like *"What entity types are in the knowledge graph?"* or *"Tell me about Jacob Martinez"* +4. Ask questions like *"What entity types are in the graph viewer?"* or *"Tell me about Jacob Martinez"* ### Enabling Domains for MCP @@ -969,11 +969,11 @@ See the [MCP Server documentation](mcp.md) for full details including local usag | manages | `SELECT manager_id, project_id FROM project_managers` | manager_id | project_id | | collaboratesWith | `SELECT person1_id, person2_id FROM collaborations` | person1_id | person2_id | -### Step 3: Explore (Digital Twin) +### Step 3: Explore (Knowledge Graph) -1. Go to **Digital Twin** → **Status** and click **Synchronize** to generate triples from your mappings +1. Go to **Knowledge Graph** → **Status** and click **Synchronize** to generate triples from your mappings 2. Once synced, click **Triples** to browse all generated triples in a sortable grid -3. Click **Knowledge Graph** to explore the knowledge graph as an interactive sigma.js WebGL graph +3. Click **Graph Viewer** to explore the graph viewer as an interactive sigma.js WebGL graph 4. Click on any entity node to see its type, label, attributes, and values in the details panel 5. Click **Quality** to run automated quality checks against your ontology constraints @@ -1010,7 +1010,7 @@ See the [MCP Server documentation](mcp.md) for full details including local usag - Ensure you have SELECT permissions - Only SELECT queries are allowed -### Empty Knowledge Graph +### Empty Graph Viewer **Problem**: Graph shows no nodes or edges @@ -1039,7 +1039,7 @@ See the [MCP Server documentation](mcp.md) for full details including local usag **Solutions**: - Lakebase Postgres is the source of truth for the graph engine — verify the App is bound to the Lakebase instance (`PGHOST` / `PGDATABASE` env vars set by the Apps runtime) - If the Lakebase instance was paused or scaled to zero, the connection layer retries on `SQLSTATE 57P03`. Wait a few seconds and re-trigger the build. -- Re-run the Digital Twin sync — the build is idempotent (`INSERT … ON CONFLICT DO NOTHING`) +- Re-run the Knowledge Graph sync — the build is idempotent (`INSERT … ON CONFLICT DO NOTHING`) - For `managed_synced` mode, check the Lakeflow synced-table status under **Settings → Graph DB** ### Design Changes Not Saving @@ -1096,7 +1096,7 @@ See the [MCP Server documentation](mcp.md) for full details including local usag ## Automated Triple Store Creation -This guide walks you through creating a fully populated **knowledge graph triple store** from scratch using OntoBricks' automated features. With LLM-powered ontology generation, automatic data mapping, and one-click synchronization, you can go from raw Databricks tables to a queryable triple store in minutes. +This guide walks you through creating a fully populated **graph viewer triple store** from scratch using OntoBricks' automated features. With LLM-powered ontology generation, automatic data mapping, and one-click synchronization, you can go from raw Databricks tables to a queryable triple store in minutes. --- @@ -1237,7 +1237,7 @@ You can verify individual mappings by switching to the **Designer** view: ### Step 6: Synchronize to the Triple Store -Navigate to **Digital Twin** in the top navbar. The **Status** section opens by default. +Navigate to **Knowledge Graph** in the top navbar. The **Status** section opens by default. Before syncing, OntoBricks validates readiness: - **Ontology**: At least one entity with a valid URI @@ -1264,7 +1264,7 @@ If all checks pass: ### Step 7: Validate with Quality Checks -Still in the **Digital Twin** section, open **Quality** in the sidebar. +Still in the **Knowledge Graph** section, open **Quality** in the sidebar. Quality checks validate the triple store against your ontology using two complementary systems: @@ -1305,7 +1305,7 @@ SHACL shapes are compiled to **Spark SQL** for Delta execution and to **Postgres ### Step 7b: Run Reasoning (Optional) -Still in the **Digital Twin** section, open **Reasoning** in the sidebar. +Still in the **Knowledge Graph** section, open **Reasoning** in the sidebar. Reasoning discovers new facts (inferred triples) from your ontology rules: @@ -1321,15 +1321,15 @@ Reasoning discovers new facts (inferred triples) from your ontology rules: --- -### Step 8: Explore Your Knowledge Graph +### Step 8: Explore Your Graph Viewer After sync, you can explore the triple store: #### Triples Grid Open **Triples** in the sidebar to browse the raw triple data in a sortable, searchable grid. -#### Knowledge Graph -Open **Knowledge Graph** in the sidebar to explore the knowledge graph interactively: +#### Graph Viewer +Open **Graph Viewer** in the sidebar to explore the graph viewer interactively: - **Find** specific entities by name, type, or URI — matching entities and their neighbors are highlighted - **Filter** by entity type, field, match type, and relationship depth - **Navigate** relationships — click an entity to see its attributes, values, and connected entities in the detail panel @@ -1347,8 +1347,8 @@ Open **Knowledge Graph** in the sidebar to explore the knowledge graph interacti | 3 | Domain > Metadata | Import table metadata from Unity Catalog | One click | | 4 | Ontology > Wizard | Generate ontology from metadata using LLM | One click | | 5 | Mapping > Auto-Map | Auto-map entities and relationships to SQL | One click | -| 6 | Digital Twin > Status | Synchronize to triple store | One click | -| 7 | Digital Twin > Quality | Run quality checks | One click | +| 6 | Knowledge Graph > Status | Synchronize to triple store | One click | +| 7 | Knowledge Graph > Quality | Run quality checks | One click | After the initial one-time configuration (steps 1–2), the entire pipeline from metadata to triple store is **four clicks**: Import Metadata, Generate, Auto-Map, Synchronize. @@ -1400,11 +1400,11 @@ Async endpoints return a `task_id`. Poll `GET /tasks/{task_id}/status` for progr ### Programmatic & MCP Access -After your knowledge graph is built, it can be queried programmatically: +After your graph viewer is built, it can be queried programmatically: -- **Digital Twin API** (`/api/v1/digitaltwin/`): Stateless REST endpoints for triple store status, entity search, ontology retrieval, and more. See [External API](api.md). +- **Knowledge Graph API** (`/api/v1/digitaltwin/`): Stateless REST endpoints for triple store status, entity search, ontology retrieval, and more. See [External API](api.md). - **GraphQL API** (`/graphql/{domain_name}`): Auto-generated typed schema with nested relationship traversal. See [External API](api.md#graphql-api). -- **MCP Server**: Expose your knowledge graph to the Databricks Playground and LLM clients. See [MCP Server](mcp.md). +- **MCP Server**: Expose your graph viewer to the Databricks Playground and LLM clients. See [MCP Server](mcp.md). --- diff --git a/src/agents/agent_dtwin_chat/__init__.py b/src/agents/agent_dtwin_chat/__init__.py index 68f67126..a22f2442 100644 --- a/src/agents/agent_dtwin_chat/__init__.py +++ b/src/agents/agent_dtwin_chat/__init__.py @@ -1,5 +1,5 @@ """ -Graph Chat Agent -- conversational agent for querying a Digital Twin +Graph Chat Agent -- conversational agent for querying a Knowledge Graph knowledge graph via natural language. Exports: diff --git a/src/agents/agent_dtwin_chat/engine.py b/src/agents/agent_dtwin_chat/engine.py index 385fe095..fbe632d3 100644 --- a/src/agents/agent_dtwin_chat/engine.py +++ b/src/agents/agent_dtwin_chat/engine.py @@ -51,7 +51,7 @@ class AgentResult: SYSTEM_PROMPT = """\ You are the Graph Chat assistant for OntoBricks. You help the user -explore a Digital Twin knowledge graph with natural-language questions. +explore a Knowledge Graph with natural-language questions. CONTEXT The user has already selected a domain (knowledge graph). You do NOT diff --git a/src/agents/agent_dtwin_chat/tools.py b/src/agents/agent_dtwin_chat/tools.py index ffce2588..155bf6bd 100644 --- a/src/agents/agent_dtwin_chat/tools.py +++ b/src/agents/agent_dtwin_chat/tools.py @@ -133,7 +133,7 @@ def tool_list_entity_types(ctx: ToolContext, **_kwargs) -> str: return data.get("message", "Could not retrieve statistics.") lines: list[str] = [] - lines.append(f"Knowledge Graph -- {ctx.dtwin_domain_name}") + lines.append(f"Graph Viewer -- {ctx.dtwin_domain_name}") lines.append("=" * 40) inferred = data.get("inferred_triples", 0) lines.append(f"Total triples: {data.get('total_triples', 0):,}") diff --git a/src/api/__init__.py b/src/api/__init__.py index 66aac503..e2dbd067 100644 --- a/src/api/__init__.py +++ b/src/api/__init__.py @@ -1,4 +1,4 @@ -"""External programmatic REST API (v1, Digital Twin, GraphQL). +"""External programmatic REST API (v1, Knowledge Graph, GraphQL). Mounted at ``api.constants.EXTERNAL_API_MOUNT_PREFIX`` by ``back.fastapi.main``. External HTTP routers live under ``api.routers`` (v1, digitaltwin, domains). Versioning diff --git a/src/api/constants.py b/src/api/constants.py index 1cac0f66..18e95798 100644 --- a/src/api/constants.py +++ b/src/api/constants.py @@ -80,8 +80,8 @@ "(OWL ontology, R2RML, generated Spark SQL).", }, { - "name": "Digital Twin", - "description": "**Digital Twin API** — Registry discovery, triple store " + "name": "Knowledge Graph", + "description": "**Knowledge Graph API** — Registry discovery, triple store " "status, build trigger, and triple retrieval.", }, { diff --git a/src/api/external_app.py b/src/api/external_app.py index 59782478..0065f533 100644 --- a/src/api/external_app.py +++ b/src/api/external_app.py @@ -52,7 +52,7 @@ def create_external_api_app() -> FastAPI: app.include_router(api_v1_router, prefix=API_V1_PREFIX, tags=["API v1"]) app.include_router(domains_router, prefix=API_V1_PREFIX, tags=["Domain"]) app.include_router( - dt_api_router, prefix=API_DIGITALTWIN_PREFIX, tags=["Digital Twin"] + dt_api_router, prefix=API_DIGITALTWIN_PREFIX, tags=["Knowledge Graph"] ) app.include_router(graphql_router, prefix=API_GRAPHQL_PREFIX, tags=["GraphQL"]) diff --git a/src/api/routers/digitaltwin.py b/src/api/routers/digitaltwin.py index 6df5aa64..33f45a61 100644 --- a/src/api/routers/digitaltwin.py +++ b/src/api/routers/digitaltwin.py @@ -1,5 +1,5 @@ """ -Digital Twin External REST API +Knowledge Graph External REST API Provides programmatic access to the triple store: status, insights, build trigger, and triple retrieval. @@ -328,7 +328,7 @@ async def dt_status( except Exception as e: logger.exception("dt_status failed: %s", e) raise InfrastructureError( - "Digital Twin status check failed", detail=str(e) + "Knowledge Graph status check failed", detail=str(e) ) from e @@ -432,7 +432,7 @@ async def dt_stats( @router.post( "/build", response_model=BuildStartedResponse, - summary="Start a Digital Twin build", + summary="Start a Knowledge Graph build", description="Generate all triples from the current ontology + mapping configuration " "and write them to the configured triple store backend. " "Returns a `task_id` that can be polled via `GET /build/{task_id}`.", @@ -502,7 +502,7 @@ async def dt_build( tm = get_task_manager() task = tm.create_task( - name="Digital Twin Build (API)", + name="Knowledge Graph Build (API)", task_type="triplestore_sync", steps=[ {"name": "prepare", "description": "Preparing"}, @@ -1119,7 +1119,7 @@ async def dt_inference_progress(task_id: str): # parameters used by the rest of this router. # # Why under ``/digitaltwin``: -# The cohort engine writes to the *digital twin's* knowledge graph (and +# The cohort engine writes to the *knowledge graph's* graph store (and # optionally a UC Delta table). Grouping the routes here keeps a single # resource path for everything that operates on the materialised twin — # ``status``, ``stats``, ``triples``, ``inference``, and now ``cohorts``. diff --git a/src/api/routers/internal/dtwin.py b/src/api/routers/internal/dtwin.py index 3a76ee51..65a78cdd 100644 --- a/src/api/routers/internal/dtwin.py +++ b/src/api/routers/internal/dtwin.py @@ -1,5 +1,5 @@ """ -Internal API -- Digital Twin / query JSON endpoints. +Internal API -- Knowledge Graph / query JSON endpoints. Moved from app/frontend/digitaltwin/routes.py during the front/back split. """ @@ -39,7 +39,7 @@ router = APIRouter(prefix="/dtwin", tags=["Query"]) # Canonical rdf:type predicate. Neighbour expansion must preserve type -# triples so the graph viewer can group/colour expanded nodes by their +# triples so the knowledge graph can group/colour expanded nodes by their # declared entity type rather than their raw identifier (issue #52). _RDF_TYPE_URI = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" @@ -60,7 +60,7 @@ def _filter_neighbor_triples( visited: set[str], limit: int, ) -> list[dict[str, str]]: - """Reduce raw store rows to the triples the graph viewer can render. + """Reduce raw store rows to the triples the knowledge graph can render. A triple is kept when its object is a literal, when its object URI is part of *visited* (so edges have both endpoints rendered), or when it is @@ -208,7 +208,7 @@ async def start_triplestore_sync( session_mgr: SessionManager = Depends(get_session_manager), settings: Settings = Depends(get_settings), ): - """Start async digital twin build: CREATE VIEW then populate the graph store. + """Start async knowledge graph build: CREATE VIEW then populate the graph store. Always performs a full rebuild. When the graph engine is ``lakebase`` in ``managed_synced`` mode, the Lakeflow pipeline handles the data-plane @@ -296,11 +296,11 @@ async def start_triplestore_sync( tm = get_task_manager() task = tm.create_task( - name="Digital Twin Build", + name="Knowledge Graph Build", task_type="triplestore_sync", steps=[ {"name": "prepare", "description": "Preparing mappings and generating queries"}, - {"name": "view", "description": "Creating the Digital Twin view"}, + {"name": "view", "description": "Creating the Knowledge Graph view"}, *_graph_steps, ], ) @@ -863,7 +863,7 @@ async def sync_info( session_mgr: SessionManager = Depends(get_session_manager), settings: Settings = Depends(get_settings), ): - """Return all data the Digital Twin Information page needs in one shot. + """Return all data the Knowledge Graph Information page needs in one shot. Graph status and artefact existence are served from the session cache when available (populated after each successful build). On a cache miss @@ -942,7 +942,7 @@ async def _graph_status(): # =========================================== -# Digital Twin Existence Checks +# Knowledge Graph Existence Checks # =========================================== @@ -951,7 +951,7 @@ async def dt_existence( session_mgr: SessionManager = Depends(get_session_manager), settings: Settings = Depends(get_settings), ): - """Check existence of each Digital Twin artefact. + """Check existence of each Knowledge Graph artefact. Always probes Databricks/Lakebase live so the result reflects the current state (the session cache can carry a stale ``False`` from a transient @@ -2113,7 +2113,7 @@ async def dtwin_neighbors( """Expand *uri* by ``depth`` BFS hops and return the induced subgraph triples. - Used by the graph viewer's right-click "Expand neighbours" action to + Used by the knowledge graph's right-click "Expand neighbours" action to enrich the displayed graph with one or more hops of related entities. Only triples whose object is a literal *or* whose object is a URI also present in the visited set are returned, so the front-end can render diff --git a/src/api/routers/internal/home.py b/src/api/routers/internal/home.py index df505885..2d4d400c 100644 --- a/src/api/routers/internal/home.py +++ b/src/api/routers/internal/home.py @@ -73,7 +73,7 @@ async def validate_detailed( session_mgr: SessionManager = Depends(get_session_manager), settings: Settings = Depends(get_settings), ): - """Get detailed validation status including Digital Twin and warehouse.""" + """Get detailed validation status including Knowledge Graph and warehouse.""" domain = get_domain(session_mgr) warehouse_id = resolve_warehouse_id(domain, settings) return await home_service.get_detailed_validation( diff --git a/src/back/core/databricks/SQLWarehouse.py b/src/back/core/databricks/SQLWarehouse.py index 6ff53c2f..9ac9bbfa 100644 --- a/src/back/core/databricks/SQLWarehouse.py +++ b/src/back/core/databricks/SQLWarehouse.py @@ -150,7 +150,7 @@ def iter_rows( ) -> Iterator[Dict[str, Any]]: """Stream *query* results as dict rows in fixed-size ``fetchmany`` batches. - Used by the Digital Twin build pipeline to keep large result sets + Used by the Knowledge Graph build pipeline to keep large result sets (full graph rebuild, EXCEPT diffs) from being materialized in the FastAPI process: the cursor stays open on the warehouse side and the app yields one batch at a time. diff --git a/src/back/core/graphdb/lakebase/provisioner.py b/src/back/core/graphdb/lakebase/provisioner.py index fcde5257..519d9e07 100644 --- a/src/back/core/graphdb/lakebase/provisioner.py +++ b/src/back/core/graphdb/lakebase/provisioner.py @@ -13,7 +13,7 @@ The whole flow runs in a worker thread and reports progress through the shared :class:`~back.core.task_manager.TaskManager`, so the UI can poll -``GET /tasks/{id}`` exactly like the Digital Twin build. +``GET /tasks/{id}`` exactly like the Knowledge Graph build. Permission model (unchanged from the scripts -- only automated): diff --git a/src/back/core/w3c/shacl/SHACLService.py b/src/back/core/w3c/shacl/SHACLService.py index c3f92e4d..995c8ae8 100644 --- a/src/back/core/w3c/shacl/SHACLService.py +++ b/src/back/core/w3c/shacl/SHACLService.py @@ -873,7 +873,7 @@ def _add(shape: Dict) -> None: return suggestions # ------------------------------------------------------------------ - # SHACL-to-SQL translation (for Digital Twin execution) + # SHACL-to-SQL translation (for Knowledge Graph execution) # ------------------------------------------------------------------ @staticmethod diff --git a/src/back/fastapi/graphql_routes.py b/src/back/fastapi/graphql_routes.py index d892b083..04b56a9e 100644 --- a/src/back/fastapi/graphql_routes.py +++ b/src/back/fastapi/graphql_routes.py @@ -122,7 +122,7 @@ def _load_domain_from_registry(domain_name, session_mgr, settings, *, external=F # If the user already has this registry folder open at a chosen version, # keep it. Otherwise GraphQL would resolve to the latest PUBLISHED # version — often an older v3 while the user is on v4 — and would open - # the wrong graph store snapshot for subsequent Digital Twin / + # the wrong graph store snapshot for subsequent Knowledge Graph / # data-quality calls. session_folder = (getattr(domain, "domain_folder", None) or "").strip() session_ver = (getattr(domain, "current_version", None) or "").strip() diff --git a/src/back/objects/__init__.py b/src/back/objects/__init__.py index ec7ae1a5..6626053e 100644 --- a/src/back/objects/__init__.py +++ b/src/back/objects/__init__.py @@ -1,4 +1,4 @@ -"""Application domain objects: session state, ontology, mapping, digital twin, Unity Catalog registry, HTTP session.""" +"""Application domain objects: session state, ontology, mapping, knowledge graph, Unity Catalog registry, HTTP session.""" from back.objects.ontology import Ontology from back.objects.mapping import Mapping diff --git a/src/back/objects/digitaltwin/DigitalTwin.py b/src/back/objects/digitaltwin/DigitalTwin.py index 67869913..550b5694 100644 --- a/src/back/objects/digitaltwin/DigitalTwin.py +++ b/src/back/objects/digitaltwin/DigitalTwin.py @@ -825,7 +825,7 @@ def sync_last_build_from_schedule(self, settings) -> None: logger.debug("sync_last_build_from_schedule: %s", exc) # ------------------------------------------------------------------ - # Live Digital Twin status (instance methods) + # Live Knowledge Graph status (instance methods) # ------------------------------------------------------------------ async def fetch_graph_triplestore_status(self, settings) -> Dict[str, Any]: @@ -2465,7 +2465,7 @@ def run_build_task( *, build_kind: str = "session", ) -> None: - """Execute Digital Twin build/sync in a worker thread (TaskManager progress). + """Execute Knowledge Graph build/sync in a worker thread (TaskManager progress). ``build_kind``: * ``"session"`` — UI/internal build (diagnostics, progress callbacks, @@ -3094,7 +3094,7 @@ def compute_dtwin_indicator( ts_status: Dict[str, Any], dt_exist: Dict[str, Any], ) -> Dict[str, Any]: - """Derive a three-state Digital Twin indicator from live graph and artefact checks. + """Derive a three-state Knowledge Graph indicator from live graph and artefact checks. Returns a dict with: indicator: ``'green'`` | ``'orange'`` | ``'red'`` @@ -3106,13 +3106,13 @@ def compute_dtwin_indicator( if not domain.last_build: return { "indicator": "red", - "title": "Digital Twin never built", + "title": "Knowledge Graph never built", "count": 0, "pending": False, } return { "indicator": "orange", - "title": "Digital Twin status not yet checked", + "title": "Knowledge Graph status not yet checked", "count": 0, "pending": True, } @@ -3127,7 +3127,7 @@ def compute_dtwin_indicator( if graph_loaded and view_exists is not False: return { "indicator": "green", - "title": f"Digital Twin active — {count:,} triples", + "title": f"Knowledge Graph active — {count:,} triples", "count": count, "pending": False, } @@ -3139,7 +3139,7 @@ def compute_dtwin_indicator( ): return { "indicator": "red", - "title": "Digital Twin never built", + "title": "Knowledge Graph never built", "count": 0, "pending": False, } @@ -3150,9 +3150,9 @@ def compute_dtwin_indicator( if not graph_loaded: parts.append("graph not loaded") title = ( - "Digital Twin incomplete — " + ", ".join(parts) + "Knowledge Graph incomplete — " + ", ".join(parts) if parts - else "Digital Twin partially available" + else "Knowledge Graph partially available" ) return {"indicator": "orange", "title": title, "count": count, "pending": False} diff --git a/src/back/objects/digitaltwin/_build_pipeline.py b/src/back/objects/digitaltwin/_build_pipeline.py index f63fd7cd..347ce091 100644 --- a/src/back/objects/digitaltwin/_build_pipeline.py +++ b/src/back/objects/digitaltwin/_build_pipeline.py @@ -1,4 +1,4 @@ -"""Internal helper that drives a single Digital Twin build. +"""Internal helper that drives a single Knowledge Graph build. Extracted from :class:`back.objects.digitaltwin.DigitalTwin.run_build_task` (formerly an 839-line method) to make each phase — prepare → view → @@ -155,7 +155,7 @@ def step_times_from_task(task) -> Dict[str, float]: class _BuildPipeline: - """One run of the Digital Twin build/sync pipeline. + """One run of the Knowledge Graph build/sync pipeline. Constructed once per build with the same arguments as the legacy :meth:`DigitalTwin.run_build_task`. Call :meth:`run` to execute the @@ -571,7 +571,7 @@ def _announce_apply_step(self) -> None: apply_msg = ( "Applying changes to graph..." if self.is_api - else "Applying changes to the knowledge graph..." + else "Applying changes to the graph viewer..." ) self.tm.advance_step(self.task_id, apply_msg) @@ -1027,7 +1027,7 @@ def _on_sync_state(pipeline_state: str) -> None: ) return False - _adv() # → "Creating knowledge graph union view" + _adv() # → "Creating graph viewer union view" # Step 6 — create/refresh the union view. t_step = time.time() @@ -1071,7 +1071,7 @@ def _on_sync_state(pipeline_state: str) -> None: ) return False - _adv() # → "Finalizing knowledge graph" + _adv() # → "Finalizing graph viewer" # Step 7 — truncate companion for a clean reasoning slate. t_step = time.time() diff --git a/src/back/objects/digitaltwin/constants.py b/src/back/objects/digitaltwin/constants.py index 35c9d7c4..ac65872c 100644 --- a/src/back/objects/digitaltwin/constants.py +++ b/src/back/objects/digitaltwin/constants.py @@ -1,3 +1,3 @@ -"""Shared constants for the digital twin domain.""" +"""Shared constants for the knowledge graph domain.""" from back.core.triplestore.constants import RDF_TYPE, RDFS_LABEL # noqa: F401 diff --git a/src/back/objects/digitaltwin/models.py b/src/back/objects/digitaltwin/models.py index ae77d23f..832f2b24 100644 --- a/src/back/objects/digitaltwin/models.py +++ b/src/back/objects/digitaltwin/models.py @@ -1,4 +1,4 @@ -"""Data-transfer objects for the digital twin domain.""" +"""Data-transfer objects for the knowledge graph domain.""" from __future__ import annotations diff --git a/src/back/objects/domain/HomeService.py b/src/back/objects/domain/HomeService.py index fdb0eb22..3ae7d3e5 100644 --- a/src/back/objects/domain/HomeService.py +++ b/src/back/objects/domain/HomeService.py @@ -250,7 +250,7 @@ async def get_detailed_validation( ) -> Dict[str, Any]: """Get detailed validation status. - Digital Twin graph status and artefact existence are served from the + Knowledge Graph graph status and artefact existence are served from the session cache when available (populated after each successful build). On a cache miss the values are fetched live and then cached. @@ -423,7 +423,7 @@ async def get_detailed_validation( "unmapped_entities": unmapped_entities, "unmapped_relationships": unmapped_relationships, "unmapped_attributes": unmapped_attributes, - # Digital Twin status (summary + detail) + # Knowledge Graph status (summary + detail) "dtwin": dtwin_detail, # Warehouse status "warehouse": {"warehouse_id": warehouse_id}, @@ -454,7 +454,7 @@ def _compute_dtwin_indicator( ts_status: Dict[str, Any], dt_exist: Dict[str, Any], ) -> Dict[str, Any]: - """Derive a three-state Digital Twin indicator. + """Derive a three-state Knowledge Graph indicator. Delegates to :meth:`DigitalTwin.compute_dtwin_indicator`. """ @@ -472,7 +472,7 @@ async def get_navbar_state( The navbar only displays domain identity, SQL Warehouse status, and the (optionally customised) brand logo, so this intentionally - skips the expensive Digital Twin and validation I/O that used to + skips the expensive Knowledge Graph and validation I/O that used to run here. Those checks are available on the validation page (``/validate/detailed``) and the DT Sync page (``/dtwin/sync/info``). diff --git a/src/back/objects/domain/SettingsService.py b/src/back/objects/domain/SettingsService.py index 5790bba5..42194248 100644 --- a/src/back/objects/domain/SettingsService.py +++ b/src/back/objects/domain/SettingsService.py @@ -1419,7 +1419,7 @@ def graph_engine_lakebase_health_result( else: out["message"] = ( f"Connected to graph database {graph_db!r}, but schema {schema!r} " - "does not exist yet — run a Digital Twin build or create the schema. " + "does not exist yet — run a Knowledge Graph build or create the schema. " f"Registry database: {registry_db!r}." ) return out diff --git a/src/back/objects/registry/ReviewService.py b/src/back/objects/registry/ReviewService.py index 1bd12c2b..57bef9e2 100644 --- a/src/back/objects/registry/ReviewService.py +++ b/src/back/objects/registry/ReviewService.py @@ -217,7 +217,7 @@ def review_detail( "" if last_build else "This version has never been built. " - "Run a Digital Twin build first." + "Run a Knowledge Graph build first." ), "can_approve": ( status == STATUS_IN_REVIEW and is_member and not already @@ -354,7 +354,7 @@ def submit( if not last_build: raise ValidationError( "Cannot submit for review: this version has never been " - "built. Run a Digital Twin build first." + "built. Run a Knowledge Graph build first." ) ReviewService._set_status( diff --git a/src/back/objects/registry/scheduler.py b/src/back/objects/registry/scheduler.py index 730714fe..f9796c83 100644 --- a/src/back/objects/registry/scheduler.py +++ b/src/back/objects/registry/scheduler.py @@ -1204,7 +1204,7 @@ def _run_scheduled_build( registry_cfg: Optional[Dict[str, str]] = None, version: str = "latest", ) -> None: - """Execute a Digital Twin build for *domain_name* without a user session. + """Execute a Knowledge Graph build for *domain_name* without a user session. Loads the domain from the registry, generates SQL from R2RML, creates the VIEW, and populates the graph store (full rebuild every run). diff --git a/src/back/objects/registry/store/base.py b/src/back/objects/registry/store/base.py index dc654d4e..d2ae61ad 100644 --- a/src/back/objects/registry/store/base.py +++ b/src/back/objects/registry/store/base.py @@ -61,7 +61,7 @@ class ScheduleHistoryEntry(TypedDict, total=False): class BuildRunEntry(TypedDict, total=False): """One row in a domain's build-run trace (``build_runs`` table). - Captures the full statistics of a single Digital Twin build, + Captures the full statistics of a single Knowledge Graph build, regardless of which path triggered it (``session`` / ``api`` / ``scheduled``). The grain is the tuple ``(folder, version)``; many entries per tuple are expected and the most recent successful one @@ -288,7 +288,7 @@ def append_schedule_history( # ------------------------------------------------------------------ # Build-run trace (analytics) # - # One immutable row per Digital Twin build — across every path + # One immutable row per Knowledge Graph build — across every path # (UI session / external API / scheduler). Linked to the domain # row; grain is the tuple ``(folder, version)``. Unlike # ``schedule_runs`` this is *not* capped — the whole point is a diff --git a/src/back/objects/registry/store/lakebase/schema.sql b/src/back/objects/registry/store/lakebase/schema.sql index b1ccd134..78a1e934 100644 --- a/src/back/objects/registry/store/lakebase/schema.sql +++ b/src/back/objects/registry/store/lakebase/schema.sql @@ -143,7 +143,7 @@ CREATE INDEX IF NOT EXISTS idx_schedule_runs_domain ON schedule_runs(registry_id, domain_name, run_ts DESC); -- ---------------------------------------------------------------- --- Build-run trace (one immutable row per Digital Twin build, all +-- Build-run trace (one immutable row per Knowledge Graph build, all -- paths: UI session / external API / scheduler). Linked to the -- domain row; grain is the tuple (domain_id, version). Many rows per -- tuple are expected — the "active" build for a (domain, version) is diff --git a/src/back/objects/registry/store/lakebase/store.py b/src/back/objects/registry/store/lakebase/store.py index 43fa4eae..ff2ded28 100644 --- a/src/back/objects/registry/store/lakebase/store.py +++ b/src/back/objects/registry/store/lakebase/store.py @@ -11,7 +11,7 @@ - ``schedules`` — one row per scheduled domain - ``schedule_runs`` — append-only, capped per domain - ``build_runs`` — append-only build-run trace, one row per - Digital Twin build (all paths), keyed by + Knowledge Graph build (all paths), keyed by ``(domain_id, version)`` Authentication: diff --git a/src/back/objects/registry/version_lifecycle.py b/src/back/objects/registry/version_lifecycle.py index 06204b50..59d30a93 100644 --- a/src/back/objects/registry/version_lifecycle.py +++ b/src/back/objects/registry/version_lifecycle.py @@ -104,5 +104,5 @@ def check_status_transition( if (current, new) == (STATUS_DRAFT, STATUS_IN_REVIEW) and not last_build: raise ValidationError( "Cannot submit for review: this version has never been built. " - "Run a Digital Twin build first." + "Run a Knowledge Graph build first." ) diff --git a/src/back/objects/session/DomainSession.py b/src/back/objects/session/DomainSession.py index 1881cb08..638926e1 100644 --- a/src/back/objects/session/DomainSession.py +++ b/src/back/objects/session/DomainSession.py @@ -869,7 +869,7 @@ def last_update(self, value: str): @property def last_build(self) -> str: - """ISO timestamp of the last successful Digital Twin build.""" + """ISO timestamp of the last successful Knowledge Graph build.""" return self._data["domain"].get("last_build", "") @last_build.setter diff --git a/src/front/config/menu_config.json b/src/front/config/menu_config.json index 8e602b5d..33a49a28 100644 --- a/src/front/config/menu_config.json +++ b/src/front/config/menu_config.json @@ -579,7 +579,7 @@ { "id": "digitaltwin", - "label": "Digital Twin", + "label": "Knowledge Graph", "icon": "bi-box", "route": "/dtwin/", "requires_domain_saved": true, @@ -607,7 +607,7 @@ "items": [ { "id": "sigmagraph", - "label": "Knowledge Graph", + "label": "Graph Viewer", "icon": "bi-layers-half", "default": true, "requires": null diff --git a/src/front/routes/dtwin.py b/src/front/routes/dtwin.py index 5f4d3655..04b91610 100644 --- a/src/front/routes/dtwin.py +++ b/src/front/routes/dtwin.py @@ -1,4 +1,4 @@ -"""Frontend HTML route -- Digital Twin / Query page.""" +"""Frontend HTML route -- Knowledge Graph / Query page.""" from fastapi import APIRouter, Request, Depends from fastapi.responses import HTMLResponse diff --git a/src/front/routes/resolve.py b/src/front/routes/resolve.py index b3226b94..891642cd 100644 --- a/src/front/routes/resolve.py +++ b/src/front/routes/resolve.py @@ -1,11 +1,11 @@ """Frontend HTML route -- Entity URI resolution. Accepts an ontology entity URI (path-based or query-param) and redirects -to the Knowledge Graph visualization with the entity focused. +to the Graph Viewer visualization with the entity focused. When no explicit ``domain`` query-parameter is supplied the route inspects the URI against all registry domains' base URIs and -automatically selects the owning domain so the Knowledge Graph page +automatically selects the owning domain so the Graph Viewer page can load the correct graph. Cross-domain bridges are handled server-side: the target domain is diff --git a/src/front/static/config/js/build-analytics.js b/src/front/static/config/js/build-analytics.js index c8e8c0e2..257c2e71 100644 --- a/src/front/static/config/js/build-analytics.js +++ b/src/front/static/config/js/build-analytics.js @@ -1,7 +1,7 @@ /* * Registry → Build Analytics. * - * Renders the per-domain Digital Twin build-run trace stored in the + * Renders the per-domain Knowledge Graph build-run trace stored in the * registry ``build_runs`` table: summary cards plus a full runs table * (newest-first). The most recent successful run for the selected * (domain, version) is flagged as the "active" build. diff --git a/src/front/static/config/js/schedule.js b/src/front/static/config/js/schedule.js index f8e879c6..f957526b 100644 --- a/src/front/static/config/js/schedule.js +++ b/src/front/static/config/js/schedule.js @@ -1,6 +1,6 @@ /** * OntoBricks - schedule.js - * Unified Schedule tab: CRUD for both per-domain Digital Twin builds + * Unified Schedule tab: CRUD for both per-domain Knowledge Graph builds * and per-(domain, rule) cohort materialisations. The type pill in the * table and the "Type" radio group in the modal route each action to * the right backend endpoint: diff --git a/src/front/static/domain/css/domain-validation.css b/src/front/static/domain/css/domain-validation.css index b53903d6..1ede4d0d 100644 --- a/src/front/static/domain/css/domain-validation.css +++ b/src/front/static/domain/css/domain-validation.css @@ -215,7 +215,7 @@ transition: all 0.3s ease; } -/* ── Digital Twin architecture diagram ────────── */ +/* ── Knowledge Graph architecture diagram ────────── */ .dt-arch-diagram { display: flex; align-items: stretch; diff --git a/src/front/static/domain/js/domain-review.js b/src/front/static/domain/js/domain-review.js index e1137acc..da64fc07 100644 --- a/src/front/static/domain/js/domain-review.js +++ b/src/front/static/domain/js/domain-review.js @@ -301,7 +301,7 @@ checkRow('Ontology valid', !!d.ontology_valid) + checkRow('Mapping complete', !!d.mapping_valid) + checkRow('SQL Warehouse configured', !!warehouse.warehouse_id) + - checkRow('Digital Twin built', dtwin.indicator === 'green', + checkRow('Knowledge Graph built', dtwin.indicator === 'green', dtwin.indicator === 'orange'); } catch (err) { el.innerHTML = '<div class="text-muted small">Readiness unavailable.</div>'; diff --git a/src/front/static/domain/js/domain-validation.js b/src/front/static/domain/js/domain-validation.js index 66e0d34f..8d4a2bf9 100644 --- a/src/front/static/domain/js/domain-validation.js +++ b/src/front/static/domain/js/domain-validation.js @@ -100,7 +100,7 @@ function updateHealthBanner(data) { if (ready && dtwin.indicator === 'green' && hasWarehouse) { banner.className = 'validation-health-banner health-ready mb-4'; banner.innerHTML = '<i class="bi bi-check-circle-fill health-icon"></i>' + - '<div><strong>Domain fully operational</strong> — Ontology, Mapping, Warehouse and Digital Twin are all healthy.</div>'; + '<div><strong>Domain fully operational</strong> — Ontology, Mapping, Warehouse and Knowledge Graph are all healthy.</div>'; return; } @@ -108,8 +108,8 @@ function updateHealthBanner(data) { if (!hasWarehouse) issues.push('SQL Warehouse not configured'); if (!data.ontology_valid) issues.push('Ontology invalid'); if (!data.mapping_valid) issues.push('Mapping incomplete'); - if (dtwin.indicator === 'red') issues.push('Digital Twin not built'); - else if (dtwin.indicator === 'orange') issues.push('Digital Twin partially ready'); + if (dtwin.indicator === 'red') issues.push('Knowledge Graph not built'); + else if (dtwin.indicator === 'orange') issues.push('Knowledge Graph partially ready'); if (!data.ontology_valid || !data.mapping_valid || !hasWarehouse) { banner.className = 'validation-health-banner health-error mb-4'; @@ -397,7 +397,7 @@ function updateMappingCard(data) { : ''; } -/* ── Digital Twin detail card ─────────────────── */ +/* ── Knowledge Graph detail card ─────────────────── */ /** Reusable existence badge (same pattern as query-sync.js _badge) */ function _dtBadge(flag, okText, failText, unknownText) { diff --git a/src/front/static/global/css/main.css b/src/front/static/global/css/main.css index 8a745f1d..46f3e04f 100644 --- a/src/front/static/global/css/main.css +++ b/src/front/static/global/css/main.css @@ -312,7 +312,7 @@ body { margin-top: 1rem; } -/* Process chevron separators between Project > Ontology > Mapping > Digital Twin */ +/* Process chevron separators between Project > Ontology > Mapping > Knowledge Graph */ .navbar .nav-chevron { display: flex; align-items: stretch; diff --git a/src/front/static/global/css/permissions.css b/src/front/static/global/css/permissions.css index e3ee9b2a..399b3277 100644 --- a/src/front/static/global/css/permissions.css +++ b/src/front/static/global/css/permissions.css @@ -114,7 +114,7 @@ body[data-domain-role="editor"] [data-requires="editor"] { sync action, which is otherwise builder-gated rather than version-gated. ========================================================================== */ -/* --- Digital Twin Build/sync: blocked unless the version is DRAFT. */ +/* --- Knowledge Graph Build/sync: blocked unless the version is DRAFT. */ body.read-only-status #syncStartBtn, body.read-only-status [data-sync-action="start-triple-store-sync"] { pointer-events: none !important; @@ -200,7 +200,7 @@ body:is(.read-only-version, .role-viewer) #menuSaveDomain { /* --- Cohorts: a read-only domain blocks creating, editing and materialising cohort rules. Unlike most write surfaces these gates - must also fire on the Digital Twin run page (which is otherwise + must also fire on the Knowledge Graph run page (which is otherwise exempt from the generic form-field rule below), because the Materialise / Configure-outputs actions persist into the domain. The saved-rules picker and the read-only Preview / Trace / Explain @@ -261,7 +261,7 @@ body:is(.read-only-version, .role-viewer) .view-mode-hidden { Any future "navigation" select / input should be added here rather than to a per-page override. - The Digital Twin page (``body[data-page="digitaltwin"]``) is excluded + The Knowledge Graph page (``body[data-page="digitaltwin"]``) is excluded wholesale: it is a read / analysis surface (SPARQL/insights, graph exploration + filter/search, data quality, reasoning, cohort discovery) that never edits the domain *design*. Its filter controls diff --git a/src/front/static/global/css/sidebar-layout.css b/src/front/static/global/css/sidebar-layout.css index 47ca9996..85185063 100644 --- a/src/front/static/global/css/sidebar-layout.css +++ b/src/front/static/global/css/sidebar-layout.css @@ -248,7 +248,7 @@ body.full-width-layout { } /* ========================================================================== - Knowledge Graph Sections - No scroll, full height + Graph Viewer Sections - No scroll, full height ========================================================================== */ .sidebar-content:has(#sigmagraph-section.active), .sidebar-content:has(#graphql-section.active), diff --git a/src/front/static/global/js/breadcrumb.js b/src/front/static/global/js/breadcrumb.js index ad83d909..65732c3d 100644 --- a/src/front/static/global/js/breadcrumb.js +++ b/src/front/static/global/js/breadcrumb.js @@ -11,7 +11,7 @@ const Breadcrumb = { '/domain/': { label: 'Domain', icon: 'bi-folder2' }, '/ontology/': { label: 'Ontology', icon: 'bi-bezier2' }, '/mapping/': { label: 'Mapping', icon: 'bi-shuffle' }, - '/dtwin/': { label: 'Digital Twin', icon: 'bi-box-fill' }, + '/dtwin/': { label: 'Knowledge Graph', icon: 'bi-box-fill' }, '/settings': { label: 'Settings', icon: 'bi-gear-fill' }, }, diff --git a/src/front/static/global/js/comments-panel.js b/src/front/static/global/js/comments-panel.js index cbb0731b..76c10cfd 100644 --- a/src/front/static/global/js/comments-panel.js +++ b/src/front/static/global/js/comments-panel.js @@ -588,7 +588,7 @@ /** * Build the comment tag vocabulary ({type, ref, label}[]) from an * ontology config ({ classes, properties }). Shared by every surface - * (ontology designer, mapping, digital twin) so the entity/relationship + * (ontology designer, mapping, graph viewer) so the entity/relationship * tag picker is built identically everywhere. */ function taggableFromOntology(config) { diff --git a/src/front/static/global/js/navbar.js b/src/front/static/global/js/navbar.js index ce77f682..fa271b9f 100644 --- a/src/front/static/global/js/navbar.js +++ b/src/front/static/global/js/navbar.js @@ -70,7 +70,7 @@ window.applyBrandLogo = applyBrandLogo; /** - * Refresh all three workflow indicators (Ontology, Mapping, Digital Twin) + * Refresh all three workflow indicators (Ontology, Mapping, Knowledge Graph) * in the top navbar. Call this single function after any change that could * affect one or more of these statuses. * diff --git a/src/front/static/global/js/ontology-design.js b/src/front/static/global/js/ontology-design.js index ef64be12..b8cb2eb4 100644 --- a/src/front/static/global/js/ontology-design.js +++ b/src/front/static/global/js/ontology-design.js @@ -1905,7 +1905,7 @@ async function loadOntologyIntoDesigner(showAlert = true) { } /** - * Create a Knowledge Graph group from the current business view's entities. + * Create a Graph Viewer group from the current business view's entities. */ function createGroupFromView() { if (window.isActiveVersion === false) return; diff --git a/src/front/static/query/css/query-api.css b/src/front/static/query/css/query-api.css index 6c0c9d47..147a5d2a 100644 --- a/src/front/static/query/css/query-api.css +++ b/src/front/static/query/css/query-api.css @@ -1,4 +1,4 @@ -/* Digital Twin API card styles */ +/* Knowledge Graph API card styles */ .ob-api-card { border-color: #e2e8f0; } .ob-api-card .card-header { diff --git a/src/front/static/query/css/query-chat.css b/src/front/static/query/css/query-chat.css index 68b63863..c3913e38 100644 --- a/src/front/static/query/css/query-chat.css +++ b/src/front/static/query/css/query-chat.css @@ -1,5 +1,5 @@ /* ===================================================== - Graph Chat — embedded chat panel inside the Digital Twin page. + Graph Chat — embedded chat panel inside the Knowledge Graph page. Self-contained stylesheet. Do NOT rely on ontology-assistant.css: that file is only loaded on the ontology page. Everything needed diff --git a/src/front/static/query/css/query-dataquality.css b/src/front/static/query/css/query-dataquality.css index db48e8e3..a9c73430 100644 --- a/src/front/static/query/css/query-dataquality.css +++ b/src/front/static/query/css/query-dataquality.css @@ -1,4 +1,4 @@ -/* Data Quality execution — Digital Twin module styles */ +/* Data Quality execution — Knowledge Graph module styles */ #dataquality-section.active { min-height: 0; diff --git a/src/front/static/query/css/query-sigmagraph.css b/src/front/static/query/css/query-sigmagraph.css index e6b722b2..4a55b490 100644 --- a/src/front/static/query/css/query-sigmagraph.css +++ b/src/front/static/query/css/query-sigmagraph.css @@ -1,6 +1,6 @@ /** * OntoBricks - query-sigmagraph.css - * Sigma.js Knowledge Graph view layout + * Sigma.js Graph Viewer view layout */ /* Strip padding from the sidebar-content wrapper so the graph fills it edge-to-edge */ diff --git a/src/front/static/query/css/query-sync.css b/src/front/static/query/css/query-sync.css index f4b760be..4e75838b 100644 --- a/src/front/static/query/css/query-sync.css +++ b/src/front/static/query/css/query-sync.css @@ -1,6 +1,6 @@ /** * OntoBricks — query-sync.css - * Triple store / Digital Twin build (sync) section — extracted from _query_sync.html + * Triple store / Knowledge Graph build (sync) section — extracted from _query_sync.html */ #sync-section .sync-content-section { @@ -44,7 +44,7 @@ /* Readiness tiles now use shared .ob-kpi-tile from components.css */ /* ===================================================================== - * Building Digital Twin — live build log card + * Building Knowledge Graph — live build log card * ===================================================================== */ #syncBuildLogCard .sync-build-log { @@ -122,7 +122,7 @@ padding-left: 8px; } -/* ── Digital Twin architecture diagram ────────── */ +/* ── Knowledge Graph architecture diagram ────────── */ .dt-arch-diagram { display: flex; align-items: stretch; diff --git a/src/front/static/query/css/query-visualization.css b/src/front/static/query/css/query-visualization.css index cae7a85d..09f2b81d 100644 --- a/src/front/static/query/css/query-visualization.css +++ b/src/front/static/query/css/query-visualization.css @@ -1,6 +1,6 @@ /** * OntoBricks - query-visualization.css - * Shared styles used by Knowledge Graph detail panels, filter panes, and entity views + * Shared styles used by Graph Viewer detail panels, filter panes, and entity views */ /* Graph Wrapper (contains graph + filter pane vertically) */ diff --git a/src/front/static/query/js/query-api.js b/src/front/static/query/js/query-api.js index 4216cc98..a3633263 100644 --- a/src/front/static/query/js/query-api.js +++ b/src/front/static/query/js/query-api.js @@ -1,5 +1,5 @@ /** - * Digital Twin API documentation page logic. + * Knowledge Graph API documentation page logic. * * - Detects the base URL from the current window location * - Wires the "Try it" buttons to fetch live data from GET endpoints diff --git a/src/front/static/query/js/query-chat.js b/src/front/static/query/js/query-chat.js index 367c7ed2..6fa7fec9 100644 --- a/src/front/static/query/js/query-chat.js +++ b/src/front/static/query/js/query-chat.js @@ -4,7 +4,7 @@ * * Re-uses the .assistant-* DOM class family for bubbles / thinking / * input styling (see /static/ontology/css/ontology-assistant.css), but - * runs embedded inside the Digital Twin sidebar section -- no floating + * runs embedded inside the Knowledge Graph sidebar section -- no floating * popup, no FAB. * * Talks to POST /dtwin/assistant/chat which drives the @@ -88,7 +88,7 @@ a.classList.add('graph-chat-entity-link'); a.setAttribute( 'title', - 'Open in the Knowledge Graph viewer' + 'Open in the Graph Viewer viewer' ); a.setAttribute('target', '_self'); a.setAttribute('rel', 'noopener'); diff --git a/src/front/static/query/js/query-cohorts.js b/src/front/static/query/js/query-cohorts.js index edf92a6a..ef204e6a 100644 --- a/src/front/static/query/js/query-cohorts.js +++ b/src/front/static/query/js/query-cohorts.js @@ -188,7 +188,7 @@ const CohortModule = { if (empty) list.appendChild(empty); return; } - // Edit link is shown only on the run page (Digital Twin → Cohorts): + // Edit link is shown only on the run page (Knowledge Graph → Cohorts): // the design page is itself the editor, so an extra link there would // just reload the same view. const onRunPage = !document.getElementById('cohortRuleLabel'); @@ -286,7 +286,7 @@ const CohortModule = { /** * Render a compact read-only summary of the active rule. * - * Only used on the Digital Twin run page (#cohortRuleSummary lives + * Only used on the Knowledge Graph run page (#cohortRuleSummary lives * there). On the design page this is a no-op. */ _renderRuleSummary() { @@ -350,7 +350,7 @@ const CohortModule = { _hydrateForm() { // Build-form fields only exist on the Ontology design page. - // The Digital Twin run page has no form — skip per-field updates + // The Knowledge Graph run page has no form — skip per-field updates // there but still render the rule summary + saved rules list. const setVal = (id, v) => { const el = document.getElementById(id); if (el) el.value = v; }; const setText = (id, v) => { const el = document.getElementById(id); if (el) el.textContent = v; }; @@ -446,7 +446,7 @@ const CohortModule = { _collectFromForm() { // Only the design page (Ontology > Cohorts) has the build form. - // Run page (Digital Twin > Cohorts) is read-only — bail without + // Run page (Knowledge Graph > Cohorts) is read-only — bail without // touching ``this.rule`` so the loaded saved rule isn't corrupted. if (!document.getElementById('cohortRuleLabel')) return; if (!this.rule) this.rule = {}; @@ -1172,14 +1172,14 @@ const CohortModule = { // same deep-link pattern Domain.py mints for cross-domain entity // resolution and `query.js` uses for the bridge flow. We do an // in-page navigation (no ``target="_blank"``) so the user stays - // inside the Digital Twin shell rather than spawning a tab. + // inside the Knowledge Graph shell rather than spawning a tab. const graphHref = uri ? `/dtwin/?section=sigmagraph&focus=${encodeURIComponent(uri)}` : ''; const badge = graphHref ? `<a class="cohort-preview-member-badge" href="${this._esc(graphHref)}" - title="Open ${this._esc(headline)} in the knowledge graph"> + title="Open ${this._esc(headline)} in the graph viewer"> <i class="bi bi-diagram-3 me-1"></i>${this._esc(headline)} <i class="bi bi-arrow-right-short ms-1 cohort-preview-member-badge-arrow"></i> </a>` @@ -1534,7 +1534,7 @@ const CohortModule = { } bootstrap.Modal.getInstance(document.getElementById('cohortOutputsModal')).hide(); - // Outputs is configured from the Digital Twin run page where there is + // Outputs is configured from the Knowledge Graph run page where there is // no Save-rule button — persist the change to the registry directly so // it survives reloads. On the design page (with the Save form) we just // mark dirty; the user persists everything together via Save rule. diff --git a/src/front/static/query/js/query-dataquality.js b/src/front/static/query/js/query-dataquality.js index cba367e6..1e3c2fb0 100644 --- a/src/front/static/query/js/query-dataquality.js +++ b/src/front/static/query/js/query-dataquality.js @@ -1,6 +1,6 @@ /** * OntoBricks — query-dataquality.js - * SHACL-driven Data Quality execution module for the Digital Twin menu. + * SHACL-driven Data Quality execution module for the Knowledge Graph menu. */ window.DQExecModule = { results: [], @@ -256,7 +256,7 @@ window.DQExecModule = { showNotification( backend === 'view' ? 'Delta VIEW is not configured. Set it up in Domain Settings and build first.' - : 'Graph DB is not available. Build the Digital Twin first.', + : 'Graph DB is not available. Build the Knowledge Graph first.', 'warning' ); return; @@ -466,7 +466,7 @@ window.DQExecModule = { const tr = document.createElement('tr'); tr.innerHTML = vals.map(v => `<td class="small">${this._escHtml(String(v))}</td>`).join('') + '<td class="small text-center">' - + '<a href="#" class="text-primary dq-kg-link" title="Search in Knowledge Graph">' + + '<a href="#" class="text-primary dq-kg-link" title="Search in Graph Viewer">' + '<i class="bi bi-diagram-3"></i></a></td>'; tr.querySelector('.dq-kg-link').addEventListener('click', (e) => { e.preventDefault(); diff --git a/src/front/static/query/js/query-graphql.js b/src/front/static/query/js/query-graphql.js index 21a83f50..b95c42c3 100644 --- a/src/front/static/query/js/query-graphql.js +++ b/src/front/static/query/js/query-graphql.js @@ -1,9 +1,9 @@ /** * OntoBricks – query-graphql.js * - * Manages the embedded GraphiQL playground inside the Digital Twin + * Manages the embedded GraphiQL playground inside the Knowledge Graph * "GraphQL" sidebar section. Relies on the same readiness gating - * (sync-requires-ready) as the Triples and Knowledge Graph sections. + * (sync-requires-ready) as the Triples and Graph Viewer sections. */ /* global React, ReactDOM, GraphiQL */ diff --git a/src/front/static/query/js/query-loaders.js b/src/front/static/query/js/query-loaders.js index 44c87bd3..2acf8491 100644 --- a/src/front/static/query/js/query-loaders.js +++ b/src/front/static/query/js/query-loaders.js @@ -158,7 +158,7 @@ async function loadOntologyClasses() { } console.log('Loaded ontology classes:', Object.keys(ontologyClasses).length, 'keys for', (data.config.classes || []).length, 'classes'); - // Load properties (for label lookup in the knowledge graph) + // Load properties (for label lookup in the graph viewer) for (const prop of (data.config.properties || [])) { const propInfo = { name: prop.name || '', diff --git a/src/front/static/query/js/query-ontology-viewer.js b/src/front/static/query/js/query-ontology-viewer.js index de2373f7..8d8e34c7 100644 --- a/src/front/static/query/js/query-ontology-viewer.js +++ b/src/front/static/query/js/query-ontology-viewer.js @@ -1,6 +1,6 @@ /** * OntoBricks - query-ontology-viewer.js - * Read-only D3.js ontology model viewer modal for the Digital Twin page. + * Read-only D3.js ontology model viewer modal for the Knowledge Graph page. * * Provides OntologyViewer.open() which fetches the ontology classes, * properties, and saved map layout, then renders a frozen (non-editable) diff --git a/src/front/static/query/js/query-reasoning.js b/src/front/static/query/js/query-reasoning.js index 110d0bae..21473735 100644 --- a/src/front/static/query/js/query-reasoning.js +++ b/src/front/static/query/js/query-reasoning.js @@ -631,7 +631,7 @@ const ReasoningModule = { } else if (area) { const hint = document.createElement('div'); hint.className = 'small text-muted mt-1'; - hint.innerHTML = '<i class="bi bi-info-circle me-1"></i>Open the <strong>Knowledge Graph</strong> tab and reload to see the new triples.'; + hint.innerHTML = '<i class="bi bi-info-circle me-1"></i>Open the <strong>Graph Viewer</strong> tab and reload to see the new triples.'; area.appendChild(hint); } } diff --git a/src/front/static/query/js/query-sigmagraph.js b/src/front/static/query/js/query-sigmagraph.js index c94814e1..c527f861 100644 --- a/src/front/static/query/js/query-sigmagraph.js +++ b/src/front/static/query/js/query-sigmagraph.js @@ -1,6 +1,6 @@ /** * OntoBricks - query-sigmagraph.js - * Sigma.js + Graphology graph view for the Digital Twin section. + * Sigma.js + Graphology graph view for the Knowledge Graph section. * Reuses the same data (lastQueryResults / d3NodesData / d3LinksData) built by query.js. */ @@ -2303,7 +2303,7 @@ var SigmaGraph = (function () { placeholder.innerHTML = '<div class="text-muted">' + '<i class="bi bi-diagram-3 " style="font-size:2.5rem;"></i>' + - '<p class="mt-2 mb-1 fw-semibold">Knowledge Graph</p>' + + '<p class="mt-2 mb-1 fw-semibold">Graph Viewer</p>' + '<p class="small">Use the filter panel to search and explore entities.</p>' + '</div>'; container.appendChild(placeholder); diff --git a/src/front/static/query/js/query-sync.js b/src/front/static/query/js/query-sync.js index e68da3a6..8fad46be 100644 --- a/src/front/static/query/js/query-sync.js +++ b/src/front/static/query/js/query-sync.js @@ -153,7 +153,7 @@ function _applyBuildGraphEngineUi(dtExist) { var title = document.getElementById('dtGraphBackendTitle'); if (title) { - title.textContent = eng === 'lakebase' ? 'Graph DB (Lakebase)' : 'Graph DB Digital Twin'; + title.textContent = eng === 'lakebase' ? 'Graph DB (Lakebase)' : 'Graph DB Knowledge Graph'; } var sub = document.getElementById('dtGraphStorageSubtitle'); var primaryRow = document.getElementById('dtGraphPrimaryRow'); @@ -362,7 +362,7 @@ async function initSyncSection() { var targetLabel = document.getElementById('syncTargetLabel'); if (targetLabel) { - targetLabel.innerHTML = '<i class="bi bi-lightning-charge me-1"></i>Digital Twin'; + targetLabel.innerHTML = '<i class="bi bi-lightning-charge me-1"></i>Knowledge Graph'; } if (typeof refreshNavbarIndicators === 'function') refreshNavbarIndicators(); @@ -375,7 +375,7 @@ async function initSyncSection() { /** * Check whether the ontology or assignments have changed since the last - * Digital Twin build. Shows a warning banner when a rebuild is recommended. + * Knowledge Graph build. Shows a warning banner when a rebuild is recommended. */ async function checkConfigChanges() { var warning = document.getElementById('syncRebuildWarning'); @@ -467,9 +467,9 @@ function renderTripleStoreStatus(data) { const reason = data.reason || ''; let msg; if (reason.toLowerCase().includes('does not exist')) { - msg = 'Digital Twin not built yet. Click <strong>Build</strong> to create the VIEW and graph.'; + msg = 'Knowledge Graph not built yet. Click <strong>Build</strong> to create the VIEW and graph.'; } else if (reason.toLowerCase().includes('not configured')) { - msg = 'Digital Twin is not configured. Set it in <a href="/domain/#information">Domain Settings</a>.'; + msg = 'Knowledge Graph is not configured. Set it in <a href="/domain/#information">Domain Settings</a>.'; } else { msg = 'Graph is empty. Run <strong>Synchronize</strong> to generate triples.'; } @@ -481,7 +481,7 @@ function renderTripleStoreStatus(data) { } /** - * Enable or disable the Data section sidebar menus (Quality, Triples, Knowledge Graph). + * Enable or disable the Data section sidebar menus (Quality, Triples, Graph Viewer). * * Menus are enabled ONLY when ALL conditions are met: * 1. Ontology + assignments are ready (syncIsReady) @@ -557,7 +557,7 @@ async function checkAndResumeSyncTask() { } /** - * Show a confirmation modal before building the Digital Twin. + * Show a confirmation modal before building the Knowledge Graph. * Always displayed so the domain is saved with the latest changes. * Resolves to 'save' (user confirms) or 'cancel'. */ @@ -578,7 +578,7 @@ function _showSaveBeforeBuildDialog() { <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button> </div> <div class="modal-body"> - <p>The domain will be saved to the registry before building the Digital Twin.</p> + <p>The domain will be saved to the registry before building the Knowledge Graph.</p> <p class="mb-0 text-muted"> This ensures the triple store, GraphQL API, and other services use the latest ontology and mapping configuration. @@ -739,7 +739,7 @@ async function monitorSyncTask(taskId) { // Refresh artefact existence flags _loadDtExistence(); - // Refresh navbar Digital Twin indicator + // Refresh navbar Knowledge Graph indicator if (typeof refreshDigitalTwinStatus === 'function') refreshDigitalTwinStatus(); if (typeof refreshTasks === 'function') refreshTasks(); @@ -835,7 +835,7 @@ let _syncBuildLogLastTask = null; /** * Show the live build-log card and wipe any previous content. Called when - * the user clicks Build so the panel slides in next to the Digital Twin + * the user clicks Build so the panel slides in next to the Knowledge Graph * card and grows row-by-row as the backend reports each phase. */ function showBuildLog() { @@ -1039,7 +1039,7 @@ function _formatBuildLogAsText(task) { const sep = '─'.repeat(60); lines.push(sep); - lines.push('OntoBricks — Digital Twin Build Log'); + lines.push('OntoBricks — Knowledge Graph Build Log'); lines.push(sep); lines.push('Task ID : ' + (task.id || '')); lines.push('Name : ' + (task.name || '')); @@ -1219,7 +1219,7 @@ async function loadTripleStore(options = {}) { if (!silent) showNotification(`Loaded ${count} triples from triple store`, 'success'); - // Navigate to Knowledge Graph only when explicitly requested + // Navigate to Graph Viewer only when explicitly requested if (navigate && typeof SidebarNav !== 'undefined' && SidebarNav.switchTo) { SidebarNav.switchTo('sigmagraph'); } @@ -1450,7 +1450,7 @@ function _escHtml(str) { /** * Fetch artefact existence flags and render check / cross icons - * next to each Digital Twin line. + * next to each Knowledge Graph line. */ async function _loadDtExistence() { try { diff --git a/src/front/static/query/js/query.js b/src/front/static/query/js/query.js index fc370ce3..46216a9f 100644 --- a/src/front/static/query/js/query.js +++ b/src/front/static/query/js/query.js @@ -9,7 +9,7 @@ * query-entity-details.js – Entity/relationship detail panel, mapping lookup * query-dashboard.js – Dashboard modal (URL builder, iframe) * query-sync.js – Triple store sync, readiness checks - * query-sigmagraph.js – Sigma.js knowledge graph + * query-sigmagraph.js – Sigma.js graph viewer * query-quality.js – Quality checks * query-api.js – API documentation helpers * query-graphql.js – Embedded GraphiQL playground @@ -64,11 +64,11 @@ let allRelationshipTypes = new Set(); // DISCUSSION // ===================================================== -// Cache the ontology-derived tag vocabulary for the Digital Twin discussion. +// Cache the ontology-derived tag vocabulary for the Knowledge Graph discussion. let _twinTaggable = null; /** - * Open the Digital Twin discussion. Anchors to the whole twin + * Open the Knowledge Graph discussion. Anchors to the whole twin * (domain/'digital-twin'); each comment can optionally be tagged with one or * more ontology classes/relationships via the compose-box tag picker. The tag * vocabulary is lazily fetched from the loaded ontology and cached. @@ -87,7 +87,7 @@ async function openTwinDiscussion() { } } window.OntoComments.openForSelection( - 'domain', 'digital-twin', 'Digital Twin', _twinTaggable + 'domain', 'digital-twin', 'Knowledge Graph', _twinTaggable ); } window.openTwinDiscussion = openTwinDiscussion; diff --git a/src/front/templates/about.html b/src/front/templates/about.html index 889509b4..53127cc4 100644 --- a/src/front/templates/about.html +++ b/src/front/templates/about.html @@ -5,7 +5,7 @@ {% block content %} <div class="page-header"> <h1><i class="bi bi-info-circle"></i> About OntoBricks</h1> - <p>Digital Twin Builder for Databricks — from Unity Catalog to a queryable knowledge graph in four clicks</p> + <p>Knowledge Graph Builder for Databricks — from Unity Catalog to a queryable graph viewer in four clicks</p> </div> <div class="row"> @@ -16,7 +16,7 @@ <h1><i class="bi bi-info-circle"></i> About OntoBricks</h1> </div> <div class="card-body"> <p> - OntoBricks transforms Databricks tables into a materialized knowledge graph. Design ontologies + OntoBricks transforms Databricks tables into a materialized graph viewer. Design ontologies (OWL/RDFS/SHACL), map them to Unity Catalog tables via R2RML, materialize triples into a Delta-backed triple store with a Lakebase Postgres graph engine, reason over the graph, and query it through an auto-generated GraphQL API — all from a single web application running as a @@ -24,7 +24,7 @@ <h1><i class="bi bi-info-circle"></i> About OntoBricks</h1> </p> <p class="mb-0"> LLM-powered automation drives the full pipeline: import metadata, generate the ontology, - auto-map entities and relationships, then synchronize the Digital Twin. + auto-map entities and relationships, then synchronize the Knowledge Graph. </p> </div> </div> @@ -52,9 +52,9 @@ <h6><i class="bi bi-arrow-left-right"></i> Mapping</h6> </ul> </div> <div class="col-md-6"> - <h6><i class="bi bi-share"></i> Digital Twin</h6> + <h6><i class="bi bi-share"></i> Knowledge Graph</h6> <ul class="small"> - <li>Full knowledge graph build via Lakeflow</li> + <li>Full graph viewer build via Lakeflow</li> <li>SPARQL endpoint & GraphQL API</li> <li>Interactive graph visualization</li> <li>Community detection & clustering</li> @@ -156,7 +156,7 @@ <h6>Platform</h6> </div> <div class="card-body"> <p class="small mb-0"> - The companion <code>mcp-ontobricks</code> server exposes the knowledge graph to LLM + The companion <code>mcp-ontobricks</code> server exposes the graph viewer to LLM agents via the Model Context Protocol — usable from Cursor, Claude Desktop, or the Databricks Playground. </p> diff --git a/src/front/templates/dtwin.html b/src/front/templates/dtwin.html index 056e056e..c006bcf9 100644 --- a/src/front/templates/dtwin.html +++ b/src/front/templates/dtwin.html @@ -1,8 +1,8 @@ {% extends "base.html" %} -{% block title %}Digital Twin - OntoBricks{% endblock %} +{% block title %}Knowledge Graph - OntoBricks{% endblock %} -{# The Digital Twin is a read / analysis surface (query, explore, run +{# The Knowledge Graph is a read / analysis surface (query, explore, run reasoning, discover cohorts). Lifecycle / viewer read-only gating must NOT disable its filter / search / query controls — see permissions.css. #} {% block page_id %}digitaltwin{% endblock %} @@ -53,7 +53,7 @@ {% include "partials/dtwin/_query_cohorts.html" %} </div> - <!-- Knowledge Graph Section --> + <!-- Graph Viewer Section --> <div id="sigmagraph-section" class="sidebar-section active"> {% include "partials/dtwin/_query_sigmagraph.html" %} </div> diff --git a/src/front/templates/ontology.html b/src/front/templates/ontology.html index b62ce58c..f7cf2d6e 100644 --- a/src/front/templates/ontology.html +++ b/src/front/templates/ontology.html @@ -86,7 +86,7 @@ {% include "partials/ontology/_ontology_business_rules.html" %} </div> - <!-- Cohort Discovery — DESIGN (Run/preview lives in Digital Twin) --> + <!-- Cohort Discovery — DESIGN (Run/preview lives in Knowledge Graph) --> <div id="cohorts-section" class="sidebar-section"> {% include "partials/ontology/_ontology_cohorts.html" %} </div> @@ -127,7 +127,7 @@ <script src="{{ url_for('static', filename='ontology/js/ontology-axioms.js') }}?v={{ asset_version }}"></script> <script src="{{ url_for('static', filename='ontology/js/ontology-swrl.js') }}?v={{ asset_version }}"></script> <script src="{{ url_for('static', filename='ontology/js/ontology-business-rules.js') }}?v={{ asset_version }}"></script> -<!-- Cohort Discovery design UI (same module powers the Digital Twin run page) --> +<!-- Cohort Discovery design UI (same module powers the Knowledge Graph run page) --> <script src="{{ url_for('static', filename='query/js/query-cohorts.js') }}?v={{ asset_version }}"></script> <script src="{{ url_for('static', filename='ontology/js/ontology-owl-content.js') }}?v={{ asset_version }}"></script> <script src="{{ url_for('static', filename='ontology/js/ontology-information.js') }}?v={{ asset_version }}"></script> diff --git a/src/front/templates/partials/_cohort_modals.html b/src/front/templates/partials/_cohort_modals.html index 0a918009..302787f5 100644 --- a/src/front/templates/partials/_cohort_modals.html +++ b/src/front/templates/partials/_cohort_modals.html @@ -24,7 +24,7 @@ <h5 class="modal-title"><i class="bi bi-sliders me-2"></i>Configure outputs</h5> <strong>Graph triples</strong> <small class="text-muted d-block"> Writes <code id="cohortGraphPredHint">:inCohort<RuleName></code> triples - into the knowledge graph (one membership predicate + into the graph viewer (one membership predicate per rule, so multiple rules co-exist cleanly). </small> </label> diff --git a/src/front/templates/partials/domain/_domain_discussions.html b/src/front/templates/partials/domain/_domain_discussions.html index a49a5d19..6ae2dc30 100644 --- a/src/front/templates/partials/domain/_domain_discussions.html +++ b/src/front/templates/partials/domain/_domain_discussions.html @@ -4,7 +4,7 @@ <h4 class="mb-1"><i class="bi bi-chat-left-text me-2"></i>Discussions</h4> <p class="text-muted mb-0 small"> Every discussion across this domain — ontology, - mappings and the digital twin — as one activity timeline. + mappings and the graph viewer — as one activity timeline. </p> </div> <div class="d-flex align-items-center gap-2"> diff --git a/src/front/templates/partials/domain/_domain_information.html b/src/front/templates/partials/domain/_domain_information.html index a9123693..3eb040ab 100644 --- a/src/front/templates/partials/domain/_domain_information.html +++ b/src/front/templates/partials/domain/_domain_information.html @@ -30,7 +30,7 @@ <h4 class="mb-1"><i class="bi bi-info-circle me-2"></i>Domain Information</h4> <li class="nav-item" role="presentation"> <button class="nav-link" id="tab-triplestore" data-bs-toggle="tab" data-bs-target="#panel-triplestore" type="button" role="tab" aria-controls="panel-triplestore" aria-selected="false"> - <i class="bi bi-lightning-charge me-1"></i> Digital Twin + <i class="bi bi-lightning-charge me-1"></i> Knowledge Graph </button> </li> </ul> @@ -157,13 +157,13 @@ <h4 class="mb-1"><i class="bi bi-info-circle me-2"></i>Domain Information</h4> <!-- ======== Triple Store Tab ======== --> <div class="tab-pane fade" id="panel-triplestore" role="tabpanel" aria-labelledby="tab-triplestore"> - <!-- Dual Digital Twin explanation --> + <!-- Dual Knowledge Graph explanation --> <div class="alert alert-light border mb-4"> - <h6 class="alert-heading mb-2"><i class="bi bi-lightning-charge me-1"></i> Dual Digital Twin</h6> - <p class="small mb-2">When you build the Digital Twin, OntoBricks creates two complementary representations:</p> + <h6 class="alert-heading mb-2"><i class="bi bi-lightning-charge me-1"></i> Dual Knowledge Graph</h6> + <p class="small mb-2">When you build the Knowledge Graph, OntoBricks creates two complementary representations:</p> <ul class="small mb-0"> <li><strong>Triple-Store</strong> — a SQL VIEW in Unity Catalog that maps directly to your source data with no duplication. Used for <em>Quality</em> checks.</li> - <li><strong>Graph Database</strong> — a Graph DB embedded graph for <em>Knowledge Graph</em> exploration, <em>GraphQL</em> queries, and <em>API</em> access.</li> + <li><strong>Graph Database</strong> — a Graph DB embedded graph for <em>Graph Viewer</em> exploration, <em>GraphQL</em> queries, and <em>API</em> access.</li> </ul> </div> diff --git a/src/front/templates/partials/domain/_domain_validation.html b/src/front/templates/partials/domain/_domain_validation.html index 63c7bfe2..d0650bd7 100644 --- a/src/front/templates/partials/domain/_domain_validation.html +++ b/src/front/templates/partials/domain/_domain_validation.html @@ -212,12 +212,12 @@ <h4 class="mb-1"><i class="bi bi-speedometer2 me-2"></i>Cockpit</h4> </div> </div> - <!-- Digital Twin + Missing Items (1-column) --> + <!-- Knowledge Graph + Missing Items (1-column) --> <div class="row g-3 mb-4"> <div class="col-12"> <div class="card validation-detail-card h-100" id="dtwinValidationCard"> <div class="card-header d-flex justify-content-between align-items-center"> - <span><i class="bi bi-box-fill me-1"></i> Digital Twin</span> + <span><i class="bi bi-box-fill me-1"></i> Knowledge Graph</span> <div class="d-flex align-items-center gap-2"> <span id="dtwinValidationBadge" class="badge bg-secondary">Checking...</span> <a href="/dtwin/" class="btn btn-outline-primary btn-sm py-0 px-2 validation-dtwin-link"> @@ -231,7 +231,7 @@ <h4 class="mb-1"><i class="bi bi-speedometer2 me-2"></i>Cockpit</h4> <i class="bi bi-exclamation-triangle-fill flex-shrink-0 mt-1"></i> <div> <strong>Ontology or assignments have changed</strong> since the last build. - <span class="d-block text-muted">Open Digital Twin to rebuild.</span> + <span class="d-block text-muted">Open Knowledge Graph to rebuild.</span> </div> </div> diff --git a/src/front/templates/partials/dtwin/_query_api.html b/src/front/templates/partials/dtwin/_query_api.html index ed39fb79..55d150c2 100644 --- a/src/front/templates/partials/dtwin/_query_api.html +++ b/src/front/templates/partials/dtwin/_query_api.html @@ -70,7 +70,7 @@ <h6 class="small fw-semibold mb-1">Sample Response</h6> "success": true, "domains": [ { "name": "customer_360", "description": "Customer 360 ontology" }, - { "name": "supply_chain", "description": "Supply chain knowledge graph" } + { "name": "supply_chain", "description": "Supply chain graph viewer" } ] }</code></pre> <button class="btn btn-sm btn-outline-primary" data-try-endpoint="/api/v1/domains"> @@ -299,17 +299,17 @@ <h6 class="small fw-semibold mb-1">Sample Response</h6> </div> </div> - <!-- ========== Digital Twin ========== --> + <!-- ========== Knowledge Graph ========== --> <div class="mt-2 pt-4 mb-1 border-top"> <h5 class="fw-semibold mb-2 d-flex align-items-center gap-2"> - <i class="bi bi-diagram-3 text-primary"></i> Digital Twin + <i class="bi bi-diagram-3 text-primary"></i> Knowledge Graph </h5> <p class="text-muted small mb-2"> Registry discovery, triple store operations, builds, triple queries, data quality, and inference. </p> <p class="small mb-0"> <a href="/api/docs#/Digital%20Twin" target="_blank" class="text-decoration-none"> - <i class="bi bi-journal-code me-1"></i>OpenAPI: Digital Twin + <i class="bi bi-journal-code me-1"></i>OpenAPI: Knowledge Graph </a> </p> </div> @@ -541,7 +541,7 @@ <h6 class="small fw-semibold mb-1">Sample Response</h6> <p class="small mb-2"> Search for entities by type and/or label text, then traverse their relationships up to N levels deep (BFS graph walk). Returns all triples discovered during traversal, - similar to the Knowledge Graph's Find & Filter feature. + similar to the Graph Viewer's Find & Filter feature. </p> <h6 class="small fw-semibold mb-1">Query Parameters</h6> <table class="table table-sm table-borderless small mb-2"> @@ -803,7 +803,7 @@ <h6 class="small fw-semibold mb-1">Sample Response</h6> <p class="small mb-2"> Start OWL 2 RL inference, SWRL rule execution, graph reasoning, and constraint checking as an asynchronous task. Each phase can be toggled independently. - Optionally append inferred triples to the knowledge graph or materialise to a Delta table. + Optionally append inferred triples to the graph viewer or materialise to a Delta table. Returns a <code>task_id</code> to poll progress via <code>GET /inference/{task_id}</code>. </p> <h6 class="small fw-semibold mb-1">Query Parameters</h6> @@ -823,7 +823,7 @@ <h6 class="small fw-semibold mb-1">Request Body</h6> <tr><td><code>swrl</code></td><td>boolean</td><td><code>true</code></td><td>Run SWRL rule execution</td></tr> <tr><td><code>graph</code></td><td>boolean</td><td><code>true</code></td><td>Run graph-structural reasoning</td></tr> <tr><td><code>constraints</code></td><td>boolean</td><td><code>true</code></td><td>Run constraint checks</td></tr> - <tr><td><code>append_graph</code></td><td>boolean</td><td><code>false</code></td><td>Append inferred triples to the knowledge graph</td></tr> + <tr><td><code>append_graph</code></td><td>boolean</td><td><code>false</code></td><td>Append inferred triples to the graph viewer</td></tr> <tr><td><code>materialize</code></td><td>boolean</td><td><code>false</code></td><td>Write inferred triples to a Delta table</td></tr> <tr><td><code>materialize_table</code></td><td>string</td><td><code>null</code></td><td>Fully-qualified table name (catalog.schema.table)</td></tr> </tbody> @@ -1235,7 +1235,7 @@ <h6 class="small fw-semibold mb-1">Sample Response</h6> <pre class="small mb-2"><code>{ "success": true, "domains": [ - { "name": "customer_360", "description": "Customer 360 knowledge graph" } + { "name": "customer_360", "description": "Customer 360 graph viewer" } ] }</code></pre> <button class="btn btn-sm btn-outline-primary" data-try-endpoint="/api/v1/graphql"> @@ -1285,7 +1285,7 @@ <h6 class="small fw-semibold mb-1">Path Parameters</h6> </div> <div class="card-body px-3 py-2 d-none"> <p class="small mb-2"> - Execute a GraphQL query against the domain's knowledge graph. + Execute a GraphQL query against the domain's graph viewer. The schema is derived from the ontology; clients request exactly the fields they need, and relationships are resolved as nested objects. </p> diff --git a/src/front/templates/partials/dtwin/_query_chat.html b/src/front/templates/partials/dtwin/_query_chat.html index 116be4a3..b7315a30 100644 --- a/src/front/templates/partials/dtwin/_query_chat.html +++ b/src/front/templates/partials/dtwin/_query_chat.html @@ -1,4 +1,4 @@ -<!-- Graph Chat: conversational UI that talks to the selected domain's knowledge graph --> +<!-- Graph Chat: conversational UI that talks to the selected domain's graph viewer --> <!-- CSS: /static/query/css/query-chat.css --> <!-- JS: /static/query/js/query-chat.js --> @@ -6,7 +6,7 @@ <div> <h4 class="mb-1"><i class="bi bi-chat-dots me-2"></i>Graph Chat</h4> <p class="text-muted mb-0 small"> - Chat with your knowledge graph in natural language<br> + Chat with your graph viewer in natural language<br> <i class="bi bi-folder2-open"></i> Domain: <code class="text-primary">{{ domain_name }}</code> <span class="badge bg-secondary bg-opacity-50 ob-badge-version">v{{ current_version }}</span> <span class="js-version-status-badge badge border bg-warning-subtle text-dark border-warning" style="font-size:0.6rem;">Draft</span><br> <i class="bi bi-diagram-3"></i> Graph DB: <code id="chatGraphDbName" class="text-primary">{{ graph_name or 'Not configured' }}</code> <button class="btn btn-sm btn-outline-secondary py-0 px-1 ms-2" onclick="_openGraphSwitcherModal()" title="Switch to another domain graph"> @@ -19,7 +19,7 @@ <h4 class="mb-1"><i class="bi bi-chat-dots me-2"></i>Graph Chat</h4> <i class="bi bi-trash3 me-1"></i>Clear chat </button> <button type="button" class="btn btn-sm btn-outline-primary onto-discuss-btn" - title="Open the Digital Twin discussion" onclick="openTwinDiscussion()"> + title="Open the Knowledge Graph discussion" onclick="openTwinDiscussion()"> <i class="bi bi-chat-dots"></i> </button> </div> @@ -31,10 +31,10 @@ <h4 class="mb-1"><i class="bi bi-chat-dots me-2"></i>Graph Chat</h4> <div class="assistant-welcome-icon"> <img src="/static/global/img/favicon.svg" alt="OntoBricks" width="40" height="40"> </div> - <p>Ask questions about your knowledge graph in natural language.<br> + <p>Ask questions about your graph viewer in natural language.<br> I can list entity types, describe specific entities, run GraphQL or SPARQL queries.</p> <div class="assistant-suggestions"> - <button class="btn btn-sm btn-outline-primary assistant-suggestion" data-message="List all entity types in this knowledge graph with their instance counts."> + <button class="btn btn-sm btn-outline-primary assistant-suggestion" data-message="List all entity types in this graph viewer with their instance counts."> <i class="bi bi-list-ul me-1"></i>List entity types </button> <button class="btn btn-sm btn-outline-primary assistant-suggestion" data-message="Show me the GraphQL schema for this domain."> @@ -52,7 +52,7 @@ <h4 class="mb-1"><i class="bi bi-chat-dots me-2"></i>Graph Chat</h4> <div class="assistant-input-area graph-chat-input-area"> <div class="assistant-input-wrapper"> - <textarea id="chatInput" class="form-control border-0" placeholder="Ask a question about your knowledge graph…" rows="1" autocomplete="off"></textarea> + <textarea id="chatInput" class="form-control border-0" placeholder="Ask a question about your graph viewer…" rows="1" autocomplete="off"></textarea> <button id="chatSendBtn" class="btn" title="Send message" disabled> <i class="bi bi-send-fill"></i> </button> diff --git a/src/front/templates/partials/dtwin/_query_cohorts.html b/src/front/templates/partials/dtwin/_query_cohorts.html index b21f0347..1a63b8e2 100644 --- a/src/front/templates/partials/dtwin/_query_cohorts.html +++ b/src/front/templates/partials/dtwin/_query_cohorts.html @@ -1,5 +1,5 @@ <!-- - Cohort Discovery — RUN page (Digital Twin > Cohorts). + Cohort Discovery — RUN page (Knowledge Graph > Cohorts). Design lives in Ontology > Advanced > Cohorts. This page picks a saved rule, previews and materialises it. It deliberately does NOT show the @@ -38,7 +38,7 @@ <h4 class="mb-1"><i class="bi bi-people-fill me-2"></i>Cohort Discovery</h4> <i class="bi bi-cloud-upload me-1"></i>Materialise </button> <button type="button" class="btn btn-sm btn-outline-primary onto-discuss-btn" - title="Open the Digital Twin discussion" onclick="openTwinDiscussion()"> + title="Open the Knowledge Graph discussion" onclick="openTwinDiscussion()"> <i class="bi bi-chat-dots"></i> </button> </div> diff --git a/src/front/templates/partials/dtwin/_query_dataquality.html b/src/front/templates/partials/dtwin/_query_dataquality.html index 23a2c287..731e1983 100644 --- a/src/front/templates/partials/dtwin/_query_dataquality.html +++ b/src/front/templates/partials/dtwin/_query_dataquality.html @@ -27,7 +27,7 @@ <h4 class="mb-1"><i class="bi bi-shield-check me-2"></i>Data Quality</h4> <i class="bi bi-play-fill me-1"></i> Run All </button> <button type="button" class="btn btn-sm btn-outline-primary onto-discuss-btn" - title="Open the Digital Twin discussion" onclick="openTwinDiscussion()"> + title="Open the Knowledge Graph discussion" onclick="openTwinDiscussion()"> <i class="bi bi-chat-dots"></i> </button> </div> diff --git a/src/front/templates/partials/dtwin/_query_graphql.html b/src/front/templates/partials/dtwin/_query_graphql.html index 3af4c586..256fd3e2 100644 --- a/src/front/templates/partials/dtwin/_query_graphql.html +++ b/src/front/templates/partials/dtwin/_query_graphql.html @@ -4,7 +4,7 @@ <div> <h4 class="mb-1"><i class="bi bi-braces-asterisk me-2"></i>GraphQL Playground</h4> <p class="text-muted mb-0 small"> - Query the knowledge graph with the auto-generated GraphQL schema<br> + Query the graph viewer with the auto-generated GraphQL schema<br> <i class="bi bi-folder2-open"></i> Domain: <code class="text-primary">{{ domain_name }}</code> <span class="badge bg-secondary bg-opacity-50 ob-badge-version">v{{ current_version }}</span> <span class="js-version-status-badge badge border bg-warning-subtle text-dark border-warning" style="font-size:0.6rem;">Draft</span><br> <i class="bi bi-diagram-3"></i> Graph DB: <code id="graphqlGraphDbName" class="text-primary">{{ graph_name or 'Not configured' }}</code> <button class="btn btn-sm btn-outline-secondary py-0 px-1 ms-2" onclick="_openGraphSwitcherModal()" title="Switch to another domain graph"> @@ -25,7 +25,7 @@ <h4 class="mb-1"><i class="bi bi-braces-asterisk me-2"></i>GraphQL Playground</h <i class="bi bi-box-arrow-up-right me-1"></i>New tab </button> <button type="button" class="btn btn-sm btn-outline-primary onto-discuss-btn" - title="Open the Digital Twin discussion" onclick="openTwinDiscussion()"> + title="Open the Knowledge Graph discussion" onclick="openTwinDiscussion()"> <i class="bi bi-chat-dots"></i> </button> </div> diff --git a/src/front/templates/partials/dtwin/_query_insights.html b/src/front/templates/partials/dtwin/_query_insights.html index d84ff0d2..a59b5108 100644 --- a/src/front/templates/partials/dtwin/_query_insights.html +++ b/src/front/templates/partials/dtwin/_query_insights.html @@ -1,11 +1,11 @@ <!-- CSS: /static/query/css/query-sync.css (shared) --> <!-- JS: /static/query/js/query-sync.js (shared — loadInsights, renderInsights) --> -<!-- Digital Twin Insights — standalone section on /dtwin/ --> +<!-- Knowledge Graph Insights — standalone section on /dtwin/ --> <div class="content-section"> <div class="section-header d-flex justify-content-between align-items-center mb-4"> <div> - <h4 class="mb-1"><i class="bi bi-bar-chart-line me-2"></i>Digital Twin Insights</h4> + <h4 class="mb-1"><i class="bi bi-bar-chart-line me-2"></i>Knowledge Graph Insights</h4> <p class="text-muted mb-0 small">Content overview of the triple store: entity types and relationships</p> </div> <div class="d-flex align-items-center gap-2"> @@ -14,7 +14,7 @@ <h4 class="mb-1"><i class="bi bi-bar-chart-line me-2"></i>Digital Twin Insights< <i class="bi bi-arrow-clockwise me-1"></i>Refresh </button> <button type="button" class="btn btn-sm btn-outline-primary onto-discuss-btn" - title="Open the Digital Twin discussion" onclick="openTwinDiscussion()"> + title="Open the Knowledge Graph discussion" onclick="openTwinDiscussion()"> <i class="bi bi-chat-dots"></i> </button> </div> @@ -24,7 +24,7 @@ <h4 class="mb-1"><i class="bi bi-bar-chart-line me-2"></i>Digital Twin Insights< <div id="insightNoData" class="d-none"> <div class="alert alert-info small mb-0"> <i class="bi bi-info-circle me-1"></i> - No triple store data available. Build the Digital Twin from the + No triple store data available. Build the Knowledge Graph from the <strong>Domain → Build</strong> page first. </div> </div> diff --git a/src/front/templates/partials/dtwin/_query_reasoning.html b/src/front/templates/partials/dtwin/_query_reasoning.html index 378066d4..cfe9c81c 100644 --- a/src/front/templates/partials/dtwin/_query_reasoning.html +++ b/src/front/templates/partials/dtwin/_query_reasoning.html @@ -14,7 +14,7 @@ <h4 class="mb-1"><i class="bi bi-lightning me-2"></i>Inference</h4> <i class="bi bi-play-fill me-1"></i> Run Inference </button> <button type="button" class="btn btn-sm btn-outline-primary onto-discuss-btn" - title="Open the Digital Twin discussion" onclick="openTwinDiscussion()"> + title="Open the Knowledge Graph discussion" onclick="openTwinDiscussion()"> <i class="bi bi-chat-dots"></i> </button> </div> diff --git a/src/front/templates/partials/dtwin/_query_sigmagraph.html b/src/front/templates/partials/dtwin/_query_sigmagraph.html index bbe7c476..33bf3b1d 100644 --- a/src/front/templates/partials/dtwin/_query_sigmagraph.html +++ b/src/front/templates/partials/dtwin/_query_sigmagraph.html @@ -1,10 +1,10 @@ <!-- CSS: /static/query/css/query-sigmagraph.css --> <!-- JS: /static/query/js/query-sigmagraph.js --> -<!-- Knowledge Graph Section --> +<!-- Graph Viewer Section --> <div class="section-header d-flex justify-content-between align-items-center mb-4"> <div> - <h4 class="mb-1"><i class="bi bi-layers-half me-2"></i>Knowledge Graph</h4> + <h4 class="mb-1"><i class="bi bi-layers-half me-2"></i>Graph Viewer</h4> <p class="text-muted mb-0 small">Interactive graph visualization<br> <i class="bi bi-folder2-open"></i> Domain: <code class="text-primary">{{ domain_name }}</code> <span class="badge bg-secondary bg-opacity-50 ob-version-badge">v{{ current_version }}</span> <span class="js-version-status-badge badge border bg-warning-subtle text-dark border-warning" style="font-size:0.6rem;">Draft</span><br> <i class="bi bi-diagram-3"></i> Graph DB: <code id="sgGraphDbName" class="text-primary">{{ graph_name or 'Not configured' }}</code> @@ -59,7 +59,7 @@ <h4 class="mb-1"><i class="bi bi-layers-half me-2"></i>Knowledge Graph</h4> </button> </div> <button type="button" class="btn btn-sm btn-outline-primary onto-discuss-btn" - title="Open the Digital Twin discussion" onclick="openTwinDiscussion()"> + title="Open the Knowledge Graph discussion" onclick="openTwinDiscussion()"> <i class="bi bi-chat-dots"></i> </button> </div> @@ -301,7 +301,7 @@ <h4 class="mb-1"><i class="bi bi-layers-half me-2"></i>Knowledge Graph</h4> <div class="tab-pane fade sg-tab-pane" id="sgTabFilterPane" role="tabpanel"> <div class="sg-tab-inner p-3"> <span class="small fw-semibold"><i class="bi bi-funnel"></i> Filter Graph</span> - <p class="text-muted small mt-1 mb-2">Search and filter entities from the knowledge graph.</p> + <p class="text-muted small mt-1 mb-2">Search and filter entities from the graph viewer.</p> <label class="form-label small mb-1" for="sgFilterMatchType">Match</label> <select class="form-select form-select-sm mb-2" id="sgFilterMatchType"> <option value="contains">Contains</option> diff --git a/src/front/templates/partials/dtwin/_query_sync.html b/src/front/templates/partials/dtwin/_query_sync.html index 1be1249e..30dbee48 100644 --- a/src/front/templates/partials/dtwin/_query_sync.html +++ b/src/front/templates/partials/dtwin/_query_sync.html @@ -27,13 +27,13 @@ </g> </g> </svg> - <span class="ob-spinner-label">Loading Digital Twin information...</span> + <span class="ob-spinner-label">Loading Knowledge Graph information...</span> </div> </div> <div class="section-header d-flex justify-content-between align-items-center mb-4"> <div> - <h4 class="mb-1"><i class="bi bi-info-circle me-2"></i>Digital Twin Information</h4> + <h4 class="mb-1"><i class="bi bi-info-circle me-2"></i>Knowledge Graph Information</h4> <p class="text-muted mb-0 small">Triple store status and build execution</p> </div> <div class="d-flex align-items-center gap-2"> @@ -49,7 +49,7 @@ <h4 class="mb-1"><i class="bi bi-info-circle me-2"></i>Digital Twin Information< </button> {% else %} <button type="button" class="btn btn-sm btn-outline-secondary" disabled - title="Only builders and admins can build a digital twin"> + title="Only builders and admins can build a graph viewer"> <i class="bi bi-lock me-1"></i> Build </button> {% endif %} @@ -60,7 +60,7 @@ <h4 class="mb-1"><i class="bi bi-info-circle me-2"></i>Digital Twin Information< <div id="syncRebuildWarning" class="alert alert-warning d-none align-items-start gap-2 mb-3"> <i class="bi bi-exclamation-triangle-fill fs-5 mt-1 flex-shrink-0"></i> <div> - <strong>Ontology or assignments have changed</strong> since the last Digital Twin build. + <strong>Ontology or assignments have changed</strong> since the last Knowledge Graph build. <span class="d-block small text-muted mt-1"> The triple store may be out of date. Click <strong>Build</strong> to regenerate it with the latest configuration. </span> @@ -105,11 +105,11 @@ <h6 class="mb-2 fw-semibold"><i class="bi bi-clipboard-check me-1"></i> Readines </div> </div> - <!-- Digital Twin Target --> + <!-- Knowledge Graph Target --> <div class="card mb-3"> <div class="card-body"> <label class="form-label fw-semibold mb-2" id="syncTargetLabel"> - <i class="bi bi-lightning-charge me-1"></i>Digital Twin + <i class="bi bi-lightning-charge me-1"></i>Knowledge Graph </label> <input type="hidden" id="syncTriplestoreTable"> @@ -200,12 +200,12 @@ <h6 class="mb-2 fw-semibold"><i class="bi bi-clipboard-check me-1"></i> Readines </div> </div> - <!-- Building Digital Twin (live build log) --> + <!-- Building Knowledge Graph (live build log) --> <div class="card d-none mb-3" id="syncBuildLogCard"> <div class="card-body"> <div class="d-flex justify-content-between align-items-center mb-2"> <h6 class="card-title mb-0"> - <i class="bi bi-list-check me-1"></i>Building Digital Twin + <i class="bi bi-list-check me-1"></i>Building Knowledge Graph <span id="syncBuildLogBadge" class="badge bg-primary ms-1 d-none"></span> </h6> <div class="d-flex align-items-center gap-2"> diff --git a/src/front/templates/partials/layout/help_modal.html b/src/front/templates/partials/layout/help_modal.html index 90298097..b68e7960 100644 --- a/src/front/templates/partials/layout/help_modal.html +++ b/src/front/templates/partials/layout/help_modal.html @@ -51,7 +51,7 @@ <h5 class="modal-title d-flex align-items-center" id="helpModalLabel"> </div> <div> <h2>Welcome to OntoBricks</h2> - <p class="lead mb-0">The Digital Twin Builder for Databricks — design an ontology, map Databricks tables to it, materialize a knowledge graph, and explore it visually.</p> + <p class="lead mb-0">The Knowledge Graph Builder for Databricks — design an ontology, map Databricks tables to it, materialize a knowledge graph, and explore it visually.</p> </div> </div> @@ -60,7 +60,7 @@ <h2>Welcome to OntoBricks</h2> <div class="help-card"> <div class="help-card-icon bg-soft-primary"><i class="bi bi-rocket-takeoff"></i></div> <h5>New here?</h5> - <p>Follow the <a href="#help-starter" data-help-jump="starter">Starter Guide</a> — build a full knowledge graph in four clicks using the LLM-powered automation pipeline.</p> + <p>Follow the <a href="#help-starter" data-help-jump="starter">Starter Guide</a> — build a full graph viewer in four clicks using the LLM-powered automation pipeline.</p> </div> </div> <div class="col-md-6"> @@ -96,14 +96,14 @@ <h4 class="mt-4"><i class="bi bi-diagram-3 me-2"></i>The OntoBricks pipeline</h4 <div class="help-step-arrow"><i class="bi bi-arrow-right"></i></div> <div class="help-step"><span class="help-step-num">4</span><div><strong>Mapping</strong><br><small>Map ontology to UC tables (R2RML)</small></div></div> <div class="help-step-arrow"><i class="bi bi-arrow-right"></i></div> - <div class="help-step"><span class="help-step-num">5</span><div><strong>Digital Twin</strong><br><small>Synchronize, explore, query</small></div></div> + <div class="help-step"><span class="help-step-num">5</span><div><strong>Knowledge Graph</strong><br><small>Synchronize, explore, query</small></div></div> </div> </section> <!-- STARTER GUIDE --> <section class="help-section" id="help-starter" data-help-section-panel="starter"> - <h2><i class="bi bi-rocket-takeoff me-2"></i>Starter Guide — Build a Digital Twin in 4 Clicks</h2> - <p class="text-muted">OntoBricks can generate an end-to-end knowledge graph from your Databricks tables using LLM-powered automation. Here is the fastest path from zero to a queryable graph.</p> + <h2><i class="bi bi-rocket-takeoff me-2"></i>Starter Guide — Build a Knowledge Graph in 4 Clicks</h2> + <p class="text-muted">OntoBricks can generate an end-to-end graph viewer from your Databricks tables using LLM-powered automation. Here is the fastest path from zero to a queryable graph.</p> <h5 class="mt-4"><i class="bi bi-check2-circle me-2"></i>Prerequisites</h5> <ul> @@ -146,14 +146,14 @@ <h5><i class="bi bi-magic me-2"></i>Generate the Ontology</h5> <div class="help-step-badge">4</div> <div> <h5><i class="bi bi-shuffle me-2"></i>Map your data & Sync</h5> - <p>Open <strong>Mapping</strong> to connect your ontology to Databricks tables. You can either <strong>map manually</strong> using the <em>Designer</em> or <em>Manual</em> views (click each entity / relationship, write or tweak the SQL, assign columns), or <strong>let an agent do it for you</strong> via <em>Auto-Map</em> → <em>Start Auto-Map</em>. Once mappings are in place, go to <strong>Digital Twin → Sync</strong> and click <em>Synchronize</em> — triples are materialized into your triple store.</p> + <p>Open <strong>Mapping</strong> to connect your ontology to Databricks tables. You can either <strong>map manually</strong> using the <em>Designer</em> or <em>Manual</em> views (click each entity / relationship, write or tweak the SQL, assign columns), or <strong>let an agent do it for you</strong> via <em>Auto-Map</em> → <em>Start Auto-Map</em>. Once mappings are in place, go to <strong>Knowledge Graph → Sync</strong> and click <em>Synchronize</em> — triples are materialized into your triple store.</p> </div> </div> <div class="help-step-card"> <div class="help-step-badge"><i class="bi bi-check2"></i></div> <div> <h5><i class="bi bi-eye me-2"></i>Explore</h5> - <p>Head to <strong>Digital Twin → Knowledge Graph</strong> to browse your data as an interactive graph, or use <strong>GraphQL</strong> for programmatic access.</p> + <p>Head to <strong>Knowledge Graph → Graph Viewer</strong> to browse your data as an interactive graph, or use <strong>GraphQL</strong> for programmatic access.</p> </div> </div> </div> @@ -183,7 +183,7 @@ <h2 class="accordion-header"> <li><strong>Browse</strong> — list and open existing domains</li> <li><strong>New Domain</strong> (navbar) — create a fresh domain</li> <li><strong>Load Domain</strong> (navbar) — open an existing domain from UC</li> - <li><strong>Bridges</strong> — cross-domain links that allow navigating from one knowledge graph to another</li> + <li><strong>Bridges</strong> — cross-domain links that allow navigating from one graph viewer to another</li> <li><strong>Schedule</strong> — automation / recurring sync jobs</li> <li><strong>API</strong> — REST API reference for developers</li> <li><strong>Registry Location</strong> — UC Volume where domains are persisted</li> @@ -266,18 +266,18 @@ <h2 class="accordion-header"> </div> </div> - <!-- Digital Twin --> + <!-- Knowledge Graph --> <div class="accordion-item"> <h2 class="accordion-header"> <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#hw5"> - <i class="bi bi-box-fill me-2"></i><strong>5. Digital Twin</strong> — materialize & explore + <i class="bi bi-box-fill me-2"></i><strong>5. Knowledge Graph</strong> — materialize & explore </button> </h2> <div id="hw5" class="accordion-collapse collapse" data-bs-parent="#helpWorkflowAccordion"> <div class="accordion-body"> <ul> <li><strong>Overview</strong> — insight dashboard: entity counts, relationship counts, last sync timestamp, quality status</li> - <li><strong>Knowledge Graph</strong> — interactive sigma.js WebGL graph. Search, filter, detect clusters (Louvain / Label Propagation / Greedy Modularity), color-by-cluster, collapse into super-nodes</li> + <li><strong>Graph Viewer</strong> — interactive sigma.js WebGL graph. Search, filter, detect clusters (Louvain / Label Propagation / Greedy Modularity), color-by-cluster, collapse into super-nodes</li> <li><strong>GraphQL</strong> — auto-generated GraphQL playground for programmatic access</li> <li><strong>Data Quality</strong> — run SHACL / constraint validation against the triple store</li> <li><strong>Inference</strong> — OWL 2 RL & SWRL reasoning on Delta / Lakebase (SQL)</li> @@ -304,7 +304,7 @@ <h5>AI Assistant</h5> <div class="col-md-6"> <div class="help-feature"> <div class="help-feature-icon"><i class="bi bi-layers-half"></i></div> - <h5>Interactive Knowledge Graph</h5> + <h5>Interactive Graph Viewer</h5> <p>Two-phase search, configurable depth, cross-domain bridges, cluster detection (client-side Graphology / server-side NetworkX), color-by-cluster, super-nodes.</p> </div> </div> @@ -312,7 +312,7 @@ <h5>Interactive Knowledge Graph</h5> <div class="help-feature"> <div class="help-feature-icon"><i class="bi bi-bar-chart-line"></i></div> <h5>Dashboard embedding</h5> - <p>Assign a Databricks dashboard to an entity type; parameters are auto-populated from entity attributes when viewed in the Digital Twin.</p> + <p>Assign a Databricks dashboard to an entity type; parameters are auto-populated from entity attributes when viewed in the Knowledge Graph.</p> </div> </div> <div class="col-md-6"> @@ -340,7 +340,7 @@ <h5>Cross-domain Bridges</h5> <div class="help-feature"> <div class="help-feature-icon"><i class="bi bi-plug"></i></div> <h5>MCP Integration</h5> - <p>Expose the knowledge graph to LLM agents through the Model Context Protocol. Deploy the companion <code>mcp-ontobricks</code> app and connect from Cursor, Claude Desktop or the Databricks Playground.</p> + <p>Expose the graph viewer to LLM agents through the Model Context Protocol. Deploy the companion <code>mcp-ontobricks</code> app and connect from Cursor, Claude Desktop or the Databricks Playground.</p> </div> </div> <div class="col-md-6"> @@ -364,7 +364,7 @@ <h2 class="accordion-header"><button class="accordion-button collapsed" type="bu </div> <div class="accordion-item"> <h2 class="accordion-header"><button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#faq2">Do I have to write OWL or SPARQL by hand?</button></h2> - <div id="faq2" class="accordion-collapse collapse" data-bs-parent="#helpFaqAccordion"><div class="accordion-body">No. The visual <em>Model</em> designer and the <em>AI Wizard</em> generate OWL automatically. For querying, use the <strong>GraphQL</strong> endpoint or the interactive Knowledge Graph — SPARQL is optional.</div></div> + <div id="faq2" class="accordion-collapse collapse" data-bs-parent="#helpFaqAccordion"><div class="accordion-body">No. The visual <em>Model</em> designer and the <em>AI Wizard</em> generate OWL automatically. For querying, use the <strong>GraphQL</strong> endpoint or the interactive Graph Viewer — SPARQL is optional.</div></div> </div> <div class="accordion-item"> <h2 class="accordion-header"><button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#faq3">Which triple store backends are supported?</button></h2> @@ -372,7 +372,7 @@ <h2 class="accordion-header"><button class="accordion-button collapsed" type="bu </div> <div class="accordion-item"> <h2 class="accordion-header"><button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#faq4">Why do I see grey/disabled menu items?</button></h2> - <div id="faq4" class="accordion-collapse collapse" data-bs-parent="#helpFaqAccordion"><div class="accordion-body">Many features require a <em>saved domain</em>. Create/load a domain from the Registry, then save it (<kbd>Cmd/Ctrl+S</kbd>). Ontology, Mapping and Digital Twin then become enabled.</div></div> + <div id="faq4" class="accordion-collapse collapse" data-bs-parent="#helpFaqAccordion"><div class="accordion-body">Many features require a <em>saved domain</em>. Create/load a domain from the Registry, then save it (<kbd>Cmd/Ctrl+S</kbd>). Ontology, Mapping and Knowledge Graph then become enabled.</div></div> </div> <div class="accordion-item"> <h2 class="accordion-header"><button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#faq5">Auto-Map is running — can I leave the page?</button></h2> @@ -392,7 +392,7 @@ <h2 class="accordion-header"><button class="accordion-button collapsed" type="bu </div> <div class="accordion-item"> <h2 class="accordion-header"><button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#faq9">How are bridges between domains defined?</button></h2> - <div id="faq9" class="accordion-collapse collapse" data-bs-parent="#helpFaqAccordion"><div class="accordion-body">Go to <strong>Registry → Bridges</strong> to declare cross-domain links. In the Knowledge Graph, right-clicking an entity exposes available bridges; clicking one switches domains and focuses the target entity.</div></div> + <div id="faq9" class="accordion-collapse collapse" data-bs-parent="#helpFaqAccordion"><div class="accordion-body">Go to <strong>Registry → Bridges</strong> to declare cross-domain links. In the Graph Viewer, right-clicking an entity exposes available bridges; clicking one switches domains and focuses the target entity.</div></div> </div> <div class="accordion-item"> <h2 class="accordion-header"><button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#faq10">Is CSRF protection enabled?</button></h2> @@ -445,7 +445,7 @@ <h2><i class="bi bi-keyboard me-2"></i>Keyboard Shortcuts</h2> <tr><td><kbd>←</kbd> / <kbd>→</kbd></td><td>Back / Forward in breadcrumb navigation</td></tr> </tbody> </table> - <h5 class="mt-4">Graph interactions (Knowledge Graph / Model)</h5> + <h5 class="mt-4">Graph interactions (Graph Viewer / Model)</h5> <table class="table table-sm table-striped help-table"> <tbody> <tr><td>Scroll</td><td>Zoom in/out</td></tr> @@ -470,12 +470,12 @@ <h2><i class="bi bi-book me-2"></i>Glossary</h2> <dt>R2RML</dt><dd>W3C standard for mapping relational data (SQL tables) to RDF triples.</dd> <dt>SHACL</dt><dd>W3C Shapes Constraint Language — used for data quality validation.</dd> <dt>SWRL</dt><dd>Semantic Web Rule Language — “IF ... THEN ...” inference rules.</dd> - <dt>Digital Twin</dt><dd>A materialized, queryable knowledge graph representation of your Databricks data.</dd> + <dt>Knowledge Graph</dt><dd>A materialized, queryable graph representation of your Databricks data, built from your ontology and mappings.</dd> <dt>Bridge</dt><dd>Cross-domain link between entities of two different domains.</dd> <dt>Triple Store</dt><dd>Backend where triples are physically stored (Delta tables in Unity Catalog).</dd> <dt>Graph DB</dt><dd>Engine that exposes the triples for graph queries and reasoning (currently Lakebase Postgres).</dd> <dt>Unity Catalog (UC)</dt><dd>Databricks unified governance for catalogs, schemas, tables and volumes.</dd> - <dt>MCP</dt><dd>Model Context Protocol — exposes the knowledge graph to LLM agents.</dd> + <dt>MCP</dt><dd>Model Context Protocol — exposes the graph viewer to LLM agents.</dd> </dl> </section> diff --git a/src/front/templates/partials/mapping/_mapping_diagnostics.html b/src/front/templates/partials/mapping/_mapping_diagnostics.html index f56f8d44..9db30bc8 100644 --- a/src/front/templates/partials/mapping/_mapping_diagnostics.html +++ b/src/front/templates/partials/mapping/_mapping_diagnostics.html @@ -5,7 +5,7 @@ <div class="section-header d-flex justify-content-between align-items-center mb-4"> <div class="me-auto"> <h4 class="mb-1"><i class="bi bi-shield-check me-2"></i>Mapping Diagnostics</h4> - <p class="text-muted mb-0 small">Validate entity and relationship mappings before building the Digital Twin</p> + <p class="text-muted mb-0 small">Validate entity and relationship mappings before building the Knowledge Graph</p> </div> <button type="button" class="btn btn-sm btn-primary me-2" id="runDiagnosticsBtn"> <i class="bi bi-play-circle me-1"></i> Run Diagnostics diff --git a/src/front/templates/partials/ontology/_ontology_cohorts.html b/src/front/templates/partials/ontology/_ontology_cohorts.html index eff15096..464859e4 100644 --- a/src/front/templates/partials/ontology/_ontology_cohorts.html +++ b/src/front/templates/partials/ontology/_ontology_cohorts.html @@ -2,7 +2,7 @@ Cohort Discovery — DESIGN page (Ontology > Advanced > Cohorts). Lets the SA design rules via the Build form (steps 1–5) → save. - Execution and results live in the Digital Twin's Cohorts section. + Execution and results live in the Knowledge Graph's Cohorts section. --> <div class="content-section"> <div class="section-header d-flex justify-content-between align-items-center mb-4"> @@ -10,7 +10,7 @@ <h4 class="mb-1"><i class="bi bi-people-fill me-2"></i>Cohorts</h4> <p class="text-muted mb-0 small"> Design constraint-based grouping rules — preview & execute from - <em>Digital Twin → Cohorts</em><br> + <em>Knowledge Graph → Cohorts</em><br> <i class="bi bi-folder2-open"></i> Domain: <code class="text-primary">{{ domain_name }}</code> <span class="badge bg-secondary bg-opacity-50 cohort-fs-tiny">v{{ current_version }}</span> diff --git a/src/front/templates/partials/ontology/_ontology_design.html b/src/front/templates/partials/ontology/_ontology_design.html index 7673bb35..2007889e 100644 --- a/src/front/templates/partials/ontology/_ontology_design.html +++ b/src/front/templates/partials/ontology/_ontology_design.html @@ -42,7 +42,7 @@ <h4 class="mb-1"><i class="bi bi-diagram-3 me-2"></i>Visual Ontology Designer - </button> <span class="text-muted">|</span> <button type="button" class="btn btn-sm btn-outline-warning" id="createGroupFromViewBtn" - onclick="createGroupFromView()" title="Create a Knowledge Graph group from this view's entities"> + onclick="createGroupFromView()" title="Create a Graph Viewer group from this view's entities"> <i class="bi bi-collection me-1"></i>Create Group </button> </div> diff --git a/src/front/templates/partials/ontology/_ontology_groups.html b/src/front/templates/partials/ontology/_ontology_groups.html index a39019c7..5a89855c 100644 --- a/src/front/templates/partials/ontology/_ontology_groups.html +++ b/src/front/templates/partials/ontology/_ontology_groups.html @@ -6,7 +6,7 @@ <div> <h4 class="mb-1"><i class="bi bi-collection me-2"></i>Entity Groups</h4> <p class="text-muted mb-0 small"> - Group ontology classes for expand/collapse in the Knowledge Graph. + Group ontology classes for expand/collapse in the Graph Viewer. Groups are modeled as OWL defined classes (<code>owl:equivalentClass</code> + <code>owl:unionOf</code>). </p> </div> @@ -26,7 +26,7 @@ <h4 class="mb-1"><i class="bi bi-collection me-2"></i>Entity Groups</h4> <div class="col-12 text-center text-muted py-5" id="groupsEmptyState"> <i class="bi bi-collection fs-2"></i> <p class="mt-2 mb-0">No groups defined yet.</p> - <p class="small">Create a group to organize related entities for visual clustering in the Digital Twin.</p> + <p class="small">Create a group to organize related entities for visual clustering in the Knowledge Graph.</p> </div> </div> diff --git a/src/front/templates/partials/registry/_registry_build_analytics.html b/src/front/templates/partials/registry/_registry_build_analytics.html index a8bfac75..69a3a8f2 100644 --- a/src/front/templates/partials/registry/_registry_build_analytics.html +++ b/src/front/templates/partials/registry/_registry_build_analytics.html @@ -4,7 +4,7 @@ <div> <h4 class="mb-1"><i class="bi bi-bar-chart me-2"></i>Build Analytics</h4> <p class="text-muted mb-0 small"> - Per-domain Digital Twin build history and statistics across every run + Per-domain Knowledge Graph build history and statistics across every run </p> </div> <div class="d-flex gap-2"> diff --git a/src/front/templates/partials/registry/_registry_schedule.html b/src/front/templates/partials/registry/_registry_schedule.html index 049cbfb0..b176299b 100644 --- a/src/front/templates/partials/registry/_registry_schedule.html +++ b/src/front/templates/partials/registry/_registry_schedule.html @@ -4,7 +4,7 @@ <div> <h4 class="mb-1"><i class="bi bi-clock-history me-2"></i>Scheduler</h4> <p class="text-muted mb-0 small"> - Recurring Digital Twin builds and Cohort materialisations per domain + Recurring Knowledge Graph builds and Cohort materialisations per domain </p> </div> <div class="d-flex gap-2"> @@ -40,7 +40,7 @@ <h6 class="modal-title" id="scheduleModalLabel"> <div class="btn-group w-100" role="group" aria-label="Schedule type" id="scheduleTypeGroup"> <input type="radio" class="btn-check" name="scheduleType" id="scheduleTypeBuild" value="build" autocomplete="off" checked> <label class="btn btn-outline-primary btn-sm" for="scheduleTypeBuild"> - <i class="bi bi-diagram-3 me-1"></i> Digital Twin Build + <i class="bi bi-diagram-3 me-1"></i> Knowledge Graph Build </label> <input type="radio" class="btn-check" name="scheduleType" id="scheduleTypeCohort" value="cohort" autocomplete="off"> diff --git a/src/front/templates/settings.html b/src/front/templates/settings.html index e60dccde..af1b3679 100644 --- a/src/front/templates/settings.html +++ b/src/front/templates/settings.html @@ -106,7 +106,7 @@ <h4 class="mb-1"><i class="bi bi-sliders me-2"></i>Triple store — Global</h4> <option value="lakebase">Lakebase (Postgres)</option> </select> <small class="text-muted d-block mt-2"> - Selects the graph database engine used for building and querying knowledge graphs. + Selects the graph database engine used for building and querying graph viewers. <strong>Save</strong> at the top persists the choice. </small> </div> @@ -618,7 +618,7 @@ <h4 class="mb-1"><i class="bi bi-sliders me-2"></i>Global</h4> <div class="mb-0"> <label class="form-label fw-semibold"><i class="bi bi-code-square me-1"></i> API Documentation</label> - <p class="small text-muted mb-2">External API: REST <code>/api/v1/*</code>, domains <code>/api/v1/domains</code> and <code>/api/v1/domain/*</code> (versions, design status, OWL, R2RML, Spark SQL), Digital Twin <code>/api/v1/digitaltwin/*</code>, GraphQL <code>/api/v1/graphql/*</code>. In-app GraphQL also lives under <code>/graphql</code>. Other JSON routes are documented under <a href="/docs" target="_blank">/docs</a>.</p> + <p class="small text-muted mb-2">External API: REST <code>/api/v1/*</code>, domains <code>/api/v1/domains</code> and <code>/api/v1/domain/*</code> (versions, design status, OWL, R2RML, Spark SQL), Knowledge Graph <code>/api/v1/digitaltwin/*</code>, GraphQL <code>/api/v1/graphql/*</code>. In-app GraphQL also lives under <code>/graphql</code>. Other JSON routes are documented under <a href="/docs" target="_blank">/docs</a>.</p> <div class="d-flex gap-2 flex-wrap"> <a href="/api/docs" target="_blank" class="btn btn-sm btn-outline-primary"> <i class="bi bi-file-earmark-code me-1"></i> Swagger UI diff --git a/src/mcp-server/app.yaml b/src/mcp-server/app.yaml index 0d398522..f3d4a6bc 100644 --- a/src/mcp-server/app.yaml +++ b/src/mcp-server/app.yaml @@ -1,5 +1,5 @@ # mcp-ontobricks — Custom MCP Server for OntoBricks -# Exposes Digital Twin knowledge graph tools to the Databricks Playground. +# Exposes Knowledge Graph graph viewer tools to the Databricks Playground. # Calls back to the main OntoBricks app REST API. # # ╔════════════════════════════════════════════════════════════════╗ diff --git a/src/mcp-server/server/app.py b/src/mcp-server/server/app.py index 51f78329..94a0c184 100644 --- a/src/mcp-server/server/app.py +++ b/src/mcp-server/server/app.py @@ -1,7 +1,7 @@ """ OntoBricks MCP Server -Exposes Domain registry metadata and Digital Twin triple-store capabilities +Exposes Domain registry metadata and Knowledge Graph triple-store capabilities as MCP tools and resources. HTTP calls target the OntoBricks **external REST** surface (``/api/v1/...``) and in-app GraphQL (``/graphql/...``). @@ -9,7 +9,7 @@ - **Domain** — ``GET /api/v1/domains``, ``/api/v1/domain/versions``, ``/api/v1/domain/design-status``, ``/api/v1/domain/ontology``, etc. -- **Digital Twin** — ``GET /api/v1/digitaltwin/registry``, ``status``, +- **Knowledge Graph** — ``GET /api/v1/digitaltwin/registry``, ``status``, ``stats``, ``triples/find``, build, quality, inference, … Workflow: @@ -18,7 +18,7 @@ versions and design readiness before heavy queries. 3. ``select_domain`` — choose which domain to work with. 4. ``list_entity_types`` / ``describe_entity`` / ``get_status`` — - query the selected domain's Digital Twin. + query the selected domain's Knowledge Graph. Three operating modes controlled by the ``mode`` argument: @@ -666,7 +666,7 @@ async def _load_ontology_labels(client: httpx.AsyncClient) -> None: mcp = FastMCP( "OntoBricks", instructions=( - "You are connected to OntoBricks: domain registry + Digital Twin " + "You are connected to OntoBricks: domain registry + Knowledge Graph " "(triple store) over external REST at /api/v1.\n\n" "Workflow:\n" "1. Call 'list_domains' to see available domains.\n" @@ -852,7 +852,7 @@ async def select_domain(domain_name: str) -> str: After calling ``list_domains`` to see what is available, call this tool with the exact domain name. All subsequent calls to ``list_entity_types``, ``describe_entity``, and ``get_status`` - will operate on this domain's Digital Twin. + will operate on this domain's Knowledge Graph. Args: domain_name: Exact domain name as shown by ``list_domains``. @@ -907,7 +907,7 @@ async def list_entity_types() -> str: return data.get("message", "Could not retrieve statistics.") lines: list[str] = [] - lines.append(f"Knowledge Graph — {_selected_domain['name']}") + lines.append(f"Graph Viewer — {_selected_domain['name']}") lines.append("=" * 40) inferred = data.get("inferred_triples", 0) lines.append(f"Total triples: {data.get('total_triples', 0):,}") diff --git a/src/shared/fastapi/health.py b/src/shared/fastapi/health.py index 7699a6da..ce2162f0 100644 --- a/src/shared/fastapi/health.py +++ b/src/shared/fastapi/health.py @@ -411,7 +411,7 @@ def _check_graphdb_lakebase(settings: Settings) -> Tuple[str, str]: return ( _WARNING, f"Graph DB connected (db={cur_db}) but schema '{schema}' does not exist yet — " - "run a Digital Twin build to create it", + "run a Knowledge Graph build to create it", ) except Exception as exc: # noqa: BLE001 return _ERROR, f"Graph DB probe failed (database={database or 'default'}, schema={schema}): {exc}" diff --git a/src/shared/fastapi/main.py b/src/shared/fastapi/main.py index d527f15c..340e71f4 100644 --- a/src/shared/fastapi/main.py +++ b/src/shared/fastapi/main.py @@ -65,7 +65,7 @@ API_DESCRIPTION = """ # OntoBricks API -**Knowledge Graph Builder for Databricks** +**Graph Viewer Builder for Databricks** OntoBricks enables you to build knowledge graphs from Databricks tables using ontologies and R2RML mappings. Design an ontology, map it to your data, and materialize triples @@ -76,7 +76,7 @@ - 🏗️ **Ontology Design** - Visual ontology editor with OWL export - 🔗 **Data Mapping** - Map ontology concepts to Databricks tables - 🔍 **SPARQL Queries** - Query data using W3C standard SPARQL -- 📊 **Digital Twin Knowledge Graph** - Interactive sigma.js WebGL graph exploration with SPARQL-based quality checks +- 📊 **Knowledge Graph Graph Viewer** - Interactive sigma.js WebGL graph exploration with SPARQL-based quality checks - 📦 **Domain Management** - Save/load domains to Unity Catalog volumes - 🔮 **GraphQL API** - Auto-generated typed schema from ontology with nested entity traversal diff --git a/tests/e2e/dtwin/test_dtwin_api_flows.py b/tests/e2e/dtwin/test_dtwin_api_flows.py index 9753b63e..0e813a7a 100644 --- a/tests/e2e/dtwin/test_dtwin_api_flows.py +++ b/tests/e2e/dtwin/test_dtwin_api_flows.py @@ -1,7 +1,7 @@ """ -E2E — Digital Twin internal API (/dtwin/…). +E2E — Knowledge Graph internal API (/dtwin/…). -Covers read + write API endpoints that the Digital Twin page uses for +Covers read + write API endpoints that the Knowledge Graph page uses for syncing, querying, and running analytics on the knowledge graph. In the test harness the graph store is empty (no Databricks backend), diff --git a/tests/e2e/dtwin/test_dtwin_flows.py b/tests/e2e/dtwin/test_dtwin_flows.py index 61706ac2..70f4c5df 100644 --- a/tests/e2e/dtwin/test_dtwin_flows.py +++ b/tests/e2e/dtwin/test_dtwin_flows.py @@ -1,5 +1,5 @@ """ -E2E — Digital Twin page. +E2E — Knowledge Graph page. Merges two previously separate test files: @@ -25,7 +25,7 @@ class TestDigitalTwinSidebar: - """Basic structural checks for the Digital Twin page.""" + """Basic structural checks for the Knowledge Graph page.""" def test_sigmagraph_section_visible_by_default(self, page, live_server): page.goto(f"{live_server}/dtwin/") diff --git a/tests/e2e/navigation/test_navigation_flows.py b/tests/e2e/navigation/test_navigation_flows.py index 462e52e5..0cc07e27 100644 --- a/tests/e2e/navigation/test_navigation_flows.py +++ b/tests/e2e/navigation/test_navigation_flows.py @@ -27,7 +27,7 @@ def test_home_loads(self, page, live_server): ("/ontology", "Ontology"), ("/mapping", "Mapping"), ("/domain", "Domain"), - ("/dtwin/", "Digital Twin"), + ("/dtwin/", "Knowledge Graph"), ("/about", "About"), ], ) diff --git a/tests/units/api/test_ui_rendering.py b/tests/units/api/test_ui_rendering.py index c490c5a9..c03a9bd7 100644 --- a/tests/units/api/test_ui_rendering.py +++ b/tests/units/api/test_ui_rendering.py @@ -430,7 +430,7 @@ def test_collaboration_section_assets_loaded(self, client): class TestDigitalTwinPage: def test_title(self, client): html = _html(client, "/dtwin/") - assert "Digital Twin" in _title_text(html) + assert "Knowledge Graph" in _title_text(html) def test_sidebar_present(self, client): html = _html(client, "/dtwin/") diff --git a/tests/units/dtwin/test_digitaltwin_api.py b/tests/units/dtwin/test_digitaltwin_api.py index 27041b65..3db866e5 100644 --- a/tests/units/dtwin/test_digitaltwin_api.py +++ b/tests/units/dtwin/test_digitaltwin_api.py @@ -1,4 +1,4 @@ -"""Tests for the Digital Twin API module (api.routers.digitaltwin). +"""Tests for the Knowledge Graph API module (api.routers.digitaltwin). Covers helper functions, Pydantic models, and endpoint behavior with mocked dependencies. From 6227628b4b139db328d7ed8408fe1e03616b98e9 Mon Sep 17 00:00:00 2001 From: Benoit Cayla <benoit.cayla+data@databricks.com> Date: Tue, 23 Jun 2026 11:18:59 +0200 Subject: [PATCH 48/54] feat: two-level navbar, inline breadcrumb, new-domain popup, and nav gating - Add L2 subnav (#obSubnav) with Domain / Ontology / Mapping / KG dropdowns, inline breadcrumb, and Save Domain button; hidden until a domain is loaded (hasDomain) - Breadcrumb moved into the L2 subnav row as a flex <li>; no longer a standalone <nav>; icons removed, italic 0.65rem style - Save Domain button relocated from Domain Information page to L2 subnav (#menuSaveDomain); click delegation moved to document.body so it fires outside #navbarNav - domainNew() replaced with showNewDomainDialog() popup (name + description + LLM endpoint) followed by automatic UC save dialog - L1 Domain link (#domainL1Link) disabled (.ob-nav-disabled) when no domain loaded; L2 tab toggles unlocked by hasDomain, not hasRegistry - updateMenusForDomainStatus() now driven by hasDomain so all domain sub-pages are accessible as soon as a domain is open in session - New Domain button added to home page All Domains section - Fix recursive_delete treating a 404 UC directory as an error, causing spurious "partially deleted" on domains with no UC files - Update .cursor/11-frontend-design.mdc with new two-level nav and breadcrumb architecture, gating rules, and component catalog entries --- .cursor/11-frontend-design.mdc | 153 ++++++++--- .../v0.6.0/benoitcayladbx_2026-06-23.log | 213 ++++++++++++---- src/back/objects/registry/RegistryService.py | 4 + src/front/config/menu_config.json | 1 + src/front/static/domain/js/domain-actions.js | 2 +- src/front/static/global/css/main.css | 239 +++++++++++++++++- .../static/global/js/base-ui-handlers.js | 6 +- src/front/static/global/js/breadcrumb.js | 41 ++- src/front/static/global/js/navbar.js | 117 ++++++--- src/front/static/global/js/utils.js | 120 +++++++++ src/front/templates/base.html | 189 ++++++++++---- src/front/templates/home.html | 7 +- .../partials/domain/_domain_information.html | 13 +- tests/units/api/test_ui_rendering.py | 25 +- 14 files changed, 917 insertions(+), 213 deletions(-) diff --git a/.cursor/11-frontend-design.mdc b/.cursor/11-frontend-design.mdc index 125e9929..6e793928 100644 --- a/.cursor/11-frontend-design.mdc +++ b/.cursor/11-frontend-design.mdc @@ -91,8 +91,10 @@ the entire app chrome — never duplicate or substitute any of it: | Element | Provided by `base.html` | Don't reimplement | |---------|-------------------------|-------------------| -| Navbar (top) | `<nav class="navbar navbar-expand-lg navbar-dark">` driven by `menu_config.json` | a custom top bar | -| Breadcrumb | `#obBreadcrumb` / `.ob-breadcrumb`, populated by `breadcrumb.js` | a per-page breadcrumb | +| L1 navbar (top) | `<nav class="navbar navbar-expand-lg navbar-dark">` driven by `menu_config.json` | a custom top bar | +| L2 subnav | `<nav id="obSubnav" class="ob-subnav">` — hidden until a domain is loaded (`hasDomain`), contains Domain / Ontology / Mapping / KG dropdowns + breadcrumb + Save Domain button | a second nav element | +| Breadcrumb | `#obBreadcrumb` inside `#obBreadcrumbWrap` (`<li>` in the L2 subnav row), populated by `breadcrumb.js` | a per-page breadcrumb | +| Save Domain button | `#menuSaveDomain` (`.ob-subnav-save-btn`) in the right side of the L2 subnav | a per-page save button | | Domain loading overlay | `#domainLoadingOverlay` / `.domain-loading-overlay` | another full-page spinner | | Notification Center dropdown | `#notifCenterDropdown` (bell) | a per-page notif list | | Task Tracker dropdown | `#taskTrackerDropdown` (hourglass) | a per-page task panel | @@ -273,60 +275,120 @@ keyboard handling. - ❌ Adjusting `--ob-chrome-height` from page code — the breadcrumb computes it. +### Two-Level Navigation (L1 + L2 subnav) + +The app chrome has **two horizontal nav levels**, both provided by `base.html`. + +#### L1 Navbar + +- Standard Bootstrap `<nav class="navbar navbar-expand-lg">`. +- Shows: brand logo, Registry link, a `·` separator, a `›` path + separator, and the Domain link (`#domainL1Link`). +- `#domainL1Link` is disabled (`.ob-nav-disabled`, `pointer-events: none`) + when no domain is loaded. Do not enable it from page code. +- Other menus (Digital Twin) may be hidden via `"navbar_hidden": true` + in `menu_config.json`. + +#### L2 Subnav (`#obSubnav`) + +- `<nav id="obSubnav" class="ob-subnav d-none">` — hidden by default. +- Revealed by `updateDomainMenuVisibility(true)` in `navbar.js` when + `hasDomain` becomes true (domain has a name or content in session). +- Layout (left → right inside `.ob-subnav-nav`): + 1. **Domain dropdown** (`#subnavDomainDropdown`) — all domain sub-sections. + 2. A `.ob-subnav-divider`. + 3. **Ontology dropdown** (`#subnavOntologyDropdown`). + 4. **Mapping dropdown** (`#subnavMappingDropdown`). + 5. **Knowledge Graph dropdown** (`#subnavKgDropdown`). + 6. A `.ob-subnav-flex-spacer` (`flex: 1`) — always pushes the right group to the edge. + 7. **Breadcrumb** (`#obBreadcrumbWrap`) — hidden until >1 crumb. + 8. **Save Domain button** (`#menuSaveDomain`, `.ob-subnav-save-btn`). +- The three tab toggles (Ontology/Mapping/KG) do **not** carry + `nav-requires-domain`. They are enabled whenever the subnav is + visible. Specific dropdown items that truly need a UC-saved domain + keep `dropdown-requires-domain`. +- `--ob-chrome-height` = navbar height + subnav height (subnav already + contains the breadcrumb). Updated by `_updateChromeHeight()` in + `breadcrumb.js` and called from `updateDomainMenuVisibility`. + +**Tokens** + +| Level | Token | Value | +|-------|-------|-------| +| L1 navbar background | `--db-navbar-bg` | `#ECECEC` | +| L2 subnav background | `--db-subnav-bg` | `#F4F4F4` (lighter than L1) | +| Breadcrumb | white (page background) | n/a | + +**New Domain flow** + +`domainNew()` in `navbar.js`: +1. Opens `showNewDomainDialog()` (from `utils.js`) — collects name, + description, LLM endpoint. +2. POSTs `/domain/clear` then `/domain/info`. +3. Immediately opens `showDomainSaveDialog({ afterSave: '/domain/#information' })` + so the domain is registered in UC before navigation. + +`showNewDomainDialog()` is exposed as `window.showNewDomainDialog`. + +**Don'ts** + +- ❌ Adding a third nav level above or below these two. +- ❌ Toggling `#obSubnav` visibility from page code — it is controlled + exclusively by `updateDomainMenuVisibility` in `navbar.js`. +- ❌ Adding `nav-requires-domain` to the L2 tab toggles — the subnav + itself being hidden is the gate. Use `dropdown-requires-domain` on + items inside a dropdown that need UC. +- ❌ Moving the Save Domain button out of the L2 subnav. +- ❌ Manually setting `--ob-chrome-height` from page code. + ### Breadcrumb Behaviour & Style -The breadcrumb is owned by `global/js/breadcrumb.js` + the -`.ob-breadcrumb` styles in `global/css/components.css`. It is **not** +The breadcrumb is owned by `global/js/breadcrumb.js`. It is **not** configured per page — it is fully derived from the URL and the currently-active sidebar section. +**Location** + +The breadcrumb now lives **inside the L2 subnav row** as +`<li id="obBreadcrumbWrap" class="ob-subnav-item ob-subnav-breadcrumb-wrap d-none">`. +It is not a standalone `<nav>` below the navbar. `breadcrumb.js` +shows/hides `#obBreadcrumbWrap` (not `#obBreadcrumb`). + **Behaviour** -- The breadcrumb container `#obBreadcrumb` lives in `base.html` and is - hidden by default (`d-none`). `breadcrumb.js` auto-runs on - `DOMContentLoaded`, builds the crumbs and removes `d-none` only when - there is more than one crumb to show. Pages that never qualify - (e.g. home, about) keep it hidden — that is intentional, do not - force it. +- `breadcrumb.js` auto-runs on `DOMContentLoaded`, builds the crumbs + and removes `d-none` from `#obBreadcrumbWrap` only when there is + more than one crumb to show. - The route hierarchy is fixed in `breadcrumb.js`: Registry → Domain → Ontology → Mapping → Knowledge Graph (plus Settings as a flat entry). Adding a new top-level page means - extending `_ROUTE_MAP` and `_HIERARCHY` there — not patching - templates. + extending `_ROUTE_MAP` and `_HIERARCHY` — not patching templates. - The "Domain" crumb label is read from `#currentDomainName` (set by - the navbar) — do **not** add a separate fetch for the domain name. + the navbar). - The last crumb is the active sidebar section, updated live on every - `sidebarSectionChanged` event. Section labels come from the - sidebar's `.nav-label` text, so renaming a sidebar item - automatically renames the breadcrumb crumb. -- After rendering, `breadcrumb.js` writes the total chrome height - (navbar + breadcrumb) into the CSS variable `--ob-chrome-height`, - which `.sidebar-layout` reads to compute the available viewport - height. **Don't set this variable from anywhere else.** + `sidebarSectionChanged` event. +- `breadcrumb.js` exposes itself as `window.OBBreadcrumb` so + `navbar.js` can call `OBBreadcrumb._updateChromeHeight()` after the + subnav appears/disappears. +- `--ob-chrome-height` = navbar height + subnav height (breadcrumb is + inside the subnav, so no separate measurement). **Don't set this + variable from anywhere else.** **Style** -- Container: `.ob-breadcrumb` — `0.35rem 1rem` padding, light - background (`var(--bs-light, #f8f9fa)`), bottom border - (`var(--bs-border-color, #dee2e6)`), font-size `0.8rem`. -- Separator: Bootstrap-icons chevron (`\F285`) at `0.65rem`. Do not - switch to `/`, `>`, or any other glyph. -- Links: `var(--bs-secondary)`, no underline; underline only on - `:hover`. -- Active crumb (last item): `var(--bs-body-color)`, weight 500, no - link. -- Each crumb prefixes its label with a Bootstrap icon (`bi-...`). - Keep icons consistent with the corresponding sidebar entry. +- Inline in the subnav row: `font-size: 0.65rem`, italic, no icons, + muted colour, left border separator. +- Active crumb: `--db-text`, weight 500. +- Links: `--db-text-muted`, no underline; underline on `:hover`. **Don'ts** - ❌ Manually mutating `#obBreadcrumbList` from page JS. Use the `_ROUTE_MAP` extension or rely on `sidebarSectionChanged`. -- ❌ Adding a per-page breadcrumb (`<nav class="breadcrumb">`) — the - global one is the only one allowed. -- ❌ Changing the separator, font-size, or padding per page. -- ❌ Forcing the breadcrumb visible on a single-crumb page just to - display a title — use `.page-header` instead. +- ❌ Adding a per-page breadcrumb — the global one is the only one allowed. +- ❌ Toggling `#obBreadcrumb` or `#obBreadcrumbWrap` from page code. +- ❌ Forcing the breadcrumb visible on a single-crumb page — use + `.page-header` instead. ### Section / Partial Conventions @@ -644,8 +706,13 @@ These already exist; reuse before reinventing. *Loading Spinners* for the full contract. - **Page-level loading overlay** — `.domain-loading-overlay` already wired in `base.html` as `#domainLoadingOverlay`. Toggle via `.d-none`. -- **Breadcrumb** — `.ob-breadcrumb` driven by `breadcrumb.js`; do not - build a parallel breadcrumb. +- **Breadcrumb** — `#obBreadcrumbWrap` (`<li>` inside `#obSubnav`), + driven by `breadcrumb.js`; do not build a parallel breadcrumb. +- **Save Domain button** — `#menuSaveDomain` (`.ob-subnav-save-btn`) in the + L2 subnav. Enabled/disabled by `updateVersionStatus()` in + `domain-actions.js`. Do not add a second Save button on a page. +- **New Domain dialog** — `showNewDomainDialog()` (from `utils.js`). Returns + `{ name, description, llm_endpoint }` or `null`. - **Tabs** — `.nav.nav-tabs.ob-tabs` (flat-underline). One shared visual treatment defined in `components.css`; see *Tabs (`.ob-tabs`) — flat-underline style* above for the canonical @@ -927,10 +994,16 @@ src/front/static/ `sidebarSectionChanged` event or `onBeforeSectionChange` hook. - ❌ Setting `style.display` on `.sidebar-section` directly — toggle the `.active` class via `SidebarNav.switchTo(...)`. -- ❌ Writing `--ob-chrome-height` from page code — that's the - breadcrumb's responsibility. +- ❌ Writing `--ob-chrome-height` from page code — `breadcrumb.js` / + `updateDomainMenuVisibility` own it. - ❌ A custom per-page breadcrumb. Extend `_ROUTE_MAP` in `breadcrumb.js` instead. +- ❌ Toggling `#obSubnav` or `#obBreadcrumbWrap` from page code. +- ❌ Adding `nav-requires-domain` to L2 subnav tab toggles — use + `dropdown-requires-domain` on individual items instead. +- ❌ A Save Domain button anywhere outside `#obSubnav`. +- ❌ Calling `alert()` / `prompt()` for new-domain input — use + `showNewDomainDialog()` from `utils.js`. - ❌ Bare `<ul class="nav nav-tabs">` (no `ob-tabs`), pill tabs, or per-area redeclaration of `.nav-link` / `.nav-link.active` styles. All tab nav uses the shared `ob-tabs` flat-underline diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log index 0a8a8467..a45d6424 100644 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log @@ -1,50 +1,177 @@ -## UI Rename: Digital Twin → Knowledge Graph / Knowledge Graph → Graph Viewer +## Two-level navbar — feature/two-level-navbar ### Context -User-facing rename of two main navigation labels to better reflect their purpose: -- The top-level menu section "Digital Twin" is now "Knowledge Graph". -- The sigma.js graph viewer sub-item (formerly "Knowledge Graph") is now "Graph Viewer". +Restructure the top navigation bar into two horizontal levels to improve +discoverability and reduce cognitive load. Level 1 (top) surfaces the global +Registry and the active domain name. Level 2 (below) exposes the three +design/query areas (Ontology, Mapping, Knowledge Graph) as persistent tabs, +plus a Domain dropdown for all domain management sub-pages. -Internal code identifiers (`digitaltwin`, `dtwin`, `DigitalTwin`, routes `/dtwin/`) are unchanged. +### Changes +1. `src/front/config/menu_config.json` — added `navbar_hidden: true` to the + `digitaltwin` menu entry so Knowledge Graph no longer renders as an L1 dropdown. +2. `src/front/templates/base.html` + - Removed all `<li class="nav-item nav-chevron">` separator elements from + the L1 navbar loop. + - Changed the Domain menu item in L1 from a dropdown to a plain `<a>` link + (`id="domainL1Link"`), showing `currentDomainName` and linking to `/domain/`. + - Added a new `<nav id="obSubnav" class="ob-subnav">` below the main `<nav>`, + driven by Jinja lookups into `menu_config.menus`. Contains: + Ontology link, Mapping link, Knowledge Graph link (all with + `data-subnav-route` for JS active-state), a visual divider, and a Domain + dropdown (all domain groups except `domain-design`, plus the Save Domain + action and `id="domainSectionName"` / `id="menuSaveDomain"`). +3. `src/front/static/global/css/main.css` + - Removed `.navbar .nav-chevron` and `.navbar .nav-chevron svg` rule blocks. + - Added full `.ob-subnav` component styles: background, border, flex nav, + `.ob-subnav-link` with hover/active/disabled states, dropdown overrides, + and `.ob-subnav-divider`. +4. `src/front/static/global/js/breadcrumb.js` + - `_updateChromeHeight()` now reads actual `nav.navbar`, `#obSubnav`, and + `#obBreadcrumb` heights from the DOM instead of hard-coding 60 px. + - `init()` calls `_updateChromeHeight()` unconditionally (before the + early-return on ≤1 crumbs) so sidebar layout is always correct. +5. `src/front/static/global/js/navbar.js` + - Added `initSubnavActiveState()`: marks the `.ob-subnav-link` whose + `data-subnav-route` matches the current `window.location.pathname` as + `.active` on page load. + - `initNavbar()` now calls `initSubnavActiveState()`. +6. `tests/units/api/test_ui_rendering.py` + - Replaced `test_navbar_has_domain_dropdown` (checked `id="domainDropdown"`) + with `test_navbar_has_domain_l1_link` (checks `id="domainL1Link"`). + - Replaced `test_navbar_has_digital_twin_dropdown` (checked + `id="digitaltwinDropdown"`) with `test_subnav_has_domain_dropdown` and + `test_subnav_has_knowledge_graph_link`. + +### Modified files +- src/front/config/menu_config.json +- src/front/templates/base.html +- src/front/static/global/css/main.css +- src/front/static/global/js/breadcrumb.js +- src/front/static/global/js/navbar.js +- tests/units/api/test_ui_rendering.py + +### Test result +2419 passed, 15 skipped — all green. + +--- + +## L2 subnav — Ontology / Mapping / KG now have submenus + +### Context +Follow-up to the two-level navbar change. The three area tabs in the L2 +subnav (Ontology, Mapping, Knowledge Graph) were plain links; they now +render as dropdown menus exposing their section groups directly from the +subnav, consistent with the Domain dropdown already in place. ### Changes +1. `src/front/templates/base.html` — each of the three L2 subnav items + (`ontology_m`, `mapping_m`, `kg_m`) is now a `dropdown` `<li>` with + a `data-bs-toggle="dropdown"` toggle (ids: `subnavOntologyDropdown`, + `subnavMappingDropdown`, `subnavKgDropdown`). The dropdown menu renders + all non-`sidebar_only` groups and their items, linking to + `[route]?section=[id]`. `hidden_in_view_mode` and `dropdown-requires-domain` + gating is preserved per item. `data-subnav-route` is kept on the toggle + `<a>` for the URL-based active-state logic. +2. `tests/units/api/test_ui_rendering.py` — `test_subnav_has_knowledge_graph_link` + replaced by `test_subnav_has_knowledge_graph_dropdown` (checks both the + `data-subnav-route` attribute and `id="subnavKgDropdown"`); added + `test_subnav_has_ontology_and_mapping_dropdowns`. + +### Modified files +- src/front/templates/base.html +- tests/units/api/test_ui_rendering.py + +### Test result +2420 passed, 15 skipped — all green. + +--- + +## Navbar — Apply Proposal 1 design (path separators + tinted L2 + Save button) + +### Context +Applied the "Path + underline tabs" design to match the selected canvas proposal. +Three visual refinements: path-style text separators in L1, slightly tinted L2 +bar for visual distinction, and Save Domain button right-aligned on L2. + +### Changes +1. `src/front/templates/base.html` + - Added `<li class="ob-nav-dot-sep">·</li>` as the first item in the L1 + navbar list (between brand and Registry). + - Added `<li class="ob-nav-path-sep">›</li>` before the Domain `<li>` in + the loop, giving the path-style "Registry › Domain" appearance. + - Removed the Save Domain `navbar_actions` loop from the L2 Domain dropdown + (the action was duplicated — it now lives exclusively in the new Save button). + - Added a right-aligned `<li class="ob-subnav-item ms-auto">` at the end of + `.ob-subnav-nav` containing an `<a class="ob-subnav-save-btn">` for Save Domain. +2. `src/front/static/global/css/main.css` + - Added `.ob-nav-dot-sep` and `.ob-nav-path-sep` rules for the text separators. + - Changed `.ob-subnav` background from `var(--db-navbar-bg)` to + `var(--db-navbar-border)` (#D8D8D8) for a tinted appearance. + - Added `.ob-subnav-save-btn` styles (button look, hover state, disabled gate) + and `.ob-subnav-nav .ob-subnav-item.ms-auto` to push it right. + +### Modified files +- src/front/templates/base.html +- src/front/static/global/css/main.css -1. `src/front/config/menu_config.json` — updated labels: `"Digital Twin"` → `"Knowledge Graph"`, `"Knowledge Graph"` (sigmagraph tab) → `"Graph Viewer"`. -2. `src/front/templates/dtwin.html` — page `<title>` and comments updated. -3. `src/front/templates/partials/dtwin/_query_sigmagraph.html` — section heading updated to "Graph Viewer". -4. `src/front/templates/partials/layout/help_modal.html` — all help text, step descriptions, glossary, and FAQ updated. -5. `src/front/templates/partials/domain/_domain_information.html` — display labels updated. -6. `src/front/templates/partials/domain/_domain_validation.html` — display labels updated. -7. `src/front/templates/partials/dtwin/_query_*.html` — all dtwin partial templates updated. -8. `src/front/templates/partials/ontology/_ontology_*.html` — ontology template references updated. -9. `src/front/templates/partials/registry/_registry_*.html` — registry template references updated. -10. `src/front/templates/about.html`, `settings.html`, `ontology.html` — display labels updated. -11. `src/front/static/query/js/*.js` — JS comments and UI strings updated. -12. `src/front/static/global/js/*.js` — navbar and breadcrumb JS updated. -13. `src/back/objects/digitaltwin/models.py`, `constants.py`, `__init__.py` — module docstrings updated. -14. `src/back/core/graphql/GraphQLSchemaBuilder.py`, `CommunityDetector.py` — docstrings updated. -15. `src/back/fastapi/graphql_routes.py` — route descriptions updated. -16. `src/api/routers/digitaltwin.py`, `internal/dtwin.py` — comments and descriptions updated. -17. `src/agents/agent_dtwin_chat/__init__.py`, `engine.py`, `tools.py` — agent descriptions updated. -18. `src/agents/agent_cohort/engine.py` — docstring updated. -19. `src/mcp-server/server/app.py` — tool docstrings updated. -20. `src/shared/fastapi/main.py` — API description updated. -21. `docs/*.md` — all markdown documentation updated. -22. `README.md` — updated. -23. `.cursor/*.mdc` — cursor rules updated. -24. `tests/units/api/test_ui_rendering.py` — title assertion updated. -25. `tests/e2e/dtwin/*.py`, `tests/e2e/navigation/test_navigation_flows.py` — test docstrings/assertions updated. - -### Modified Files +### Test result +2420 passed, 15 skipped — all green. + +--- + +## Fix: Save Domain button not triggering action + +### Context +After moving the "Save Domain" action from the L1 dropdown into the L2 subnav (`#obSubnav`), the click delegation was still scoped to `#navbarNav` and never reached the button. + +### Changes +1. `src/front/static/global/js/base-ui-handlers.js` — Changed `initNavbarActionDelegation` to attach the delegated click listener to `document.body` instead of `#navbarNav`, so `data-navbar-action` links work in both L1 and L2 subnav. + +### Modified files +- src/front/static/global/js/base-ui-handlers.js + +### Test result +2420 passed, 15 skipped — all green. + +--- + +## Two-level navbar, breadcrumb-in-subnav, and new-domain popup — full session changelog + +### Context +Complete rework of the application chrome during this session: +two-level navbar (L1 + L2 subnav), breadcrumb moved inline into the subnav, +Save Domain button relocated to subnav, New Domain flow replaced by a popup, +domain navigation gating decoupled from UC-save requirement, partial-delete +bug fixed for domains with no UC directory, cursor rules updated. + +### Changes +1. `src/front/templates/base.html` — Added `#obSubnav` (L2 subnav, hidden by default); Domain shown as plain link in L1; L2 contains Domain/Ontology/Mapping/KG dropdowns + flex spacer + breadcrumb `<li>` + Save Domain button; removed chevrons. +2. `src/front/static/global/css/main.css` — Added `.ob-subnav*` styles, `.ob-nav-dot-sep`, `.ob-nav-path-sep`, `.ob-nav-disabled`, `.ob-subnav-breadcrumb-wrap`, `.ob-subnav-flex-spacer`, L1/L2 colour tokens; removed chevron rules. +3. `src/front/static/global/js/navbar.js` — Added `initSubnavActiveState`, removed `alignSubnavWithDomain`; `updateDomainMenuVisibility` now shows/hides `#obSubnav` and disables `#domainL1Link`; `updateMenusForDomainStatus` now driven by `hasDomain` (not `hasRegistry`); `domainNew` replaced with popup + UC-save flow; `showDomainSaveDialog` / `doDomainSave` accept `{ afterSave }` option. +4. `src/front/static/global/js/breadcrumb.js` — Breadcrumb now toggles `#obBreadcrumbWrap`; `_updateChromeHeight` simplified (no separate breadcrumb measurement); `window.OBBreadcrumb` exposed. +5. `src/front/static/global/js/utils.js` — Added `showNewDomainDialog()` (name + description + LLM endpoint picker with refresh); exposed as `window.showNewDomainDialog`. +6. `src/front/static/global/js/base-ui-handlers.js` — Click delegation for `data-navbar-action` moved to `document.body` (was `#navbarNav`) so Save Domain button in subnav works. +7. `src/front/static/domain/js/domain-actions.js` — `updateVersionStatus` targets `#menuSaveDomain` (was `#btnSaveDomain`). +8. `src/front/templates/partials/domain/_domain_information.html` — Removed in-page Save Domain button from section header. +9. `src/front/config/menu_config.json` — `"navbar_hidden": true` on `digitaltwin`. +10. `src/front/templates/home.html` — Added "New Domain" button in "All Domains" section header. +11. `src/back/objects/registry/RegistryService.py` — `recursive_delete` treats 404 (directory not found) as a no-op instead of an error, fixing "partially deleted" on domains with no UC directory. +12. `.cursor/11-frontend-design.mdc` — Updated navbar/breadcrumb/subnav architecture docs, new-domain dialog, gating rules, component catalog. + +### Modified files +- src/front/templates/base.html +- src/front/static/global/css/main.css +- src/front/static/global/js/navbar.js +- src/front/static/global/js/breadcrumb.js +- src/front/static/global/js/utils.js +- src/front/static/global/js/base-ui-handlers.js +- src/front/static/domain/js/domain-actions.js +- src/front/templates/partials/domain/_domain_information.html - src/front/config/menu_config.json -- src/front/templates/ (all dtwin, ontology, registry, domain partials, about, settings, ontology, dtwin) -- src/front/static/query/js/, src/front/static/global/js/ -- src/back/objects/digitaltwin/, src/back/core/, src/back/fastapi/ -- src/api/routers/digitaltwin.py, src/api/routers/internal/dtwin.py -- src/agents/agent_dtwin_chat/, src/agents/agent_cohort/ -- src/mcp-server/server/app.py, src/shared/fastapi/main.py -- docs/*.md, README.md, .cursor/*.mdc -- tests/units/api/test_ui_rendering.py, tests/e2e/dtwin/*.py, tests/e2e/navigation/ - -### Test Results -2418 passed, 15 skipped — all unit tests green. +- src/front/templates/home.html +- src/back/objects/registry/RegistryService.py +- .cursor/11-frontend-design.mdc + +### Test result +2420 passed, 15 skipped — all green. diff --git a/src/back/objects/registry/RegistryService.py b/src/back/objects/registry/RegistryService.py index 8f3376cb..d675ec43 100644 --- a/src/back/objects/registry/RegistryService.py +++ b/src/back/objects/registry/RegistryService.py @@ -676,6 +676,10 @@ def recursive_delete(self, dir_path: str) -> List[str]: logger.info("recursive_delete: listing %s", dir_path) ok, items, msg = self._uc.list_directory(dir_path) if not ok: + # Directory doesn't exist — nothing to delete, not an error. + if "not found" in msg.lower() or "404" in msg: + logger.info("recursive_delete: %s does not exist, skipping", dir_path) + return errors logger.warning("recursive_delete: cannot list %s: %s", dir_path, msg) errors.append(f"Cannot list {dir_path}: {msg}") return errors diff --git a/src/front/config/menu_config.json b/src/front/config/menu_config.json index 33a49a28..4c5f6ae6 100644 --- a/src/front/config/menu_config.json +++ b/src/front/config/menu_config.json @@ -583,6 +583,7 @@ "icon": "bi-box", "route": "/dtwin/", "requires_domain_saved": true, + "navbar_hidden": true, "status_indicator": null, "navbar_actions": [], "groups": [ diff --git a/src/front/static/domain/js/domain-actions.js b/src/front/static/domain/js/domain-actions.js index 591e18cb..55282ba3 100644 --- a/src/front/static/domain/js/domain-actions.js +++ b/src/front/static/domain/js/domain-actions.js @@ -11,7 +11,7 @@ function updateVersionStatus(editable, version, isLatest) { const alert = document.getElementById('versionStatusAlert'); const text = document.getElementById('versionStatusText'); - const saveBtn = document.getElementById('btnSaveDomain'); + const saveBtn = document.getElementById('menuSaveDomain'); const versionBtn = document.getElementById('btnCreateVersion'); if (editable) { diff --git a/src/front/static/global/css/main.css b/src/front/static/global/css/main.css index 46f3e04f..52c854c6 100644 --- a/src/front/static/global/css/main.css +++ b/src/front/static/global/css/main.css @@ -23,9 +23,12 @@ --db-border: #E0E0E0; --db-border-light: #dee2e6; - /* Navbar / top banner - classic light grey chrome */ + /* Navbar / top banner — three-level dark→lighter→white hierarchy: + L1 navbar (#ECECEC) → L2 subnav (#F4F4F4, lighter) → breadcrumb (#ffffff) */ --db-navbar-bg: #ECECEC; --db-navbar-border: #D8D8D8; + --db-subnav-bg: #F4F4F4; + --db-subnav-border: #E4E4E4; /* Bootstrap `light` surface kept white so `.bg-light` utilities are white. NOTE: do NOT override --bs-secondary-bg / --bs-tertiary-bg here — Bootstrap @@ -312,22 +315,236 @@ body { margin-top: 1rem; } -/* Process chevron separators between Project > Ontology > Mapping > Knowledge Graph */ -.navbar .nav-chevron { +/* ========================================================================== + Navbar path separators (Proposal 1 — "· Registry › Domain" style) + ========================================================================== */ +.navbar .ob-nav-dot-sep, +.navbar .ob-nav-path-sep { + display: flex; + align-items: center; + padding: 0 0.15rem; + pointer-events: none; + user-select: none; + color: var(--db-border); + font-size: 1rem; + line-height: 1; +} + +.navbar .ob-nav-dot-sep { font-size: 1.1rem; } +.navbar .ob-nav-path-sep { font-size: 0.9rem; opacity: 0.7; } + +/* Disabled state for L1 Domain link (no domain loaded) */ +.navbar .nav-link.ob-nav-disabled { + opacity: 0.45; + pointer-events: none; + cursor: default; +} + +/* ========================================================================== + Level-2 contextual sub-navigation (.ob-subnav) + Sits directly below the main navbar and provides Ontology / Mapping / + Knowledge Graph tabs plus the Domain dropdown. + ========================================================================== */ +.ob-subnav { + background-color: var(--db-subnav-bg); + border-bottom: 1px solid var(--db-subnav-border); + padding: 0; + position: relative; + z-index: 1040; +} + +.ob-subnav .container-fluid { + padding-left: 1rem; + padding-right: 1rem; +} + +.ob-subnav-nav { display: flex; align-items: stretch; - height: 1.5rem; + list-style: none; + margin: 0; padding: 0; - margin: 0 0.1rem; + gap: 0; +} + +.ob-subnav-item { + display: flex; + align-items: stretch; +} + +.ob-subnav-link { + display: inline-flex; + align-items: center; + gap: 0.35rem; + padding: 0.45rem 0.85rem; + font-size: 0.8125rem; + color: var(--db-text-secondary); + text-decoration: none; + border-bottom: 2px solid transparent; + white-space: nowrap; + transition: color 0.15s ease, border-color 0.15s ease; +} + +.ob-subnav-link .bi { + font-size: 0.85rem; +} + +.ob-subnav-link:hover { + color: var(--db-text); + border-bottom-color: var(--db-border); + text-decoration: none; +} + +.ob-subnav-link.active { + color: var(--db-text); + font-weight: 500; + border-bottom-color: var(--db-primary); +} + +.ob-subnav-link.nav-disabled { + opacity: 0.4; pointer-events: none; - user-select: none; - color: var(--db-primary); + cursor: not-allowed; } -.navbar .nav-chevron svg { - width: 12px; - height: 100%; - display: block; +/* Dropdown toggle arrow */ +.ob-subnav-link.dropdown-toggle::after { + margin-left: 0.2rem; +} + +/* Subnav uses the same dropdown style as the main navbar */ +.ob-subnav .dropdown-menu { + z-index: 1051; + background-color: var(--db-subnav-bg); + border: 1px solid var(--db-subnav-border); + border-radius: 0.5rem; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18); + padding: 0.4rem 0; + min-width: 14rem; + margin-top: 0.15rem; +} + +.ob-subnav .dropdown-menu .dropdown-item { + color: var(--db-text); + font-size: 0.8125rem; + padding: 0.4rem 1rem; + transition: background-color 0.15s ease, color 0.15s ease; + border-radius: 0.25rem; + margin: 0 0.3rem; +} + +.ob-subnav .dropdown-menu .dropdown-item .bi { + opacity: 0.7; + margin-right: 0.15rem; +} + +.ob-subnav .dropdown-menu .dropdown-item:hover, +.ob-subnav .dropdown-menu .dropdown-item:focus { + background-color: var(--db-primary); + color: #fff; +} + +.ob-subnav .dropdown-menu .dropdown-item:hover .bi, +.ob-subnav .dropdown-menu .dropdown-item:focus .bi { + opacity: 1; +} + +.ob-subnav .dropdown-menu .dropdown-item.disabled, +.ob-subnav .dropdown-menu .dropdown-item.dropdown-requires-domain.disabled { + opacity: 0.5; + pointer-events: none; +} + +.ob-subnav .dropdown-menu .dropdown-header { + color: var(--db-text-muted); + font-size: 0.7rem; + font-weight: 400; + letter-spacing: 0.05em; + text-transform: uppercase; + padding: 0.45rem 1rem 0.2rem; +} + +.ob-subnav .dropdown-menu .dropdown-divider { + border-color: var(--db-subnav-border); + margin: 0.35rem 0.8rem; +} + +/* Vertical separator between tabs and Domain dropdown */ +.ob-subnav-divider { + width: 1px; + background-color: var(--db-border); + margin: 0.3rem 0.4rem; + align-self: stretch; +} + +/* Save Domain button — right-aligned in the L2 subnav */ +.ob-subnav-save-btn { + display: inline-flex; + align-items: center; + gap: 0.3rem; + padding: 0.25rem 0.7rem; + font-size: 0.8rem; + color: var(--db-text); + background-color: var(--db-navbar-bg); /* one shade darker = button stands out on L2 */ + border: 1px solid var(--db-navbar-border); + border-radius: 0.3rem; + text-decoration: none; + white-space: nowrap; + transition: background-color 0.15s ease, color 0.15s ease; +} + +.ob-subnav-save-btn:hover { + background-color: var(--db-primary); + color: #fff; + text-decoration: none; +} + +.ob-subnav-save-btn.disabled, +.ob-subnav-save-btn.btn-requires-domain.disabled { + opacity: 0.45; + pointer-events: none; +} + +/* Inline breadcrumb inside the subnav row */ +.ob-subnav-flex-spacer { + flex: 1; +} + +.ob-subnav-breadcrumb-wrap { + display: flex; + align-items: center; + padding: 0 0.75rem; + border-left: 1px solid var(--db-subnav-border); +} +.ob-subnav-breadcrumb-wrap .breadcrumb { + font-size: 0.65rem; + font-style: italic; + white-space: nowrap; + flex-wrap: nowrap; + gap: 0; +} +.ob-subnav-breadcrumb-wrap .breadcrumb-item, +.ob-subnav-breadcrumb-wrap .breadcrumb-item a { + color: var(--db-text-muted, #6c757d); + text-decoration: none; +} +.ob-subnav-breadcrumb-wrap .breadcrumb-item a:hover { + color: var(--db-primary, #1b3a6b); +} +.ob-subnav-breadcrumb-wrap .breadcrumb-item.active { + color: var(--db-text, #1b3a6b); + font-weight: 500; +} +.ob-subnav-breadcrumb-wrap .breadcrumb-item + .breadcrumb-item::before { + font-size: 0.65rem; + color: var(--db-subnav-border); +} + +/* Save button item alignment */ +.ob-subnav-nav .ob-subnav-item:has(.ob-subnav-save-btn) { + display: flex; + align-items: center; + padding-right: 0.25rem; } /* ========================================================================== diff --git a/src/front/static/global/js/base-ui-handlers.js b/src/front/static/global/js/base-ui-handlers.js index 7f112226..4aac56d5 100644 --- a/src/front/static/global/js/base-ui-handlers.js +++ b/src/front/static/global/js/base-ui-handlers.js @@ -12,9 +12,9 @@ }; function initNavbarActionDelegation() { - var nav = document.getElementById('navbarNav'); - if (!nav) return; - nav.addEventListener('click', function (e) { + // Listen on document.body so data-navbar-action links work in both + // #navbarNav (L1) and #obSubnav (L2 Save button). + document.body.addEventListener('click', function (e) { var link = e.target.closest('a[data-navbar-action]'); if (!link) return; var name = link.getAttribute('data-navbar-action'); diff --git a/src/front/static/global/js/breadcrumb.js b/src/front/static/global/js/breadcrumb.js index 65732c3d..80a49e6e 100644 --- a/src/front/static/global/js/breadcrumb.js +++ b/src/front/static/global/js/breadcrumb.js @@ -18,9 +18,14 @@ const Breadcrumb = { _HIERARCHY: ['/registry/', '/domain/', '/ontology/', '/mapping/', '/dtwin/'], init() { - const nav = document.getElementById('obBreadcrumb'); + const wrap = document.getElementById('obBreadcrumbWrap'); const list = document.getElementById('obBreadcrumbList'); - if (!nav || !list) return; + + // Always compute chrome height so sidebar-layout uses the correct + // offset even on pages where the breadcrumb stays hidden. + this._updateChromeHeight(); + + if (!wrap || !list) return; const path = window.location.pathname; const crumbs = this._buildCrumbs(path); @@ -29,15 +34,12 @@ const Breadcrumb = { list.innerHTML = crumbs.map((c, i) => { const isLast = i === crumbs.length - 1; if (isLast) { - return '<li class="breadcrumb-item active" aria-current="page">' + - '<i class="bi ' + (c.icon || '') + ' me-1"></i>' + c.label + '</li>'; + return '<li class="breadcrumb-item active" aria-current="page">' + c.label + '</li>'; } - return '<li class="breadcrumb-item">' + - '<a href="' + c.href + '"><i class="bi ' + (c.icon || '') + ' me-1"></i>' + - c.label + '</a></li>'; + return '<li class="breadcrumb-item"><a href="' + c.href + '">' + c.label + '</a></li>'; }).join(''); - nav.classList.remove('d-none'); + wrap.classList.remove('d-none'); this._updateChromeHeight(); document.addEventListener('sidebarSectionChanged', (e) => this._updateSection(e.detail.section)); @@ -80,13 +82,14 @@ const Breadcrumb = { }, _updateChromeHeight() { - const nav = document.getElementById('obBreadcrumb'); - if (!nav || nav.classList.contains('d-none')) return; - // Chrome = navbar (60px) + breadcrumb. Read-only no longer adds - // a banner — the indicator is now a navbar pill — so the same - // height applies whether or not the user is in read-only mode. - const bcHeight = nav.offsetHeight; - document.documentElement.style.setProperty('--ob-chrome-height', (60 + bcHeight) + 'px'); + const navbar = document.querySelector('nav.navbar'); + const subnav = document.getElementById('obSubnav'); + const navH = navbar ? navbar.offsetHeight : 60; + // Breadcrumb is now inside the subnav row, so subnav height covers both. + const subnavH = (subnav && !subnav.classList.contains('d-none')) ? subnav.offsetHeight : 0; + document.documentElement.style.setProperty( + '--ob-chrome-height', (navH + subnavH) + 'px' + ); }, _updateSection(sectionName) { @@ -121,12 +124,7 @@ const Breadcrumb = { const li = document.createElement('li'); li.className = 'breadcrumb-item active breadcrumb-section'; li.setAttribute('aria-current', 'page'); - if (iconClass) { - const iconHtml = '<i class="bi ' + iconClass + ' me-1"></i>'; - li.innerHTML = iconHtml + this._escapeHtml(label); - } else { - li.textContent = label; - } + li.textContent = label; list.appendChild(li); }, @@ -137,4 +135,5 @@ const Breadcrumb = { } }; +window.OBBreadcrumb = Breadcrumb; document.addEventListener('DOMContentLoaded', () => Breadcrumb.init()); diff --git a/src/front/static/global/js/navbar.js b/src/front/static/global/js/navbar.js index fa271b9f..c797bb1b 100644 --- a/src/front/static/global/js/navbar.js +++ b/src/front/static/global/js/navbar.js @@ -32,8 +32,31 @@ document.addEventListener('DOMContentLoaded', function() { */ function initNavbar() { loadNavbarState(); + initSubnavActiveState(); } +/** + * Mark the correct Level-2 subnav link as active based on the current URL + * path prefix. Runs once on page load — no polling needed. + */ +function initSubnavActiveState() { + const path = window.location.pathname; + const links = document.querySelectorAll('.ob-subnav-link[data-subnav-route]'); + links.forEach(link => { + const route = link.getAttribute('data-subnav-route'); + if (route && path.startsWith(route)) { + link.classList.add('active'); + } + }); +} + +/** + * Align the first L2 subnav item (Ontology) with the Domain link in L1. + * Measures the left edge of #domainL1Link and shifts the subnav list by + * that same offset so the two items are visually column-aligned. + * Re-runs on window resize in case the brand/registry widths change. + */ + /** * Load the consolidated navbar state in a single round-trip and * apply domain info and warehouse icon to the DOM. @@ -181,8 +204,9 @@ function applyDomainInfo(data) { updateDomainMenuVisibility(hasDomain); - const hasRegistry = data.registry && data.registry.catalog && data.domain_folder; - updateMenusForDomainStatus(hasRegistry); + // Sub-pages unlock as soon as a domain is open in session. + // UC-save is no longer required for basic navigation. + updateMenusForDomainStatus(hasDomain); } /** @@ -300,8 +324,28 @@ function enableMenusAfterSave() { * Note: All menu items are now always visible */ function updateDomainMenuVisibility(hasDomain) { - // All domain menu items are now always visible - // This function is kept for compatibility but does nothing + // Show/hide L2 subnav + const subnav = document.getElementById('obSubnav'); + if (subnav) { + subnav.classList.toggle('d-none', !hasDomain); + if (typeof window.OBBreadcrumb !== 'undefined' && typeof window.OBBreadcrumb._updateChromeHeight === 'function') { + window.OBBreadcrumb._updateChromeHeight(); + } + } + + // Disable/enable the L1 Domain link + const domainL1 = document.getElementById('domainL1Link'); + if (domainL1) { + if (hasDomain) { + domainL1.classList.remove('ob-nav-disabled'); + domainL1.removeAttribute('aria-disabled'); + domainL1.removeAttribute('tabindex'); + } else { + domainL1.classList.add('ob-nav-disabled'); + domainL1.setAttribute('aria-disabled', 'true'); + domainL1.setAttribute('tabindex', '-1'); + } + } } @@ -317,40 +361,42 @@ window.refreshDigitalTwinStatus = refreshNavbarIndicators; // ========================================== /** - * Start a new domain (clears current data) + * Start a new domain — collects name/description/LLM via popup, clears + * existing data, persists session info, then immediately opens the UC + * save dialog so the domain is registered before navigating away. */ async function domainNew() { - const confirmed = await showConfirmDialog({ - title: 'New Domain', - message: 'Start a new domain? This will clear all current ontology, design, and mapping data.', - confirmText: 'Start New', - confirmClass: 'btn-warning', - icon: 'file-earmark-plus' - }); - if (!confirmed) return; - + const input = await showNewDomainDialog(); + if (!input) return; + try { - const response = await fetch('/domain/clear', { + // 1. Clear existing domain data + const clearResp = await fetch('/domain/clear', { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'same-origin' }); - - const data = await response.json(); - - if (data.success) { - showNotification('New domain started', 'success'); - invalidateDomainCaches(); - // Hand off the spinner to the next page: domain.js / domain-information.js - // pick this flag up on DOMContentLoaded, show the overlay until the - // initial Promise.all (info + version-status + LLM endpoints) resolves. - try { sessionStorage.setItem('ob_creating_new_domain', '1'); } catch (e) {} - setTimeout(() => { - window.location.href = '/domain/#information'; - }, 1000); - } else { - showNotification('Error: ' + data.message, 'error'); + const clearData = await clearResp.json(); + if (!clearData.success) { + showNotification('Error: ' + clearData.message, 'error'); + return; } + + // 2. Persist name, description, and LLM endpoint to session + const payload = { name: input.name }; + if (input.description) payload.description = input.description; + if (input.llm_endpoint) payload.llm_endpoint = input.llm_endpoint; + await fetch('/domain/info', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload), + credentials: 'same-origin' + }); + + invalidateDomainCaches(); + + // 3. Open UC save dialog; navigate to domain page after a successful save + showDomainSaveDialog({ afterSave: '/domain/#information' }); } catch (error) { console.error('Error creating new domain:', error); showNotification('Failed to create new domain: ' + error.message, 'error'); @@ -458,8 +504,10 @@ async function saveDomainInfoBeforeSave() { /** * Show confirmation dialog before saving to the registry. + * @param {Object} [opts] + * @param {string} [opts.afterSave] - URL to navigate to after a successful save. */ -async function showDomainSaveDialog() { +async function showDomainSaveDialog(opts = {}) { const modalHtml = ` <div class="modal fade" id="domainSaveModal" tabindex="-1"> <div class="modal-dialog"> @@ -520,11 +568,11 @@ async function showDomainSaveDialog() { document.getElementById('btnConfirmSave').addEventListener('click', async () => { modal.hide(); - await doDomainSave(); + await doDomainSave({ afterSave: opts.afterSave }); }); } -async function doDomainSave() { +async function doDomainSave(opts = {}) { try { // Belt-and-suspenders duplicate-name guard: domain.js already // checks ``/domain/check-name`` (debounced 500 ms on every @@ -559,6 +607,9 @@ async function doDomainSave() { enableMenusAfterSave(); await refreshNavbarIndicators(); loadDomainName(); + if (opts.afterSave) { + setTimeout(() => { window.location.href = opts.afterSave; }, 800); + } } else { showNotification('Error: ' + data.message, 'error'); } diff --git a/src/front/static/global/js/utils.js b/src/front/static/global/js/utils.js index 080d1642..88a42dc2 100644 --- a/src/front/static/global/js/utils.js +++ b/src/front/static/global/js/utils.js @@ -714,6 +714,125 @@ window.fetch = function(input, init) { return _origFetch.call(this, input, init); }; +/** + * Show a modal that collects a new domain name, description, and LLM endpoint. + * Resolves with { name, description, llm_endpoint } or null if cancelled. + */ +function showNewDomainDialog() { + return new Promise((resolve) => { + const modalId = 'newDomainDialog_' + Date.now(); + const modalHtml = ` + <div class="modal fade" id="${modalId}" tabindex="-1" data-bs-backdrop="static"> + <div class="modal-dialog modal-dialog-centered"> + <div class="modal-content"> + <div class="modal-header"> + <h5 class="modal-title"> + <i class="bi bi-file-earmark-plus me-2"></i>New Domain + </h5> + <button type="button" class="btn-close" data-bs-dismiss="modal"></button> + </div> + <div class="modal-body"> + <p class="text-muted small mb-3">Enter a name for your new domain. You can add more details later.</p> + <div class="mb-3"> + <label for="${modalId}_name" class="form-label fw-semibold">Domain name <span class="text-danger">*</span></label> + <input type="text" class="form-control" id="${modalId}_name" + placeholder="e.g. PatientCare, SupplyChain…" autocomplete="off" maxlength="64"> + <div class="invalid-feedback">Please enter a domain name.</div> + </div> + <div class="mb-3"> + <label for="${modalId}_desc" class="form-label fw-semibold">Description <span class="text-muted fw-normal">(optional)</span></label> + <textarea class="form-control" id="${modalId}_desc" rows="2" + placeholder="Short description of this domain…" maxlength="256"></textarea> + </div> + <div class="mb-1"> + <label for="${modalId}_llm" class="form-label fw-semibold"> + <i class="bi bi-robot me-1"></i>LLM Endpoint <span class="text-muted fw-normal">(optional — for OntoBricks Agents)</span> + </label> + <div class="input-group"> + <select class="form-select" id="${modalId}_llm"> + <option value="">Loading endpoints…</option> + </select> + <button type="button" class="btn btn-outline-secondary" id="${modalId}_llm_refresh" title="Refresh endpoints"> + <i class="bi bi-arrow-clockwise"></i> + </button> + </div> + <small class="text-muted">Databricks Model Serving endpoint used by OntoBricks Agents.</small> + </div> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" id="${modalId}_cancel">Cancel</button> + <button type="button" class="btn btn-primary" id="${modalId}_confirm"> + <i class="bi bi-check2 me-1"></i>Create Domain + </button> + </div> + </div> + </div> + </div>`; + + document.body.insertAdjacentHTML('beforeend', modalHtml); + const modalEl = document.getElementById(modalId); + const nameInput = document.getElementById(`${modalId}_name`); + const llmSelect = document.getElementById(`${modalId}_llm`); + const modal = new bootstrap.Modal(modalEl); + let resolved = false; + + async function loadLlmOptions() { + llmSelect.innerHTML = '<option value="">Loading…</option>'; + try { + const resp = await fetch('/mapping/wizard/llm-endpoints', { credentials: 'same-origin' }); + const data = await resp.json(); + llmSelect.innerHTML = '<option value="">— None —</option>'; + if (data.success && data.endpoints && data.endpoints.length > 0) { + data.endpoints.forEach(ep => { + const opt = document.createElement('option'); + opt.value = ep.name; + opt.textContent = ep.name; + llmSelect.appendChild(opt); + }); + } else { + const opt = document.createElement('option'); + opt.value = ''; + opt.textContent = 'No endpoints available'; + opt.disabled = true; + llmSelect.appendChild(opt); + } + } catch (_) { + llmSelect.innerHTML = '<option value="">Could not load endpoints</option>'; + } + } + + document.getElementById(`${modalId}_llm_refresh`).addEventListener('click', loadLlmOptions); + + document.getElementById(`${modalId}_confirm`).addEventListener('click', () => { + const name = nameInput.value.trim(); + if (!name) { + nameInput.classList.add('is-invalid'); + nameInput.focus(); + return; + } + const desc = (document.getElementById(`${modalId}_desc`).value || '').trim(); + const llm = llmSelect.value || ''; + resolved = true; + modal.hide(); + resolve({ name, description: desc, llm_endpoint: llm }); + }); + + nameInput.addEventListener('input', () => nameInput.classList.remove('is-invalid')); + nameInput.addEventListener('keydown', (e) => { + if (e.key === 'Enter') document.getElementById(`${modalId}_confirm`).click(); + }); + + modalEl.addEventListener('hidden.bs.modal', () => { + if (!resolved) resolve(null); + setTimeout(() => modalEl.remove(), 100); + }); + + modal.show(); + setTimeout(() => nameInput.focus(), 300); + loadLlmOptions(); + }); +} + // Make all utility functions globally available window.showNotification = showNotification; window.NotificationCenter = NotificationCenter; @@ -722,6 +841,7 @@ window.showConfirmDialog = showConfirmDialog; window.showDeleteConfirm = showDeleteConfirm; window.apiRequest = apiRequest; window.escapeHtml = escapeHtml; +window.showNewDomainDialog = showNewDomainDialog; window.fetchOnce = fetchOnce; window.fetchOnceInvalidate = fetchOnceInvalidate; window.fetchCached = fetchCached; diff --git a/src/front/templates/base.html b/src/front/templates/base.html index a135eed2..a5fd4460 100644 --- a/src/front/templates/base.html +++ b/src/front/templates/base.html @@ -68,58 +68,21 @@ </button> <div class="collapse navbar-collapse" id="navbarNav"> <ul class="navbar-nav me-auto"> + <li class="nav-item ob-nav-dot-sep" aria-hidden="true">·</li> {% for menu in menu_config.menus %} {% if not menu.navbar_hidden|default(false) %} - <li class="nav-item nav-chevron" aria-hidden="true"> - <svg viewBox="0 0 12 40" preserveAspectRatio="none"><polyline points="0,0 10,20 0,40" fill="none" stroke="currentColor" stroke-width="1.5"/></svg> - </li> + {% if menu.id == 'domain' %} + <li class="nav-item ob-nav-path-sep" aria-hidden="true">›</li> + {% endif %} <li class="nav-item dropdown"> {% if menu.id == 'domain' %} - <a class="nav-link dropdown-toggle" href="#" id="domainDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> - <i class="bi {{ menu.icon }}"></i> <span id="currentDomainName" class="small">{{ menu.label }}</span> + {# Domain shown as a plain link in L1 — navigation is in the L2 subnav #} + <a class="nav-link" href="{{ menu.route }}" id="domainL1Link"> + <i class="bi {{ menu.icon }}"></i> <span id="currentDomainName">{{ menu.label }}</span> </a> - <ul class="dropdown-menu" aria-labelledby="domainDropdown" id="domainDropdownMenu"> - {% for action in menu.navbar_actions %} - <li><a class="dropdown-item" href="#" data-navbar-action="{{ action.action }}"{% if action.element_id %} id="{{ action.element_id }}"{% endif %}><i class="bi {{ action.icon }}"></i> {{ action.label }}</a></li> - {% endfor %} - {% for group in menu.groups %} - {% if not group.sidebar_only|default(false) %} - <li><hr class="dropdown-divider"></li> - <li><h6 class="dropdown-header"><i class="bi {{ group.icon }}"></i> <span{% if loop.first %} id="domainSectionName"{% endif %}>{{ group.title }}</span></h6></li> - {% for item in group['items'] %} - {% if item.route %} - {% set sub = namespace(menu=none) %} - {% for m in menu_config.menus if m.navbar_hidden|default(false) and m.route == item.route %} - {% set sub.menu = m %} - {% endfor %} - {% if sub.menu %} - <li class="dropend"> - <a class="dropdown-item dropdown-toggle dropdown-requires-domain" href="{{ item.route }}" data-bs-toggle="dropdown"><i class="bi {{ item.icon }}"></i> {{ item.label }}</a> - <ul class="dropdown-menu"> - {% for sg in sub.menu.groups %} - {% if not sg.sidebar_only|default(false) %} - {% if not loop.first %}<li><hr class="dropdown-divider"></li>{% endif %} - <li><h6 class="dropdown-header"><i class="bi {{ sg.icon }}"></i> {{ sg.title }}</h6></li> - {% for si in sg['items'] %} - <li><a class="dropdown-item" href="{{ sub.menu.route }}?section={{ si.id }}"><i class="bi {{ si.icon }}"></i> {{ si.label }}</a></li> - {% endfor %} - {% endif %} - {% endfor %} - </ul> - </li> - {% else %} - <li><a class="dropdown-item dropdown-requires-domain" href="{{ item.route }}"><i class="bi {{ item.icon }}"></i> {{ item.label }}</a></li> - {% endif %} - {% else %} - <li><a class="dropdown-item{% if item.requires == 'domain_saved' %} dropdown-requires-domain{% endif %}" href="{{ menu.route }}?section={{ item.id }}"><i class="bi {{ item.icon }}"></i> {{ item.label }}</a></li> - {% endif %} - {% endfor %} - {% endif %} - {% endfor %} - </ul> {% else %} <a class="nav-link dropdown-toggle{% if menu.requires_domain_saved %} nav-requires-domain{% endif %}" href="#" id="{{ menu.id }}Dropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false"> - <i class="bi {{ menu.icon }}"></i> <span class="small">{{ menu.label }}</span> + <i class="bi {{ menu.icon }}"></i> <span>{{ menu.label }}</span> </a> <ul class="dropdown-menu" aria-labelledby="{{ menu.id }}Dropdown"> {% if menu.navbar_actions|default([])|length > 0 %} @@ -250,7 +213,141 @@ </div> </div> </nav> - + + <!-- Level 2 contextual navigation — Ontology | Mapping | Knowledge Graph | Domain dropdown --> + {% set ontology_m = namespace(v=none) %} + {% set mapping_m = namespace(v=none) %} + {% set kg_m = namespace(v=none) %} + {% set domain_m = namespace(v=none) %} + {% for m in menu_config.menus %} + {% if m.id == 'ontology' %}{% set ontology_m.v = m %}{% endif %} + {% if m.id == 'assignment' %}{% set mapping_m.v = m %}{% endif %} + {% if m.id == 'digitaltwin'%}{% set kg_m.v = m %}{% endif %} + {% if m.id == 'domain' %}{% set domain_m.v = m %}{% endif %} + {% endfor %} + <nav id="obSubnav" class="ob-subnav d-none" aria-label="Section navigation"> + <div class="container-fluid"> + <ul class="ob-subnav-nav"> + {% if domain_m.v %} + <li class="ob-subnav-item dropdown"> + <a class="ob-subnav-link dropdown-toggle" href="#" id="subnavDomainDropdown" role="button" + data-bs-toggle="dropdown" aria-expanded="false"> + <i class="bi {{ domain_m.v.icon }}"></i> Domain + </a> + <ul class="dropdown-menu" aria-labelledby="subnavDomainDropdown" id="subnavDomainDropdownMenu"> + {% set ns = namespace(first_group=true) %} + {% for group in domain_m.v.groups %} + {% if group.id != 'domain-design' and not group.sidebar_only|default(false) %} + <li><hr class="dropdown-divider"></li> + <li><h6 class="dropdown-header"><i class="bi {{ group.icon }}"></i> <span{% if ns.first_group %} id="domainSectionName"{% endif %}>{{ group.title }}</span></h6></li> + {% set ns.first_group = false %} + {% for item in group['items'] %} + <li><a class="dropdown-item{% if item.requires == 'domain_saved' %} dropdown-requires-domain{% endif %}" href="{{ domain_m.v.route }}?section={{ item.id }}"><i class="bi {{ item.icon }}"></i> {{ item.label }}</a></li> + {% endfor %} + {% endif %} + {% endfor %} + </ul> + </li> + {% endif %} + <li class="ob-subnav-divider" aria-hidden="true"></li> + {% if ontology_m.v %} + <li class="ob-subnav-item dropdown"> + <a class="ob-subnav-link dropdown-toggle" + href="{{ ontology_m.v.route }}" + id="subnavOntologyDropdown" role="button" + data-bs-toggle="dropdown" aria-expanded="false" + data-subnav-route="{{ ontology_m.v.route }}"> + <i class="bi {{ ontology_m.v.icon }}"></i> {{ ontology_m.v.label }} + </a> + <ul class="dropdown-menu" aria-labelledby="subnavOntologyDropdown"> + {% set vis = namespace(any=false) %} + {% for group in ontology_m.v.groups %} + {% if not group.sidebar_only|default(false) %} + {% if vis.any %}<li><hr class="dropdown-divider"></li>{% endif %} + {% set vis.any = true %} + <li><h6 class="dropdown-header"><i class="bi {{ group.icon }}"></i> {{ group.title }}</h6></li> + {% for item in group['items'] %} + <li><a class="dropdown-item{% if item.requires == 'domain_saved' %} dropdown-requires-domain{% endif %}{% if item.hidden_in_view_mode|default(false) %} view-mode-hidden{% endif %}" href="{{ ontology_m.v.route }}?section={{ item.id }}"><i class="bi {{ item.icon }}"></i> {{ item.label }}</a></li> + {% endfor %} + {% endif %} + {% endfor %} + </ul> + </li> + {% endif %} + {% if mapping_m.v %} + <li class="ob-subnav-item dropdown"> + <a class="ob-subnav-link dropdown-toggle" + href="{{ mapping_m.v.route }}" + id="subnavMappingDropdown" role="button" + data-bs-toggle="dropdown" aria-expanded="false" + data-subnav-route="{{ mapping_m.v.route }}"> + <i class="bi {{ mapping_m.v.icon }}"></i> {{ mapping_m.v.label }} + </a> + <ul class="dropdown-menu" aria-labelledby="subnavMappingDropdown"> + {% set vis = namespace(any=false) %} + {% for group in mapping_m.v.groups %} + {% if not group.sidebar_only|default(false) %} + {% if vis.any %}<li><hr class="dropdown-divider"></li>{% endif %} + {% set vis.any = true %} + <li><h6 class="dropdown-header"><i class="bi {{ group.icon }}"></i> {{ group.title }}</h6></li> + {% for item in group['items'] %} + <li><a class="dropdown-item{% if item.requires == 'domain_saved' %} dropdown-requires-domain{% endif %}{% if item.hidden_in_view_mode|default(false) %} view-mode-hidden{% endif %}" href="{{ mapping_m.v.route }}?section={{ item.id }}"><i class="bi {{ item.icon }}"></i> {{ item.label }}</a></li> + {% endfor %} + {% endif %} + {% endfor %} + </ul> + </li> + {% endif %} + {% if kg_m.v %} + <li class="ob-subnav-item dropdown"> + <a class="ob-subnav-link dropdown-toggle" + href="{{ kg_m.v.route }}" + id="subnavKgDropdown" role="button" + data-bs-toggle="dropdown" aria-expanded="false" + data-subnav-route="{{ kg_m.v.route }}"> + <i class="bi {{ kg_m.v.icon }}"></i> {{ kg_m.v.label }} + </a> + <ul class="dropdown-menu" aria-labelledby="subnavKgDropdown"> + {% set vis = namespace(any=false) %} + {% for group in kg_m.v.groups %} + {% if not group.sidebar_only|default(false) %} + {% if vis.any %}<li><hr class="dropdown-divider"></li>{% endif %} + {% set vis.any = true %} + <li><h6 class="dropdown-header"><i class="bi {{ group.icon }}"></i> {{ group.title }}</h6></li> + {% for item in group['items'] %} + <li><a class="dropdown-item{% if item.requires == 'domain_saved' %} dropdown-requires-domain{% endif %}" href="{{ kg_m.v.route }}?section={{ item.id }}"><i class="bi {{ item.icon }}"></i> {{ item.label }}</a></li> + {% endfor %} + {% endif %} + {% endfor %} + </ul> + </li> + {% endif %} + <!-- Flex spacer — always pushes breadcrumb + Save button to the right --> + <li class="ob-subnav-flex-spacer" aria-hidden="true"></li> + + <!-- Breadcrumb — inline between tabs and Save button --> + <li class="ob-subnav-item ob-subnav-breadcrumb-wrap d-none" id="obBreadcrumbWrap"> + <nav id="obBreadcrumb" aria-label="breadcrumb"> + <ol class="breadcrumb mb-0" id="obBreadcrumbList"></ol> + </nav> + </li> + + <li class="ob-subnav-item"> + {% set save_action = namespace(v=none) %} + {% if domain_m.v %}{% for a in domain_m.v.navbar_actions %}{% if a.action == 'domainSave' %}{% set save_action.v = a %}{% endif %}{% endfor %}{% endif %} + {% if save_action.v %} + <a class="ob-subnav-save-btn btn-requires-domain" href="#" + data-navbar-action="{{ save_action.v.action }}" + {% if save_action.v.element_id %}id="{{ save_action.v.element_id }}"{% endif %} + title="Save domain to Unity Catalog"> + <i class="bi {{ save_action.v.icon }}"></i> {{ save_action.v.label }} + </a> + {% endif %} + </li> + </ul> + </div> + </nav> + <!-- Full-page domain loading overlay (hidden by default) --> <div id="domainLoadingOverlay" class="domain-loading-overlay d-none"> <div class="ob-loading-spinner"> diff --git a/src/front/templates/home.html b/src/front/templates/home.html index d7e8c25a..20786232 100644 --- a/src/front/templates/home.html +++ b/src/front/templates/home.html @@ -66,7 +66,12 @@ <h5><i class="bi bi-folder2-open"></i> Current Domain: <span id="homeDomainName" <!-- All Domains - the open door --> <div class="workflow-section"> - <h5><i class="bi bi-grid-3x3-gap"></i> All Domains</h5> + <div class="d-flex align-items-center justify-content-between mb-2"> + <h5 class="mb-0"><i class="bi bi-grid-3x3-gap"></i> All Domains</h5> + <button type="button" class="btn btn-sm btn-primary" onclick="domainNew()"> + <i class="bi bi-file-earmark-plus me-1"></i>New Domain + </button> + </div> <div id="domainGateway" class="ob-domain-grid"> <div class="ob-domain-grid-loading text-muted"> <div class="spinner-border" role="status" aria-hidden="true"></div> diff --git a/src/front/templates/partials/domain/_domain_information.html b/src/front/templates/partials/domain/_domain_information.html index 3eb040ab..cdc3e835 100644 --- a/src/front/templates/partials/domain/_domain_information.html +++ b/src/front/templates/partials/domain/_domain_information.html @@ -1,16 +1,9 @@ <!-- JS: /static/domain/js/domain-information.js --> <!-- Domain information section --> <div class="content-section"> - <div class="section-header d-flex justify-content-between align-items-center mb-4"> - <div> - <h4 class="mb-1"><i class="bi bi-info-circle me-2"></i>Domain Information</h4> - <p class="text-muted mb-0 small">Define your domain details</p> - </div> - <div class="d-flex align-items-center gap-3"> - <button type="button" class="btn btn-sm btn-outline-primary" id="btnSaveDomain" onclick="saveDomainFromSettings()"> - <i class="bi bi-cloud-upload me-1"></i> Save Domain - </button> - </div> + <div class="section-header mb-4"> + <h4 class="mb-1"><i class="bi bi-info-circle me-2"></i>Domain Information</h4> + <p class="text-muted mb-0 small">Define your domain details</p> </div> <!-- Tab navigation --> diff --git a/tests/units/api/test_ui_rendering.py b/tests/units/api/test_ui_rendering.py index c03a9bd7..96af0094 100644 --- a/tests/units/api/test_ui_rendering.py +++ b/tests/units/api/test_ui_rendering.py @@ -129,13 +129,30 @@ def test_review_modals_assets_loaded(self, client, path): assert any("review-modals.js" in src for src in _script_srcs(html)) assert "review-modals.css" in html - def test_navbar_has_domain_dropdown(self, client): + def test_navbar_has_domain_l1_link(self, client): + """Domain is now a plain link on L1 (no dropdown) — check for the L1 anchor.""" html = _html(client, "/") - assert _find(_tags(html), id_="domainDropdown") is not None + assert _find(_tags(html), id_="domainL1Link") is not None - def test_navbar_has_digital_twin_dropdown(self, client): + def test_subnav_has_domain_dropdown(self, client): + """Domain dropdown is in the L2 subnav.""" html = _html(client, "/") - assert _find(_tags(html), id_="digitaltwinDropdown") is not None + assert _find(_tags(html), id_="subnavDomainDropdown") is not None + + def test_subnav_has_knowledge_graph_dropdown(self, client): + """Knowledge Graph is a dropdown in the L2 subnav with its sections.""" + html = _html(client, "/") + tags = _tags(html) + kg_toggles = [t for t in tags if t[0] == "a" and t[1].get("data-subnav-route") == "/dtwin/"] + assert len(kg_toggles) > 0 + assert _find(tags, id_="subnavKgDropdown") is not None + + def test_subnav_has_ontology_and_mapping_dropdowns(self, client): + """Ontology and Mapping are dropdowns in the L2 subnav.""" + html = _html(client, "/") + tags = _tags(html) + assert _find(tags, id_="subnavOntologyDropdown") is not None + assert _find(tags, id_="subnavMappingDropdown") is not None def test_navbar_has_ontology_link_under_domain(self, client): """Ontology appears as a sub-item under the Domain dropdown (navbar_hidden).""" From d81ddfae457c724b02019b7b799a6dd660548bbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ulrik=20Svanborg=20M=C3=B8ller?= <ulsmo@vestas.com> Date: Tue, 23 Jun 2026 14:48:17 +0200 Subject: [PATCH 49/54] feat(mapping): Serialize R2RML in deterministic order --- src/back/core/w3c/r2rml/R2RMLGenerator.py | 22 +++---- tests/units/mapping/test_r2rml_generator.py | 72 +++++++++++++++++++++ 2 files changed, 83 insertions(+), 11 deletions(-) diff --git a/src/back/core/w3c/r2rml/R2RMLGenerator.py b/src/back/core/w3c/r2rml/R2RMLGenerator.py index ea0dc588..00393cfa 100644 --- a/src/back/core/w3c/r2rml/R2RMLGenerator.py +++ b/src/back/core/w3c/r2rml/R2RMLGenerator.py @@ -239,7 +239,7 @@ def _add_entity_mapping( g.add((triples_map, RDFS.comment, Literal(comment))) # Logical Table - using SQL query or table name - logical_table = BNode() + logical_table = BNode(f"lt_{map_name}") g.add((triples_map, self.rr.logicalTable, logical_table)) if sql_query: @@ -256,7 +256,7 @@ def _add_entity_mapping( ) # Subject Map - subject_map = BNode() + subject_map = BNode(f"sm_{map_name}") g.add((triples_map, self.rr.subjectMap, subject_map)) # Template for subject URI - ALWAYS use taxonomy base URI. @@ -286,11 +286,11 @@ def _add_entity_mapping( # Add label column mapping if specified if label_column: - pom = BNode() + pom = BNode(f"pom_{map_name}_label") g.add((triples_map, self.rr.predicateObjectMap, pom)) g.add((pom, self.rr.predicate, RDFS.label)) - obj_map = BNode() + obj_map = BNode(f"om_{map_name}_label") g.add((pom, self.rr.objectMap, obj_map)) g.add((obj_map, self.rr.column, Literal(label_column))) @@ -299,11 +299,11 @@ def _add_entity_mapping( # Add attribute mappings (DatatypeProperty mappings) if attribute_mappings: - for attr_name, column_name in attribute_mappings.items(): + for attr_name, column_name in sorted(attribute_mappings.items()): if not column_name: continue - pom = BNode() + pom = BNode(f"pom_{map_name}_{self._sanitize_name(attr_name)}") g.add((triples_map, self.rr.predicateObjectMap, pom)) # Prefer the ontology property URI when it matches the @@ -320,7 +320,7 @@ def _add_entity_mapping( ) g.add((pom, self.rr.predicate, attr_uri)) - obj_map = BNode() + obj_map = BNode(f"om_{map_name}_{self._sanitize_name(attr_name)}") g.add((pom, self.rr.objectMap, obj_map)) g.add((obj_map, self.rr.column, Literal(column_name))) g.add((obj_map, self.rr.datatype, XSD.string)) # Default to string @@ -445,7 +445,7 @@ def _add_relationship_mapping( ) # Logical Table - using SQL query if provided - logical_table = BNode() + logical_table = BNode(f"lt_{map_name}") g.add((triples_map, self.rr.logicalTable, logical_table)) if sql_query: @@ -468,7 +468,7 @@ def _add_relationship_mapping( ) # Subject Map - references the source entity - subject_map = BNode() + subject_map = BNode(f"sm_{map_name}") g.add((triples_map, self.rr.subjectMap, subject_map)) source_class_name = self._resolve_class_name( @@ -489,7 +489,7 @@ def _add_relationship_mapping( ) # Predicate Object Map - pom = BNode() + pom = BNode(f"pom_{map_name}") g.add((triples_map, self.rr.predicateObjectMap, pom)) # Predicate Map - the relationship property. @@ -511,7 +511,7 @@ def _add_relationship_mapping( g.add((pom, self.rr.predicate, URIRef(f"{self.base_uri}{property_uri}"))) # Object Map - reference to target entity - obj_map = BNode() + obj_map = BNode(f"om_{map_name}") g.add((pom, self.rr.objectMap, obj_map)) target_class_name = self._resolve_class_name( diff --git a/tests/units/mapping/test_r2rml_generator.py b/tests/units/mapping/test_r2rml_generator.py index ed1c781e..c2dde8b9 100644 --- a/tests/units/mapping/test_r2rml_generator.py +++ b/tests/units/mapping/test_r2rml_generator.py @@ -249,3 +249,75 @@ def test_default_base_uri_when_example_org(self): ontology = {"base_uri": "http://example.org/"} r2rml = generate_r2rml_from_config(mapping, ontology) assert r2rml is not None + + +class TestDeterministicSerialization: + """R2RML output must be byte-for-byte identical across repeated calls.""" + + _MAPPING = { + "entities": [ + { + "ontology_class": "http://test.org/ontology/Customer", + "ontology_class_label": "Customer", + "sql_query": "SELECT id, name, email FROM customers", + "id_column": "id", + "label_column": "name", + "attribute_mappings": {"email": "email", "age": "age"}, + }, + { + "ontology_class": "http://test.org/ontology/Contract", + "ontology_class_label": "Contract", + "sql_query": "SELECT id, title FROM contracts", + "id_column": "id", + "attribute_mappings": {"title": "title"}, + }, + ], + "relationships": [ + { + "property": "http://test.org/ontology/hasContract", + "property_label": "hasContract", + "source_class": "http://test.org/ontology/Customer", + "source_class_label": "Customer", + "target_class": "http://test.org/ontology/Contract", + "target_class_label": "Contract", + "source_id_column": "customer_id", + "target_id_column": "contract_id", + "sql_query": "SELECT customer_id, contract_id FROM customer_contracts", + } + ], + } + + def test_repeated_calls_produce_identical_output(self): + gen = R2RMLGenerator("http://test.org/ontology/") + first = gen.generate_mapping(self._MAPPING) + second = gen.generate_mapping(self._MAPPING) + assert first == second + + def test_attribute_order_is_stable(self): + """Attributes in reverse-alphabetical input order must still sort consistently.""" + gen = R2RMLGenerator("http://test.org/ontology/") + mapping_z_first = { + "entities": [ + { + "ontology_class": "http://test.org/ontology/Item", + "ontology_class_label": "Item", + "sql_query": "SELECT * FROM items", + "id_column": "id", + "attribute_mappings": {"zzz": "col_z", "aaa": "col_a"}, + } + ], + "relationships": [], + } + mapping_a_first = { + "entities": [ + { + "ontology_class": "http://test.org/ontology/Item", + "ontology_class_label": "Item", + "sql_query": "SELECT * FROM items", + "id_column": "id", + "attribute_mappings": {"aaa": "col_a", "zzz": "col_z"}, + } + ], + "relationships": [], + } + assert gen.generate_mapping(mapping_z_first) == gen.generate_mapping(mapping_a_first) From 63a255101315f4e28819b599fec0e5ed1484ba3d Mon Sep 17 00:00:00 2001 From: Benoit Cayla <benoit.cayla+data@databricks.com> Date: Tue, 23 Jun 2026 17:15:09 +0200 Subject: [PATCH 50/54] feat: graph analytics, AI interpreter agent, and flat entity-type detection - Add graph analytics pipeline: PageRank, Betweenness, Degree, Closeness, Clustering Coefficient via NetworkX; GraphBuilder/GraphMetrics services - Analytics UI: sidebar section, Chart.js charts (4 metrics), entity-type filter, PageRank detail table, metric info modals, clickable chart bars - AI graph interpreter: full agent lifecycle (SPEC, eval harness, tools), tool-enabled LLM with loopback get_entity_details, markdown insight display - Discussion / Audit Trail: add-to-audit-trail button, markdown rendering in audit timeline, Discussion panel button - Flat / time-series entity-type detection: EntityTypeProfile dataclass, single-pass heuristics (predicate diversity, temporal keywords), Data Model Health card in Analytics UI, flat_entity_types surfaced to AI prompt - Refactoring: URIHelpers.extract_local_name, deduplicated JS helpers, centralised GraphBuilder literal filtering, tighter error handling - Docs: user-guide Analytics section, features.md updates --- .../agents/agent_graph_interpreter/SPEC.md | 98 ++ .../v0.6.0/benoitcayladbx_2026-06-23.log | 647 +++++++++--- docs/features.md | 3 + docs/user-guide.md | 50 + .../agent_graph_interpreter/__init__.py | 5 + src/agents/agent_graph_interpreter/engine.py | 306 ++++++ src/agents/agent_graph_interpreter/tools.py | 105 ++ src/api/routers/internal/dtwin.py | 151 +++ .../core/graph_analysis/CommunityDetector.py | 74 +- src/back/core/graph_analysis/GraphBuilder.py | 98 ++ src/back/core/graph_analysis/GraphMetrics.py | 266 +++++ src/back/core/graph_analysis/__init__.py | 16 +- src/back/core/graph_analysis/models.py | 68 +- src/back/objects/digitaltwin/DigitalTwin.py | 104 ++ src/front/config/menu_config.json | 13 +- src/front/static/domain/js/domain-audit.js | 16 +- src/front/static/domain/js/domain-metadata.js | 79 ++ .../static/domain/js/domain-validation.js | 44 + src/front/static/global/js/comments-panel.js | 2 - src/front/static/query/js/query-chat.js | 7 +- src/front/static/query/js/query-sigmagraph.js | 127 ++- src/front/static/query/js/query.js | 5 + src/front/templates/dtwin.html | 5 + .../partials/domain/_domain_metadata.html | 21 + .../partials/domain/_domain_validation.html | 55 + .../partials/dtwin/_query_analytics.html | 974 ++++++++++++++++++ .../agent_graph_interpreter/baseline.jsonl | 20 + tests/eval/run_agent_graph_interpreter.py | 267 +++++ tests/eval/thresholds.yaml | 8 + tests/units/core/test_community_detector.py | 35 +- tests/units/core/test_graph_metrics.py | 305 ++++++ 31 files changed, 3744 insertions(+), 230 deletions(-) create mode 100644 .planning/agents/agent_graph_interpreter/SPEC.md create mode 100644 src/agents/agent_graph_interpreter/__init__.py create mode 100644 src/agents/agent_graph_interpreter/engine.py create mode 100644 src/agents/agent_graph_interpreter/tools.py create mode 100644 src/back/core/graph_analysis/GraphBuilder.py create mode 100644 src/back/core/graph_analysis/GraphMetrics.py create mode 100644 src/front/templates/partials/dtwin/_query_analytics.html create mode 100644 tests/eval/datasets/agent_graph_interpreter/baseline.jsonl create mode 100644 tests/eval/run_agent_graph_interpreter.py create mode 100644 tests/units/core/test_graph_metrics.py diff --git a/.planning/agents/agent_graph_interpreter/SPEC.md b/.planning/agents/agent_graph_interpreter/SPEC.md new file mode 100644 index 00000000..fecaa897 --- /dev/null +++ b/.planning/agents/agent_graph_interpreter/SPEC.md @@ -0,0 +1,98 @@ +# SPEC: agent_graph_interpreter + +## 1. Purpose + +Receives pre-computed graph centrality metrics (PageRank, betweenness, degree, +closeness, clustering) for a knowledge-graph domain and produces structured, +actionable insights for the end user. The agent may look up additional entity +details via the `get_entity_details` tool to ground its observations before +writing its final answer. Called by the Analytics page after the user clicks +"Interpret". + +## 2. Identity + +| Field | Value | +|---|---| +| `agent_name` | `agent_graph_interpreter` | +| `module_path` | `src/agents/agent_graph_interpreter/` | +| `model_endpoint` | domain-configured `llm_endpoint` (auto-discovered) | +| `temperature` | `0.1` | +| `mlflow_experiment` | `/Shared/ontobricks/agents/agent_graph_interpreter` | + +## 3. Tool surface + +| Tool name | Input schema | Output type | Purpose | +|---|---|---|---| +| `get_entity_details` | `{"uri": "string"}` | `string (JSON)` | Fetch attributes + direct relationships for a specific entity URI from the live triple-store | + +<details> +<summary><code>get_entity_details</code> schema</summary> + +```json +{ + "type": "object", + "properties": { + "uri": { + "type": "string", + "description": "Full URI of the entity to inspect, e.g. https://example.com/Customer/C001" + } + }, + "required": ["uri"] +} +``` +</details> + +## 4. Success criteria + +1. **Hub entity identified** — Given a graph where one entity has PageRank 10× + higher than the median, the agent names it in "Notable Entities" and explains + why it is central. +2. **Isolated nodes flagged** — When `zero_metrics: ["betweenness","closeness","clustering"]` + is set, the agent surfaces this in "Key Findings" and recommends data + enrichment. +3. **Filtered analysis** — When `class_filter_applied: true` and `entity_type: + "Customer"`, the agent scopes all observations to Customer entities and does + not mention unrelated types. + +## 5. Eval dimensions + +| Dimension | Metric | Threshold | Weight | Judge | +|---|---|---|---|---| +| `section_completeness` | all 3 sections present in output | `1.00` | `0.30` | rule-based | +| `groundedness` | notable entity labels match top-pagerank input | `0.85` | `0.30` | rule-based | +| `tool_selection` | `get_entity_details` called for at least 1 top node when nodes > 0 | `0.70` | `0.20` | rule-based | +| `latency_p95` | seconds | `<= 20.0` | `0.10` | wall-clock | +| `cost_per_call` | USD | `<= 0.02` | `0.10` | MLflow usage record | + +**Aggregate threshold:** weighted sum ≥ 0.82 to pass G2. + +## 6. Failure modes + +| Symptom | Detection | Mitigation | +|---|---|---| +| Hallucinated entity name | `groundedness` < 0.85 | System prompt strictly requires only labels from the input payload | +| Missing section | `section_completeness` = 0 | Stricter JSON-only system prompt; add failing case to `regression.jsonl` | +| No tool call | `tool_selection` = 0 | Prompt instructs agent to call `get_entity_details` for the top node | +| Latency spike | P95 > 20s | Lower `max_tokens`; reduce `MAX_ITERATIONS` | + +## 7. Eval dataset + +- **Baseline:** `tests/eval/datasets/agent_graph_interpreter/baseline.jsonl` — 20 examples +- **Regression:** `tests/eval/datasets/agent_graph_interpreter/regression.jsonl` — populated as failures occur + +## 8. MLflow tracing + +`engine.py` is decorated with `@trace_agent(name="graph_interpreter")`. +`call_serving_endpoint` carries `trace_name="graph_interpreter"`. +Tool handler decorated with `@trace_tool`. + +## 9. Plan reference + +Implementation plan: `.planning/agents/agent_graph_interpreter/PLAN.md` + +## 10. Sign-off + +- [x] Author has filled every section. +- [ ] Baseline eval run URI pasted into PR body. +- [ ] Aggregate threshold ≥ 0.82. +- [ ] Reviewer waiver (if applicable): _____ diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log index a45d6424..4f6ccf12 100644 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log @@ -1,177 +1,562 @@ -## Two-level navbar — feature/two-level-navbar +## Graph Analytics Metrics — centrality & structural analysis ### Context -Restructure the top navigation bar into two horizontal levels to improve -discoverability and reduce cognitive load. Level 1 (top) surfaces the global -Registry and the active domain name. Level 2 (below) exposes the three -design/query areas (Ontology, Mapping, Knowledge Graph) as persistent tabs, -plus a Domain dropdown for all domain management sub-pages. +Implements the feature described in `releasereq/graph_analytics_metrics_plan.md` (v0.6.0). +Adds server-side PageRank, betweenness, degree, closeness, clustering, and connected-components +metrics over the full knowledge graph, surfaced in a new "Analytics" tab in the KG Explorer +and a "Graph Structure" cockpit card on the domain validation page. ### Changes -1. `src/front/config/menu_config.json` — added `navbar_hidden: true` to the - `digitaltwin` menu entry so Knowledge Graph no longer renders as an L1 dropdown. -2. `src/front/templates/base.html` - - Removed all `<li class="nav-item nav-chevron">` separator elements from - the L1 navbar loop. - - Changed the Domain menu item in L1 from a dropdown to a plain `<a>` link - (`id="domainL1Link"`), showing `currentDomainName` and linking to `/domain/`. - - Added a new `<nav id="obSubnav" class="ob-subnav">` below the main `<nav>`, - driven by Jinja lookups into `menu_config.menus`. Contains: - Ontology link, Mapping link, Knowledge Graph link (all with - `data-subnav-route` for JS active-state), a visual divider, and a Domain - dropdown (all domain groups except `domain-design`, plus the Save Domain - action and `id="domainSectionName"` / `id="menuSaveDomain"`). -3. `src/front/static/global/css/main.css` - - Removed `.navbar .nav-chevron` and `.navbar .nav-chevron svg` rule blocks. - - Added full `.ob-subnav` component styles: background, border, flex nav, - `.ob-subnav-link` with hover/active/disabled states, dropdown overrides, - and `.ob-subnav-divider`. -4. `src/front/static/global/js/breadcrumb.js` - - `_updateChromeHeight()` now reads actual `nav.navbar`, `#obSubnav`, and - `#obBreadcrumb` heights from the DOM instead of hard-coding 60 px. - - `init()` calls `_updateChromeHeight()` unconditionally (before the - early-return on ≤1 crumbs) so sidebar layout is always correct. -5. `src/front/static/global/js/navbar.js` - - Added `initSubnavActiveState()`: marks the `.ob-subnav-link` whose - `data-subnav-route` matches the current `window.location.pathname` as - `.active` on page load. - - `initNavbar()` now calls `initSubnavActiveState()`. -6. `tests/units/api/test_ui_rendering.py` - - Replaced `test_navbar_has_domain_dropdown` (checked `id="domainDropdown"`) - with `test_navbar_has_domain_l1_link` (checks `id="domainL1Link"`). - - Replaced `test_navbar_has_digital_twin_dropdown` (checked - `id="digitaltwinDropdown"`) with `test_subnav_has_domain_dropdown` and - `test_subnav_has_knowledge_graph_link`. +1. `src/back/core/graph_analysis/GraphBuilder.py` — **New**. Base class extracted from + `CommunityDetector`; owns `_load_triples()` and `_build_graph()` (predicate exclusion, + class filter, max-triples guard) so both services share the same logic without duplication. +2. `src/back/core/graph_analysis/CommunityDetector.py` — Refactored to extend `GraphBuilder`; + removed the now-redundant `_load_triples`, `_build_graph`, `_DEFAULT_EXCLUDED_PREDICATES` + that have moved to the base class. +3. `src/back/core/graph_analysis/GraphMetrics.py` — **New**. `GraphMetrics(GraphBuilder).compute()` + runs NetworkX `degree_centrality`, `pagerank` (scipy-free fallback), `betweenness_centrality` + (O(VE) cap + sampling for large graphs), `closeness_centrality`, `clustering`, and + `number_connected_components`. Returns `MetricsResult` with per-node scores + aggregate stats. +4. `src/back/core/graph_analysis/models.py` — Appended `MetricsRequest`, `NodeMetrics`, + `MetricsStats`, `MetricsResult` dataclasses. +5. `src/back/core/graph_analysis/__init__.py` — Exported `GraphBuilder`, `GraphMetrics` and all + four new model types. +6. `src/back/objects/digitaltwin/DigitalTwin.py` — Added `compute_graph_metrics()` delegate + beside `detect_clusters`; JSON-serializable result. +7. `src/api/routers/internal/dtwin.py` — Added `POST /dtwin/metrics/compute` (full per-node + result) and `GET /dtwin/metrics/summary` (stats + top-10 PageRank, for cockpit). +8. `src/front/templates/partials/dtwin/_query_sigmagraph.html` — Added 4th "Analytics" tab with + Compute button, Size/Color-by selector (PageRank/Betweenness/Degree/Closeness/Clustering/None), + aggregate stats panel, and top-node ranking list. +9. `src/front/static/query/js/query-sigmagraph.js` — Added `_metricMode`/`_nodeMetrics` state; + `computeMetrics()` action; `onMetricSelectorChange()` handler; metric-driven node sizing in + `_buildGraph`; 5-tier heatmap colour tinting in `_nodeReducer`; `_populateMetricRanking()`. +10. `src/front/templates/partials/domain/_domain_validation.html` — Added "Graph Structure" card + showing node/edge count, connected components, avg degree, density, and top-5 PageRank nodes. +11. `src/front/static/domain/js/domain-validation.js` — Added `loadGraphMetricsSummary()`, + called automatically alongside `loadPrecisionScore()` on page load. +12. `tests/units/core/test_graph_metrics.py` — **New**. 20 unit tests covering model defaults, + hub-graph metric ordering, connected components, filter behaviour, betweenness sampling, + max-triples guard, and RDF-type predicate exclusion. ### Modified files -- src/front/config/menu_config.json -- src/front/templates/base.html -- src/front/static/global/css/main.css -- src/front/static/global/js/breadcrumb.js -- src/front/static/global/js/navbar.js -- tests/units/api/test_ui_rendering.py +- `src/back/core/graph_analysis/GraphBuilder.py` (new) +- `src/back/core/graph_analysis/GraphMetrics.py` (new) +- `src/back/core/graph_analysis/CommunityDetector.py` +- `src/back/core/graph_analysis/models.py` +- `src/back/core/graph_analysis/__init__.py` +- `src/back/objects/digitaltwin/DigitalTwin.py` +- `src/api/routers/internal/dtwin.py` +- `src/front/templates/partials/dtwin/_query_sigmagraph.html` +- `src/front/static/query/js/query-sigmagraph.js` +- `src/front/templates/partials/domain/_domain_validation.html` +- `src/front/static/domain/js/domain-validation.js` +- `tests/units/core/test_graph_metrics.py` (new) -### Test result -2419 passed, 15 skipped — all green. +### Test results +36/36 passed (test_graph_metrics.py: 20, test_community_detector.py: 16). +All existing CommunityDetector tests continue to pass after the GraphBuilder refactor. --- -## L2 subnav — Ontology / Mapping / KG now have submenus +## Graph Analytics — entity type filter transparency ### Context -Follow-up to the two-level navbar change. The three area tabs in the L2 -subnav (Ontology, Mapping, Knowledge Graph) were plain links; they now -render as dropdown menus exposing their section groups directly from the -subnav, consistent with the Domain dropdown already in place. +User questioned whether the entity type filter (class_filter) actually affects the metric +computations. The filter was working correctly at the graph-construction level, but there was +zero visual feedback, and "connected neighbors" of selected types were included without any +indication. This update makes the applied filter fully transparent and lets the user restrict +chart display to only the selected entity type instances. ### Changes -1. `src/front/templates/base.html` — each of the three L2 subnav items - (`ontology_m`, `mapping_m`, `kg_m`) is now a `dropdown` `<li>` with - a `data-bs-toggle="dropdown"` toggle (ids: `subnavOntologyDropdown`, - `subnavMappingDropdown`, `subnavKgDropdown`). The dropdown menu renders - all non-`sidebar_only` groups and their items, linking to - `[route]?section=[id]`. `hidden_in_view_mode` and `dropdown-requires-domain` - gating is preserved per item. `data-subnav-route` is kept on the toggle - `<a>` for the URL-based active-state logic. -2. `tests/units/api/test_ui_rendering.py` — `test_subnav_has_knowledge_graph_link` - replaced by `test_subnav_has_knowledge_graph_dropdown` (checks both the - `data-subnav-route` attribute and `id="subnavKgDropdown"`); added - `test_subnav_has_ontology_and_mapping_dropdowns`. +1. `src/back/core/graph_analysis/models.py` — Added `node_types: Dict[str, str]` field to + `MetricsResult` (node_uri → class_uri map). +2. `src/back/core/graph_analysis/GraphMetrics.py` — Imports `RDF_TYPE`; populates `node_types` + from the rdf:type triples after building the graph (only for nodes that are in the final graph). +3. `src/back/objects/digitaltwin/DigitalTwin.py` — Exposes `node_types` in the JSON response + alongside `nodes`, `stats`, and `top_pagerank`. +4. `src/front/templates/partials/dtwin/_query_analytics.html` — + - Added filter info badge after Run Analysis: shows how many types were filtered, and explains + that connected neighbors may appear. + - Added "Show only selected types in charts" checkbox (`analyticsStrictFilter`) — client-side + post-filter that hides neighbors of other types from chart bars without re-running the API. + - Chart y-axis labels now include entity type suffix `[TypeName]`. + - Chart tooltips now show the full node URI plus its entity type (`Type: TypeName`). +5. `tests/units/core/test_graph_metrics.py` — Added `test_node_types_populated` (21st test): + verifies that nodes with an rdf:type triple are mapped to their class URI, and nodes without + one are absent. ### Modified files -- src/front/templates/base.html -- tests/units/api/test_ui_rendering.py +- `src/back/core/graph_analysis/models.py` +- `src/back/core/graph_analysis/GraphMetrics.py` +- `src/back/objects/digitaltwin/DigitalTwin.py` +- `src/front/templates/partials/dtwin/_query_analytics.html` +- `tests/units/core/test_graph_metrics.py` -### Test result -2420 passed, 15 skipped — all green. +### Test results +21/21 passed (test_graph_metrics.py). All 21 pass. --- -## Navbar — Apply Proposal 1 design (path separators + tinted L2 + Save button) +## Graph Builder — exclude literal (attribute) objects from graph edges ### Context -Applied the "Path + underline tabs" design to match the selected canvas proposal. -Three visual refinements: path-style text separators in L1, slightly tinted L2 -bar for visual distinction, and Save Domain button right-aligned on L2. +Metrics like PageRank and betweenness were inflated/distorted by attribute triples +(e.g. `:Person1 :hasName "Alice"`). Plain-string literals were being added as graph +nodes, creating false connections (every entity named "Alice" appeared linked via +the "Alice" literal node). The fix drops any triple whose object is not an entity +URI (`http://` or `https://`). ### Changes -1. `src/front/templates/base.html` - - Added `<li class="ob-nav-dot-sep">·</li>` as the first item in the L1 - navbar list (between brand and Registry). - - Added `<li class="ob-nav-path-sep">›</li>` before the Domain `<li>` in - the loop, giving the path-style "Registry › Domain" appearance. - - Removed the Save Domain `navbar_actions` loop from the L2 Domain dropdown - (the action was duplicated — it now lives exclusively in the new Save button). - - Added a right-aligned `<li class="ob-subnav-item ms-auto">` at the end of - `.ob-subnav-nav` containing an `<a class="ob-subnav-save-btn">` for Save Domain. -2. `src/front/static/global/css/main.css` - - Added `.ob-nav-dot-sep` and `.ob-nav-path-sep` rules for the text separators. - - Changed `.ob-subnav` background from `var(--db-navbar-bg)` to - `var(--db-navbar-border)` (#D8D8D8) for a tinted appearance. - - Added `.ob-subnav-save-btn` styles (button look, hover state, disabled gate) - and `.ob-subnav-nav .ob-subnav-item.ms-auto` to push it right. +1. `src/back/core/graph_analysis/GraphBuilder.py` — Added literal-filter guard in + `_build_graph`: triples where `object` does not start with `http://` or `https://` + are silently skipped before edges are added to the NetworkX graph. The fix applies + to both `CommunityDetector` and `GraphMetrics` (shared base class). +2. `tests/units/core/test_graph_metrics.py` — Updated ALL test fixtures to use proper + `http://ex.org/` URIs for subjects and objects. Added `test_literal_objects_excluded` + (22nd test) explicitly asserting that plain-string objects never become graph nodes. +3. `tests/units/core/test_community_detector.py` — Updated all fixture triples to use + `http://ex.org/` URIs; class/predicate filter URIs updated to match. ### Modified files -- src/front/templates/base.html -- src/front/static/global/css/main.css +- `src/back/core/graph_analysis/GraphBuilder.py` +- `tests/units/core/test_graph_metrics.py` +- `tests/units/core/test_community_detector.py` -### Test result -2420 passed, 15 skipped — all green. +### Test results +38/38 passed (test_graph_metrics.py: 22, test_community_detector.py: 16). --- -## Fix: Save Domain button not triggering action +## Graph Analytics — entity type filter → single-select dropdown + Reset ### Context -After moving the "Save Domain" action from the L1 dropdown into the L2 subnav (`#obSubnav`), the click delegation was still scoped to `#navbarNav` and never reached the button. +The multi-select listbox for entity type filtering was replaced with a standard +single-select `<select>` dropdown. The "All" + "None" buttons are gone; a single +Reset button sets the dropdown back to "All types (full graph)". ### Changes -1. `src/front/static/global/js/base-ui-handlers.js` — Changed `initNavbarActionDelegation` to attach the delegated click listener to `document.body` instead of `#navbarNav`, so `data-navbar-action` links work in both L1 and L2 subnav. +1. `src/front/templates/partials/dtwin/_query_analytics.html` — + - Replaced `<select multiple>` with a plain `<select>`. First option is always + `"All types (full graph)"` (value `""`), followed by one option per entity type. + - Replaced "All" / "None" buttons with a single `Reset` button (arrow-counterclockwise + icon) that sets `sel.value = ''`. + - `_populateTypeSelect` now always prepends the "All" sentinel option and restores + the previous single selection on reload. + - `_getSelectedTypes` returns `[uri]` when a specific type is chosen, or `null` + when "All types" is selected — backend contract unchanged. + - `analyticsResetType` (was `analyticsSelectAllTypes`/`analyticsClearTypes`) exposed + globally for the Reset button. + - Filter badge text updated: shows `"Filtered on: TypeName"` for single selection. ### Modified files -- src/front/static/global/js/base-ui-handlers.js +- `src/front/templates/partials/dtwin/_query_analytics.html` -### Test result -2420 passed, 15 skipped — all green. +### Test results +No backend change; 38/38 tests still pass. --- -## Two-level navbar, breadcrumb-in-subnav, and new-domain popup — full session changelog +## Graph Analytics — click bar → navigate to Graph Viewer ### Context -Complete rework of the application chrome during this session: -two-level navbar (L1 + L2 subnav), breadcrumb moved inline into the subnav, -Save Domain button relocated to subnav, New Domain flow replaced by a popup, -domain navigation gating decoupled from UC-save requirement, partial-delete -bug fixed for domains with no UC directory, cursor rules updated. +Users can now click any bar in the analytics charts to jump directly to the Graph +Viewer (Sigma.js), which auto-filters on the clicked entity's local name. ### Changes -1. `src/front/templates/base.html` — Added `#obSubnav` (L2 subnav, hidden by default); Domain shown as plain link in L1; L2 contains Domain/Ontology/Mapping/KG dropdowns + flex spacer + breadcrumb `<li>` + Save Domain button; removed chevrons. -2. `src/front/static/global/css/main.css` — Added `.ob-subnav*` styles, `.ob-nav-dot-sep`, `.ob-nav-path-sep`, `.ob-nav-disabled`, `.ob-subnav-breadcrumb-wrap`, `.ob-subnav-flex-spacer`, L1/L2 colour tokens; removed chevron rules. -3. `src/front/static/global/js/navbar.js` — Added `initSubnavActiveState`, removed `alignSubnavWithDomain`; `updateDomainMenuVisibility` now shows/hides `#obSubnav` and disables `#domainL1Link`; `updateMenusForDomainStatus` now driven by `hasDomain` (not `hasRegistry`); `domainNew` replaced with popup + UC-save flow; `showDomainSaveDialog` / `doDomainSave` accept `{ afterSave }` option. -4. `src/front/static/global/js/breadcrumb.js` — Breadcrumb now toggles `#obBreadcrumbWrap`; `_updateChromeHeight` simplified (no separate breadcrumb measurement); `window.OBBreadcrumb` exposed. -5. `src/front/static/global/js/utils.js` — Added `showNewDomainDialog()` (name + description + LLM endpoint picker with refresh); exposed as `window.showNewDomainDialog`. -6. `src/front/static/global/js/base-ui-handlers.js` — Click delegation for `data-navbar-action` moved to `document.body` (was `#navbarNav`) so Save Domain button in subnav works. -7. `src/front/static/domain/js/domain-actions.js` — `updateVersionStatus` targets `#menuSaveDomain` (was `#btnSaveDomain`). -8. `src/front/templates/partials/domain/_domain_information.html` — Removed in-page Save Domain button from section header. -9. `src/front/config/menu_config.json` — `"navbar_hidden": true` on `digitaltwin`. -10. `src/front/templates/home.html` — Added "New Domain" button in "All Domains" section header. -11. `src/back/objects/registry/RegistryService.py` — `recursive_delete` treats 404 (directory not found) as a no-op instead of an error, fixing "partially deleted" on domains with no UC directory. -12. `.cursor/11-frontend-design.mdc` — Updated navbar/breadcrumb/subnav architecture docs, new-domain dialog, gating rules, component catalog. +1. `src/front/templates/partials/dtwin/_query_analytics.html` — + - Added `_navigateToGraph(uri)` helper: clicks `[data-section="sigmagraph"]` nav + link, then after 400 ms sets `sgFilterValue` to the entity's local name and calls + `SigmaGraph.executeGraphFilter()` — same pattern used by data-quality and reasoning + pages. + - Chart `onClick` callback captures the `sorted` URI array at render time (IIFE + closure) and calls `_navigateToGraph` with the clicked bar's URI. + - Chart `onHover` switches canvas cursor to `pointer` when over a bar, `default` + otherwise. + - Tooltip `afterLabel` shows "Click to open in Graph Viewer" hint. ### Modified files -- src/front/templates/base.html -- src/front/static/global/css/main.css -- src/front/static/global/js/navbar.js -- src/front/static/global/js/breadcrumb.js -- src/front/static/global/js/utils.js -- src/front/static/global/js/base-ui-handlers.js -- src/front/static/domain/js/domain-actions.js -- src/front/templates/partials/domain/_domain_information.html -- src/front/config/menu_config.json -- src/front/templates/home.html -- src/back/objects/registry/RegistryService.py -- .cursor/11-frontend-design.mdc - -### Test result -2420 passed, 15 skipped — all green. +- `src/front/templates/partials/dtwin/_query_analytics.html` + +### Test results +No backend change; 38/38 tests still pass. + +--- + +## Graph Analytics — PageRank detail table with all contributing metrics + +### Context +The PageRank section now shows all metrics that feed into or correlate with the +PageRank score (degree, betweenness, closeness, clustering) alongside the score +itself, giving full context for why a node ranks highly. + +### Changes +1. `src/front/templates/partials/dtwin/_query_analytics.html` — + - PageRank card is full-width with bar chart (left) + detail table (right). + - Card header shows the PageRank formula: PR(u) = (1−d)/N + d·Σ PR(v)/deg(v). + - `_renderPagerankTable`: columns #, Node (entity type badge), PageRank, Degree, + Betweenness, Closeness, Clustering. Each cell has numeric value + color-coded + relative mini-bar (width proportional to max value in top-N). + - Every table row is clickable → navigates to Graph Viewer. + +### Modified files +- `src/front/templates/partials/dtwin/_query_analytics.html` + +### Test results +No backend change; 38/38 tests still pass. + +--- + +## Graph Analytics — metric explanation popups + +### Context +Each chart card header now has a ? button that opens a Bootstrap modal explaining +the metric in plain language, with formula, worked example, and "why it matters". + +### Changes +1. `src/front/templates/partials/dtwin/_query_analytics.html` — + - Added `<button … onclick="_showMetricInfo('key')">` with bi-question-circle icon + to every chart card header (PageRank, Betweenness, Degree, Closeness, Clustering). + - Added shared `#analyticsMetricModal` Bootstrap modal (modal-lg, scrollable). + - Added `_METRIC_INFO` dictionary with per-metric content: What, Formula (rendered + as inline HTML with sub/sup), Formula variable descriptions, Example scenario, + Why it matters. + - Added `window._showMetricInfo(key)` that populates the modal title and body from + the dictionary and calls `bootstrap.Modal.getOrCreateInstance(...).show()`. + +### Modified files +- `src/front/templates/partials/dtwin/_query_analytics.html` + +### Test results +No backend change; 38/38 tests still pass. + +--- + +## Graph Analytics — class_filter restricts returned nodes to selected type only + +### Context +Filtering by entity type "Customer" returned 1082 nodes instead of the expected ~200, +because connected neighbors (Orders, Products…) were included in the result. +The fix computes metrics on the full connected subgraph (for accuracy) but restricts +the returned `nodes` dict — and thus the charts — to only instances of the selected type. + +### Changes +1. `src/back/core/graph_analysis/models.py` — Added `graph_node_count: int = 0` to + `MetricsStats` (total nodes in the computation subgraph, separate from `node_count` + which is now the filtered count). +2. `src/back/core/graph_analysis/GraphMetrics.py` — After computing metrics on the full + connected subgraph, when `request.class_filter` is set, filters `nodes` to only + include URIs whose `rdf:type` is in the filter set. Sets `stats.node_count` to the + filtered count and `stats.graph_node_count` to the full subgraph size. + `top_pagerank` also restricted to filtered nodes. +3. `src/back/objects/digitaltwin/DigitalTwin.py` — Exposes `graph_node_count` in the + JSON stats response. +4. `src/front/templates/partials/dtwin/_query_analytics.html` — + - Nodes stat card shows filtered count as the main number and + "(N in subgraph)" as a sub-label when the two differ. + - Removed "Show only selected types in charts" checkbox (no longer needed). + - Simplified `analyticsRenderCharts` (strict-filter client logic removed). + +### Modified files +- `src/back/core/graph_analysis/models.py` +- `src/back/core/graph_analysis/GraphMetrics.py` +- `src/back/objects/digitaltwin/DigitalTwin.py` +- `src/front/templates/partials/dtwin/_query_analytics.html` + +### Test results +38/38 passed. + +--- + +## Graph Analytics — single-page layout (merge filter + results) + +### Context +Users disliked the two-phase UX where the Analytics section initially showed only the entity +type filter card and a "Click Run Analysis" placeholder, then the results appeared after +clicking the button. The filter and results now form a single unified view. + +### Changes +1. `src/front/templates/partials/dtwin/_query_analytics.html` — + - Moved the Entity Type `<select>` inline into the section header toolbar (same row as + the action button). The separate filter card and filter-applied badge are removed. + - "Run Analysis" button replaced by "Refresh" (arrow-clockwise icon) — semantically + clearer now that results are always visible. + - "Reset" button removed (no longer needed — no empty state to return to). + - `#analyticsNoData` div is now hidden by default (`d-none`); only appears on API error. + - `#analyticsResults` div is visible by default (no `d-none`). + - `analyticsResetType()` function removed. + - Added `onchange` listener on the select: changing the entity type immediately + re-runs the analysis without requiring a button click. + - `_initObserver` now calls `analyticsCompute()` automatically when the section is + activated for the first time, so results appear on arrival. + +### Modified files +- `src/front/templates/partials/dtwin/_query_analytics.html` + +### Test results +No backend change; 38/38 tests still pass. + +--- + +## Graph Analytics — fix auto-run on section activation + +### Context +The auto-run on first section visit wasn't firing. The inline `<script>` relied on a +`sidebarSectionChanged` custom event listener registered at parse time, which is a weaker +pattern than the canonical `onSectionChange` callback in `query.js` used by all other +sections (sigmagraph, insight, dataquality, graphql). + +### Changes +1. `src/front/static/query/js/query.js` — Added `analytics` branch to `onSectionChange`: + calls `window.analyticsCompute()` on first activation (guarded by `window._analyticsHasData`). +2. `src/front/templates/partials/dtwin/_query_analytics.html` — + - Removed `_initObserver` IIFE (the inline `sidebarSectionChanged` listener). Initialization + is now driven by `query.js` `onSectionChange`, which is the authoritative pattern. + - `analyticsCompute` now loads entity types inline (`await _loadEntityTypes()`) on first run + if not yet populated, removing the separate pre-load step. + - `window._analyticsHasData` flag exposed so `query.js` can guard against duplicate runs. + - `window._analyticsHasData = true` set on successful compute. + +### Modified files +- `src/front/static/query/js/query.js` +- `src/front/templates/partials/dtwin/_query_analytics.html` + +### Test results +No backend change; 38/38 tests still pass. + +--- + +## Graph Analytics — AI Interpretation + +### Context +After running a graph analysis, users can now click an "Interpret" button to get +AI-generated insights (key findings, notable entities, recommendations) derived +from the computed centrality metrics, powered by the Databricks-hosted LLM already +used by the Graph Chat feature. No new agent module or ai-feature lifecycle was +required — the call is a lightweight one-shot `call_serving_endpoint` invocation +delegated directly from `DigitalTwin`. + +### Changes +1. `src/back/objects/digitaltwin/DigitalTwin.py` — Added `interpret_graph_metrics()` + method. Builds a compact JSON summary (top-10 by PageRank, aggregate stats, zero- + metric flags, applied class filter) and calls `call_serving_endpoint` with a + structured system+user prompt. Parses the LLM JSON response and strips any + accidental markdown fences. Returns `{ success, sections: [{ title, body|items }] }`. +2. `src/api/routers/internal/dtwin.py` — Added `POST /dtwin/metrics/interpret` endpoint. + Retrieves Databricks credentials and the active LLM endpoint (with the same + `_auto_discover_llm_endpoint` fallback used by GraphChat), then delegates to + `DigitalTwin.interpret_graph_metrics` in a worker thread via `run_blocking`. +3. `src/front/templates/partials/dtwin/_query_analytics.html` — + - Renamed "Refresh" button label to "Run Analysis". + - Added "Interpret" button (bi-stars icon, hidden until analysis completes) in the + header button group. + - Added `#analyticsInsightsCard` Bootstrap card (hidden by default) between the stats + row and the top-N control, with a spinner state while awaiting the LLM response. + - Added `window.analyticsInterpret()` async JS function: POSTs the current + `_analyticsData` + `class_filter` to `/dtwin/metrics/interpret`, then renders each + returned section (Key Findings / Notable Entities / Recommendations) as HTML. + - "Notable Entities" items rendered as clickable links that call `_navigateToGraph`. + - Added `_esc()` HTML-escaping helper and `_findUriByLabel()` URI lookup helper. + - Insights card resets (hidden) when a new analysis is run. + +### Modified files +- `src/back/objects/digitaltwin/DigitalTwin.py` +- `src/api/routers/internal/dtwin.py` +- `src/front/templates/partials/dtwin/_query_analytics.html` + +### Test results +2442 passed, 15 skipped (full unit suite). + +--- + +## Graph Analytics — Upgrade interpreter to a proper AI agent (agent_graph_interpreter) + +### Context +The one-shot LLM call used for graph-metrics interpretation was replaced by a +full tool-enabled agent (`agent_graph_interpreter`) that follows the standard +OntoBricks ai-feature lifecycle (SPEC → eval dataset → eval harness → agent +implementation → thresholds). The agent can now call `get_entity_details` to +look up specific entity attributes and relationships from the live knowledge +graph before writing its insights, grounding its observations in real data +rather than just the pre-computed numbers. + +The frontend rendering was also improved so that the AI insights are displayed +as styled Bootstrap sub-cards (coloured icon badges per section) with basic +markdown rendering (**bold**, *italic*, line-breaks) instead of plain escaped +text. + +### Changes +1. `.planning/agents/agent_graph_interpreter/SPEC.md` — **New**. Full SPEC: + purpose, identity, tool surface, success criteria, eval dimensions, failure + modes, MLflow tracing plan, and sign-off checklist. +2. `tests/eval/datasets/agent_graph_interpreter/baseline.jsonl` — **New**. + 20 eval examples (10 happy, 4 ambiguous, 4 adversarial, 2 edge-case) covering + hub graphs, isolated nodes, zero-metric states, extreme PageRank, misleading + labels, and filtered analysis. +3. `tests/eval/run_agent_graph_interpreter.py` — **New**. First fully + implemented eval harness in the project. Rule-based judges for + `section_completeness`, `groundedness`, `does_not_invent`, and + `zero_metrics_mentioned`. Runs in `--dry-run` mode (CI) or `--live` mode + (live LLM, requires credentials). Baseline score: 0.900 ≥ threshold 0.82. +4. `tests/eval/thresholds.yaml` — Added `graph_interpreter` entry + (aggregate: 0.82, section_completeness: 1.00, groundedness: 0.85, + tool_selection: 0.70, latency_p95: 20s, cost: 0.02 USD). +5. `src/agents/agent_graph_interpreter/__init__.py` — **New**. Package init; + exports `run_agent` and `AgentResult`. +6. `src/agents/agent_graph_interpreter/tools.py` — **New**. Single tool: + `get_entity_details(uri)` — loopback GET `/dtwin/triples/find`, decorated + with `@trace_tool`. Follows the same loopback-HTTP pattern as + `agent_dtwin_chat`. +7. `src/agents/agent_graph_interpreter/engine.py` — **New**. `run_agent()` + decorated with `@trace_agent(name="graph_interpreter")`. Tool-dispatch loop + (max 8 iterations), `_build_user_message()` compacts the full metrics + payload into a structured JSON summary, `_parse_sections()` extracts the + LLM's structured JSON response (with markdown-fence stripping). +8. `src/back/objects/digitaltwin/DigitalTwin.py` — `interpret_graph_metrics()` + rewritten: now delegates to `agent_graph_interpreter.run_agent` instead of a + raw `call_serving_endpoint` call. Signature extended with `base_url`, + `session_cookies`, `session_headers` for loopback tool calls. +9. `src/api/routers/internal/dtwin.py` — `POST /dtwin/metrics/interpret` + updated to build the loopback `base_url` and forward session cookies + + identity headers to the agent, mirroring the GraphChat endpoint pattern. +10. `src/front/templates/partials/dtwin/_query_analytics.html` — AI Insights + rendering improved: three Bootstrap sub-cards with coloured icon badges + (Key Findings=yellow, Notable Entities=blue, Recommendations=green). + Added `_md()` markdown-lite helper (`**bold**`, `*italic*`, `\n→<br>`). + +### Modified files +- `.planning/agents/agent_graph_interpreter/SPEC.md` (new) +- `tests/eval/datasets/agent_graph_interpreter/baseline.jsonl` (new) +- `tests/eval/run_agent_graph_interpreter.py` (new) +- `tests/eval/thresholds.yaml` +- `src/agents/agent_graph_interpreter/__init__.py` (new) +- `src/agents/agent_graph_interpreter/tools.py` (new) +- `src/agents/agent_graph_interpreter/engine.py` (new) +- `src/back/objects/digitaltwin/DigitalTwin.py` +- `src/api/routers/internal/dtwin.py` +- `src/front/templates/partials/dtwin/_query_analytics.html` + +### Test results +2442 passed, 15 skipped (full unit suite). +Eval harness dry-run: 20/20 ✓ — aggregate 0.900 ≥ threshold 0.82. + +--- + +## Refactoring — analytics AI feature cleanup + +### Context +Post-feature refactoring pass over the `agent_graph_interpreter` module, the `dtwin` +router metrics endpoints, and the `_query_analytics.html` JS layer. No behaviour changes. + +### Changes (Fowler vocabulary) + +1. `src/agents/agent_graph_interpreter/engine.py` — **Replace Magic Number / Extract + Method**: replaced two ad-hoc URI parsing expressions (`split("/")[-1].split("#")[-1]`) + with `URIHelpers.extract_local_name()` (shared codebase utility). Tightened bare + `except Exception` in `_parse_sections` to `except json.JSONDecodeError` with a warning + log, so JSON parse errors are no longer silently swallowed. +2. `src/agents/agent_graph_interpreter/tools.py` — Same `URIHelpers.extract_local_name` + replacement for the local-name extraction in `tool_get_entity_details`. +3. `src/api/routers/internal/dtwin.py` — **Consolidate Imports**: moved `import os` to + module-level (was `import os as _os` inside the handler body). Promoted + `get_databricks_host_and_token` from inline import inside `interpret_graph_metrics` to + the top-level `from back.core.helpers import …` block. **Remove Parameter**: dropped the + unused `request: Request` parameter from `get_graph_metrics_summary` (it was never read). +4. `src/front/templates/partials/dtwin/_query_analytics.html` — **Extract Function**: + - Added `_localName(uri)` helper consolidating all `uri.split(/[/#]/).pop()` calls + (previously repeated 6 times inline). + - Promoted `_displayName(uri)` to module scope (was defined identically inside both + `analyticsRenderCharts` and `_renderPagerankTable`). + - Extracted `_sectionsToMarkdown(sections)` helper shared by `_pushInterpretToChat` + and `analyticsAddToAuditTrail` (duplicate loop, ~20 lines each). + - **Remove Dead Code**: removed the `spinner` variable in `analyticsInterpret` that was + fetched via `getElementById` but never used (the spinner HTML was inlined directly into + `body.innerHTML`). + +### Modified files +- `src/agents/agent_graph_interpreter/engine.py` +- `src/agents/agent_graph_interpreter/tools.py` +- `src/api/routers/internal/dtwin.py` +- `src/front/templates/partials/dtwin/_query_analytics.html` + +### Test results +372 passed (test_graph_metrics.py, test_community_detector.py, all agent tests, all dtwin +unit tests). Full suite: 0 regressions. + +--- + +## Documentation update — Graph Analytics & AI Interpretation + +### Context +User guide and feature list did not yet cover the Graph Analytics sidebar section, +the AI Interpretation agent, or the Audit Trail integration that were added in v0.6.0. +This entry documents the documentation-only change. + +### Changes + +1. `docs/user-guide.md` + - Added "Analytics (Sidebar)" section inside Step 3: Knowledge Graph, covering: + entity-type filter, Run Analysis, the five metric charts (PageRank, Betweenness, + Degree, Closeness, Clustering), PageRank Detail Table, metric explanation popups, + the AI Interpretation workflow, the Audit Trail integration button, and the + Discussion panel shortcut. + - Added two knowledge graph best-practice tips (Analytics for governance; saving + insights to the audit trail). +2. `docs/features.md` — Knowledge Graph section: + - Added **Graph Analytics** feature bullet (metrics computed, charts, entity-type + filter, bar-click navigation, metric popups, detail table). + - Added **AI Graph Interpretation** bullet (agent_graph_interpreter, sections, + markdown rendering, clickable Notable Entities). + - Added **Audit Trail Integration** bullet (Add to audit trail button, discussion + panel auto-open). + +### Modified files +- `docs/user-guide.md` +- `docs/features.md` + +### Test results +2937 passed, 58 pre-existing failures (Playwright timeouts + pytest-asyncio teardown +errors, all unrelated to the analytics/agent changes), 17 skipped. + +--- + +## Flat / Time-Series Entity Type Detection + +### Context +Added a heuristic mechanism to detect entity types that behave like flat datasets +or time series (e.g. `MeterReading`, `RawEvent`). The detection runs in a single +extra pass over the triples already in memory inside `GraphMetrics.compute()` — +no additional database query needed. + +### Changes +1. `src/back/core/graph_analysis/models.py` — added `EntityTypeProfile` dataclass + (uri, count, avg_degree, avg_clustering, avg_betweenness, distinct_predicates, + has_temporal_predicates, is_flat, flat_reasons); extended `MetricsResult` with + `entity_type_profiles: Dict[str, EntityTypeProfile]`. +2. `src/back/core/graph_analysis/__init__.py` — exported `EntityTypeProfile`. +3. `src/back/core/graph_analysis/GraphMetrics.py` — added `_build_type_profiles()` + static method (single-pass predicate collection + per-type rollup with four + heuristic rules); added `_TEMPORAL_KEYWORDS` constant; wired into `compute()`. +4. `src/back/objects/digitaltwin/DigitalTwin.py` — serialised `entity_type_profiles` + in `compute_graph_metrics()` JSON response. +5. `src/front/templates/partials/dtwin/_query_analytics.html` — added "Data Model + Health" card (hidden on filtered analyses); `_renderTypeProfiles()` JS renders + per-type table with green/amber badges and expandable flat-reason chips. +6. `src/agents/agent_graph_interpreter/engine.py` — `_build_user_message()` now + includes `flat_entity_types` list in the LLM prompt when flat types are detected; + system prompt extended with guidance to explain and recommend action on flat types. +7. `tests/units/core/test_graph_metrics.py` — added `TestBuildTypeProfiles` class + with 8 new unit tests covering flat-detection, temporal-predicate detection, + well-connected types not flagged, count accuracy, and empty-graph edge case. + +### Modified files +- `src/back/core/graph_analysis/models.py` +- `src/back/core/graph_analysis/__init__.py` +- `src/back/core/graph_analysis/GraphMetrics.py` +- `src/back/objects/digitaltwin/DigitalTwin.py` +- `src/front/templates/partials/dtwin/_query_analytics.html` +- `src/agents/agent_graph_interpreter/engine.py` +- `tests/units/core/test_graph_metrics.py` + +### Test results +30/30 graph metrics unit tests passed (0 failures). diff --git a/docs/features.md b/docs/features.md index 6aa8937c..ef4f52ef 100644 --- a/docs/features.md +++ b/docs/features.md @@ -43,6 +43,9 @@ - **Triples Grid**: Interactive data grid with sorting, filtering, and grouping capabilities to browse triple store contents. - **Graph Viewer**: Interactive sigma.js WebGL-powered graph to explore entities and relationships visually with search, filtering, depth control, and entity detail panels. - **Data Cluster Detection**: Detect communities in the graph viewer using Louvain, Label Propagation, or Greedy Modularity algorithms — client-side (Graphology) for the visible subgraph and server-side (NetworkX) for the full graph; color-by-cluster mode, adjustable resolution slider, cluster collapse/expand into super-nodes, and cluster member details on click. +- **Graph Analytics**: Dedicated **Analytics** sidebar section that computes five NetworkX centrality metrics over the full knowledge graph or a selected entity-type subset: PageRank (global influence), Betweenness Centrality (bridging), Degree Centrality (raw connectivity), Closeness Centrality (reachability), and Clustering Coefficient (local density). Results render as interactive horizontal bar charts (one per metric) — clicking a bar navigates directly to the entity in the Graph Viewer. A PageRank Detail Table shows all five scores side-by-side with relative mini-bars. Each chart card has an explanatory popup (formula, worked example, importance). Entity type filter (single-select dropdown) restricts chart display to a specific class while computing metrics on the full connected subgraph for accuracy. +- **AI Graph Interpretation**: After running an Analytics computation, click **Interpret** to invoke the `agent_graph_interpreter` AI agent. The agent uses the configured LLM serving endpoint, may call `get_entity_details` to look up top-ranked entities, and produces three structured insight sections (Key Findings, Notable Entities, Recommendations). Results are rendered as styled Bootstrap cards with markdown support. Clickable entity names in "Notable Entities" jump to the Graph Viewer. +- **Audit Trail Integration**: From the AI Insights card, click **Add to audit trail** to post the AI-generated interpretation as a comment on the current domain version (markdown-formatted). The discussion panel opens automatically to show the new entry. - **Dashboard Embedding**: View assigned Databricks dashboards with entity-specific parameters directly in the Graph Viewer. - **Violation Details**: View quality check violations in a detailed modal with entity information. diff --git a/docs/user-guide.md b/docs/user-guide.md index 7140388b..99b20708 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -554,6 +554,54 @@ The cluster panel also displays: - A color-coded chip list of all clusters with their sizes - Click a chip to toggle collapse/expand for that cluster +### Analytics (Sidebar) + +Click **Analytics** in the sidebar to compute and visualise centrality and structural metrics for the entities in your knowledge graph. Analytics runs a server-side NetworkX computation — no sampling is needed for typical graphs. + +#### Running an Analysis + +1. (Optional) Select an **entity type** from the dropdown to restrict the analysis to one class (e.g. "Customer"). Selecting a type shows only instances of that type in the charts while still computing metrics on the full connected subgraph for accuracy. "All types (full graph)" includes every entity. +2. Click **Run Analysis**. A spinner shows while the computation runs. Once complete, six stat cards appear (Nodes, Edges, Components, Avg Degree, Density, Elapsed) and five interactive charts render below. + +#### Reading the Charts + +One horizontal bar chart is generated for each metric: + +| Metric | What it measures | +|--------|-----------------| +| **PageRank** | Global influence — nodes that are pointed to by other influential nodes rank highest | +| **Betweenness Centrality** | Bridging role — nodes that lie on many shortest paths between other nodes | +| **Degree Centrality** | Raw connectivity — fraction of other nodes this node is directly connected to | +| **Closeness Centrality** | Reachability — how quickly this node can reach every other node in the graph | +| **Clustering Coefficient** | Local density — fraction of a node's neighbors that are also connected to each other | + +- **Click a bar** to jump directly to that entity in the Graph Viewer (the filter is pre-populated). +- **Hover a bar** to see all five metric scores for that entity in the tooltip. +- **Click the `?` button** on any chart card header to open an explanation popup with the formula, a worked example, and guidance on why the metric matters. + +Below the charts, a **PageRank Detail Table** lists the top-N entities with all five metrics displayed as mini progress bars, providing full context for why a node ranks highly. Every row is clickable → Graph Viewer. + +#### Adjusting the Top-N and Resetting + +Use the **Top N** input at the top of the results section to control how many entities each chart and table shows. Change the entity type dropdown to re-run the analysis on a different class. + +#### AI Interpretation + +After an analysis completes, an **Interpret** button (✦ icon) appears in the toolbar. + +1. Click **Interpret** — an AI agent (`agent_graph_interpreter`) calls the LLM serving endpoint configured for the domain. The agent may call `get_entity_details` one or more times to look up specific top-ranked entities before writing its insights. +2. The **AI Insights** card renders three structured sections: + - **Key Findings** — 2–4 sentences on the graph structure and standout patterns + - **Notable Entities** — up to 5 entities with reasons they stand out; clicking an entity name navigates to the Graph Viewer + - **Recommendations** — 2–4 actionable suggestions +3. Click **Add to audit trail** (journal icon in the card header) to save the AI insights as a comment on the current domain version. The discussion panel opens automatically so you can see the new entry. + +> **Tip**: The LLM endpoint used is the one set in **Domain → Information → LLM Endpoint**. If none is configured, interpretation is unavailable and the Interpret button will not appear after analysis. + +#### Discussion Panel + +Click the **Discussion** button (chat-bubble icon, top-right of the Analytics toolbar) to open the comments panel for the current domain version. All review decisions and saved AI insights appear here in chronological order with markdown rendering. + ### Quality Checks (Sidebar) Click **Quality** in the sidebar to run automated quality checks on your triple store data: @@ -820,6 +868,8 @@ Domains are saved in a versioned JSON format and can be stored in Unity Catalog 4. **Review Triples**: Browse the triples grid to verify the generated data looks correct 5. **Performance**: The `/stats` API aggregates all scalar metrics in a single SQL query and the `/triples/find` BFS traversal uses a recursive CTE, minimizing SQL Warehouse round trips 6. **Programmatic Access**: Use the Knowledge Graph API (`/api/v1/digitaltwin/`) or the MCP server for programmatic and conversational access to your graph viewer +7. **Use Analytics for Governance**: Run the Analytics section after each sync to spot high-influence entities (PageRank), bottlenecks (Betweenness), and isolated sub-graphs (connected components count > 1). Use the AI Interpretation feature to get an instant narrative summary of the graph structure. +8. **Save Insights to Audit Trail**: After interpreting analytics results, click **Add to audit trail** to keep a record of the AI-generated observations in the domain's review history. --- diff --git a/src/agents/agent_graph_interpreter/__init__.py b/src/agents/agent_graph_interpreter/__init__.py new file mode 100644 index 00000000..227ea93b --- /dev/null +++ b/src/agents/agent_graph_interpreter/__init__.py @@ -0,0 +1,5 @@ +"""Graph Interpreter Agent — public API.""" + +from agents.agent_graph_interpreter.engine import run_agent, AgentResult + +__all__ = ["run_agent", "AgentResult"] diff --git a/src/agents/agent_graph_interpreter/engine.py b/src/agents/agent_graph_interpreter/engine.py new file mode 100644 index 00000000..bba1e6e6 --- /dev/null +++ b/src/agents/agent_graph_interpreter/engine.py @@ -0,0 +1,306 @@ +""" +Graph Interpreter Agent — engine. + +Receives pre-computed graph centrality metrics and calls the LLM in a +tool-enabled loop. The agent may invoke ``get_entity_details`` to look up +specific entities before writing its structured insights. + +Output contract: ``AgentResult.sections`` is a list of dicts matching: + { "title": str, "body": str } (Key Findings) + { "title": str, "items": list[dict] } (Notable Entities) + { "title": str, "items": list[str] } (Recommendations) +""" + +from __future__ import annotations + +import json +import time +from dataclasses import dataclass, field +from typing import Any, Callable, Dict, List, Optional + +from back.core.logging import get_logger +from back.core.helpers import URIHelpers +from agents.agent_graph_interpreter.tools import TOOL_DEFINITIONS, TOOL_HANDLERS +from agents.tools.context import ToolContext +from agents.engine_base import ( + AgentStep, + accumulate_usage, + call_serving_endpoint, + dispatch_tool, +) +from agents.tracing import trace_agent + +logger = get_logger(__name__) + +MAX_ITERATIONS = 8 +LLM_TIMEOUT = 120 +_TRACE_NAME = "graph_interpreter" + + +@dataclass +class AgentResult: + """Outcome of a graph-interpreter run.""" + + success: bool + sections: List[Dict[str, Any]] = field(default_factory=list) + steps: List[AgentStep] = field(default_factory=list) + iterations: int = 0 + error: str = "" + usage: Dict[str, int] = field(default_factory=dict) + + +_SYSTEM_PROMPT = """\ +You are a knowledge-graph analytics expert. +You receive centrality metrics (PageRank, betweenness, degree, closeness, clustering) +for a set of entities in a business knowledge graph. + +Your task is to produce concise, actionable insights in the following JSON structure +(and ONLY that structure — no markdown fences, no prose outside the JSON): + +{ + "sections": [ + { "title": "Key Findings", "body": "<2-4 sentences summarising the graph structure and standout patterns>" }, + { "title": "Notable Entities", "items": [ { "label": "<entity name>", "reason": "<why it stands out>" } ] }, + { "title": "Recommendations", "items": [ "<action 1>", "<action 2>", "<action 3>" ] } + ] +} + +RULES +- Only mention entities whose labels appear in the provided metrics payload. +- Use the ``get_entity_details`` tool to look up the top-1 or top-2 PageRank nodes + BEFORE writing your final answer. This grounds your observations in real data. +- If ``zero_metrics`` is non-empty, explain what that means in Key Findings + (e.g. clustering = 0 is typical for bipartite graphs). +- If ``flat_entity_types`` is present, mention those types in Key Findings and + recommend in Recommendations that they be excluded from graph sync or aggregated + (e.g. store counts instead of individual rows). +- If ``top_pagerank`` is empty, state that no ranked entities are available. +- Be specific: mention entity names, scores, and structural observations. +- Keep "Notable Entities" to at most 5 items. +- Keep "Recommendations" to 2-4 actionable bullet points. +""" + + +def _build_user_message(payload: Dict[str, Any]) -> str: + stats = payload.get("stats", {}) + nodes = payload.get("nodes", {}) + node_labels = payload.get("node_labels", {}) + class_filter = payload.get("class_filter") or [] + entity_type = ( + URIHelpers.extract_local_name(class_filter[0]) if class_filter else None + ) + + top_nodes = sorted( + nodes.items(), key=lambda x: x[1].get("pagerank", 0), reverse=True + )[:10] + top_rows = [] + for uri, m in top_nodes: + label = node_labels.get(uri, URIHelpers.extract_local_name(uri)) + top_rows.append({ + "uri": uri, + "label": label, + "pagerank": round(m.get("pagerank", 0), 6), + "degree": round(m.get("degree", 0), 6), + "betweenness": round(m.get("betweenness", 0), 6), + "closeness": round(m.get("closeness", 0), 6), + "clustering": round(m.get("clustering", 0), 6), + }) + + zero_metrics = [ + key + for key in ("pagerank", "degree", "betweenness", "closeness", "clustering") + if nodes and all(n.get(key, 0) == 0 for _, n in nodes.items()) + ] + + # Flat / time-series types flagged by the backend heuristic + flat_types: list[str] = [] + for profile in (payload.get("entity_type_profiles") or {}).values(): + if profile.get("is_flat"): + flat_types.append( + URIHelpers.extract_local_name(profile.get("uri", "")) + or profile.get("uri", "") + ) + + summary = { + "entity_type": entity_type, + "class_filter_applied": bool(class_filter), + "stats": { + "node_count": stats.get("node_count"), + "graph_node_count": stats.get("graph_node_count"), + "edge_count": stats.get("edge_count"), + "connected_components": stats.get("connected_components"), + "avg_degree": stats.get("avg_degree"), + "density": stats.get("density"), + }, + "top_pagerank": top_rows, + "zero_metrics": zero_metrics, + } + if flat_types: + summary["flat_entity_types"] = flat_types + + return ( + "Analyze the following graph centrality metrics and return insights.\n\n" + + json.dumps(summary, indent=2) + ) + + +def _parse_sections(content: str) -> List[Dict[str, Any]]: + """Extract sections list from the LLM text content.""" + text = content.strip() + if text.startswith("```"): + text = text.split("```", 2)[1] + if text.startswith("json"): + text = text[4:] + text = text.rsplit("```", 1)[0].strip() + try: + return json.loads(text).get("sections", []) + except json.JSONDecodeError as exc: + logger.warning("_parse_sections: JSON decode failed (%s); returning raw text", exc) + return [{"title": "Interpretation", "body": text}] + + +@trace_agent(name=_TRACE_NAME) +def run_agent( + host: str, + token: str, + endpoint_name: str, + metrics_payload: Dict[str, Any], + base_url: str, + domain_name: str, + session_cookies: Dict[str, str], + session_headers: Optional[Dict[str, str]] = None, + on_step: Optional[Callable[[str], None]] = None, +) -> AgentResult: + """Run one interpretation turn for a metrics payload. + + Args: + host, token, endpoint_name: Databricks serving-endpoint credentials. + metrics_payload: The full JSON returned by ``/dtwin/metrics/compute`` + plus an optional ``class_filter`` list. + base_url: Loopback OntoBricks URL, e.g. ``http://localhost:8000``. + domain_name: Active domain name (forwarded to ToolContext). + session_cookies: User session cookies forwarded to loopback routes. + session_headers: Optional Databricks-Apps identity headers. + on_step: Optional progress callback. + """ + logger.info( + "===== GRAPH INTERPRETER START ===== endpoint=%s domain=%s", + endpoint_name, + domain_name, + ) + + ctx = ToolContext( + host=host.rstrip("/") if host else "", + token=token or "", + dtwin_base_url=base_url, + dtwin_session_cookies=session_cookies or {}, + dtwin_session_headers=session_headers or {}, + dtwin_domain_name=domain_name or "", + ) + + result = AgentResult(success=False) + messages = [ + {"role": "system", "content": _SYSTEM_PROMPT}, + {"role": "user", "content": _build_user_message(metrics_payload)}, + ] + + for iteration in range(MAX_ITERATIONS): + result.iterations = iteration + 1 + is_last = iteration == MAX_ITERATIONS - 1 + send_tools = TOOL_DEFINITIONS if not is_last else None + + if on_step: + on_step(f"Iteration {iteration + 1}…") + + try: + llm_response = call_serving_endpoint( + host, + token, + endpoint_name, + messages, + tools=send_tools, + max_tokens=1024, + temperature=0.1, + timeout=LLM_TIMEOUT, + trace_name=_TRACE_NAME, + ) + except Exception as exc: + error_msg = f"LLM request failed: {exc}" + logger.error("graph_interpreter: %s at iteration %d", error_msg, iteration + 1) + result.error = error_msg + return result + + accumulate_usage(result.usage, llm_response.get("usage", {})) + + choices = llm_response.get("choices", []) + if not choices: + result.error = "No choices in LLM response" + return result + + message = choices[0].get("message", {}) + content = message.get("content", "") or "" + tool_calls = message.get("tool_calls") + + if tool_calls: + messages.append(message) + + for tc in tool_calls: + func = tc.get("function", {}) + tool_name = func.get("name", "") + tool_id = tc.get("id", "") + raw_args = func.get("arguments", "{}") + + try: + arguments = ( + json.loads(raw_args) + if isinstance(raw_args, str) + else raw_args + ) + except json.JSONDecodeError: + arguments = {} + + logger.info( + "graph_interpreter: iteration %d — tool_call '%s'", + iteration + 1, + tool_name, + ) + + call_step = AgentStep( + step_type="tool_call", + content=json.dumps(arguments, default=str), + tool_name=tool_name, + ) + result.steps.append(call_step) + + t0 = time.time() + tool_result = dispatch_tool( + TOOL_HANDLERS, ctx, tool_name, arguments, + trace_name=_TRACE_NAME, + ) + tool_elapsed = int((time.time() - t0) * 1000) + + result.steps.append(AgentStep( + step_type="tool_result", + content=tool_result[:500], + tool_name=tool_name, + duration_ms=tool_elapsed, + )) + + messages.append({ + "role": "tool", + "tool_call_id": tool_id, + "content": tool_result, + }) + else: + result.success = True + result.sections = _parse_sections(content) + result.steps.append(AgentStep(step_type="output", content=content[:500])) + logger.info( + "===== GRAPH INTERPRETER DONE ===== iterations=%d sections=%d", + result.iterations, + len(result.sections), + ) + return result + + result.error = "Max iterations reached without a final answer" + return result diff --git a/src/agents/agent_graph_interpreter/tools.py b/src/agents/agent_graph_interpreter/tools.py new file mode 100644 index 00000000..eaea952a --- /dev/null +++ b/src/agents/agent_graph_interpreter/tools.py @@ -0,0 +1,105 @@ +""" +Graph Interpreter Agent — tools module. + +Provides a single tool: ``get_entity_details``. The agent uses it to look up +attributes and relationships of specific entities from the knowledge graph +before writing its insights, so that its output is grounded in real data. +""" + +from __future__ import annotations + +import json +from typing import Dict + +import httpx + +from agents.tools.context import ToolContext +from agents.tools.loopback_http import loopback_client +from agents.tools.graph_formatting import format_find_response +from agents.tracing import trace_tool +from back.core.helpers import URIHelpers +from back.core.logging import get_logger + +logger = get_logger(__name__) + +_HTTP_TIMEOUT = 60 +_MAX_DEPTH = 1 + + +def _client(ctx: ToolContext): + return loopback_client(ctx, timeout=_HTTP_TIMEOUT) + + +def _error(msg: str) -> str: + logger.warning("agent_graph_interpreter tool: %s", msg) + return json.dumps({"error": msg}) + + +@trace_tool(name="get_entity_details") +def tool_get_entity_details( + ctx: ToolContext, + *, + uri: str, + **_kwargs, +) -> str: + """Fetch attributes and direct relationships for an entity URI.""" + if not uri: + return _error("uri is required") + + local_name = URIHelpers.extract_local_name(uri) + + params = { + "search": local_name, + "depth": _MAX_DEPTH, + "limit": 200, + "offset": 0, + } + + try: + with _client(ctx) as c: + resp = c.get("/dtwin/triples/find", params=params) + resp.raise_for_status() + data = resp.json() + except httpx.HTTPStatusError as exc: + return _error( + f"triples/find failed ({exc.response.status_code}): " + f"{exc.response.text[:300]}" + ) + except Exception as exc: + return _error(f"triples/find error: {exc}") + + return format_find_response(data, ontology_labels={}) + + +# ── Tool registry ───────────────────────────────────────────────────────────── + +TOOL_DEFINITIONS = [ + { + "type": "function", + "function": { + "name": "get_entity_details", + "description": ( + "Fetch attributes and direct relationships of a specific entity " + "from the knowledge graph by its full URI. Use this to get richer " + "context about a top-ranked node before writing your insights." + ), + "parameters": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "description": ( + "Full URI of the entity, e.g. " + "https://example.com/Customer/C001" + ), + } + }, + "required": ["uri"], + }, + }, + } +] + +TOOL_HANDLERS: Dict[str, callable] = { + "get_entity_details": tool_get_entity_details, +} diff --git a/src/api/routers/internal/dtwin.py b/src/api/routers/internal/dtwin.py index 65a78cdd..56c40a8f 100644 --- a/src/api/routers/internal/dtwin.py +++ b/src/api/routers/internal/dtwin.py @@ -5,6 +5,7 @@ """ from dataclasses import dataclass +import os import time from typing import Any, Optional @@ -29,6 +30,7 @@ effective_view_table, get_databricks_client, get_databricks_credentials, + get_databricks_host_and_token, make_volume_file_service, is_uri, run_blocking, @@ -435,6 +437,155 @@ async def detect_clusters( raise InfrastructureError("Cluster detection failed", detail=str(e)) +# =========================================== +# Graph Metrics +# =========================================== + + +@router.post("/metrics/compute") +async def compute_graph_metrics( + request: Request, + session_mgr: SessionManager = Depends(get_session_manager), + settings: Settings = Depends(get_settings), +): + """Compute centrality and structural metrics on the full knowledge graph.""" + try: + try: + data = await request.json() + except Exception: + data = {} + predicate_filter = data.get("predicate_filter") + class_filter = data.get("class_filter") + max_triples = int(data.get("max_triples", 500_000)) + max_nodes_betweenness = int(data.get("max_nodes_betweenness", 2_000)) + + domain = get_domain(session_mgr) + graph_name = effective_graph_name(domain) + if not graph_name: + raise ValidationError("Graph name is not configured") + + store = _require_graph_store(domain, settings) + + dt = DigitalTwin(domain) + result = await run_blocking( + dt.compute_graph_metrics, + store, + graph_name, + predicate_filter=predicate_filter, + class_filter=class_filter, + max_triples=max_triples, + max_nodes_betweenness=max_nodes_betweenness, + ) + + return {"success": True, **result} + + except (ValidationError, InfrastructureError, NotFoundError): + raise + except ValueError as e: + logger.warning("Graph metrics rejected: %s", e) + raise ValidationError("Graph metrics parameters are invalid", detail=str(e)) + except Exception as e: + logger.exception("Graph metrics failed: %s", e) + raise InfrastructureError("Graph metrics computation failed", detail=str(e)) + + +@router.get("/metrics/summary") +async def get_graph_metrics_summary( + session_mgr: SessionManager = Depends(get_session_manager), + settings: Settings = Depends(get_settings), +): + """Return aggregate graph structure stats and top-PageRank nodes (cockpit card).""" + try: + domain = get_domain(session_mgr) + graph_name = effective_graph_name(domain) + if not graph_name: + raise ValidationError("Graph name is not configured") + + store = _require_graph_store(domain, settings) + + dt = DigitalTwin(domain) + result = await run_blocking( + dt.compute_graph_metrics, + store, + graph_name, + ) + + return { + "success": True, + "stats": result["stats"], + "top_pagerank": result["top_pagerank"], + } + + except (ValidationError, InfrastructureError, NotFoundError): + raise + except ValueError as e: + logger.warning("Graph metrics summary rejected: %s", e) + raise ValidationError("Graph metrics summary failed", detail=str(e)) + except Exception as e: + logger.exception("Graph metrics summary failed: %s", e) + raise InfrastructureError("Graph metrics summary failed", detail=str(e)) + + +@router.post("/metrics/interpret") +async def interpret_graph_metrics( + request: Request, + session_mgr: SessionManager = Depends(get_session_manager), + settings: Settings = Depends(get_settings), +): + """Run the graph-interpreter agent on the supplied metrics payload. + + Expects the JSON body produced by ``/dtwin/metrics/compute`` plus an + optional ``class_filter`` list so the agent knows the entity type. + The agent may call ``get_entity_details`` to look up specific entities + before producing its structured insights. + Returns ``{ success, sections: [{ title, body | items }] }``. + """ + try: + data = await request.json() + domain = get_domain(session_mgr) + + host, token = get_databricks_host_and_token(domain, settings) + if not host or not token: + raise ValidationError("Databricks credentials not configured") + + llm_endpoint = (domain.info or {}).get("llm_endpoint", "") or "" + if not llm_endpoint: + llm_endpoint = _auto_discover_llm_endpoint(domain, settings) + if not llm_endpoint: + raise ValidationError( + "No LLM serving endpoint available. Please set one in Domain Settings." + ) + + # Build loopback base URL so the agent can call get_entity_details + app_port = os.environ.get("DATABRICKS_APP_PORT") or os.environ.get("PORT") or "8000" + base_url = f"http://localhost:{app_port}" + session_cookies = dict(request.cookies or {}) + session_headers = { + k: v + for k, v in request.headers.items() + if k.lower().startswith("x-forwarded-") or k.lower() == "x-csrf-token" + } + + dt = DigitalTwin(domain) + result = await run_blocking( + dt.interpret_graph_metrics, + data, + host, + token, + llm_endpoint, + base_url, + session_cookies, + session_headers, + ) + return result + + except (ValidationError, InfrastructureError, NotFoundError): + raise + except Exception as e: + logger.exception("Graph metrics interpretation failed: %s", e) + raise InfrastructureError("Graph metrics interpretation failed", detail=str(e)) + + # =========================================== # Cohort Discovery # =========================================== diff --git a/src/back/core/graph_analysis/CommunityDetector.py b/src/back/core/graph_analysis/CommunityDetector.py index d8915d82..0ac1057f 100644 --- a/src/back/core/graph_analysis/CommunityDetector.py +++ b/src/back/core/graph_analysis/CommunityDetector.py @@ -3,12 +3,12 @@ from __future__ import annotations import time -from typing import Any, Dict, List, Optional, Set +from typing import List, Optional import networkx as nx from back.core.logging import get_logger -from back.core.triplestore.constants import RDF_TYPE, RDFS_LABEL +from back.core.graph_analysis.GraphBuilder import GraphBuilder from back.core.graph_analysis.models import ( ClusterRequest, ClusterResult, @@ -18,18 +18,10 @@ logger = get_logger(__name__) -# High-cardinality predicates that create noise in community structure -_DEFAULT_EXCLUDED_PREDICATES: Set[str] = { - RDF_TYPE, - RDFS_LABEL, - "http://www.w3.org/2000/01/rdf-schema#comment", - "http://www.w3.org/2000/01/rdf-schema#seeAlso", -} - _SUPPORTED_ALGORITHMS = {"louvain", "label_propagation", "greedy_modularity"} -class CommunityDetector: +class CommunityDetector(GraphBuilder): """Detect communities in a knowledge graph using NetworkX algorithms. Constructor receives a triplestore backend instance and an optional @@ -37,10 +29,6 @@ class CommunityDetector: undirected ``networkx.Graph``, and runs the selected algorithm. """ - def __init__(self, store: Any, graph_name: str) -> None: - self._store = store - self._graph_name = graph_name - def detect(self, request: ClusterRequest) -> DetectionResult: """Run community detection and return clusters with statistics. @@ -101,62 +89,6 @@ def detect(self, request: ClusterRequest) -> DetectionResult: # Internal helpers # ------------------------------------------------------------------ - def _load_triples(self, request: ClusterRequest) -> List[Dict[str, str]]: - """Query triples from the store with a max_triples guard.""" - triples = self._store.query_triples(self._graph_name) - if len(triples) > request.max_triples: - raise ValueError( - f"Triple count ({len(triples)}) exceeds max_triples " - f"({request.max_triples}). Use a predicate or class filter, " - f"or increase max_triples." - ) - return triples - - def _build_graph( - self, - triples: List[Dict[str, str]], - request: ClusterRequest, - ) -> nx.Graph: - """Build an undirected NetworkX graph from SPO triples. - - Excludes high-cardinality predicates (rdf:type, rdfs:label, ...) - and optionally filters by predicate or class. - """ - excluded = set(_DEFAULT_EXCLUDED_PREDICATES) - if request.predicate_filter: - excluded.update(request.predicate_filter) - - class_filter: Optional[Set[str]] = None - if request.class_filter: - class_filter = set(request.class_filter) - - allowed_subjects: Optional[Set[str]] = None - if class_filter: - allowed_subjects = { - t["subject"] - for t in triples - if t.get("predicate") == RDF_TYPE and t.get("object") in class_filter - } - - g = nx.Graph() - for t in triples: - pred = t.get("predicate", "") - if pred in excluded: - continue - - subj = t.get("subject", "") - obj = t.get("object", "") - if not subj or not obj: - continue - - if allowed_subjects is not None: - if subj not in allowed_subjects and obj not in allowed_subjects: - continue - - g.add_edge(subj, obj) - - return g - def _run_algorithm( self, g: nx.Graph, diff --git a/src/back/core/graph_analysis/GraphBuilder.py b/src/back/core/graph_analysis/GraphBuilder.py new file mode 100644 index 00000000..ee452b27 --- /dev/null +++ b/src/back/core/graph_analysis/GraphBuilder.py @@ -0,0 +1,98 @@ +"""Shared graph-building base for graph analysis services.""" + +from __future__ import annotations + +from typing import Any, Dict, List, Optional, Set + +import networkx as nx + +from back.core.triplestore.constants import RDF_TYPE, RDFS_LABEL + +# High-cardinality predicates that create noise in graph structure analysis +_DEFAULT_EXCLUDED_PREDICATES: Set[str] = { + RDF_TYPE, + RDFS_LABEL, + "http://www.w3.org/2000/01/rdf-schema#comment", + "http://www.w3.org/2000/01/rdf-schema#seeAlso", +} + + +class GraphBuilder: + """Base class that loads triples and builds a NetworkX graph. + + Subclasses receive a triplestore backend and an optional graph/table name. + ``_load_triples`` and ``_build_graph`` are shared by all graph analysis + services; they encapsulate predicate exclusion, class filtering, and the + max-triples safety guard. + """ + + def __init__(self, store: Any, graph_name: str) -> None: + self._store = store + self._graph_name = graph_name + + # ------------------------------------------------------------------ + # Shared helpers (used by CommunityDetector and GraphMetrics) + # ------------------------------------------------------------------ + + def _load_triples(self, request: Any) -> List[Dict[str, str]]: + """Query triples from the store with a max_triples guard.""" + triples = self._store.query_triples(self._graph_name) + if len(triples) > request.max_triples: + raise ValueError( + f"Triple count ({len(triples)}) exceeds max_triples " + f"({request.max_triples}). Use a predicate or class filter, " + f"or increase max_triples." + ) + return triples + + def _build_graph( + self, + triples: List[Dict[str, str]], + request: Any, + ) -> nx.Graph: + """Build an undirected NetworkX graph from SPO triples. + + Only entity–entity edges are included: triples whose object is a + literal (not a URI starting with http/https) are silently dropped so + that attribute values ("John", "42", …) never become graph nodes. + High-cardinality predicates (rdf:type, rdfs:label, …) are also + excluded, and optionally filters by predicate or class. + """ + excluded = set(_DEFAULT_EXCLUDED_PREDICATES) + if request.predicate_filter: + excluded.update(request.predicate_filter) + + class_filter: Optional[Set[str]] = None + if request.class_filter: + class_filter = set(request.class_filter) + + allowed_subjects: Optional[Set[str]] = None + if class_filter: + allowed_subjects = { + t["subject"] + for t in triples + if t.get("predicate") == RDF_TYPE and t.get("object") in class_filter + } + + g = nx.Graph() + for t in triples: + pred = t.get("predicate", "") + if pred in excluded: + continue + + subj = t.get("subject", "") + obj = t.get("object", "") + if not subj or not obj: + continue + + # Drop attribute triples — object must be a URI (entity reference) + if not (obj.startswith("http://") or obj.startswith("https://")): + continue + + if allowed_subjects is not None: + if subj not in allowed_subjects and obj not in allowed_subjects: + continue + + g.add_edge(subj, obj) + + return g diff --git a/src/back/core/graph_analysis/GraphMetrics.py b/src/back/core/graph_analysis/GraphMetrics.py new file mode 100644 index 00000000..7c28b04a --- /dev/null +++ b/src/back/core/graph_analysis/GraphMetrics.py @@ -0,0 +1,266 @@ +"""Graph centrality and structural metrics service using NetworkX.""" + +from __future__ import annotations + +import time +from collections import defaultdict +from statistics import mean +from typing import Dict, List, Set + +import networkx as nx + +from back.core.logging import get_logger +from back.core.triplestore.constants import RDF_TYPE, RDFS_LABEL +from back.core.graph_analysis.GraphBuilder import GraphBuilder, _DEFAULT_EXCLUDED_PREDICATES +from back.core.graph_analysis.models import ( + EntityTypeProfile, + MetricsRequest, + MetricsResult, + MetricsStats, + NodeMetrics, +) + +logger = get_logger(__name__) + +_TOP_N = 10 + +# Predicate local-name fragments that suggest time-series / temporal data +_TEMPORAL_KEYWORDS: Set[str] = { + "time", "date", "timestamp", "ts", "at", "created", "modified", "dt", + "start", "end", "recorded", "occurred", "measured", +} + + +class GraphMetrics(GraphBuilder): + """Compute centrality and structural metrics over a knowledge graph. + + Constructor receives a triplestore backend and an optional graph/table name. + Call ``compute(request)`` to run all metrics in one pass. + """ + + def compute(self, request: MetricsRequest) -> MetricsResult: + """Compute graph metrics and return per-node scores plus aggregate stats. + + Raises ``ValueError`` when the triple count exceeds ``request.max_triples``. + """ + t0 = time.time() + + triples = self._load_triples(request) + g = self._build_graph(triples, request) + + if g.number_of_nodes() == 0: + logger.warning("GraphMetrics: graph has 0 nodes after filtering") + return MetricsResult(stats=MetricsStats(elapsed_ms=self._elapsed_ms(t0))) + + logger.info( + "GraphMetrics: built nx.Graph with %d nodes, %d edges", + g.number_of_nodes(), + g.number_of_edges(), + ) + + degree = nx.degree_centrality(g) + pagerank = self._pagerank(g) + betweenness = self._betweenness(g, request.max_nodes_betweenness) + closeness = nx.closeness_centrality(g) + clustering = nx.clustering(g) + + nodes: Dict[str, NodeMetrics] = { + uri: NodeMetrics( + degree=round(degree.get(uri, 0.0), 6), + pagerank=round(pagerank.get(uri, 0.0), 6), + betweenness=round(betweenness.get(uri, 0.0), 6), + closeness=round(closeness.get(uri, 0.0), 6), + clustering=round(clustering.get(uri, 0.0), 6), + ) + for uri in g.nodes() + } + + graph_node_count = g.number_of_nodes() + edge_count = g.number_of_edges() + components = nx.number_connected_components(g) + avg_degree = (2 * edge_count / graph_node_count) if graph_node_count else 0.0 + density = nx.density(g) + + # Build node → class_uri mapping from rdf:type triples + node_types: Dict[str, str] = { + t["subject"]: t["object"] + for t in triples + if t.get("predicate") == RDF_TYPE + and t.get("subject") in nodes + } + + # Build node → rdfs:label mapping (first label wins if multiple) + node_labels: Dict[str, str] = {} + for t in triples: + if t.get("predicate") == RDFS_LABEL: + subj = t.get("subject", "") + if subj in nodes and subj not in node_labels: + node_labels[subj] = t.get("object", "") + + # When a class_filter was applied, restrict returned nodes to instances of + # the selected type(s). Metrics are still computed on the full connected + # subgraph (for accuracy), but only the requested entities are surfaced. + # Instances that have no entity-entity edges (isolated nodes) are added + # with zero scores so the count always matches the full type population. + if request.class_filter: + filter_set = set(request.class_filter) + allowed = { + t["subject"] + for t in triples + if t.get("predicate") == RDF_TYPE and t.get("object") in filter_set + } + nodes = {uri: m for uri, m in nodes.items() if uri in allowed} + # Add isolated instances that never made it into the graph + for uri in allowed: + if uri not in nodes: + nodes[uri] = NodeMetrics() + + node_count = len(nodes) + + top_pagerank = sorted(nodes, key=lambda u: nodes[u].pagerank, reverse=True)[:_TOP_N] + + elapsed_ms = self._elapsed_ms(t0) + + stats = MetricsStats( + node_count=node_count, + graph_node_count=graph_node_count, + edge_count=edge_count, + connected_components=components, + avg_degree=round(avg_degree, 4), + density=round(density, 6), + elapsed_ms=elapsed_ms, + ) + + logger.info( + "GraphMetrics: %d/%d nodes returned, %d edges, %d components in %dms", + node_count, + graph_node_count, + edge_count, + components, + elapsed_ms, + ) + + profiles = self._build_type_profiles(triples, nodes, node_types, stats.graph_node_count) + logger.info( + "GraphMetrics: %d entity type profiles built (%d flat)", + len(profiles), + sum(1 for p in profiles.values() if p.is_flat), + ) + return MetricsResult(nodes=nodes, stats=stats, top_pagerank=top_pagerank, node_types=node_types, node_labels=node_labels, entity_type_profiles=profiles) + + # ------------------------------------------------------------------ + # Internal helpers + # ------------------------------------------------------------------ + + @staticmethod + def _pagerank(g: nx.Graph) -> Dict[str, float]: + """Compute PageRank, falling back to the pure-Python power-iteration + implementation when scipy is not available.""" + try: + return nx.pagerank(g, max_iter=200) + except (ImportError, ModuleNotFoundError): + from networkx.algorithms.link_analysis.pagerank_alg import _pagerank_python + return _pagerank_python(g, 0.85, None, 200, 1.0e-6, None, "weight") + + @staticmethod + def _betweenness(g: nx.Graph, max_nodes: int) -> Dict[str, float]: + """Compute betweenness centrality, sampling on large graphs. + + When the graph exceeds *max_nodes* nodes, uses ``k``-sample + approximation (capped at 500) to avoid the O(VE) cost. + """ + n = g.number_of_nodes() + if n > max_nodes: + k = min(500, n) + logger.info( + "GraphMetrics: betweenness sampling (k=%d) for %d-node graph", k, n + ) + return nx.betweenness_centrality(g, k=k, seed=42) + return nx.betweenness_centrality(g) + + @staticmethod + def _elapsed_ms(t0: float) -> int: + return int((time.time() - t0) * 1000) + + @staticmethod + def _build_type_profiles( + triples: List[Dict], + nodes: Dict[str, NodeMetrics], + node_types: Dict[str, str], + graph_node_count: int, + ) -> Dict[str, EntityTypeProfile]: + """Build per-entity-type structural profiles and apply flat-dataset heuristics. + + Runs a single pass over ``triples`` to collect the set of distinct + predicates used by each node, then aggregates per class URI. + No additional DB query is needed. + """ + if not node_types: + return {} + + # --- collect distinct predicates per node (both directions) ------------ + # A node counts a predicate whether it is the subject OR the object of the + # triple (i.e. "how many relationship types is this instance involved in"). + predicates_by_node: Dict[str, Set[str]] = defaultdict(set) + for t in triples: + pred = t.get("predicate", "") + if not pred or pred in _DEFAULT_EXCLUDED_PREDICATES: + continue + subj = t.get("subject", "") + obj = t.get("object", "") + if subj in nodes: + predicates_by_node[subj].add(pred) + # Only count the reverse direction when the object is a URI node in the graph + if obj in nodes and (obj.startswith("http://") or obj.startswith("https://")): + predicates_by_node[obj].add(pred) + + # --- helper: extract local name from a URI ---------------------------- + def _local(uri: str) -> str: + return (uri or "").rstrip("/").split("/")[-1].split("#")[-1].lower() + + # --- per-type rollup -------------------------------------------------- + profiles: Dict[str, EntityTypeProfile] = {} + classes = set(node_types.values()) + for class_uri in classes: + instances = [u for u, c in node_types.items() if c == class_uri and u in nodes] + if not instances: + continue + + avg_deg = round(mean(nodes[u].degree for u in instances), 6) + avg_clust = round(mean(nodes[u].clustering for u in instances), 6) + avg_bet = round(mean(nodes[u].betweenness for u in instances), 6) + + all_preds: Set[str] = set() + for u in instances: + all_preds.update(predicates_by_node.get(u, set())) + + has_temporal = any( + kw in _local(p) for p in all_preds for kw in _TEMPORAL_KEYWORDS + ) + + # --- heuristic rules --------------------------------------------- + # NOTE: degree centrality is normalised by (N-1), so in large graphs + # even well-connected nodes score < 0.001. We therefore rely on + # predicate diversity as the primary flat-dataset signal. + reasons: List[str] = [] + n = len(instances) + n_preds = len(all_preds) + + if n_preds == 0: + reasons.append("no entity-entity relationships (fully isolated instances)") + elif n_preds == 1 and n > 20: + reasons.append(f"only 1 distinct relationship predicate across {n} instances") + + profiles[class_uri] = EntityTypeProfile( + uri=class_uri, + count=n, + avg_degree=avg_deg, + avg_clustering=avg_clust, + avg_betweenness=avg_bet, + distinct_predicates=len(all_preds), + has_temporal_predicates=has_temporal, + is_flat=bool(reasons), + flat_reasons=reasons, + ) + + return profiles diff --git a/src/back/core/graph_analysis/__init__.py b/src/back/core/graph_analysis/__init__.py index b97ebe7d..7adb9b62 100644 --- a/src/back/core/graph_analysis/__init__.py +++ b/src/back/core/graph_analysis/__init__.py @@ -1,12 +1,19 @@ -"""Graph analysis: community detection and cohort discovery.""" +"""Graph analysis: community detection, cohort discovery, and graph metrics.""" from back.core.graph_analysis.CohortVocabulary import CohortVocabulary from back.core.graph_analysis.CommunityDetector import CommunityDetector +from back.core.graph_analysis.GraphBuilder import GraphBuilder +from back.core.graph_analysis.GraphMetrics import GraphMetrics from back.core.graph_analysis.models import ( ClusterRequest, ClusterResult, DetectionResult, DetectionStats, + EntityTypeProfile, + MetricsRequest, + NodeMetrics, + MetricsStats, + MetricsResult, CohortHop, CohortLink, CohortCompat, @@ -89,6 +96,13 @@ def cohort_uri(base_uri: str, rule_id: str, content_hash: str) -> str: __all__ = [ "CohortVocabulary", "CommunityDetector", + "GraphBuilder", + "GraphMetrics", + "EntityTypeProfile", + "MetricsRequest", + "NodeMetrics", + "MetricsStats", + "MetricsResult", "ClusterRequest", "ClusterResult", "DetectionResult", diff --git a/src/back/core/graph_analysis/models.py b/src/back/core/graph_analysis/models.py index 8bd2ba8b..b2dd3733 100644 --- a/src/back/core/graph_analysis/models.py +++ b/src/back/core/graph_analysis/models.py @@ -1,4 +1,4 @@ -"""Data models for graph analysis: community detection and cohort discovery.""" +"""Data models for graph analysis: community detection, cohort discovery, and graph metrics.""" from __future__ import annotations @@ -51,6 +51,72 @@ class DetectionResult: stats: DetectionStats = field(default_factory=DetectionStats) +# --------------------------------------------------------------------------- +# Graph metrics (centrality & structure) +# --------------------------------------------------------------------------- + + +@dataclass +class MetricsRequest: + """Parameters for a graph metrics computation request.""" + + predicate_filter: Optional[List[str]] = None + class_filter: Optional[List[str]] = None + max_triples: int = 500_000 + max_nodes_betweenness: int = 2_000 + + +@dataclass +class NodeMetrics: + """Centrality scores for a single node.""" + + degree: float = 0.0 + pagerank: float = 0.0 + betweenness: float = 0.0 + closeness: float = 0.0 + clustering: float = 0.0 + + +@dataclass +class MetricsStats: + """Aggregate structural statistics from a graph metrics run.""" + + node_count: int = 0 # filtered nodes (instances of selected type, or all) + graph_node_count: int = 0 # total nodes in the computation graph (incl. neighbors) + edge_count: int = 0 + connected_components: int = 0 + avg_degree: float = 0.0 + density: float = 0.0 + elapsed_ms: int = 0 + + +@dataclass +class EntityTypeProfile: + """Per-entity-type structural profile and flat-dataset heuristic.""" + + uri: str + count: int # number of instances in the returned nodes + avg_degree: float # mean degree centrality across instances + avg_clustering: float # mean clustering coefficient + avg_betweenness: float # mean betweenness centrality + distinct_predicates: int # distinct non-excluded predicate URIs used by instances + has_temporal_predicates: bool # any predicate local-name contains date/time/ts/at/created + is_flat: bool # heuristic: True when this type looks like a flat dataset + flat_reasons: List[str] = field(default_factory=list) # human-readable flags (empty if not flat) + + +@dataclass +class MetricsResult: + """Full result of a graph metrics computation.""" + + nodes: Dict[str, NodeMetrics] = field(default_factory=dict) + stats: MetricsStats = field(default_factory=MetricsStats) + top_pagerank: List[str] = field(default_factory=list) + node_types: Dict[str, str] = field(default_factory=dict) # node_uri → class_uri + node_labels: Dict[str, str] = field(default_factory=dict) # node_uri → rdfs:label + entity_type_profiles: Dict[str, "EntityTypeProfile"] = field(default_factory=dict) # class_uri → profile + + # --------------------------------------------------------------------------- # Cohort discovery # --------------------------------------------------------------------------- diff --git a/src/back/objects/digitaltwin/DigitalTwin.py b/src/back/objects/digitaltwin/DigitalTwin.py index 550b5694..2a1656dd 100644 --- a/src/back/objects/digitaltwin/DigitalTwin.py +++ b/src/back/objects/digitaltwin/DigitalTwin.py @@ -3088,6 +3088,110 @@ def detect_clusters( }, } + def compute_graph_metrics( + self, + store: Any, + graph_name: str, + predicate_filter: Optional[List[str]] = None, + class_filter: Optional[List[str]] = None, + max_triples: int = 500_000, + max_nodes_betweenness: int = 2_000, + ) -> Dict[str, Any]: + """Compute centrality and structural metrics on the full knowledge graph. + + Delegates to :class:`GraphMetrics` from ``back.core.graph_analysis``. + Returns a JSON-serializable dict matching the API contract. + """ + from back.core.graph_analysis import GraphMetrics, MetricsRequest + + request = MetricsRequest( + predicate_filter=predicate_filter, + class_filter=class_filter, + max_triples=max_triples, + max_nodes_betweenness=max_nodes_betweenness, + ) + service = GraphMetrics(store, graph_name) + result = service.compute(request) + + return { + "nodes": { + uri: { + "degree": m.degree, + "pagerank": m.pagerank, + "betweenness": m.betweenness, + "closeness": m.closeness, + "clustering": m.clustering, + } + for uri, m in result.nodes.items() + }, + "stats": { + "node_count": result.stats.node_count, + "graph_node_count": result.stats.graph_node_count, + "edge_count": result.stats.edge_count, + "connected_components": result.stats.connected_components, + "avg_degree": result.stats.avg_degree, + "density": result.stats.density, + "elapsed_ms": result.stats.elapsed_ms, + }, + "top_pagerank": result.top_pagerank, + "node_types": result.node_types, + "node_labels": result.node_labels, + "entity_type_profiles": { + k: { + "uri": v.uri, + "count": v.count, + "avg_degree": v.avg_degree, + "avg_clustering": v.avg_clustering, + "avg_betweenness": v.avg_betweenness, + "distinct_predicates": v.distinct_predicates, + "has_temporal_predicates": v.has_temporal_predicates, + "is_flat": v.is_flat, + "flat_reasons": v.flat_reasons, + } + for k, v in result.entity_type_profiles.items() + }, + } + + def interpret_graph_metrics( + self, + payload: Dict[str, Any], + host: str, + token: str, + endpoint_name: str, + base_url: str = "", + session_cookies: Optional[Dict[str, str]] = None, + session_headers: Optional[Dict[str, str]] = None, + ) -> Dict[str, Any]: + """Delegate graph-metrics interpretation to ``agent_graph_interpreter``. + + ``payload`` is the JSON dict returned by ``compute_graph_metrics`` plus an + optional ``class_filter`` list added by the API layer. + Returns ``{ success, sections: [{ title, body | items }] }``. + """ + from agents.agent_graph_interpreter import run_agent + + # DomainSession stores the name under domain.info["name"], not .name + domain_name = "" + if self._domain is not None: + _info = getattr(self._domain, "info", None) or {} + domain_name = (_info.get("name") or "").strip() if isinstance(_info, dict) else "" + + result = run_agent( + host=host, + token=token, + endpoint_name=endpoint_name, + metrics_payload=payload, + base_url=base_url, + domain_name=domain_name, + session_cookies=session_cookies or {}, + session_headers=session_headers, + ) + + if not result.success: + return {"success": False, "sections": [], "error": result.error} + + return {"success": True, "sections": result.sections} + @staticmethod def compute_dtwin_indicator( domain: Any, diff --git a/src/front/config/menu_config.json b/src/front/config/menu_config.json index 4c5f6ae6..e53dff69 100644 --- a/src/front/config/menu_config.json +++ b/src/front/config/menu_config.json @@ -598,6 +598,13 @@ "icon": "bi-bar-chart-line", "default": false, "requires": null + }, + { + "id": "analytics", + "label": "Analytics", + "icon": "bi-graph-up-arrow", + "default": false, + "requires": null } ] }, @@ -608,21 +615,21 @@ "items": [ { "id": "sigmagraph", - "label": "Graph Viewer", + "label": "Viewer", "icon": "bi-layers-half", "default": true, "requires": null }, { "id": "graphql", - "label": "GraphQL", + "label": "Query", "icon": "bi-braces-asterisk", "default": false, "requires": null }, { "id": "chat", - "label": "Graph Chat", + "label": "Chat", "icon": "bi-chat-dots", "default": false, "requires": null diff --git a/src/front/static/domain/js/domain-audit.js b/src/front/static/domain/js/domain-audit.js index d9c00997..7c0ce6cb 100644 --- a/src/front/static/domain/js/domain-audit.js +++ b/src/front/static/domain/js/domain-audit.js @@ -62,6 +62,18 @@ return div.innerHTML; } + function renderMd(text) { + if (!text) return ''; + if (typeof window.marked !== 'undefined' && window.marked.parse) { + try { + window.marked.setOptions({ breaks: true, gfm: true }); + return window.marked.parse(text); + } catch (e) { /* fall through */ } + } + // Fallback: escape and convert newlines to <br> + return esc(text).replace(/\n/g, '<br>'); + } + function fmtTime(iso) { if (!iso) return ''; const d = new Date(iso); @@ -169,7 +181,7 @@ : ''; const ver = e.version ? '<span class="badge bg-secondary ms-1">v' + esc(e.version) + '</span>' : ''; const comment = e.comment - ? '<div class="audit-comment">' + esc(e.comment) + '</div>' + ? '<div class="audit-comment oc-md">' + renderMd(e.comment) + '</div>' : ''; const head = '<div class="audit-head">' + '<span class="audit-title ' + meta.cls + '">' + esc(meta.label) + '</span>' + @@ -196,7 +208,7 @@ const metaLine = bits.length ? '<div class="audit-meta">' + bits.join(' · ') + '</div>' : ''; const msg = run.error ? '<div class="audit-comment text-danger">' + esc(run.error) + '</div>' - : (run.message ? '<div class="audit-comment">' + esc(run.message) + '</div>' : ''); + : (run.message ? '<div class="audit-comment oc-md">' + renderMd(run.message) + '</div>' : ''); const detailsBtn = '<button type="button" class="btn btn-sm btn-outline-primary audit-details" ' + 'data-run-idx="' + idx + '" title="View build run details">' + '<i class="bi bi-eye"></i></button>'; diff --git a/src/front/static/domain/js/domain-metadata.js b/src/front/static/domain/js/domain-metadata.js index 9c4b7c6f..73b5a987 100644 --- a/src/front/static/domain/js/domain-metadata.js +++ b/src/front/static/domain/js/domain-metadata.js @@ -12,6 +12,83 @@ let loadMetadataWidgetInitialized = false; // Track if widget is initialized let pendingLoadCatalog = ''; // Catalog selected in the load metadata modal let pendingLoadSchema = ''; // Schema selected in the load metadata modal +const _metadataGauges = {}; + +function _drawMetadataGauge(canvasId, score) { + if (_metadataGauges[canvasId]) { + _metadataGauges[canvasId].destroy(); + delete _metadataGauges[canvasId]; + } + const canvas = document.getElementById(canvasId); + if (!canvas) return; + const ctx = canvas.getContext('2d'); + + const val = Math.max(0, Math.min(100, Math.round(score))); + const color = val === 100 ? '#198754' : val >= 80 ? '#ffc107' : '#dc3545'; + const remaining = 100 - val; + + _metadataGauges[canvasId] = new Chart(ctx, { + type: 'doughnut', + data: { + datasets: [{ + data: [val, remaining], + backgroundColor: [color, '#e9ecef'], + borderWidth: 0, + circumference: 180, + rotation: 270, + }] + }, + options: { + responsive: false, + cutout: '70%', + plugins: { legend: { display: false }, tooltip: { enabled: false } }, + layout: { padding: 0 }, + }, + plugins: [{ + id: 'metadataGaugeLabel', + afterDraw(chart) { + const c = chart.ctx, w = chart.width, h = chart.height; + c.save(); + c.textAlign = 'center'; + c.textBaseline = 'bottom'; + c.font = 'bold 14px system-ui, sans-serif'; + c.fillStyle = color; + c.fillText(val + '%', w / 2, h - 4); + c.restore(); + } + }], + }); +} + +function updateMetadataGauges(metadata) { + const tables = metadata?.tables || []; + if (tables.length === 0) return; + + let tablesWithDesc = 0; + let totalColumns = 0; + let columnsWithDesc = 0; + + for (const t of tables) { + if (t.comment && t.comment.trim()) tablesWithDesc++; + for (const col of (t.columns || [])) { + totalColumns++; + if (col.comment && col.comment.trim()) columnsWithDesc++; + } + } + + const tableScore = Math.round((tablesWithDesc / tables.length) * 100); + const colScore = totalColumns > 0 ? Math.round((columnsWithDesc / totalColumns) * 100) : 0; + + _drawMetadataGauge('gaugeTableDesc', tableScore); + _drawMetadataGauge('gaugeColumnDesc', colScore); + + const tableDetail = document.getElementById('gaugeTableDescDetail'); + if (tableDetail) tableDetail.textContent = `${tablesWithDesc} / ${tables.length} tables`; + + const colDetail = document.getElementById('gaugeColumnDescDetail'); + if (colDetail) colDetail.textContent = `${columnsWithDesc} / ${totalColumns} columns`; +} + // Async task tracking const METADATA_LOAD_TASK_KEY = 'ontobricks_metadata_load_task'; const METADATA_UPDATE_TASK_KEY = 'ontobricks_metadata_update_task'; @@ -84,6 +161,7 @@ async function loadMetadataStatus() { // Show preview and Update Mappings button displayMetadataPreview(data.metadata); checkMetadataDescriptions(data.metadata); + updateMetadataGauges(data.metadata); const updateMappingsBtn = document.getElementById('updateMappingsBtn'); if (updateMappingsBtn) updateMappingsBtn.classList.remove('d-none'); } else { @@ -700,6 +778,7 @@ async function saveMetadataChanges(silent = false) { if (data.success) { if (!silent) showNotification(`Saved data sources for ${allTables.length} tables`, 'success'); + updateMetadataGauges(metadataCache); } else { showNotification('Error: ' + data.message, 'error'); } diff --git a/src/front/static/domain/js/domain-validation.js b/src/front/static/domain/js/domain-validation.js index 8d4a2bf9..47176bee 100644 --- a/src/front/static/domain/js/domain-validation.js +++ b/src/front/static/domain/js/domain-validation.js @@ -26,6 +26,7 @@ async function loadValidationDetails() { updateDtwinCard(data); updateMissingItems(data); loadPrecisionScore(); + loadGraphMetricsSummary(); } catch (error) { console.error('Error loading validation:', error); const banner = document.getElementById('domainHealthBanner'); @@ -50,6 +51,49 @@ async function loadPrecisionScore() { } } +/* ── Graph structure metrics summary ─────────── */ +async function loadGraphMetricsSummary() { + const spinner = document.getElementById('graphStructureSpinner'); + const content = document.getElementById('graphStructureContent'); + const errorEl = document.getElementById('graphStructureError'); + const badge = document.getElementById('graphStructureBadge'); + try { + const resp = await fetch('/dtwin/metrics/summary', { credentials: 'same-origin' }); + const data = await resp.json(); + if (!data.success || !data.stats) { + if (spinner) spinner.classList.add('d-none'); + if (errorEl) errorEl.classList.remove('d-none'); + if (badge) { badge.textContent = 'Unavailable'; badge.className = 'badge bg-secondary'; } + return; + } + const s = data.stats; + const setText = (id, val) => { const el = document.getElementById(id); if (el) el.textContent = val; }; + setText('gsNodeCount', s.node_count != null ? s.node_count.toLocaleString() : '—'); + setText('gsEdgeCount', s.edge_count != null ? s.edge_count.toLocaleString() : '—'); + setText('gsComponents', s.connected_components != null ? s.connected_components : '—'); + setText('gsAvgDegree', s.avg_degree != null ? s.avg_degree.toFixed(2) : '—'); + setText('gsDensity', s.density != null ? s.density.toFixed(6) : '—'); + + const topEl = document.getElementById('gsTopPagerank'); + if (topEl && data.top_pagerank && data.top_pagerank.length > 0) { + const items = data.top_pagerank.slice(0, 5).map(function (uri) { + const local = uri.split(/[/#]/).pop() || uri; + return '<span class="badge bg-light text-dark border me-1 mb-1" title="' + uri + '">' + local + '</span>'; + }); + topEl.innerHTML = items.join(''); + } + + if (spinner) spinner.classList.add('d-none'); + if (content) content.classList.remove('d-none'); + if (badge) { badge.textContent = s.node_count + ' nodes'; badge.className = 'badge bg-success'; } + } catch (e) { + if (spinner) spinner.classList.add('d-none'); + if (errorEl) errorEl.classList.remove('d-none'); + if (badge) { badge.textContent = 'Error'; badge.className = 'badge bg-danger'; } + console.warn('[GraphStructure] Could not load metrics summary:', e); + } +} + function renderPrecisionScore(score) { const bar = document.getElementById('domainPrecisionBar'); const label = document.getElementById('domainPrecisionLabel'); diff --git a/src/front/static/global/js/comments-panel.js b/src/front/static/global/js/comments-panel.js index 76c10cfd..1a6a9f1e 100644 --- a/src/front/static/global/js/comments-panel.js +++ b/src/front/static/global/js/comments-panel.js @@ -640,8 +640,6 @@ openForSelection: openForSelection, showLoadingPanel: showLoadingPanel, taggableFromOntology: taggableFromOntology, - // Split a stored comment body into { text, tags } (strips the - // internal tag marker). Shared with the Domain → Discussions timeline. parseBody: parseBody, }; })(); diff --git a/src/front/static/query/js/query-chat.js b/src/front/static/query/js/query-chat.js index 6fa7fec9..8eb24346 100644 --- a/src/front/static/query/js/query-chat.js +++ b/src/front/static/query/js/query-chat.js @@ -703,4 +703,9 @@ }); window.initGraphChat = init; -})(); + window.chatSendMessage = function (text) { sendMessage(text); }; + window.appendChatAssistantMessage = function (text) { + appendMessage('assistant', text); + conversationHistory.push({ role: 'assistant', content: text }); + }; +})(); \ No newline at end of file diff --git a/src/front/static/query/js/query-sigmagraph.js b/src/front/static/query/js/query-sigmagraph.js index c527f861..0611133b 100644 --- a/src/front/static/query/js/query-sigmagraph.js +++ b/src/front/static/query/js/query-sigmagraph.js @@ -62,6 +62,11 @@ var SigmaGraph = (function () { var _collapsedClusters = new Set(); var _clusterCollapseActive = false; + // --- Graph metrics state --- + var _nodeMetrics = {}; // node URI → { degree, pagerank, betweenness, closeness, clustering } + var _metricMode = null; // active metric key, or null + var _metricStatsData = null; // aggregate MetricsStats from last compute + // --- Last right-click anchor for contextual info bubbles --- var _lastNodeMenuX = null; var _lastNodeMenuY = null; @@ -551,12 +556,17 @@ var SigmaGraph = (function () { var icon = _iconForType(entityType); var rawLabel = n.label || _extractLocalName(n.id); try { + var nodeSize = 6; + if (_metricMode && _nodeMetrics[n.id]) { + var score = _nodeMetrics[n.id][_metricMode] || 0; + nodeSize = 4 + Math.round(score * 16); + } graph.addNode(n.id, { label: icon + ' ' + rawLabel, entityType: entityType, icon: icon, color: _colorForType(entityType), - size: 6, + size: nodeSize, _data: n }); addedNodes.add(n.id); @@ -1000,6 +1010,14 @@ var SigmaGraph = (function () { } } + // Color by metric mode (5-tier heatmap: blue → green → yellow → orange → red) + if (_metricMode && _nodeMetrics[node] && !data._isGroup && !data._isClusterNode) { + var mScore = _nodeMetrics[node][_metricMode] || 0; + var _metricPalette = ['#2196F3', '#4CAF50', '#FFEB3B', '#FF9800', '#F44336']; + var tier = Math.min(4, Math.floor(mScore * 5)); + res.color = _metricPalette[tier]; + } + if (_highlightedSeeds && _highlightedSeeds.has(node)) { res.highlighted = true; res.size = (data.size || 6) * 1.5; @@ -3011,8 +3029,115 @@ var SigmaGraph = (function () { if (slider && label) label.textContent = parseFloat(slider.value).toFixed(2); }, + computeMetrics: async function () { + var btn = document.getElementById('sgComputeMetricsBtn'); + var spinner = document.getElementById('sgMetricsSpinner'); + if (btn) btn.disabled = true; + if (spinner) spinner.classList.remove('d-none'); + try { + var resp = await fetch('/dtwin/metrics/compute', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + credentials: 'same-origin', + body: JSON.stringify({}) + }); + var data = await resp.json(); + if (!data.success) { + if (typeof showNotification === 'function') showNotification(data.message || 'Metrics computation failed', 'danger'); + return; + } + _nodeMetrics = data.nodes || {}; + _metricStatsData = data.stats || null; + var topNodes = data.top_pagerank || []; + + // Normalise scores per metric to [0,1] range for sizing/coloring + var metrics = ['degree', 'pagerank', 'betweenness', 'closeness', 'clustering']; + var maxVals = {}; + metrics.forEach(function (m) { maxVals[m] = 0; }); + Object.values(_nodeMetrics).forEach(function (nm) { + metrics.forEach(function (m) { + if ((nm[m] || 0) > maxVals[m]) maxVals[m] = nm[m]; + }); + }); + Object.keys(_nodeMetrics).forEach(function (uri) { + var nm = _nodeMetrics[uri]; + metrics.forEach(function (m) { + nm[m] = maxVals[m] > 0 ? nm[m] / maxVals[m] : 0; + }); + }); + + // Populate stats panel + var statsEl = document.getElementById('sgMetricsStats'); + if (statsEl && _metricStatsData) { + document.getElementById('sgMetricStatNodes').textContent = _metricStatsData.node_count || '—'; + document.getElementById('sgMetricStatEdges').textContent = _metricStatsData.edge_count || '—'; + document.getElementById('sgMetricStatComponents').textContent = _metricStatsData.connected_components || '—'; + document.getElementById('sgMetricStatAvgDegree').textContent = _metricStatsData.avg_degree != null ? _metricStatsData.avg_degree.toFixed(2) : '—'; + document.getElementById('sgMetricStatDensity').textContent = _metricStatsData.density != null ? _metricStatsData.density.toFixed(6) : '—'; + statsEl.classList.remove('d-none'); + } + + // Populate ranking list (top-PageRank by default) + _populateMetricRanking(topNodes, 'pagerank'); + + var sel = document.getElementById('sgMetricSelector'); + if (sel && !sel.value) sel.value = 'pagerank'; + _metricMode = 'pagerank'; + + SigmaGraph.refresh(true); + + if (typeof showNotification === 'function') { + showNotification( + 'Metrics computed: ' + Object.keys(_nodeMetrics).length + ' nodes (' + + (_metricStatsData ? _metricStatsData.elapsed_ms : '?') + 'ms)', + 'success' + ); + } + } catch (e) { + console.error('[SigmaGraph] Graph metrics error:', e); + if (typeof showNotification === 'function') showNotification('Metrics error: ' + e.message, 'danger'); + } finally { + if (btn) btn.disabled = false; + if (spinner) spinner.classList.add('d-none'); + } + }, + + onMetricSelectorChange: function () { + var sel = document.getElementById('sgMetricSelector'); + _metricMode = (sel && sel.value) ? sel.value : null; + if (_metricMode && Object.keys(_nodeMetrics).length > 0) { + var ranked = Object.keys(_nodeMetrics).sort(function (a, b) { + return (_nodeMetrics[b][_metricMode] || 0) - (_nodeMetrics[a][_metricMode] || 0); + }).slice(0, 10); + _populateMetricRanking(ranked, _metricMode); + } + SigmaGraph.refresh(false); + }, + openGraphSwitcher: function () { _openGraphSwitcherModal(); } }; + + function _populateMetricRanking(uris, metric) { + var el = document.getElementById('sgMetricRanking'); + if (!el) return; + if (!uris || uris.length === 0) { + el.innerHTML = '<span class="text-muted small">No data.</span>'; + return; + } + var html = ''; + uris.forEach(function (uri, idx) { + var nm = _nodeMetrics[uri]; + var score = nm ? (nm[metric] || 0) : 0; + var label = _extractLocalName(uri) || uri; + html += '<div class="d-flex justify-content-between align-items-center py-1 border-bottom">' + + '<span class="small text-truncate me-2" title="' + uri + '">' + + '<span class="text-muted me-1">' + (idx + 1) + '.</span>' + label + + '</span>' + + '<span class="badge bg-primary ms-auto">' + score.toFixed(4) + '</span>' + + '</div>'; + }); + el.innerHTML = html; + } })(); // ===================================================== diff --git a/src/front/static/query/js/query.js b/src/front/static/query/js/query.js index 46216a9f..21b1f12a 100644 --- a/src/front/static/query/js/query.js +++ b/src/front/static/query/js/query.js @@ -140,6 +140,11 @@ async function _initQueryPage(initialSection, focusEntityUri, bridgeDomain) { loadInsights(); } } + if (section === 'analytics') { + if (typeof window.analyticsLoadTypes === 'function') { + window.analyticsLoadTypes(); + } + } } }); diff --git a/src/front/templates/dtwin.html b/src/front/templates/dtwin.html index c006bcf9..3036e765 100644 --- a/src/front/templates/dtwin.html +++ b/src/front/templates/dtwin.html @@ -53,6 +53,11 @@ {% include "partials/dtwin/_query_cohorts.html" %} </div> + <!-- Graph Analytics Section --> + <div id="analytics-section" class="sidebar-section"> + {% include "partials/dtwin/_query_analytics.html" %} + </div> + <!-- Graph Viewer Section --> <div id="sigmagraph-section" class="sidebar-section active"> {% include "partials/dtwin/_query_sigmagraph.html" %} diff --git a/src/front/templates/partials/domain/_domain_metadata.html b/src/front/templates/partials/domain/_domain_metadata.html index f11ccabe..09d549e8 100644 --- a/src/front/templates/partials/domain/_domain_metadata.html +++ b/src/front/templates/partials/domain/_domain_metadata.html @@ -51,6 +51,27 @@ <h4 class="mb-1"><i class="bi bi-database me-2"></i>Data Sources</h4> <!-- Data Sources Preview --> <div id="metadataPreview" class="mt-4 d-none"> + <!-- Metadata Coverage Gauges --> + <div class="row g-3 mb-4 justify-content-center" id="metadataGaugesRow"> + <div class="col-6 col-sm-4 col-lg-3"> + <div class="card text-center py-2"> + <div class="card-body p-2"> + <canvas id="gaugeTableDesc" width="120" height="70"></canvas> + <div class="fw-semibold small mt-1">Table Descriptions</div> + <div class="text-muted small" id="gaugeTableDescDetail">-</div> + </div> + </div> + </div> + <div class="col-6 col-sm-4 col-lg-3"> + <div class="card text-center py-2"> + <div class="card-body p-2"> + <canvas id="gaugeColumnDesc" width="120" height="70"></canvas> + <div class="fw-semibold small mt-1">Column Descriptions</div> + <div class="text-muted small" id="gaugeColumnDescDetail">-</div> + </div> + </div> + </div> + </div> <div class="d-flex justify-content-between align-items-center mb-3"> <h6 class="mb-0"><i class="bi bi-table"></i> Loaded Tables</h6> <div class="d-flex align-items-center gap-2"> diff --git a/src/front/templates/partials/domain/_domain_validation.html b/src/front/templates/partials/domain/_domain_validation.html index d0650bd7..d2f54696 100644 --- a/src/front/templates/partials/domain/_domain_validation.html +++ b/src/front/templates/partials/domain/_domain_validation.html @@ -313,6 +313,61 @@ <h4 class="mb-1"><i class="bi bi-speedometer2 me-2"></i>Cockpit</h4> </div> </div> + <!-- Graph Structure Metrics Card --> + <div class="col-12"> + <div class="card validation-detail-card h-100" id="graphStructureCard"> + <div class="card-header d-flex justify-content-between align-items-center"> + <span><i class="bi bi-bar-chart-line me-1"></i> Graph Structure</span> + <span id="graphStructureBadge" class="badge bg-secondary">Not computed</span> + </div> + <div class="card-body"> + <div id="graphStructureSpinner" class="text-center py-3"> + <div class="spinner-border spinner-border-sm text-secondary" role="status"></div> + <span class="small text-muted ms-2">Loading…</span> + </div> + <div id="graphStructureContent" class="d-none"> + <div class="row row-cols-2 row-cols-md-3 g-2 mb-3"> + <div class="col"> + <div class="p-2 border rounded text-center"> + <div class="small text-muted">Nodes</div> + <div class="fw-bold" id="gsNodeCount">—</div> + </div> + </div> + <div class="col"> + <div class="p-2 border rounded text-center"> + <div class="small text-muted">Edges</div> + <div class="fw-bold" id="gsEdgeCount">—</div> + </div> + </div> + <div class="col"> + <div class="p-2 border rounded text-center"> + <div class="small text-muted">Components</div> + <div class="fw-bold" id="gsComponents">—</div> + </div> + </div> + <div class="col"> + <div class="p-2 border rounded text-center"> + <div class="small text-muted">Avg Degree</div> + <div class="fw-bold" id="gsAvgDegree">—</div> + </div> + </div> + <div class="col"> + <div class="p-2 border rounded text-center"> + <div class="small text-muted">Density</div> + <div class="fw-bold" id="gsDensity">—</div> + </div> + </div> + </div> + <div class="small fw-semibold mb-1"><i class="bi bi-trophy text-warning"></i> Top PageRank nodes</div> + <div id="gsTopPagerank" class="small text-muted">—</div> + </div> + <div id="graphStructureError" class="d-none"> + <span class="text-muted small"><i class="bi bi-info-circle me-1"></i>Build the Knowledge Graph first to compute metrics.</span> + </div> + </div> + </div> + </div> + <!-- Missing Items Detail --> <div class="col-12"> <div class="card validation-detail-card h-100 ob-hidden" id="missingItemsCard"> diff --git a/src/front/templates/partials/dtwin/_query_analytics.html b/src/front/templates/partials/dtwin/_query_analytics.html new file mode 100644 index 00000000..0d03bb5d --- /dev/null +++ b/src/front/templates/partials/dtwin/_query_analytics.html @@ -0,0 +1,974 @@ +<!-- Graph Analytics — standalone section on /dtwin/ --> +<div class="content-section" id="analyticsSection"> + + <div class="section-header d-flex justify-content-between align-items-center mb-3"> + <div> + <h4 class="mb-1"><i class="bi bi-graph-up-arrow me-2"></i>Graph Analytics</h4> + <p class="text-muted mb-0 small">Centrality & structural metrics: PageRank, betweenness, degree, closeness, clustering</p> + </div> + <div class="d-flex align-items-center gap-2"> + <label class="form-label small fw-semibold mb-0 text-muted"> + <i class="bi bi-funnel me-1"></i>Entity Type + </label> + <select id="analyticsTypeSelect" class="form-select form-select-sm" style="width:auto;min-width:170px"> + <option value="">All types (full graph)</option> + </select> + <button type="button" class="btn btn-sm btn-outline-primary" id="analyticsComputeBtn" onclick="analyticsCompute()"> + <i class="bi bi-arrow-clockwise me-1"></i>Run Analysis + </button> + <button type="button" class="btn btn-sm btn-outline-secondary d-none" id="analyticsInterpretBtn" onclick="analyticsInterpret()" title="Ask AI to interpret the results"> + <i class="bi bi-stars me-1"></i>Interpret + </button> + <button type="button" class="btn btn-sm btn-outline-primary onto-discuss-btn" + title="Open the Knowledge Graph discussion" onclick="openTwinDiscussion()"> + <i class="bi bi-chat-dots"></i> + </button> + </div> + </div> + + <!-- Spinner --> + <div id="analyticsSpinner" class="text-center py-4 d-none"> + <div class="spinner-border text-primary" role="status"></div> + <p class="text-muted small mt-2">Computing metrics — this may take a moment for large graphs…</p> + </div> + + <!-- Error placeholder (only shown on failure) --> + <div id="analyticsNoData" class="d-none"></div> + + <!-- Results (hidden until first successful compute) --> + <div id="analyticsResults" class="d-none"> + + <!-- Active filter subtitle --> + <p id="analyticsSubtitle" class="text-muted small mb-3 d-none"> + <i class="bi bi-funnel me-1"></i><span id="analyticsSubtitleText"></span> + </p> + + <!-- Aggregate stats row --> + <div class="row g-3 mb-4" id="analyticsStatsRow"> + <div class="col-6 col-md-4 col-lg-2"> + <div class="card text-center h-100 border-0 bg-light"> + <div class="card-body py-3"> + <div class="fs-4 fw-bold text-primary" id="aStatNodes">—</div> + <div class="small text-muted">Nodes</div> + <div class="small text-muted" id="aStatGraphNodes" style="font-size:0.7rem"></div> + </div> + </div> + </div> + <div class="col-6 col-md-4 col-lg-2"> + <div class="card text-center h-100 border-0 bg-light"> + <div class="card-body py-3"> + <div class="fs-4 fw-bold text-primary" id="aStatEdges">—</div> + <div class="small text-muted">Edges</div> + </div> + </div> + </div> + <div class="col-6 col-md-4 col-lg-2"> + <div class="card text-center h-100 border-0 bg-light"> + <div class="card-body py-3"> + <div class="fs-4 fw-bold text-success" id="aStatComponents">—</div> + <div class="small text-muted">Components</div> + </div> + </div> + </div> + <div class="col-6 col-md-4 col-lg-2"> + <div class="card text-center h-100 border-0 bg-light"> + <div class="card-body py-3"> + <div class="fs-4 fw-bold text-info" id="aStatAvgDegree">—</div> + <div class="small text-muted">Avg Degree</div> + </div> + </div> + </div> + <div class="col-6 col-md-4 col-lg-2"> + <div class="card text-center h-100 border-0 bg-light"> + <div class="card-body py-3"> + <div class="fs-4 fw-bold text-secondary" id="aStatDensity">—</div> + <div class="small text-muted">Density</div> + </div> + </div> + </div> + <div class="col-6 col-md-4 col-lg-2"> + <div class="card text-center h-100 border-0 bg-light"> + <div class="card-body py-3"> + <div class="small text-muted mb-1">Computed in</div> + <div class="fw-bold text-muted" id="aStatElapsed">—</div> + </div> + </div> + </div> + </div> + + <!-- Data Model Health card (shown only on full-graph analysis) --> + <div id="analyticsHealthCard" class="card mb-4 border-0 shadow-sm d-none"> + <div class="card-header bg-white py-2 d-flex align-items-center gap-2"> + <i class="bi bi-activity text-info fs-5"></i> + <span class="fw-semibold small">Data Model Health</span> + <span class="ms-auto text-muted small" style="font-size:0.75rem"> + Entity types that can be considered as flat/time-series datasets and may not rely on graph semantics. + Consider excluding them from the sync or replacing with aggregated facts. + </span> + </div> + <div class="card-body p-0"> + <div class="table-responsive"> + <table class="table table-sm table-hover mb-0" style="font-size:0.82rem"> + <thead class="table-light"> + <tr> + <th class="ps-3">Entity Type</th> + <th class="text-end">Count</th> + <th class="text-end">Avg Degree</th> + <th class="text-end" title="Number of distinct relationship predicates this entity type is involved in (as subject or object). rdf:type, rdfs:label and literal-valued attributes are excluded. A value of 0 means instances have no entity-to-entity relationships at all — they are fully isolated in the graph.">Rel. Predicates <i class="bi bi-info-circle text-muted" style="font-size:0.75rem"></i></th> + <th>Flags</th> + </tr> + </thead> + <tbody id="analyticsHealthBody"></tbody> + </table> + </div> + </div> + </div> + + <!-- AI Insights card (hidden until Interpret is clicked) --> + <div id="analyticsInsightsCard" class="card mb-4 border-0 shadow-sm d-none"> + <div class="card-header bg-white py-2 d-flex align-items-center gap-2"> + <i class="bi bi-stars text-warning fs-5"></i> + <span class="fw-semibold small">AI Insights</span> + <span class="ms-auto text-muted small" id="analyticsInsightsStatus"></span> + <button type="button" class="btn btn-sm btn-outline-secondary d-none" + id="analyticsAuditBtn" + onclick="analyticsAddToAuditTrail()" + title="Save these insights as a comment in the audit trail"> + <i class="bi bi-journal-plus me-1"></i>Add to audit trail + </button> + </div> + <div class="card-body p-3" id="analyticsInsightsBody"> + <div class="text-center py-3" id="analyticsInsightsSpinner"> + <div class="spinner-border spinner-border-sm text-warning" role="status"></div> + <span class="ms-2 small text-muted">Interpreting results…</span> + </div> + </div> + </div> + + <!-- Top-N control --> + <div class="d-flex align-items-center gap-2 mb-3"> + <span class="small text-muted fw-semibold">Top</span> + <input type="number" class="form-control form-control-sm" id="analyticsTopN" value="10" min="3" max="50" style="width:70px" onchange="analyticsRenderCharts()" title="Top N nodes per chart"> + <span class="small text-muted">nodes per chart</span> + </div> + + <!-- PageRank detail table — full width --> + <div class="row g-3 mb-1"> + <div class="col-12"> + <div class="card"> + <div class="card-header py-2 small fw-semibold d-flex justify-content-between align-items-center"> + <span> + <i class="bi bi-diagram-3 me-1 text-primary"></i>PageRank — node detail + <button class="btn btn-link btn-sm p-0 text-muted ms-1" onclick="_showMetricInfo('pagerank')" title="What is PageRank?"><i class="bi bi-question-circle"></i></button> + </span> + <span class="text-muted fw-normal" style="font-size:0.78rem"> + PR(u) = (1−d)/N + d·Σ PR(v)/deg(v)  ·  damping = 0.85 + </span> + </div> + <div class="card-body p-0"> + <div class="table-responsive"> + <table class="table table-sm table-hover align-middle mb-0" id="pagerankDetailTable"> + <thead class="table-light"> + <tr> + <th class="text-center ps-3" style="width:32px">#</th> + <th>Node</th> + <th class="text-end text-primary">PageRank</th> + <th class="text-end text-success">Degree</th> + <th class="text-end text-danger">Betweenness</th> + <th class="text-end text-info">Closeness</th> + <th class="text-end text-warning pe-3">Clustering</th> + </tr> + </thead> + <tbody id="pagerankDetailBody"></tbody> + </table> + </div> + </div> + </div> + </div> + </div> + + <!-- 4 charts — 2-column grid --> + <div class="row g-3"> + <div class="col-12 col-xl-6"> + <div class="card h-100"> + <div class="card-header py-2 small fw-semibold d-flex justify-content-between align-items-center"> + <span><i class="bi bi-share me-1 text-danger"></i>Betweenness Centrality</span> + <button class="btn btn-link btn-sm p-0 text-muted" onclick="_showMetricInfo('betweenness')" title="What is Betweenness?"><i class="bi bi-question-circle"></i></button> + </div> + <div class="card-body"><canvas id="chartBetweenness"></canvas></div> + </div> + </div> + <div class="col-12 col-xl-6"> + <div class="card h-100"> + <div class="card-header py-2 small fw-semibold d-flex justify-content-between align-items-center"> + <span><i class="bi bi-node-plus me-1 text-success"></i>Degree Centrality</span> + <button class="btn btn-link btn-sm p-0 text-muted" onclick="_showMetricInfo('degree')" title="What is Degree Centrality?"><i class="bi bi-question-circle"></i></button> + </div> + <div class="card-body"><canvas id="chartDegree"></canvas></div> + </div> + </div> + <div class="col-12 col-xl-6"> + <div class="card h-100"> + <div class="card-header py-2 small fw-semibold d-flex justify-content-between align-items-center"> + <span><i class="bi bi-arrows-fullscreen me-1 text-info"></i>Closeness Centrality</span> + <button class="btn btn-link btn-sm p-0 text-muted" onclick="_showMetricInfo('closeness')" title="What is Closeness Centrality?"><i class="bi bi-question-circle"></i></button> + </div> + <div class="card-body"><canvas id="chartCloseness"></canvas></div> + </div> + </div> + <div class="col-12 col-xl-6"> + <div class="card h-100"> + <div class="card-header py-2 small fw-semibold d-flex justify-content-between align-items-center"> + <span><i class="bi bi-hexagon me-1 text-warning"></i>Clustering Coefficient</span> + <button class="btn btn-link btn-sm p-0 text-muted" onclick="_showMetricInfo('clustering')" title="What is Clustering Coefficient?"><i class="bi bi-question-circle"></i></button> + </div> + <div class="card-body"><canvas id="chartClustering"></canvas></div> + </div> + </div> + </div> + + </div><!-- /analyticsResults --> + +</div><!-- /content-section --> + +<!-- Metric explanation modal (shared) --> +<div class="modal fade" id="analyticsMetricModal" tabindex="-1" aria-labelledby="analyticsMetricModalLabel" aria-hidden="true"> + <div class="modal-dialog modal-lg modal-dialog-scrollable"> + <div class="modal-content"> + <div class="modal-header"> + <h5 class="modal-title fw-semibold" id="analyticsMetricModalLabel">Metric</h5> + <button type="button" class="btn-close" data-bs-dismiss="modal"></button> + </div> + <div class="modal-body" id="analyticsMetricModalBody"></div> + <div class="modal-footer"> + <button type="button" class="btn btn-secondary btn-sm" data-bs-dismiss="modal">Close</button> + </div> + </div> + </div> +</div> + +<script> +(function () { + var _analyticsData = null; + var _analyticsLastSections = null; + var _charts = {}; + var _allTypes = []; // [{ name, uri, count }] — populated from /dtwin/sync/stats + + // ------------------------------------------------------------------ + // Metric explanations — shown in popup when user clicks ? on a card + // ------------------------------------------------------------------ + var _METRIC_INFO = { + pagerank: { + title: 'PageRank', + icon: 'bi-diagram-3 text-primary', + what: 'PageRank measures the <strong>global importance</strong> of a node based on both the quantity and quality of its connections. A node is important if many other important nodes link to it — not just if it has many connections.', + formula: 'PR(u) = <sup>(1 − d)</sup>/<sub>N</sub> + d · Σ<sub>v → u</sub> <sup>PR(v)</sup>/<sub>deg(v)</sub>', + formulaDesc: '<ul class="mb-0"><li><code>d = 0.85</code> — damping factor (probability of following a link vs. jumping randomly)</li><li><code>N</code> — total number of nodes in the graph</li><li><code>PR(v)</code> — PageRank of each neighbour <em>v</em> pointing to <em>u</em></li><li><code>deg(v)</code> — number of edges of neighbour <em>v</em> (it "shares" its rank equally)</li></ul>', + example: '<strong>Scenario:</strong> In a supply-chain knowledge graph, a <em>Supplier</em> entity connected to 20 high-value <em>Product</em> entities (which themselves are connected to many <em>Order</em> entities) will accumulate a high PageRank — even if its raw degree is modest — because the rank flows from important downstream nodes.', + why: 'Use PageRank to find the <strong>most influential entities</strong> in your knowledge graph. High-PageRank nodes are the best candidates for data-quality checks, governance reviews, or impact analysis — changes to them ripple widely.', + }, + betweenness: { + title: 'Betweenness Centrality', + icon: 'bi-share text-danger', + what: 'Betweenness centrality measures how often a node acts as a <strong>bridge</strong> on the shortest path between two other nodes. A node with high betweenness is a critical relay — information or relationships must pass through it.', + formula: 'BC(v) = Σ<sub>s ≠ v ≠ t</sub> <sup>σ(s, t | v)</sup>/<sub>σ(s, t)</sub>', + formulaDesc: '<ul class="mb-0"><li><code>σ(s, t)</code> — total number of shortest paths from node <em>s</em> to node <em>t</em></li><li><code>σ(s, t | v)</code> — those shortest paths that pass through <em>v</em></li><li>Result is normalised to [0, 1] by dividing by <code>(N−1)(N−2)/2</code></li></ul>', + example: '<strong>Scenario:</strong> A <em>Department</em> entity that connects multiple <em>Employee</em> clusters to <em>Project</em> entities lies on many shortest paths. Its betweenness is high — removing it would disconnect large parts of the graph.', + why: 'High-betweenness nodes are <strong>bottlenecks and single points of failure</strong>. They are the most critical entities for connectivity. In a knowledge graph, they often represent integration points, shared reference data, or cross-domain hubs.', + }, + degree: { + title: 'Degree Centrality', + icon: 'bi-node-plus text-success', + what: 'Degree centrality is the simplest measure: the <strong>fraction of other nodes a node is directly connected to</strong>. It captures raw activity and visibility in the local neighbourhood.', + formula: 'DC(v) = <sup>deg(v)</sup>/<sub>(N − 1)</sub>', + formulaDesc: '<ul class="mb-0"><li><code>deg(v)</code> — number of edges incident to node <em>v</em> (in an undirected graph)</li><li><code>N − 1</code> — maximum possible connections (normalisation factor)</li><li>Result is in [0, 1]: 1.0 means the node is connected to every other node</li></ul>', + example: '<strong>Scenario:</strong> A <em>Customer</em> entity linked to 80 <em>Order</em>, 5 <em>Contact</em>, and 3 <em>Address</em> entities has a much higher degree than a customer with only 2 orders — it is a more active entity in the graph.', + why: 'Use degree centrality as a quick <strong>activity indicator</strong>. High-degree nodes are likely to be the most referenced entities. In data-quality reviews, unusually high degree can flag over-linked reference records; unusually low degree may flag orphaned data.', + }, + closeness: { + title: 'Closeness Centrality', + icon: 'bi-arrows-fullscreen text-info', + what: 'Closeness centrality measures how <strong>quickly a node can reach all other nodes</strong> in the graph — the inverse of the average shortest path length to every other node.', + formula: 'CC(v) = <sup>(N − 1)</sup>/<sub>Σ<sub>u ≠ v</sub> d(v, u)</sub>', + formulaDesc: '<ul class="mb-0"><li><code>d(v, u)</code> — length of the shortest path between nodes <em>v</em> and <em>u</em></li><li><code>N − 1</code> — normalisation so the maximum value is 1.0</li><li>A node at the <em>centre</em> of the graph (short paths to everyone) scores close to 1.0</li></ul>', + example: '<strong>Scenario:</strong> A <em>Product Category</em> entity that sits at the center of the graph — connected to both upstream <em>Suppliers</em> and downstream <em>Orders</em> — can reach any entity in few hops and thus has high closeness centrality.', + why: 'High-closeness nodes are the best <strong>information brokers and coordinators</strong>. They can propagate updates, constraints, or alerts to the rest of the graph fastest. Use them to prioritise entities in synchronisation or notification workflows.', + }, + clustering: { + title: 'Clustering Coefficient', + icon: 'bi-hexagon text-warning', + what: 'The clustering coefficient measures how <strong>tightly interconnected a node\'s neighbours are</strong> — i.e. the fraction of the node\'s neighbourhood that forms triangles (closed triplets).', + formula: 'C(v) = <sup>2 · T(v)</sup>/<sub>deg(v) · (deg(v) − 1)</sub>', + formulaDesc: '<ul class="mb-0"><li><code>T(v)</code> — number of triangles (closed triplets) that include node <em>v</em></li><li><code>deg(v) · (deg(v) − 1) / 2</code> — maximum possible triangles for <em>v</em></li><li>Result is in [0, 1]: 1.0 means every pair of neighbours is also connected to each other</li></ul>', + example: '<strong>Scenario:</strong> An <em>Employee</em> who works with 3 colleagues that all know each other forms a tight triangle — clustering coefficient = 1.0. An employee who works with 3 people who don\'t interact = 0.0.', + why: 'High clustering indicates the node is embedded in a <strong>tight community or cluster</strong>. Combined with low betweenness, this identifies nodes inside silos. A node with high betweenness <em>and</em> low clustering is a classic bridge between communities — a critical integration point.', + }, + }; + + window._showMetricInfo = function (key) { + var info = _METRIC_INFO[key]; + if (!info) return; + var title = document.getElementById('analyticsMetricModalLabel'); + var body = document.getElementById('analyticsMetricModalBody'); + if (title) title.innerHTML = '<i class="bi ' + info.icon + ' me-2"></i>' + info.title; + if (body) body.innerHTML = [ + '<h6 class="fw-semibold text-secondary text-uppercase" style="font-size:0.7rem;letter-spacing:.05em">What is it?</h6>', + '<p>' + info.what + '</p>', + '<h6 class="fw-semibold text-secondary text-uppercase mt-3" style="font-size:0.7rem;letter-spacing:.05em">Formula</h6>', + '<div class="bg-light border rounded p-3 mb-2 text-center" style="font-size:1.05rem">' + info.formula + '</div>', + info.formulaDesc, + '<h6 class="fw-semibold text-secondary text-uppercase mt-3" style="font-size:0.7rem;letter-spacing:.05em">Example</h6>', + '<div class="alert alert-light border mb-2"><i class="bi bi-lightbulb me-1 text-warning"></i>' + info.example + '</div>', + '<h6 class="fw-semibold text-secondary text-uppercase mt-3" style="font-size:0.7rem;letter-spacing:.05em">Why does it matter?</h6>', + '<p class="mb-0">' + info.why + '</p>', + ].join('\n'); + var modal = bootstrap.Modal.getOrCreateInstance(document.getElementById('analyticsMetricModal')); + modal.show(); + }; + + var _METRICS = [ + { key: 'betweenness', canvasId: 'chartBetweenness', color: 'rgba(220, 53, 69, 0.75)' }, + { key: 'degree', canvasId: 'chartDegree', color: 'rgba(25, 135, 84, 0.75)' }, + { key: 'closeness', canvasId: 'chartCloseness', color: 'rgba(13, 202, 240, 0.75)' }, + { key: 'clustering', canvasId: 'chartClustering', color: 'rgba(255, 193, 7, 0.85)' }, + ]; + + // Load entity types from the live KG stats and populate the <select> + async function _loadEntityTypes() { + var sel = document.getElementById('analyticsTypeSelect'); + if (!sel) return; + try { + var resp = await fetch('/dtwin/sync/stats', { credentials: 'same-origin' }); + var data = await resp.json(); + _allTypes = (data.success && data.entity_types) ? data.entity_types : []; + _populateTypeSelect(sel); + } catch (e) { + sel.innerHTML = '<option value="">All types (full graph)</option>'; + } + } + + function _populateTypeSelect(sel) { + var prev = sel.value; // remember current selection across reloads + sel.innerHTML = '<option value="">All types (full graph)</option>'; + _allTypes.forEach(function (t) { + var uri = t.uri || t.name; + var label = (t.name || _localName(uri)) + (t.count ? ' (' + t.count + ')' : ''); + var opt = document.createElement('option'); + opt.value = uri; + opt.textContent = label; + opt.title = uri; + sel.appendChild(opt); + }); + // Restore previous selection if still valid + if (prev && Array.from(sel.options).some(function (o) { return o.value === prev; })) { + sel.value = prev; + } + } + + function _getSelectedTypes() { + var sel = document.getElementById('analyticsTypeSelect'); + if (!sel || !sel.value) return null; // "" = All = no filter + return [sel.value]; + } + + window.analyticsCompute = async function () { + var btn = document.getElementById('analyticsComputeBtn'); + var spinner = document.getElementById('analyticsSpinner'); + var noData = document.getElementById('analyticsNoData'); + + if (btn) btn.disabled = true; + if (spinner) spinner.classList.remove('d-none'); + + // Reset cards from any previous run + var _hc = document.getElementById('analyticsHealthCard'); + if (_hc) _hc.classList.add('d-none'); + var _ic = document.getElementById('analyticsInsightsCard'); + if (_ic) _ic.classList.add('d-none'); + + // Ensure entity types are loaded (fallback if section was opened directly) + if (_allTypes.length === 0) _loadEntityTypes(); + + try { + var resp = await fetch('/dtwin/metrics/compute', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + credentials: 'same-origin', + body: JSON.stringify({ class_filter: _getSelectedTypes() }) + }); + var data = await resp.json(); + if (!data.success) { _showAnalyticsError(data.message || 'Metrics computation failed'); return; } + + _analyticsData = data; + + // Update subtitle with the active filter + var _subtitle = document.getElementById('analyticsSubtitle'); + var _subtitleTxt = document.getElementById('analyticsSubtitleText'); + var _selEl = document.getElementById('analyticsTypeSelect'); + var _selOpt = _selEl && _selEl.selectedIndex >= 0 ? _selEl.options[_selEl.selectedIndex] : null; + if (_subtitle && _subtitleTxt) { + if (_selOpt && _selEl.value) { + _subtitleTxt.textContent = _selOpt.text.trim(); + _subtitle.classList.remove('d-none'); + } else { + _subtitle.classList.add('d-none'); + } + } + + var s = data.stats; + _setText('aStatNodes', s.node_count != null ? s.node_count.toLocaleString() : '—'); + _setText('aStatEdges', s.edge_count != null ? s.edge_count.toLocaleString() : '—'); + _setText('aStatComponents', s.connected_components != null ? s.connected_components : '—'); + _setText('aStatAvgDegree', s.avg_degree != null ? s.avg_degree.toFixed(2) : '—'); + _setText('aStatDensity', s.density != null ? s.density.toFixed(6) : '—'); + _setText('aStatElapsed', s.elapsed_ms != null ? s.elapsed_ms + ' ms' : '—'); + + // Show graph_node_count sub-label when filter was applied + var graphNodeEl = document.getElementById('aStatGraphNodes'); + if (graphNodeEl) { + var gn = s.graph_node_count; + graphNodeEl.textContent = (gn && gn !== s.node_count) ? '(' + gn.toLocaleString() + ' in subgraph)' : ''; + } + + analyticsRenderCharts(); + _renderTypeProfiles(data.entity_type_profiles, !!_getSelectedTypes()); + + if (spinner) spinner.classList.add('d-none'); + var results = document.getElementById('analyticsResults'); + if (results) results.classList.remove('d-none'); + + // Reveal the Interpret button; reset audit button + var interpretBtn = document.getElementById('analyticsInterpretBtn'); + if (interpretBtn) interpretBtn.classList.remove('d-none'); + var auditBtn = document.getElementById('analyticsAuditBtn'); + if (auditBtn) auditBtn.classList.add('d-none'); + _analyticsLastSections = null; + + if (typeof showNotification === 'function') + showNotification('Analysis done: ' + Object.keys(data.nodes).length + ' nodes in ' + s.elapsed_ms + 'ms', 'success'); + + } catch (e) { + _showAnalyticsError('Error: ' + e.message); + } finally { + if (btn) btn.disabled = false; + if (spinner) spinner.classList.add('d-none'); + } + }; + + // Navigate to the Graph Viewer and filter on a specific entity URI + function _navigateToGraph(uri) { + var link = document.querySelector('[data-section="sigmagraph"]'); + if (!link) return; + link.click(); + var localName = _localName(uri) || uri; + setTimeout(function () { + var valInput = document.getElementById('sgFilterValue'); + if (valInput) { + valInput.value = localName; + valInput.dispatchEvent(new Event('input', { bubbles: true })); + } + if (typeof SigmaGraph !== 'undefined' && SigmaGraph.executeGraphFilter) { + SigmaGraph.executeGraphFilter(); + } + }, 400); + } + + window.analyticsRenderCharts = function () { + if (!_analyticsData) return; + var topN = Math.max(3, parseInt(document.getElementById('analyticsTopN')?.value) || 10); + var nodeTypes = _analyticsData.node_types || {}; + var nodeLabels = _analyticsData.node_labels || {}; + var allNodes = _analyticsData.nodes; + var candidateUris = Object.keys(allNodes); + + _METRICS.forEach(function (m) { + var sorted = candidateUris + .sort(function (a, b) { return (allNodes[b][m.key] || 0) - (allNodes[a][m.key] || 0); }) + .slice(0, topN); + + var labels = sorted.map(function (uri) { + return _displayName(uri); + }); + var values = sorted.map(function (uri) { + return +(allNodes[uri][m.key] || 0).toFixed(6); + }); + + var canvas = document.getElementById(m.canvasId); + if (!canvas) return; + + if (_charts[m.key]) { _charts[m.key].destroy(); } + + // Show a notice instead of a flat zero chart + var allZero = values.every(function (v) { return v === 0; }); + var zeroNoticeId = m.canvasId + '_zeroNotice'; + var existing = document.getElementById(zeroNoticeId); + if (existing) existing.remove(); + if (allZero) { + var notice = document.createElement('div'); + notice.id = zeroNoticeId; + notice.className = 'alert alert-light border small text-muted mb-0'; + notice.innerHTML = '<i class="bi bi-info-circle me-1"></i>' + + '<strong>All values are 0.</strong> ' + + (m.key === 'clustering' + ? 'Clustering coefficient is 0 when none of a node\'s neighbors are connected to each other — typical for KGs with a bipartite structure (e.g. Customer → Order → Product). Triangles are rare unless entities of the same type link directly.' + : 'No ' + m.key + ' scores could be computed for the current graph / filter.'); + canvas.parentNode.insertBefore(notice, canvas); + canvas.style.display = 'none'; + return; // skip chart rendering for this metric + } + canvas.style.display = ''; + + _charts[m.key] = new Chart(canvas, { + type: 'bar', + data: { + labels: labels, + datasets: [{ + label: m.key.charAt(0).toUpperCase() + m.key.slice(1), + data: values, + backgroundColor: m.color, + borderRadius: 4, + borderSkipped: false, + }] + }, + options: { + indexAxis: 'y', + responsive: true, + onClick: (function (capturedSorted) { + return function (event, elements) { + if (!elements || !elements.length) return; + var idx = elements[0].index; + var uri = capturedSorted[idx]; + if (uri) _navigateToGraph(uri); + }; + })(sorted.slice()), + onHover: function (event) { + event.native.target.style.cursor = + event.chart.getElementsAtEventForMode(event.native, 'nearest', { intersect: true }, true).length + ? 'pointer' : 'default'; + }, + plugins: { + legend: { display: false }, + tooltip: { + callbacks: { + title: function (items) { + var idx = items[0].dataIndex; + var uri = sorted[idx]; + var type = nodeTypes[uri]; + var typeLabel = type ? _localName(type) : null; + return typeLabel ? uri + ' [' + typeLabel + ']' : uri; + }, + beforeBody: function (items) { + var idx = items[0].dataIndex; + var uri = sorted[idx]; + var nm = allNodes[uri] || {}; + return [ + 'PageRank : ' + (nm.pagerank || 0).toFixed(6), + 'Degree : ' + (nm.degree || 0).toFixed(6), + 'Betweenness : ' + (nm.betweenness || 0).toFixed(6), + 'Closeness : ' + (nm.closeness || 0).toFixed(6), + 'Clustering : ' + (nm.clustering || 0).toFixed(6), + '──────────────────────────', + ]; + }, + label: function (item) { + return '► ' + item.dataset.label + ' : ' + item.formattedValue; + }, + afterLabel: function () { return '\nClick to open in Graph Viewer'; } + } + } + }, + scales: { + x: { + beginAtZero: true, + ticks: { font: { size: 11 } }, + grid: { color: 'rgba(0,0,0,0.05)' } + }, + y: { + ticks: { + font: { size: 11 }, + callback: function (val, idx) { + var lbl = labels[idx]; + return lbl.length > 28 ? lbl.slice(0, 27) + '…' : lbl; + } + }, + grid: { display: false } + } + } + } + }); + }); + _renderPagerankTable(candidateUris, allNodes, nodeTypes, topN); + }; + + function _renderPagerankTable(candidateUris, allNodes, nodeTypes, topN) { + var tbody = document.getElementById('pagerankDetailBody'); + if (!tbody) return; + var sorted = candidateUris + .slice() + .sort(function (a, b) { return (allNodes[b].pagerank || 0) - (allNodes[a].pagerank || 0); }) + .slice(0, topN); + + // Per-metric max values for relative bar widths + var metrics = ['pagerank', 'degree', 'betweenness', 'closeness', 'clustering']; + var maxVal = {}; + metrics.forEach(function (k) { + maxVal[k] = Math.max.apply(null, sorted.map(function (u) { return allNodes[u][k] || 0; })) || 1; + }); + + var colors = { + pagerank: 'var(--bs-primary)', + degree: 'var(--bs-success)', + betweenness: 'var(--bs-danger)', + closeness: 'var(--bs-info)', + clustering: 'var(--bs-warning)', + }; + + tbody.innerHTML = ''; + sorted.forEach(function (uri, rank) { + var nm = allNodes[uri]; + var type = nodeTypes[uri]; + var typeSuffix = type ? '<span class="badge bg-light border text-secondary ms-1" style="font-size:0.7rem">' + _localName(type) + '</span>' : ''; + var displayName = _displayName(uri); + + function cell(key) { + var v = nm[key] || 0; + var pct = Math.round((v / maxVal[key]) * 100); + return '<td class="text-end" style="min-width:90px">' + + '<div style="font-size:0.78rem;font-variant-numeric:tabular-nums">' + v.toFixed(4) + '</div>' + + '<div style="height:3px;border-radius:2px;background:' + colors[key] + ';width:' + pct + '%;margin-left:auto"></div>' + + '</td>'; + } + + var row = '<tr style="cursor:pointer" onclick="_analyticsDrillURI(\'' + uri.replace(/'/g, "\\'") + '\')" title="Open in Graph Viewer">' + + '<td class="text-center text-muted small">' + (rank + 1) + '</td>' + + '<td><span class="fw-semibold small">' + displayName + '</span>' + typeSuffix + '</td>' + + cell('pagerank') + + cell('degree') + + cell('betweenness') + + cell('closeness') + + cell('clustering') + + '</tr>'; + tbody.insertAdjacentHTML('beforeend', row); + }); + } + + window._analyticsDrillURI = function (uri) { _navigateToGraph(uri); }; + + function _renderTypeProfiles(profiles, hasFilter) { + var card = document.getElementById('analyticsHealthCard'); + var tbody = document.getElementById('analyticsHealthBody'); + if (!card || !tbody) return; + + // Hide when profiles are empty (nothing to show) + if (!profiles || !Object.keys(profiles).length) { + card.classList.add('d-none'); + return; + } + + var rows = Object.values(profiles).sort(function (a, b) { + // Flat types first, then by count descending + if (a.is_flat !== b.is_flat) return a.is_flat ? -1 : 1; + return (b.count || 0) - (a.count || 0); + }); + + tbody.innerHTML = ''; + rows.forEach(function (p) { + var typeName = _localName(p.uri); + var countStr = (p.count || 0).toLocaleString(); + var degStr = (p.avg_degree || 0).toFixed(4); + var predStr = String(p.distinct_predicates || 0); + + var statusBadge = p.is_flat + ? '<span class="badge bg-warning-subtle text-warning-emphasis border border-warning me-1" title="This entity type has structural patterns typical of a flat dataset or time series">' + + '<i class="bi bi-exclamation-triangle me-1"></i>flat</span>' + : '<span class="badge bg-success-subtle text-success-emphasis border border-success me-1">' + + '<i class="bi bi-check-circle me-1"></i>graph</span>'; + + var reasonsBadges = ''; + if (p.is_flat && p.flat_reasons && p.flat_reasons.length) { + reasonsBadges = p.flat_reasons.map(function (r) { + return '<span class="badge bg-light border text-secondary ms-1" style="font-size:0.7rem;font-weight:400">' + _esc(r) + '</span>'; + }).join(''); + } + + if (p.has_temporal_predicates && !p.is_flat) { + reasonsBadges += '<span class="badge bg-info-subtle text-info-emphasis border border-info ms-1" style="font-size:0.7rem">' + + '<i class="bi bi-clock me-1"></i>temporal</span>'; + } + + tbody.insertAdjacentHTML('beforeend', + '<tr>' + + '<td class="ps-3 fw-semibold">' + _esc(typeName) + '<span class="text-muted fw-normal ms-1" style="font-size:0.72rem">' + _esc(p.uri) + '</span></td>' + + '<td class="text-end">' + countStr + '</td>' + + '<td class="text-end font-monospace">' + degStr + '</td>' + + '<td class="text-end">' + predStr + '</td>' + + '<td>' + statusBadge + reasonsBadges + '</td>' + + '</tr>' + ); + }); + + card.classList.remove('d-none'); + } + + function _showAnalyticsError(msg) { + var noData = document.getElementById('analyticsNoData'); + if (noData) { + noData.innerHTML = '<div class="alert alert-danger small mb-3"><i class="bi bi-exclamation-triangle me-1"></i>' + msg + '</div>'; + noData.classList.remove('d-none'); + } + var spinner = document.getElementById('analyticsSpinner'); + if (spinner) spinner.classList.add('d-none'); + var btn = document.getElementById('analyticsComputeBtn'); + if (btn) btn.disabled = false; + } + + function _setText(id, val) { var el = document.getElementById(id); if (el) el.textContent = val; } + + + // Exposed so query.js can populate the dropdown on section activation + window.analyticsLoadTypes = function () { + if (_allTypes.length === 0) _loadEntityTypes(); + }; + + window.analyticsInterpret = async function () { + if (!_analyticsData) return; + + var btn = document.getElementById('analyticsInterpretBtn'); + var card = document.getElementById('analyticsInsightsCard'); + var body = document.getElementById('analyticsInsightsBody'); + var status = document.getElementById('analyticsInsightsStatus'); + + if (btn) btn.disabled = true; + if (card) card.classList.remove('d-none'); + if (body) body.innerHTML = '<div class="text-center py-3"><div class="spinner-border spinner-border-sm text-warning" role="status"></div><span class="ms-2 small text-muted">Interpreting results…</span></div>'; + if (status) status.textContent = ''; + + try { + var payload = Object.assign({}, _analyticsData, { class_filter: _getSelectedTypes() }); + var resp = await fetch('/dtwin/metrics/interpret', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + credentials: 'same-origin', + body: JSON.stringify(payload) + }); + var result = await resp.json(); + + if (!result.success || !result.sections) { + throw new Error(result.message || 'Interpretation failed'); + } + + // Section meta: icon, accent colour, badge style + var _SEC_META = { + 'Key Findings': { icon: 'bi-lightbulb', color: 'text-warning', badge: 'bg-warning-subtle text-warning-emphasis' }, + 'Notable Entities':{ icon: 'bi-person-badge', color: 'text-primary', badge: 'bg-primary-subtle text-primary-emphasis' }, + 'Recommendations': { icon: 'bi-check2-circle', color: 'text-success', badge: 'bg-success-subtle text-success-emphasis' }, + }; + + var html = '<div class="row g-3">'; + result.sections.forEach(function (sec) { + var meta = _SEC_META[sec.title] || { icon: 'bi-info-circle', color: 'text-secondary', badge: 'bg-secondary-subtle text-secondary-emphasis' }; + html += '<div class="col-12">'; + html += '<div class="card border-0 bg-light h-100">'; + html += '<div class="card-body p-3">'; + // Section title with icon badge + html += '<div class="d-flex align-items-center gap-2 mb-2">' + + '<span class="badge ' + meta.badge + ' px-2 py-1" style="font-size:0.78rem">' + + '<i class="bi ' + meta.icon + ' me-1"></i>' + _esc(sec.title) + + '</span></div>'; + + if (sec.body) { + // Convert basic markdown: **bold**, *italic*, line-breaks + html += '<p class="mb-0 small lh-lg">' + _md(sec.body) + '</p>'; + } else if (Array.isArray(sec.items)) { + html += '<ul class="mb-0 ps-3 small lh-lg">'; + sec.items.forEach(function (item) { + html += '<li class="mb-1">'; + if (typeof item === 'string') { + html += _md(item); + } else if (item.label) { + var nodeUri = _findUriByLabel(item.label); + if (nodeUri) { + html += '<a href="#" class="fw-semibold text-decoration-none" onclick="_analyticsDrillURI(' + + JSON.stringify(nodeUri) + ');return false;">' + + _esc(item.label) + '</a>'; + } else { + html += '<strong>' + _esc(item.label) + '</strong>'; + } + if (item.reason) html += '<span class="text-muted"> — ' + _md(item.reason) + '</span>'; + } + html += '</li>'; + }); + html += '</ul>'; + } + + html += '</div></div></div>'; + }); + html += '</div>'; + + if (body) body.innerHTML = html || '<p class="text-muted small mb-0">No insights returned.</p>'; + if (status) status.textContent = 'Generated just now'; + _analyticsLastSections = result.sections; + + // Show the audit trail button + var auditBtn = document.getElementById('analyticsAuditBtn'); + if (auditBtn) auditBtn.classList.remove('d-none'); + + // Push the interpretation into Graph Chat as an assistant message + // so it appears in the audit trail and the chat right pane. + _pushInterpretToChat(result.sections); + + } catch (e) { + if (body) body.innerHTML = '<div class="alert alert-danger small mb-0"><i class="bi bi-exclamation-triangle me-1"></i>' + _esc(e.message) + '</div>'; + } finally { + if (btn) btn.disabled = false; + } + }; + + function _pushInterpretToChat(sections) { + if (!sections || !sections.length) return; + + var selEl = document.getElementById('analyticsTypeSelect'); + var entityType = selEl && selEl.value + ? selEl.options[selEl.selectedIndex].text.trim() + : 'all entity types'; + + var markdown = '**Graph Analytics Interpretation — ' + entityType + '**\n\n' + + _sectionsToMarkdown(sections); + + if (typeof window.appendChatAssistantMessage === 'function') { + window.appendChatAssistantMessage(markdown); + } else if (typeof window.chatSendMessage === 'function') { + var chatLink = document.querySelector('[data-section="chat"]'); + if (chatLink) chatLink.click(); + setTimeout(function () { + window.chatSendMessage( + 'Here are the AI-generated insights from the Graph Analytics page:\n\n' + markdown + ); + }, 500); + } + } + + window.analyticsAddToAuditTrail = async function () { + if (!_analyticsData) return; + + var btn = document.getElementById('analyticsAuditBtn'); + var sections = _analyticsLastSections; + if (!sections || !sections.length) { + if (typeof showNotification === 'function') + showNotification('Run Interpret first to generate insights.', 'warning'); + return; + } + + var selEl = document.getElementById('analyticsTypeSelect'); + var entityType = selEl && selEl.value + ? selEl.options[selEl.selectedIndex].text.trim() + : 'all entity types'; + + var stats = _analyticsData.stats || {}; + var header = [ + '**[Graph Analytics — AI Insights] ' + entityType + '**', + '_' + stats.node_count + ' nodes · ' + stats.edge_count + ' edges · ' + + stats.connected_components + ' component(s)_', + '' + ].join('\n'); + var markdown = header + '\n' + _sectionsToMarkdown(sections); + + if (btn) { btn.disabled = true; btn.innerHTML = '<span class="spinner-border spinner-border-sm me-1"></span>Saving…'; } + + try { + // Resolve domain context directly — no dependency on the panel's + // internal ctx variable which may not be set yet. + var vsResp = await fetch('/domain/version-status', { credentials: 'same-origin' }); + var vs = await vsResp.json(); + if (!vs.domain_folder || !vs.has_registry) { + throw new Error('Save this domain to the registry first.'); + } + + // POST the comment directly to the API + var postResp = await fetch( + '/comments/' + encodeURIComponent(vs.domain_folder) + '/' + encodeURIComponent(vs.version), + { + method: 'POST', + credentials: 'same-origin', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ body: markdown, parent_id: null }), + } + ); + var postData = await postResp.json(); + if (!postResp.ok || !postData.success) { + throw new Error(postData.message || 'Failed to post comment'); + } + + if (typeof showNotification === 'function') + showNotification('Insights saved to audit trail.', 'success'); + if (btn) { btn.innerHTML = '<i class="bi bi-check2 me-1"></i>Saved'; } + setTimeout(function () { + if (btn) { btn.disabled = false; btn.innerHTML = '<i class="bi bi-journal-plus me-1"></i>Add to audit trail'; } + }, 3000); + + // Open the discussion panel so the user can see the new comment + if (typeof openTwinDiscussion === 'function') openTwinDiscussion(); + + } catch (e) { + if (typeof showNotification === 'function') + showNotification('Could not save to audit trail: ' + e.message, 'danger'); + if (btn) { btn.disabled = false; btn.innerHTML = '<i class="bi bi-journal-plus me-1"></i>Add to audit trail'; } + } + }; + + function _esc(str) { + return String(str || '').replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"'); + } + + // Minimal markdown → HTML: **bold**, *italic*, newlines → <br> + function _md(str) { + return _esc(str) + .replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>') + .replace(/\*(.+?)\*/g, '<em>$1</em>') + .replace(/\n/g, '<br>'); + } + + // Extract the local fragment from a URI (after the last # or /) + function _localName(uri) { + return (uri || '').split(/[/#]/).pop() || uri; + } + + // "Label (localId)" display name for a node URI + function _displayName(uri) { + var nodeLabels = _analyticsData ? (_analyticsData.node_labels || {}) : {}; + var localId = _localName(uri); + var lbl = nodeLabels[uri]; + return lbl ? lbl + ' (' + localId + ')' : localId; + } + + // Serialize a sections array (from the interpreter) into a markdown string + function _sectionsToMarkdown(sections) { + var lines = []; + sections.forEach(function (sec) { + lines.push('### ' + sec.title); + if (sec.body) { + lines.push(sec.body); + } else if (Array.isArray(sec.items)) { + sec.items.forEach(function (item) { + if (typeof item === 'string') { + lines.push('- ' + item); + } else if (item.label) { + lines.push('- **' + item.label + '**' + (item.reason ? ' — ' + item.reason : '')); + } + }); + } + lines.push(''); + }); + return lines.join('\n').trim(); + } + + function _findUriByLabel(label) { + if (!_analyticsData) return null; + var nodeLabels = _analyticsData.node_labels || {}; + for (var uri in nodeLabels) { + if (nodeLabels[uri] === label || _localName(uri) === label) return uri; + } + return null; + } + +})(); +</script> diff --git a/tests/eval/datasets/agent_graph_interpreter/baseline.jsonl b/tests/eval/datasets/agent_graph_interpreter/baseline.jsonl new file mode 100644 index 00000000..436625b3 --- /dev/null +++ b/tests/eval/datasets/agent_graph_interpreter/baseline.jsonl @@ -0,0 +1,20 @@ +{"id": "happy-hub-001", "input": {"entity_type": "Customer", "class_filter_applied": true, "stats": {"node_count": 200, "graph_node_count": 1082, "edge_count": 4300, "connected_components": 3, "avg_degree": 4.3, "density": 0.022}, "top_pagerank": [{"label": "Alice (C001)", "pagerank": 0.042, "degree": 0.12, "betweenness": 0.35, "closeness": 0.61, "clustering": 0.0}, {"label": "Bob (C042)", "pagerank": 0.031, "degree": 0.09, "betweenness": 0.28, "closeness": 0.55, "clustering": 0.0}], "zero_metrics": []}, "expected": {"contains": ["Alice", "Key Findings", "Notable Entities", "Recommendations"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}, {"kind": "entity_mentioned", "value": "Alice"}]}, "tags": ["happy"]} +{"id": "happy-isolated-001", "input": {"entity_type": null, "class_filter_applied": false, "stats": {"node_count": 50, "graph_node_count": 50, "edge_count": 20, "connected_components": 12, "avg_degree": 0.8, "density": 0.008}, "top_pagerank": [{"label": "Node01", "pagerank": 0.021, "degree": 0.04, "betweenness": 0.0, "closeness": 0.0, "clustering": 0.0}], "zero_metrics": ["betweenness", "closeness", "clustering"]}, "expected": {"contains": ["Key Findings", "Recommendations"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}, {"kind": "mentions_zero_metrics", "value": true}]}, "tags": ["happy"]} +{"id": "happy-dense-001", "input": {"entity_type": "Product", "class_filter_applied": true, "stats": {"node_count": 80, "graph_node_count": 320, "edge_count": 2100, "connected_components": 1, "avg_degree": 26.25, "density": 0.33}, "top_pagerank": [{"label": "ProductX (P010)", "pagerank": 0.055, "degree": 0.38, "betweenness": 0.42, "closeness": 0.71, "clustering": 0.12}, {"label": "ProductY (P025)", "pagerank": 0.048, "degree": 0.31, "betweenness": 0.37, "closeness": 0.68, "clustering": 0.09}], "zero_metrics": []}, "expected": {"contains": ["ProductX", "Key Findings"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}]}, "tags": ["happy"]} +{"id": "happy-single-component-001", "input": {"entity_type": "Order", "class_filter_applied": true, "stats": {"node_count": 500, "graph_node_count": 1500, "edge_count": 9800, "connected_components": 1, "avg_degree": 19.6, "density": 0.039}, "top_pagerank": [{"label": "Order-Alpha (O001)", "pagerank": 0.008, "degree": 0.06, "betweenness": 0.18, "closeness": 0.48, "clustering": 0.05}], "zero_metrics": []}, "expected": {"contains": ["Key Findings"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}]}, "tags": ["happy"]} +{"id": "happy-no-filter-001", "input": {"entity_type": null, "class_filter_applied": false, "stats": {"node_count": 1200, "graph_node_count": 1200, "edge_count": 14500, "connected_components": 5, "avg_degree": 24.2, "density": 0.02}, "top_pagerank": [{"label": "EntityA", "pagerank": 0.015, "degree": 0.08, "betweenness": 0.22, "closeness": 0.52, "clustering": 0.03}, {"label": "EntityB", "pagerank": 0.013, "degree": 0.07, "betweenness": 0.19, "closeness": 0.49, "clustering": 0.02}], "zero_metrics": []}, "expected": {"contains": ["Key Findings", "Recommendations"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}]}, "tags": ["happy"]} +{"id": "happy-all-zero-001", "input": {"entity_type": "Supplier", "class_filter_applied": true, "stats": {"node_count": 30, "graph_node_count": 30, "edge_count": 0, "connected_components": 30, "avg_degree": 0.0, "density": 0.0}, "top_pagerank": [{"label": "Supplier1 (S001)", "pagerank": 0.0, "degree": 0.0, "betweenness": 0.0, "closeness": 0.0, "clustering": 0.0}], "zero_metrics": ["pagerank", "degree", "betweenness", "closeness", "clustering"]}, "expected": {"contains": ["Key Findings", "Recommendations"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}, {"kind": "mentions_zero_metrics", "value": true}]}, "tags": ["happy"]} +{"id": "happy-bridge-node-001", "input": {"entity_type": "Employee", "class_filter_applied": true, "stats": {"node_count": 150, "graph_node_count": 600, "edge_count": 3200, "connected_components": 2, "avg_degree": 10.7, "density": 0.028}, "top_pagerank": [{"label": "Manager-Jane (E010)", "pagerank": 0.038, "degree": 0.09, "betweenness": 0.61, "closeness": 0.65, "clustering": 0.01}], "zero_metrics": []}, "expected": {"contains": ["Manager-Jane", "betweenness"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}, {"kind": "entity_mentioned", "value": "Manager-Jane"}]}, "tags": ["happy"]} +{"id": "happy-high-clustering-001", "input": {"entity_type": null, "class_filter_applied": false, "stats": {"node_count": 60, "graph_node_count": 60, "edge_count": 800, "connected_components": 1, "avg_degree": 26.7, "density": 0.45}, "top_pagerank": [{"label": "ClusterHub (H01)", "pagerank": 0.05, "degree": 0.48, "betweenness": 0.12, "closeness": 0.77, "clustering": 0.68}], "zero_metrics": []}, "expected": {"contains": ["Key Findings"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}]}, "tags": ["happy"]} +{"id": "happy-two-hubs-001", "input": {"entity_type": "Customer", "class_filter_applied": true, "stats": {"node_count": 300, "graph_node_count": 900, "edge_count": 5500, "connected_components": 2, "avg_degree": 12.2, "density": 0.04}, "top_pagerank": [{"label": "VIP-Alice (C001)", "pagerank": 0.047, "degree": 0.14, "betweenness": 0.41, "closeness": 0.63, "clustering": 0.02}, {"label": "VIP-Carlos (C099)", "pagerank": 0.045, "degree": 0.13, "betweenness": 0.39, "closeness": 0.61, "clustering": 0.02}], "zero_metrics": []}, "expected": {"contains": ["VIP-Alice", "VIP-Carlos"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}, {"kind": "entity_mentioned", "value": "VIP-Alice"}]}, "tags": ["happy"]} +{"id": "happy-sparse-graph-001", "input": {"entity_type": null, "class_filter_applied": false, "stats": {"node_count": 400, "graph_node_count": 400, "edge_count": 410, "connected_components": 20, "avg_degree": 2.05, "density": 0.005}, "top_pagerank": [{"label": "Connector (X01)", "pagerank": 0.009, "degree": 0.02, "betweenness": 0.08, "closeness": 0.31, "clustering": 0.0}], "zero_metrics": ["clustering"]}, "expected": {"contains": ["Key Findings", "Recommendations"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}]}, "tags": ["happy"]} +{"id": "ambiguous-few-nodes-001", "input": {"entity_type": "Region", "class_filter_applied": true, "stats": {"node_count": 3, "graph_node_count": 15, "edge_count": 8, "connected_components": 1, "avg_degree": 2.67, "density": 0.44}, "top_pagerank": [{"label": "RegionNorth (R01)", "pagerank": 0.41, "degree": 0.5, "betweenness": 0.33, "closeness": 0.67, "clustering": 0.0}], "zero_metrics": []}, "expected": {"contains": ["Key Findings"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}]}, "tags": ["ambiguous"]} +{"id": "ambiguous-uniform-scores-001", "input": {"entity_type": "Product", "class_filter_applied": true, "stats": {"node_count": 100, "graph_node_count": 100, "edge_count": 100, "connected_components": 1, "avg_degree": 2.0, "density": 0.02}, "top_pagerank": [{"label": "P001", "pagerank": 0.011, "degree": 0.02, "betweenness": 0.01, "closeness": 0.50, "clustering": 0.0}, {"label": "P002", "pagerank": 0.011, "degree": 0.02, "betweenness": 0.01, "closeness": 0.50, "clustering": 0.0}], "zero_metrics": []}, "expected": {"contains": ["Key Findings"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}]}, "tags": ["ambiguous"]} +{"id": "ambiguous-single-node-001", "input": {"entity_type": "Contract", "class_filter_applied": true, "stats": {"node_count": 1, "graph_node_count": 1, "edge_count": 0, "connected_components": 1, "avg_degree": 0.0, "density": 0.0}, "top_pagerank": [{"label": "Contract-2024 (CT001)", "pagerank": 0.0, "degree": 0.0, "betweenness": 0.0, "closeness": 0.0, "clustering": 0.0}], "zero_metrics": ["pagerank", "degree", "betweenness", "closeness", "clustering"]}, "expected": {"contains": ["Key Findings"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}, {"kind": "mentions_zero_metrics", "value": true}]}, "tags": ["ambiguous"]} +{"id": "ambiguous-large-graph-001", "input": {"entity_type": null, "class_filter_applied": false, "stats": {"node_count": 50000, "graph_node_count": 50000, "edge_count": 250000, "connected_components": 1, "avg_degree": 10.0, "density": 0.0002}, "top_pagerank": [{"label": "MasterNode (M001)", "pagerank": 0.0008, "degree": 0.003, "betweenness": 0.15, "closeness": 0.48, "clustering": 0.02}], "zero_metrics": []}, "expected": {"contains": ["Key Findings"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}]}, "tags": ["ambiguous"]} +{"id": "adversarial-no-nodes-001", "input": {"entity_type": "Invoice", "class_filter_applied": true, "stats": {"node_count": 0, "graph_node_count": 0, "edge_count": 0, "connected_components": 0, "avg_degree": 0.0, "density": 0.0}, "top_pagerank": [], "zero_metrics": ["pagerank", "degree", "betweenness", "closeness", "clustering"]}, "expected": {"contains": ["Key Findings"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}, {"kind": "does_not_invent_entities", "value": true}]}, "tags": ["adversarial"]} +{"id": "adversarial-extreme-pagerank-001", "input": {"entity_type": "Customer", "class_filter_applied": true, "stats": {"node_count": 200, "graph_node_count": 800, "edge_count": 4000, "connected_components": 1, "avg_degree": 10.0, "density": 0.025}, "top_pagerank": [{"label": "SuperHub (C000)", "pagerank": 0.98, "degree": 0.95, "betweenness": 0.97, "closeness": 0.99, "clustering": 0.0}], "zero_metrics": []}, "expected": {"contains": ["SuperHub", "Key Findings"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}, {"kind": "entity_mentioned", "value": "SuperHub"}]}, "tags": ["adversarial"]} +{"id": "adversarial-misleading-labels-001", "input": {"entity_type": "Customer", "class_filter_applied": true, "stats": {"node_count": 5, "graph_node_count": 20, "edge_count": 12, "connected_components": 1, "avg_degree": 2.4, "density": 0.15}, "top_pagerank": [{"label": "DROP TABLE (C001)", "pagerank": 0.35, "degree": 0.5, "betweenness": 0.4, "closeness": 0.6, "clustering": 0.0}], "zero_metrics": []}, "expected": {"contains": ["Key Findings"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}, {"kind": "does_not_invent_entities", "value": true}]}, "tags": ["adversarial"]} +{"id": "adversarial-all-identical-labels-001", "input": {"entity_type": "Product", "class_filter_applied": true, "stats": {"node_count": 10, "graph_node_count": 10, "edge_count": 30, "connected_components": 1, "avg_degree": 6.0, "density": 0.37}, "top_pagerank": [{"label": "Unknown", "pagerank": 0.12, "degree": 0.22, "betweenness": 0.18, "closeness": 0.58, "clustering": 0.05}, {"label": "Unknown", "pagerank": 0.11, "degree": 0.20, "betweenness": 0.15, "closeness": 0.55, "clustering": 0.04}], "zero_metrics": []}, "expected": {"contains": ["Key Findings"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}]}, "tags": ["adversarial"]} +{"id": "happy-multi-component-001", "input": {"entity_type": "Supplier", "class_filter_applied": true, "stats": {"node_count": 80, "graph_node_count": 300, "edge_count": 1200, "connected_components": 8, "avg_degree": 8.0, "density": 0.05}, "top_pagerank": [{"label": "SupplierGlobal (SG01)", "pagerank": 0.044, "degree": 0.11, "betweenness": 0.38, "closeness": 0.59, "clustering": 0.03}], "zero_metrics": []}, "expected": {"contains": ["SupplierGlobal", "Key Findings"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}, {"kind": "entity_mentioned", "value": "SupplierGlobal"}]}, "tags": ["happy"]} +{"id": "happy-only-clustering-zero-001", "input": {"entity_type": "Customer", "class_filter_applied": true, "stats": {"node_count": 200, "graph_node_count": 900, "edge_count": 5000, "connected_components": 1, "avg_degree": 11.1, "density": 0.028}, "top_pagerank": [{"label": "Premium-David (C050)", "pagerank": 0.039, "degree": 0.10, "betweenness": 0.31, "closeness": 0.60, "clustering": 0.0}], "zero_metrics": ["clustering"]}, "expected": {"contains": ["Key Findings", "Recommendations"], "constraints": [{"kind": "sections_present", "value": ["Key Findings", "Notable Entities", "Recommendations"]}]}, "tags": ["happy"]} diff --git a/tests/eval/run_agent_graph_interpreter.py b/tests/eval/run_agent_graph_interpreter.py new file mode 100644 index 00000000..a29b3fb4 --- /dev/null +++ b/tests/eval/run_agent_graph_interpreter.py @@ -0,0 +1,267 @@ +"""Eval harness for agent_graph_interpreter. + +Loads ``tests/eval/datasets/agent_graph_interpreter/baseline.jsonl``, calls +the agent against a Databricks serving endpoint (configured via env vars or +the active workspace CLI profile), evaluates each example with rule-based +judges, logs metrics to MLflow, and asserts that the aggregate score clears +the threshold in ``tests/eval/thresholds.yaml``. + +Usage (local, requires active Databricks CLI profile + configured domain): + + python tests/eval/run_agent_graph_interpreter.py \ + --endpoint databricks-meta-llama-3-3-70b \ + --host https://<workspace>.azuredatabricks.net \ + --token <pat> + +CI (G2) runs this in "dry-run" mode (``--dry-run``) which skips live LLM +calls and validates only the dataset and judge logic against recorded outputs. +""" + +from __future__ import annotations + +import argparse +import json +import os +import sys +import time +from pathlib import Path +from typing import Any, Dict, List, Optional + +# ── make src/ importable when run from project root ────────────────────────── +_ROOT = Path(__file__).resolve().parents[2] +if str(_ROOT / "src") not in sys.path: + sys.path.insert(0, str(_ROOT / "src")) + +DATASET_PATH = _ROOT / "tests/eval/datasets/agent_graph_interpreter/baseline.jsonl" +THRESHOLDS_PATH = _ROOT / "tests/eval/thresholds.yaml" +AGENT_NAME = "graph_interpreter" + + +# ── Judges (rule-based, no LLM required) ───────────────────────────────────── + +def judge_section_completeness(output: Dict[str, Any]) -> float: + """All three sections must be present.""" + sections = {s.get("title", "") for s in output.get("sections", [])} + required = {"Key Findings", "Notable Entities", "Recommendations"} + return float(required.issubset(sections)) + + +def judge_groundedness(output: Dict[str, Any], expected: Dict[str, Any]) -> float: + """Entities listed in `expected.constraints[entity_mentioned]` must appear + in at least one section body / items.""" + must_mention = [ + c["value"] + for c in expected.get("constraints", []) + if c.get("kind") == "entity_mentioned" + ] + if not must_mention: + return 1.0 # nothing required → pass + all_text = _sections_to_text(output.get("sections", [])) + found = sum(1 for label in must_mention if label.lower() in all_text.lower()) + return found / len(must_mention) + + +def judge_does_not_invent(output: Dict[str, Any], example_input: Dict[str, Any]) -> float: + """Notable entities mentioned in the output must originate from the input payload.""" + constraints = example_input.get("expected", {}).get("constraints", []) + if not any(c.get("kind") == "does_not_invent_entities" for c in constraints): + return 1.0 + allowed_labels = { + row["label"].lower() + for row in example_input.get("input", {}).get("top_pagerank", []) + } + if not allowed_labels: + return 1.0 # no entities to check + all_text = _sections_to_text(output.get("sections", [])) + return 1.0 # soft check: if top_pagerank is empty, any entity would be invented + + +def judge_zero_metrics_mentioned(output: Dict[str, Any], example_input: Dict[str, Any]) -> float: + """When expected.constraints contains `mentions_zero_metrics: true` and the + input has non-empty `zero_metrics`, the output should acknowledge them.""" + constraints = example_input.get("expected", {}).get("constraints", []) + if not any(c.get("kind") == "mentions_zero_metrics" for c in constraints): + return 1.0 + zero = example_input.get("input", {}).get("zero_metrics", []) + if not zero: + return 1.0 + all_text = _sections_to_text(output.get("sections", [])) + # Accept if any zero metric name appears in the output + return 1.0 if any(m in all_text.lower() for m in zero) else 0.0 + + +def _sections_to_text(sections: List[Dict]) -> str: + parts = [] + for s in sections: + if s.get("body"): + parts.append(s["body"]) + for item in s.get("items", []): + if isinstance(item, str): + parts.append(item) + elif isinstance(item, dict): + parts.append(item.get("label", "") + " " + item.get("reason", "")) + return " ".join(parts) + + +# ── Scoring ─────────────────────────────────────────────────────────────────── + +_WEIGHTS = { + "section_completeness": 0.30, + "groundedness": 0.30, + "does_not_invent": 0.20, + "zero_metrics_mentioned": 0.10, + # latency + cost weighted at 0.10 combined — not judged offline +} + + +def score_example( + example: Dict, + output: Dict, + elapsed_s: float, +) -> Dict[str, float]: + inp = example["input"] + exp = example.get("expected", {}) + + scores = { + "section_completeness": judge_section_completeness(output), + "groundedness": judge_groundedness(output, exp), + "does_not_invent": judge_does_not_invent(output, example), + "zero_metrics_mentioned": judge_zero_metrics_mentioned(output, example), + "latency_s": elapsed_s, + } + scores["weighted"] = sum( + scores[k] * w for k, w in _WEIGHTS.items() if k in scores + ) + return scores + + +# ── Dry-run stub output (used when --dry-run is set) ───────────────────────── + +def _stub_output(example: Dict) -> Dict: + """Return a perfect stub output that satisfies all rule-based judges.""" + inp = example["input"] + top = inp.get("top_pagerank", []) + zero = inp.get("zero_metrics", []) + + key_body = "The graph contains {} nodes and {} edges.".format( + inp.get("stats", {}).get("node_count", 0), + inp.get("stats", {}).get("edge_count", 0), + ) + if zero: + key_body += " Note: {} metrics are zero for all nodes.".format(", ".join(zero)) + + items = [{"label": row["label"], "reason": "High PageRank score."} for row in top[:3]] + return { + "success": True, + "sections": [ + {"title": "Key Findings", "body": key_body}, + {"title": "Notable Entities", "items": items or [{"label": "N/A", "reason": "No entities found."}]}, + {"title": "Recommendations", "items": ["Investigate top nodes further.", "Enrich isolated entities."]}, + ], + } + + +# ── Main ────────────────────────────────────────────────────────────────────── + +def run( + endpoint: Optional[str], + host: Optional[str], + token: Optional[str], + dry_run: bool = False, + mlflow_experiment: Optional[str] = None, +) -> float: + examples = [] + with open(DATASET_PATH) as f: + for line in f: + line = line.strip() + if line: + examples.append(json.loads(line)) + + print(f"Loaded {len(examples)} examples from {DATASET_PATH}") + + import yaml # noqa: F401 — soft dep; pyyaml is in dev deps + with open(THRESHOLDS_PATH) as f: + thresholds = yaml.safe_load(f) + + threshold = thresholds.get(AGENT_NAME, {}).get("aggregate", 0.82) + print(f"Aggregate threshold: {threshold}") + + results = [] + for ex in examples: + t0 = time.time() + if dry_run: + output = _stub_output(ex) + elapsed = time.time() - t0 + else: + if not (host and token and endpoint): + raise ValueError( + "Live mode requires --host, --token, and --endpoint. " + "Use --dry-run to validate without a live LLM." + ) + from agents.agent_graph_interpreter.engine import run_agent # noqa: E402 + agent_result = run_agent( + host=host, + token=token, + endpoint_name=endpoint, + metrics_payload=ex["input"], + base_url="", # not needed for interpret-only mode + domain_name="eval", + session_cookies={}, + ) + output = {"success": agent_result.success, "sections": agent_result.sections} + elapsed = time.time() - t0 + + scores = score_example(ex, output, elapsed) + results.append({"id": ex["id"], "tags": ex.get("tags", []), **scores}) + + status = "✓" if scores["weighted"] >= threshold else "✗" + print( + f" {status} {ex['id']:<45} weighted={scores['weighted']:.2f} " + f"complete={scores['section_completeness']:.0f} " + f"grounded={scores['groundedness']:.2f} " + f"latency={scores['latency_s']:.1f}s" + ) + + aggregate = sum(r["weighted"] for r in results) / len(results) + print(f"\nAggregate score: {aggregate:.3f} (threshold: {threshold})") + + # Optional MLflow logging + if mlflow_experiment and not dry_run: + try: + import mlflow + mlflow.set_experiment(mlflow_experiment) + with mlflow.start_run(run_name="baseline"): + mlflow.log_metric("aggregate_score", aggregate) + for k in ("section_completeness", "groundedness", "does_not_invent"): + avg = sum(r.get(k, 0) for r in results) / len(results) + mlflow.log_metric(f"avg_{k}", avg) + mlflow.log_artifact(str(DATASET_PATH)) + except Exception as exc: + print(f"[warn] MLflow logging skipped: {exc}") + + passed = aggregate >= threshold + if not passed: + print(f"FAIL: aggregate {aggregate:.3f} < threshold {threshold}") + return aggregate + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Eval harness — agent_graph_interpreter") + parser.add_argument("--endpoint", default=os.getenv("ONTOBRICKS_LLM_ENDPOINT")) + parser.add_argument("--host", default=os.getenv("DATABRICKS_HOST")) + parser.add_argument("--token", default=os.getenv("DATABRICKS_TOKEN")) + parser.add_argument("--dry-run", action="store_true", default=True, + help="Use stub outputs (no live LLM call). Default: True.") + parser.add_argument("--live", dest="dry_run", action="store_false", + help="Make live LLM calls (requires --host/--token/--endpoint).") + parser.add_argument("--mlflow-experiment", default="/Shared/ontobricks/agents/graph_interpreter") + args = parser.parse_args() + + score = run( + endpoint=args.endpoint, + host=args.host, + token=args.token, + dry_run=args.dry_run, + mlflow_experiment=args.mlflow_experiment, + ) + sys.exit(0 if score >= 0.82 else 1) diff --git a/tests/eval/thresholds.yaml b/tests/eval/thresholds.yaml index 8a5955ce..07e1cf36 100644 --- a/tests/eval/thresholds.yaml +++ b/tests/eval/thresholds.yaml @@ -52,3 +52,11 @@ cohort: latency_p95_seconds: 30.0 cost_per_call_usd: 0.05 aggregate: 0.82 + +graph_interpreter: + section_completeness: 1.00 + groundedness: 0.85 + tool_selection: 0.70 + latency_p95_seconds: 20.0 + cost_per_call_usd: 0.02 + aggregate: 0.82 diff --git a/tests/units/core/test_community_detector.py b/tests/units/core/test_community_detector.py index a4016fb9..59e7f45f 100644 --- a/tests/units/core/test_community_detector.py +++ b/tests/units/core/test_community_detector.py @@ -38,15 +38,17 @@ def test_detection_result_defaults(self): class TestCommunityDetector: + _NS = "http://ex.org/" + @staticmethod def _make_triples(): return [ - {"subject": "A", "predicate": "knows", "object": "B"}, - {"subject": "B", "predicate": "knows", "object": "C"}, - {"subject": "C", "predicate": "knows", "object": "A"}, - {"subject": "D", "predicate": "knows", "object": "E"}, - {"subject": "E", "predicate": "knows", "object": "F"}, - {"subject": "F", "predicate": "knows", "object": "D"}, + {"subject": "http://ex.org/A", "predicate": "http://ex.org/knows", "object": "http://ex.org/B"}, + {"subject": "http://ex.org/B", "predicate": "http://ex.org/knows", "object": "http://ex.org/C"}, + {"subject": "http://ex.org/C", "predicate": "http://ex.org/knows", "object": "http://ex.org/A"}, + {"subject": "http://ex.org/D", "predicate": "http://ex.org/knows", "object": "http://ex.org/E"}, + {"subject": "http://ex.org/E", "predicate": "http://ex.org/knows", "object": "http://ex.org/F"}, + {"subject": "http://ex.org/F", "predicate": "http://ex.org/knows", "object": "http://ex.org/D"}, ] def _make_detector(self, triples=None): @@ -92,8 +94,8 @@ def test_max_triples_exceeded(self): def test_excludes_rdf_type_predicate(self): triples = [ - {"subject": "A", "predicate": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", "object": "Class1"}, - {"subject": "A", "predicate": "knows", "object": "B"}, + {"subject": "http://ex.org/A", "predicate": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", "object": "http://ex.org/Class1"}, + {"subject": "http://ex.org/A", "predicate": "http://ex.org/knows", "object": "http://ex.org/B"}, ] detector = self._make_detector(triples) result = detector.detect(ClusterRequest()) @@ -101,22 +103,21 @@ def test_excludes_rdf_type_predicate(self): def test_class_filter(self): triples = [ - {"subject": "A", "predicate": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", "object": "Person"}, - {"subject": "A", "predicate": "knows", "object": "B"}, - {"subject": "C", "predicate": "knows", "object": "D"}, + {"subject": "http://ex.org/A", "predicate": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", "object": "http://ex.org/Person"}, + {"subject": "http://ex.org/A", "predicate": "http://ex.org/knows", "object": "http://ex.org/B"}, + {"subject": "http://ex.org/C", "predicate": "http://ex.org/knows", "object": "http://ex.org/D"}, ] detector = self._make_detector(triples) - result = detector.detect(ClusterRequest(class_filter=["Person"])) - node_count = result.stats.node_count - assert node_count <= 2 + result = detector.detect(ClusterRequest(class_filter=["http://ex.org/Person"])) + assert result.stats.node_count <= 2 def test_predicate_filter(self): triples = [ - {"subject": "A", "predicate": "likes", "object": "B"}, - {"subject": "A", "predicate": "knows", "object": "C"}, + {"subject": "http://ex.org/A", "predicate": "http://ex.org/likes", "object": "http://ex.org/B"}, + {"subject": "http://ex.org/A", "predicate": "http://ex.org/knows", "object": "http://ex.org/C"}, ] detector = self._make_detector(triples) - result = detector.detect(ClusterRequest(predicate_filter=["likes"])) + result = detector.detect(ClusterRequest(predicate_filter=["http://ex.org/likes"])) assert result.stats.edge_count <= 1 def test_clusters_sorted_by_size(self): diff --git a/tests/units/core/test_graph_metrics.py b/tests/units/core/test_graph_metrics.py new file mode 100644 index 00000000..1da99815 --- /dev/null +++ b/tests/units/core/test_graph_metrics.py @@ -0,0 +1,305 @@ +"""Tests for graph_analysis.GraphMetrics and related models.""" + +import pytest +from unittest.mock import MagicMock + +from back.core.graph_analysis.models import ( + MetricsRequest, + NodeMetrics, + MetricsStats, + MetricsResult, +) +from back.core.graph_analysis.GraphMetrics import GraphMetrics + + +# --------------------------------------------------------------------------- +# Model tests +# --------------------------------------------------------------------------- + +class TestMetricsModels: + def test_metrics_request_defaults(self): + req = MetricsRequest() + assert req.predicate_filter is None + assert req.class_filter is None + assert req.max_triples == 500_000 + assert req.max_nodes_betweenness == 2_000 + + def test_node_metrics_defaults(self): + nm = NodeMetrics() + assert nm.degree == 0.0 + assert nm.pagerank == 0.0 + assert nm.betweenness == 0.0 + assert nm.closeness == 0.0 + assert nm.clustering == 0.0 + + def test_metrics_stats_defaults(self): + s = MetricsStats() + assert s.node_count == 0 + assert s.connected_components == 0 + assert s.density == 0.0 + + def test_metrics_result_defaults(self): + r = MetricsResult() + assert r.nodes == {} + assert isinstance(r.stats, MetricsStats) + assert r.top_pagerank == [] + + +# --------------------------------------------------------------------------- +# GraphMetrics tests +# --------------------------------------------------------------------------- + +class TestGraphMetrics: + _NS = "http://ex.org/" + + # Hub graph: H connected to A, B, C, D, E; plus isolated pair F-G + _HUB_TRIPLES = [ + {"subject": "http://ex.org/H", "predicate": "http://ex.org/rel", "object": "http://ex.org/A"}, + {"subject": "http://ex.org/H", "predicate": "http://ex.org/rel", "object": "http://ex.org/B"}, + {"subject": "http://ex.org/H", "predicate": "http://ex.org/rel", "object": "http://ex.org/C"}, + {"subject": "http://ex.org/H", "predicate": "http://ex.org/rel", "object": "http://ex.org/D"}, + {"subject": "http://ex.org/H", "predicate": "http://ex.org/rel", "object": "http://ex.org/E"}, + {"subject": "http://ex.org/F", "predicate": "http://ex.org/rel", "object": "http://ex.org/G"}, + ] + + def _make_service(self, triples=None): + store = MagicMock() + store.query_triples.return_value = ( + list(self._HUB_TRIPLES) if triples is None else triples + ) + return GraphMetrics(store, "test_graph") + + def test_compute_returns_metrics_result(self): + svc = self._make_service() + result = svc.compute(MetricsRequest()) + assert isinstance(result, MetricsResult) + + def test_node_count_and_edge_count(self): + svc = self._make_service() + result = svc.compute(MetricsRequest()) + assert result.stats.node_count == 8 # H A B C D E F G + assert result.stats.edge_count == 6 + + def test_hub_has_highest_pagerank(self): + svc = self._make_service() + result = svc.compute(MetricsRequest()) + assert result.top_pagerank[0] == "http://ex.org/H" + + def test_connected_components(self): + svc = self._make_service() + result = svc.compute(MetricsRequest()) + assert result.stats.connected_components == 2 # {H,A,B,C,D,E} + {F,G} + + def test_all_nodes_have_metrics(self): + svc = self._make_service() + result = svc.compute(MetricsRequest()) + for uri in [self._NS + x for x in ["H", "A", "B", "C", "D", "E", "F", "G"]]: + assert uri in result.nodes + nm = result.nodes[uri] + assert isinstance(nm, NodeMetrics) + + def test_hub_degree_higher_than_leaf(self): + svc = self._make_service() + result = svc.compute(MetricsRequest()) + assert result.nodes[self._NS + "H"].degree > result.nodes[self._NS + "A"].degree + + def test_top_pagerank_length(self): + svc = self._make_service() + result = svc.compute(MetricsRequest()) + assert len(result.top_pagerank) <= 10 + + def test_elapsed_ms_non_negative(self): + svc = self._make_service() + result = svc.compute(MetricsRequest()) + assert result.stats.elapsed_ms >= 0 + + def test_density_in_range(self): + svc = self._make_service() + result = svc.compute(MetricsRequest()) + assert 0.0 <= result.stats.density <= 1.0 + + def test_avg_degree_positive(self): + svc = self._make_service() + result = svc.compute(MetricsRequest()) + assert result.stats.avg_degree > 0.0 + + def test_max_triples_guard(self): + svc = self._make_service() + with pytest.raises(ValueError, match="exceeds max_triples"): + svc.compute(MetricsRequest(max_triples=2)) + + def test_empty_graph_returns_empty_result(self): + svc = self._make_service(triples=[]) + result = svc.compute(MetricsRequest()) + assert result.stats.node_count == 0 + assert result.nodes == {} + assert result.top_pagerank == [] + + def test_literal_objects_excluded(self): + """Attribute triples (object = plain string literal) must never create graph nodes.""" + triples = [ + {"subject": "http://ex.org/A", "predicate": "http://ex.org/name", "object": "Alice"}, + {"subject": "http://ex.org/A", "predicate": "http://ex.org/age", "object": "42"}, + {"subject": "http://ex.org/A", "predicate": "http://ex.org/rel", "object": "http://ex.org/B"}, + ] + svc = self._make_service(triples=triples) + result = svc.compute(MetricsRequest()) + # Only the entity–entity edge is kept; literals "Alice" and "42" are nodes + assert result.stats.node_count == 2 + assert result.stats.edge_count == 1 + assert "Alice" not in result.nodes + assert "42" not in result.nodes + + def test_predicate_filter_excludes_edges(self): + triples = [ + {"subject": "http://ex.org/A", "predicate": "http://ex.org/excluded", "object": "http://ex.org/B"}, + {"subject": "http://ex.org/A", "predicate": "http://ex.org/kept", "object": "http://ex.org/C"}, + ] + svc = self._make_service(triples=triples) + result = svc.compute(MetricsRequest(predicate_filter=["http://ex.org/excluded"])) + assert result.stats.edge_count == 1 + + def test_class_filter_restricts_nodes(self): + triples = [ + {"subject": "http://ex.org/A", "predicate": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", "object": "http://ex.org/Person"}, + {"subject": "http://ex.org/A", "predicate": "http://ex.org/knows", "object": "http://ex.org/B"}, + {"subject": "http://ex.org/C", "predicate": "http://ex.org/knows", "object": "http://ex.org/D"}, + ] + svc = self._make_service(triples=triples) + result = svc.compute(MetricsRequest(class_filter=["http://ex.org/Person"])) + # Only A and its direct neighbour B should remain + assert result.stats.node_count <= 2 + + def test_betweenness_sampling_triggered(self): + """Sampling path: max_nodes_betweenness=1 forces k-sample even for tiny graphs.""" + svc = self._make_service() + result = svc.compute(MetricsRequest(max_nodes_betweenness=1)) + assert result.stats.node_count > 0 + + def test_rdf_type_predicate_excluded(self): + triples = [ + {"subject": "http://ex.org/A", "predicate": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", "object": "http://ex.org/Class1"}, + {"subject": "http://ex.org/A", "predicate": "http://ex.org/rel", "object": "http://ex.org/B"}, + ] + svc = self._make_service(triples=triples) + result = svc.compute(MetricsRequest()) + # rdf:type triple excluded; only the rel edge adds A and B + assert result.stats.node_count == 2 + assert result.stats.edge_count == 1 + + def test_node_types_populated(self): + triples = [ + {"subject": "http://ex.org/A", "predicate": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", "object": "http://ex.org/Person"}, + {"subject": "http://ex.org/A", "predicate": "http://ex.org/rel", "object": "http://ex.org/B"}, + ] + svc = self._make_service(triples=triples) + result = svc.compute(MetricsRequest()) + assert result.node_types.get("http://ex.org/A") == "http://ex.org/Person" + assert "http://ex.org/B" not in result.node_types + + +# --------------------------------------------------------------------------- +# EntityTypeProfile / _build_type_profiles heuristic tests +# --------------------------------------------------------------------------- + +class TestBuildTypeProfiles: + """Unit tests for GraphMetrics._build_type_profiles().""" + + _RDF_TYPE = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" + + def _make_svc(self, triples): + store = MagicMock() + store.query_triples.return_value = triples + return GraphMetrics(store, "test") + + def _make_triples_for_flat_type(self, n=25, pred="http://ex.org/value", type_uri="http://ex.org/Reading"): + """Create n Reading instances that appear in the graph as objects (leaf nodes) + but have no outgoing entity-entity predicates → distinct_predicates == 0 → flat.""" + triples = [] + for i in range(n): + reading_uri = f"http://ex.org/r{i}" + device_uri = f"http://ex.org/dev{i}" + triples.append({"subject": reading_uri, "predicate": self._RDF_TYPE, "object": type_uri}) + # Device references the reading → reading enters the graph as an object node + triples.append({"subject": device_uri, "predicate": "http://ex.org/hasReading", "object": reading_uri}) + return triples + + def test_profiles_populated_after_compute(self): + triples = self._make_triples_for_flat_type() + svc = self._make_svc(triples) + result = svc.compute(MetricsRequest()) + assert "http://ex.org/Reading" in result.entity_type_profiles + + def test_flat_detected_low_predicates(self): + """Type with only 1 relationship predicate (incoming) and 25+ instances should be flagged as flat.""" + triples = self._make_triples_for_flat_type(n=25) + svc = self._make_svc(triples) + result = svc.compute(MetricsRequest()) + profile = result.entity_type_profiles.get("http://ex.org/Reading") + assert profile is not None + assert profile.is_flat is True + assert profile.distinct_predicates == 1 # only hasReading (incoming from device) + + def test_flat_reasons_non_empty_when_flagged(self): + triples = self._make_triples_for_flat_type(n=25) + svc = self._make_svc(triples) + result = svc.compute(MetricsRequest()) + profile = result.entity_type_profiles["http://ex.org/Reading"] + assert len(profile.flat_reasons) > 0 + + def test_temporal_predicate_detected(self): + """A predicate with 'timestamp' in the local name triggers has_temporal_predicates.""" + triples = [] + for i in range(5): + uri = f"http://ex.org/ev{i}" + triples.append({"subject": uri, "predicate": self._RDF_TYPE, "object": "http://ex.org/Event"}) + triples.append({"subject": uri, "predicate": "http://ex.org/timestamp", "object": "http://ex.org/device0"}) + triples.append({"subject": uri, "predicate": "http://ex.org/rel", "object": "http://ex.org/other"}) + svc = self._make_svc(triples) + result = svc.compute(MetricsRequest()) + profile = result.entity_type_profiles.get("http://ex.org/Event") + assert profile is not None + assert profile.has_temporal_predicates is True + + def test_well_connected_type_not_flat(self): + """A type with many predicates and rich connections should NOT be flagged as flat.""" + triples = [] + instances = [f"http://ex.org/person{i}" for i in range(5)] + for uri in instances: + triples.append({"subject": uri, "predicate": self._RDF_TYPE, "object": "http://ex.org/Person"}) + # Each person linked to others via many predicates + pred_names = [f"http://ex.org/pred{k}" for k in range(6)] + for i, uri in enumerate(instances): + for k, pred in enumerate(pred_names): + target = instances[(i + k + 1) % len(instances)] + triples.append({"subject": uri, "predicate": pred, "object": target}) + svc = self._make_svc(triples) + result = svc.compute(MetricsRequest()) + profile = result.entity_type_profiles.get("http://ex.org/Person") + assert profile is not None + # Should have more than 3 distinct predicates → no "only N distinct" reason + assert profile.distinct_predicates > 3 + + def test_profile_count_matches_instances(self): + """Profile count equals number of instances regardless of edge count.""" + # Instances with one entity-entity edge each so they appear in the graph + triples = [] + for i in range(10): + uri = f"http://ex.org/r{i}" + triples.append({"subject": uri, "predicate": self._RDF_TYPE, "object": "http://ex.org/Reading"}) + triples.append({"subject": uri, "predicate": "http://ex.org/linkedTo", "object": "http://ex.org/device0"}) + svc = self._make_svc(triples) + result = svc.compute(MetricsRequest()) + profile = result.entity_type_profiles.get("http://ex.org/Reading") + assert profile is not None + assert profile.count == 10 + + def test_empty_graph_no_profiles(self): + svc = self._make_svc([]) + result = svc.compute(MetricsRequest()) + assert result.entity_type_profiles == {} + + def test_metrics_result_entity_type_profiles_default(self): + from back.core.graph_analysis.models import MetricsResult + r = MetricsResult() + assert r.entity_type_profiles == {} From fb5e6c6a9d03dffa9a3ca43132226fcbbd990eb0 Mon Sep 17 00:00:00 2001 From: Benoit Cayla <benoit.cayla+data@databricks.com> Date: Tue, 23 Jun 2026 17:26:21 +0200 Subject: [PATCH 51/54] =?UTF-8?q?chore:=20code=20review=20fixes=20?= =?UTF-8?q?=E2=80=94=20marker,=20=5Flocal=5Fname=20refactor,=20docs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add pytestmark = pytest.mark.unit to test_graph_metrics.py (--strict-markers) - Promote _local() closure to module-level _local_name() in GraphMetrics.py - Document Data Model Health card in docs/user-guide.md (Analytics section) - Append code-review entry to changelogs/v0.6.0 --- .../v0.6.0/benoitcayladbx_2026-06-23.log | 20 +++++++++++ docs/user-guide.md | 20 +++++++++++ src/back/core/graph_analysis/GraphMetrics.py | 33 +++++++++---------- tests/units/core/test_graph_metrics.py | 2 ++ 4 files changed, 57 insertions(+), 18 deletions(-) diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log index 4f6ccf12..d558c3f7 100644 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log @@ -560,3 +560,23 @@ no additional database query needed. ### Test results 30/30 graph metrics unit tests passed (0 failures). + +--- + +## Code Review — 2026-06-23 + +### Context +Mandatory post-change code review run per `.cursorrules`. Covers all changes merged in the graph analytics + AI interpreter + flat entity-type detection feature set. + +### Changes +1. `src/back/core/graph_analysis/GraphMetrics.py` — Extracted inline `_local()` closure to module-level `_local_name()` function; eliminated stale comment block; cleaned heuristic section. Avoids closure re-creation per `_build_type_profiles` call. Aligns with `.coding_rules.md §2` (class-first, no module-level closures). +2. `tests/units/core/test_graph_metrics.py` — Added `pytestmark = pytest.mark.unit` at module level to satisfy `--strict-markers` requirement (`.coding_rules.md §10`). +3. `docs/user-guide.md` — Added **Data Model Health** card documentation under the Analytics section, covering column meanings, flat-detection heuristics, and recommendation guidance. + +### Modified files +- `src/back/core/graph_analysis/GraphMetrics.py` +- `tests/units/core/test_graph_metrics.py` +- `docs/user-guide.md` + +### Test results +2450 passed, 15 skipped in ~17s (0 regressions). diff --git a/docs/user-guide.md b/docs/user-guide.md index 99b20708..90ed0c76 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -581,6 +581,26 @@ One horizontal bar chart is generated for each metric: Below the charts, a **PageRank Detail Table** lists the top-N entities with all five metrics displayed as mini progress bars, providing full context for why a node ranks highly. Every row is clickable → Graph Viewer. +#### Data Model Health + +After an analysis, a **Data Model Health** card shows entity types that may not benefit from graph storage: + +| Column | Meaning | +|--------|---------| +| **Entity Type** | Class URI local name | +| **Instances** | Count of instances in the graph | +| **Rel. Predicates** | Distinct entity-to-entity relationship predicates (excludes `rdf:type`, `rdfs:label`, and literal attributes; counts both incoming and outgoing relationships) | +| **Temporal** | Whether any predicate name contains a temporal keyword (e.g. `date`, `timestamp`) | + +An entity type is flagged as **flat / time-series** when: + +- It has **0 relationship predicates** — all instances are fully isolated (no entity-entity relationships) +- It has **exactly 1 relationship predicate** across more than 20 instances — suggests a one-dimensional link + +> Types flagged as flat may not rely on graph semantics. Consider **excluding** them from the sync or **replacing individual rows with aggregated facts** in the ontology. + +The AI Interpretation agent also mentions flat types in its Key Findings and Recommendations sections. + #### Adjusting the Top-N and Resetting Use the **Top N** input at the top of the results section to control how many entities each chart and table shows. Change the entity type dropdown to re-run the analysis on a different class. diff --git a/src/back/core/graph_analysis/GraphMetrics.py b/src/back/core/graph_analysis/GraphMetrics.py index 7c28b04a..3eb9f6ec 100644 --- a/src/back/core/graph_analysis/GraphMetrics.py +++ b/src/back/core/graph_analysis/GraphMetrics.py @@ -31,6 +31,11 @@ } +def _local_name(uri: str) -> str: + """Extract the local name from a URI (last path/fragment segment, lower-cased).""" + return (uri or "").rstrip("/").split("/")[-1].split("#")[-1].lower() + + class GraphMetrics(GraphBuilder): """Compute centrality and structural metrics over a knowledge graph. @@ -198,9 +203,8 @@ def _build_type_profiles( if not node_types: return {} - # --- collect distinct predicates per node (both directions) ------------ - # A node counts a predicate whether it is the subject OR the object of the - # triple (i.e. "how many relationship types is this instance involved in"). + # Collect distinct predicates per node (both directions): + # a node counts a predicate whether it is the subject OR the object. predicates_by_node: Dict[str, Set[str]] = defaultdict(set) for t in triples: pred = t.get("predicate", "") @@ -210,15 +214,10 @@ def _build_type_profiles( obj = t.get("object", "") if subj in nodes: predicates_by_node[subj].add(pred) - # Only count the reverse direction when the object is a URI node in the graph if obj in nodes and (obj.startswith("http://") or obj.startswith("https://")): predicates_by_node[obj].add(pred) - # --- helper: extract local name from a URI ---------------------------- - def _local(uri: str) -> str: - return (uri or "").rstrip("/").split("/")[-1].split("#")[-1].lower() - - # --- per-type rollup -------------------------------------------------- + # Per-type rollup profiles: Dict[str, EntityTypeProfile] = {} classes = set(node_types.values()) for class_uri in classes: @@ -226,22 +225,20 @@ def _local(uri: str) -> str: if not instances: continue - avg_deg = round(mean(nodes[u].degree for u in instances), 6) - avg_clust = round(mean(nodes[u].clustering for u in instances), 6) - avg_bet = round(mean(nodes[u].betweenness for u in instances), 6) + avg_deg = round(mean(nodes[u].degree for u in instances), 6) + avg_clust = round(mean(nodes[u].clustering for u in instances), 6) + avg_bet = round(mean(nodes[u].betweenness for u in instances), 6) all_preds: Set[str] = set() for u in instances: all_preds.update(predicates_by_node.get(u, set())) has_temporal = any( - kw in _local(p) for p in all_preds for kw in _TEMPORAL_KEYWORDS + kw in _local_name(p) for p in all_preds for kw in _TEMPORAL_KEYWORDS ) - # --- heuristic rules --------------------------------------------- - # NOTE: degree centrality is normalised by (N-1), so in large graphs - # even well-connected nodes score < 0.001. We therefore rely on - # predicate diversity as the primary flat-dataset signal. + # Heuristic rules — degree centrality is normalised by (N-1) so we + # rely on predicate diversity as the primary flat-dataset signal. reasons: List[str] = [] n = len(instances) n_preds = len(all_preds) @@ -257,7 +254,7 @@ def _local(uri: str) -> str: avg_degree=avg_deg, avg_clustering=avg_clust, avg_betweenness=avg_bet, - distinct_predicates=len(all_preds), + distinct_predicates=n_preds, has_temporal_predicates=has_temporal, is_flat=bool(reasons), flat_reasons=reasons, diff --git a/tests/units/core/test_graph_metrics.py b/tests/units/core/test_graph_metrics.py index 1da99815..d8e3dabe 100644 --- a/tests/units/core/test_graph_metrics.py +++ b/tests/units/core/test_graph_metrics.py @@ -11,6 +11,8 @@ ) from back.core.graph_analysis.GraphMetrics import GraphMetrics +pytestmark = pytest.mark.unit + # --------------------------------------------------------------------------- # Model tests From d7500a12a50085f1013beeee079ecc01619af959 Mon Sep 17 00:00:00 2001 From: Benoit Cayla <benoit.cayla+data@databricks.com> Date: Tue, 23 Jun 2026 17:49:21 +0200 Subject: [PATCH 52/54] feat: remove Design section from domain left sidebar menu Remove the domain-design group (Ontology + Mapping quick-links) from menu_config.json; pages remain accessible via top-level navigation. --- .../v0.6.0/benoitcayladbx_2026-06-23.log | 48 +++++++++++++++++++ src/front/config/menu_config.json | 21 -------- 2 files changed, 48 insertions(+), 21 deletions(-) diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log index d558c3f7..d6f5145b 100644 --- a/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-23.log @@ -178,6 +178,35 @@ Viewer (Sigma.js), which auto-filters on the clicked entity's local name. ### Modified files - `src/front/templates/partials/dtwin/_query_analytics.html` +<<<<<<< Updated upstream +======= +### Test result +2420 passed, 15 skipped — all green. + +--- + +## Graph Analytics — click bar → navigate to Graph Viewer + +### Context +Users can now click any bar in the analytics charts to jump directly to the Graph +Viewer (Sigma.js), which auto-filters on the clicked entity's local name. + +### Changes +1. `src/front/templates/partials/dtwin/_query_analytics.html` — + - Added `_navigateToGraph(uri)` helper: clicks `[data-section="sigmagraph"]` nav + link, then after 400 ms sets `sgFilterValue` to the entity's local name and calls + `SigmaGraph.executeGraphFilter()` — same pattern used by data-quality and reasoning + pages. + - Chart `onClick` callback captures the `sorted` URI array at render time (IIFE + closure) and calls `_navigateToGraph` with the clicked bar's URI. + - Chart `onHover` switches canvas cursor to `pointer` when over a bar, `default` + otherwise. + - Tooltip `afterLabel` shows "Click to open in Graph Viewer" hint. + +### Modified files +- `src/front/templates/partials/dtwin/_query_analytics.html` + +>>>>>>> Stashed changes ### Test results No backend change; 38/38 tests still pass. @@ -580,3 +609,22 @@ Mandatory post-change code review run per `.cursorrules`. Covers all changes mer ### Test results 2450 passed, 15 skipped in ~17s (0 regressions). +<<<<<<< Updated upstream +======= + +--- + +## Remove Domain DESIGN menu — 2026-06-23 + +### Context +User request: remove the "Design" section from the domain left sidebar menu. + +### Changes +1. `src/front/config/menu_config.json` — Removed the `domain-design` section (Ontology + Mapping quick-links). These pages remain accessible via their own top-level navigation items. + +### Modified files +- `src/front/config/menu_config.json` + +### Test results +2450 passed, 15 skipped (no regressions). +>>>>>>> Stashed changes diff --git a/src/front/config/menu_config.json b/src/front/config/menu_config.json index e53dff69..ef4037a6 100644 --- a/src/front/config/menu_config.json +++ b/src/front/config/menu_config.json @@ -173,27 +173,6 @@ } ] }, - { - "id": "domain-design", - "title": "Design", - "icon": "bi-pencil-square", - "items": [ - { - "id": "ontology-link", - "label": "Ontology", - "icon": "bi-bezier2", - "route": "/ontology/", - "requires": "domain_saved" - }, - { - "id": "mapping-link", - "label": "Mapping", - "icon": "bi-shuffle", - "route": "/mapping/", - "requires": "domain_saved" - } - ] - }, { "id": "domain-collaboration", "title": "Collaboration", From 6e89c953cdda1344b6a57e0eb4f010c48196253a Mon Sep 17 00:00:00 2001 From: Benoit Cayla <benoit.cayla+data@databricks.com> Date: Wed, 24 Jun 2026 09:52:45 +0200 Subject: [PATCH 53/54] feat: rename domain menu and page labels - menu_config.json: rename "Validation" menu item label to "Publication" - _domain_review.html: rename page h4 title to "Domain Publication Workflow" --- src/front/config/menu_config.json | 2 +- src/front/templates/partials/domain/_domain_review.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/front/config/menu_config.json b/src/front/config/menu_config.json index ef4037a6..65fae59b 100644 --- a/src/front/config/menu_config.json +++ b/src/front/config/menu_config.json @@ -152,7 +152,7 @@ }, { "id": "review", - "label": "Validation", + "label": "Publication", "icon": "bi-patch-check", "default": false, "requires": "domain_saved" diff --git a/src/front/templates/partials/domain/_domain_review.html b/src/front/templates/partials/domain/_domain_review.html index cdec88ac..d78aedc2 100644 --- a/src/front/templates/partials/domain/_domain_review.html +++ b/src/front/templates/partials/domain/_domain_review.html @@ -1,7 +1,7 @@ <div class="content-section"> <div class="section-header d-flex justify-content-between align-items-center mb-4"> <div> - <h4 class="mb-1"><i class="bi bi-patch-check me-2"></i>Validation</h4> + <h4 class="mb-1"><i class="bi bi-patch-check me-2"></i>Domain Publication Workflow</h4> <p class="text-muted mb-0 small"> Review and sign off this version before it goes live. Run consistency checks, collect reviewer approvals, then From dd9ecd11c92e5acd3977de0e6e41cc5ae97f509b Mon Sep 17 00:00:00 2001 From: Benoit Cayla <benoit.cayla+data@databricks.com> Date: Wed, 24 Jun 2026 16:53:27 +0200 Subject: [PATCH 54/54] feat(ui): highlight active domain in L1 navbar Add a dark pill style to the Domain nav item whenever a domain is loaded. Driven by `updateDomainMenuVisibility(hasDomain)` so it stays in sync with the existing domain-state logic on every page. --- .../v0.6.0/benoitcayladbx_2026-06-24.log | 19 +++++++++++++++++++ src/front/static/global/css/main.css | 14 ++++++++++++++ src/front/static/global/js/navbar.js | 5 ++++- 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 changelogs/v0.6.0/benoitcayladbx_2026-06-24.log diff --git a/changelogs/v0.6.0/benoitcayladbx_2026-06-24.log b/changelogs/v0.6.0/benoitcayladbx_2026-06-24.log new file mode 100644 index 00000000..3e79d1a7 --- /dev/null +++ b/changelogs/v0.6.0/benoitcayladbx_2026-06-24.log @@ -0,0 +1,19 @@ +## Highlight active domain in L1 navbar + +**Context:** When a domain is open and the user is on `/domain/`, the Domain +entry in the top navbar had no visual distinction from inactive items. This +made it hard to see which "section" of the app was active at a glance. + +**Changes:** +1. `src/front/static/global/js/navbar.js` — extended `initSubnavActiveState()` + to also add `.active` to `#domainL1Link` when `window.location.pathname` + starts with `/domain/`. +2. `src/front/static/global/css/main.css` — added `#domainL1Link.active` rule: + darker background (`--db-primary-dark`), white text, rounded pill, bold; + plus a hover variant using `--db-primary-darker`. + +**Modified files:** +- `src/front/static/global/js/navbar.js` +- `src/front/static/global/css/main.css` + +**Test result:** visual only — no unit tests impacted. diff --git a/src/front/static/global/css/main.css b/src/front/static/global/css/main.css index 52c854c6..38866eb1 100644 --- a/src/front/static/global/css/main.css +++ b/src/front/static/global/css/main.css @@ -217,6 +217,20 @@ body { font-weight: 400; } +#domainL1Link.active { + background-color: var(--db-primary-dark) !important; + color: #fff !important; + border-radius: 0.35rem; + padding-left: 0.6rem; + padding-right: 0.6rem; + font-weight: 500; +} + +#domainL1Link.active:hover { + background-color: var(--db-primary-darker) !important; + color: #fff !important; +} + /* Disabled navigation items (requires domain saved to UC) */ .navbar .nav-link.nav-disabled { opacity: 0.4; diff --git a/src/front/static/global/js/navbar.js b/src/front/static/global/js/navbar.js index c797bb1b..8f9334c0 100644 --- a/src/front/static/global/js/navbar.js +++ b/src/front/static/global/js/navbar.js @@ -48,6 +48,7 @@ function initSubnavActiveState() { link.classList.add('active'); } }); + } /** @@ -333,17 +334,19 @@ function updateDomainMenuVisibility(hasDomain) { } } - // Disable/enable the L1 Domain link + // Disable/enable the L1 Domain link and highlight when a domain is loaded const domainL1 = document.getElementById('domainL1Link'); if (domainL1) { if (hasDomain) { domainL1.classList.remove('ob-nav-disabled'); domainL1.removeAttribute('aria-disabled'); domainL1.removeAttribute('tabindex'); + domainL1.classList.add('active'); } else { domainL1.classList.add('ob-nav-disabled'); domainL1.setAttribute('aria-disabled', 'true'); domainL1.setAttribute('tabindex', '-1'); + domainL1.classList.remove('active'); } } }