diff --git a/.github/workflows/MainDistributionPipeline.yml b/.github/workflows/MainDistributionPipeline.yml index 2219615..644155c 100644 --- a/.github/workflows/MainDistributionPipeline.yml +++ b/.github/workflows/MainDistributionPipeline.yml @@ -1,73 +1,28 @@ # -# Build, test and (optionally) release the extension +# Build and test the extension using the DuckDB reusable CI workflow. +# Tracks the v1.4 stable branch so point releases (v1.4.5, v1.4.6, ...) +# automatically trigger a rebuild with matching platform strings. # name: Main Extension Distribution Pipeline on: push: pull_request: workflow_dispatch: + schedule: + - cron: "0 8 * * 1-5" concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.head_ref || '' }}-${{ github.base_ref || '' }}-${{ github.ref != 'refs/heads/main' && github.sha || '' }} - cancel-in-progress: true + group: ${{ github.workflow }}-${{ github.ref }}-${{ github.head_ref || '' }}-${{ github.base_ref || '' }}-${{ github.ref != 'refs/heads/main' || github.sha }} + cancel-in-progress: false jobs: - build: - name: Build (${{ matrix.duckdb_arch }}) - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - include: - - os: ubuntu-latest - duckdb_arch: linux_amd64 - rust_target: x86_64-unknown-linux-gnu - - os: macos-14 - duckdb_arch: osx_amd64 - rust_target: x86_64-apple-darwin - osx_build_arch: x86_64 - - os: macos-14 - duckdb_arch: osx_arm64 - rust_target: aarch64-apple-darwin - osx_build_arch: arm64 - - os: windows-latest - duckdb_arch: windows_amd64 - rust_target: x86_64-pc-windows-msvc - env: - OSX_BUILD_ARCH: ${{ matrix.osx_build_arch }} - - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - fetch-depth: 0 - - - name: Install Rust - uses: dtolnay/rust-toolchain@stable - with: - targets: ${{ matrix.rust_target }} - - - name: Build extension (Unix) - if: runner.os != 'Windows' - run: make release - - - name: Build extension (Windows) - if: runner.os == 'Windows' - shell: bash - run: | - cd yardstick-rs && cargo build --release - cd .. - mkdir -p build/release - cd build/release - cmake -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=Release ../.. - cmake --build . --config Release - - - name: Test extension - if: matrix.osx_build_arch != 'x86_64' && runner.os != 'Windows' - run: make test - - - name: Upload artifact - uses: actions/upload-artifact@v4 - with: - name: yardstick-${{ matrix.duckdb_arch }} - path: build/release/extension/yardstick/yardstick.duckdb_extension + duckdb-stable-build: + name: Build extension binaries + uses: duckdb/extension-ci-tools/.github/workflows/_extension_distribution.yml@main + with: + duckdb_version: v1.4-andium + ci_tools_version: main + extension_name: yardstick + extra_toolchains: rust + exclude_archs: "wasm_mvp;wasm_eh;wasm_threads;linux_amd64_gcc4;windows_amd64_rtools;windows_amd64_mingw" + rust_logs: true diff --git a/.gitmodules b/.gitmodules index 75d9a82..859dbd9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,8 @@ [submodule "duckdb"] path = duckdb url = https://github.com/duckdb/duckdb + branch = main [submodule "extension-ci-tools"] path = extension-ci-tools - url = https://github.com/duckdb/extension-ci-tools + url = https://github.com/duckdb/extension-ci-tools.git + branch = main diff --git a/docs/yardstick_adtech_kitchen_sink.ipynb b/docs/yardstick_adtech_kitchen_sink.ipynb new file mode 100644 index 0000000..1cfd4a2 --- /dev/null +++ b/docs/yardstick_adtech_kitchen_sink.ipynb @@ -0,0 +1,4972 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "5295dcf0", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "# /// script\n", + "# requires-python = \">=3.13\"\n", + "# dependencies = [\n", + "# \"altair\",\n", + "# \"duckdb\",\n", + "# \"ipywidgets\",\n", + "# \"jupyterlab\",\n", + "# \"pandas\",\n", + "# \"plotly\",\n", + "# ]\n", + "#\n", + "# [tool.uv]\n", + "# exclude-newer = \"2025-12-29T09:27:05.834166-08:00\"\n", + "# ///" + ] + }, + { + "cell_type": "markdown", + "id": "fdaf96bc", + "metadata": {}, + "source": [ + "# Yardstick + DuckDB: Adtech kitchen sink\n", + "\n", + "This notebook builds a synthetic adtech dataset with multiple dimension tables, a wide denormalized view, derived measures, ad hoc metrics, an interactive Altair dashboard, and cohort retention.\n", + "\n", + "Run from the repo root with juv:\n", + "\n", + "```bash\n", + "# optional install\n", + "uv tool install juv\n", + "\n", + "# run (no install)\n", + "uvx juv run docs/yardstick_adtech_kitchen_sink.ipynb\n", + "# or\n", + "juv run docs/yardstick_adtech_kitchen_sink.ipynb\n", + "```\n", + "\n", + "If the local extension is built, the notebook loads it from `build/release/extension/yardstick/yardstick.duckdb_extension`. Otherwise it falls back to `INSTALL yardstick FROM community`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "id": "2b335a68", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "import duckdb\n", + "import pandas as pd\n", + "import altair as alt\n", + "import tempfile\n", + "import ipywidgets as widgets\n", + "from IPython.display import display, clear_output\n", + "\n", + "alt.data_transformers.disable_max_rows()\n", + "alt.renderers.enable(\"default\")\n", + "\n", + "conn = duckdb.connect(database=\":memory:\", config={\"allow_unsigned_extensions\": \"true\"})\n", + "\n", + "temp_dir = Path(tempfile.gettempdir()) / \"yardstick_duckdb_tmp\"\n", + "temp_dir.mkdir(parents=True, exist_ok=True)\n", + "conn.execute(f\"pragma temp_directory='{temp_dir.as_posix()}'\")\n", + "conn.execute(\"pragma memory_limit='3GB'\")\n", + "conn.execute(\"pragma preserve_insertion_order=false\")\n", + "conn.execute(\"pragma threads=4\")\n", + "\n", + "ext_path = Path(\"build/release/extension/yardstick/yardstick.duckdb_extension\").resolve()\n", + "if ext_path.exists():\n", + " conn.execute(f\"LOAD '{ext_path.as_posix()}'\")\n", + "else:\n", + " conn.execute(\"INSTALL yardstick FROM community\")\n", + " conn.execute(\"LOAD yardstick\")\n", + "\n", + "def exec_sql(sql: str) -> None:\n", + " conn.execute(sql)\n", + "\n", + "def df_sql(sql: str) -> pd.DataFrame:\n", + " return conn.sql(sql).df()\n" + ] + }, + { + "cell_type": "markdown", + "id": "1bca9f8b", + "metadata": {}, + "source": [ + "## Build the data model\n", + "\n", + "Dimensions: advertisers, campaigns, creatives, placements, geos.\n", + "Fact: daily ad_events.\n", + "Wide view: ad_events_wide (denormalized).\n", + "Measures view: ad_measures_v (Yardstick measures + derived calculations).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "id": "d02fcdd9", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "f0baae4874984155bd55801a13a41128", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "FloatProgress(value=0.0, layout=Layout(width='auto'), style=ProgressStyle(bar_color='black'))" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "campaign_count = 200\n", + "campaigns_per_advertiser = 5\n", + "advertiser_count = campaign_count // campaigns_per_advertiser\n", + "creatives_per_campaign = 3\n", + "creative_count = campaign_count * creatives_per_campaign\n", + "placement_count = 14\n", + "density_mod = 9\n", + "density_cutoff = 8\n", + "date_days = 730\n", + "\n", + "exec_sql(f\"\"\"\n", + "create or replace table advertisers as\n", + "select\n", + " advertiser_id,\n", + " 'Advertiser ' || advertiser_id as advertiser,\n", + " case advertiser_id % 4\n", + " when 0 then 'Retail'\n", + " when 1 then 'SaaS'\n", + " when 2 then 'Gaming'\n", + " else 'FinTech'\n", + " end as vertical,\n", + " case\n", + " when advertiser_id in (1, 2, 3, 4) then 'Enterprise'\n", + " when advertiser_id in (5, 6, 7, 8, 9, 10) then 'Mid-Market'\n", + " else 'SMB'\n", + " end as tier,\n", + " case advertiser_id % 3\n", + " when 0 then 'NA'\n", + " when 1 then 'EMEA'\n", + " else 'APAC'\n", + " end as account_region\n", + "from range(1, {advertiser_count + 1}) t(advertiser_id);\n", + "\n", + "create or replace table advertiser_lifecycle as\n", + "select\n", + " advertiser_id,\n", + " date '2024-01-01' + ((advertiser_id * 29) % 180)::integer as account_start,\n", + " least(\n", + " date '2025-12-31',\n", + " date '2024-01-01' + ((advertiser_id * 29) % 180 + 180 + ((advertiser_id * 13) % 450))::integer\n", + " ) as account_end\n", + "from advertisers;\n", + "\n", + "create or replace table agency_accounts as\n", + "select\n", + " advertiser_id,\n", + " case advertiser_id % 5\n", + " when 0 then 'Northwind Media'\n", + " when 1 then 'Starlight Performance'\n", + " when 2 then 'BlueSky Growth'\n", + " when 3 then 'Vertex Digital'\n", + " else 'Nimbus Creative'\n", + " end as agency,\n", + " case advertiser_id % 3\n", + " when 0 then 'OmniGroup'\n", + " when 1 then 'Publicis-ish'\n", + " else 'Indie'\n", + " end as holding_company,\n", + " case advertiser_id % 3\n", + " when 0 then 'Managed'\n", + " when 1 then 'Self-Serve'\n", + " else 'Hybrid'\n", + " end as buying_model,\n", + " case advertiser_id % 2\n", + " when 0 then 'Annual'\n", + " else 'Quarterly'\n", + " end as contract_type\n", + "from advertisers;\n", + "\n", + "create or replace table brands as\n", + "select\n", + " advertiser_id,\n", + " 'Brand ' || advertiser_id as brand,\n", + " case advertiser_id % 3\n", + " when 0 then 'Core'\n", + " when 1 then 'Growth'\n", + " else 'Enterprise'\n", + " end as product_line,\n", + " case advertiser_id % 4\n", + " when 0 then 'Consumer'\n", + " when 1 then 'Prosumer'\n", + " when 2 then 'SMB'\n", + " else 'B2B'\n", + " end as portfolio\n", + "from advertisers;\n", + "\n", + "create or replace table campaigns as\n", + "select\n", + " campaign_id,\n", + " 1 + ((campaign_id - 1) / {campaigns_per_advertiser}) as advertiser_id,\n", + " 'Campaign ' || campaign_id as campaign,\n", + " case campaign_id % 3\n", + " when 0 then 'Performance'\n", + " when 1 then 'Acquisition'\n", + " else 'Awareness'\n", + " end as objective,\n", + " case campaign_id % 4\n", + " when 0 then 'CPA'\n", + " when 1 then 'ROAS'\n", + " when 2 then 'CTR'\n", + " else 'Reach'\n", + " end as optimization_goal,\n", + " date '2024-01-01' + ((campaign_id * 11) % 320)::integer as start_date,\n", + " date '2024-01-01' + ((campaign_id * 11) % 320 + 180 + (campaign_id % 45))::integer as end_date,\n", + " 60000 + (campaign_id % 5) * 20000 as planned_budget\n", + "from range(1, {campaign_count + 1}) t(campaign_id);\n", + "\n", + "create or replace table audience_targets as\n", + "select\n", + " campaign_id,\n", + " case campaign_id % 5\n", + " when 0 then 'Prospecting'\n", + " when 1 then 'Retargeting'\n", + " when 2 then 'Lookalike'\n", + " when 3 then 'Loyalty'\n", + " else 'Lapsed'\n", + " end as audience_segment,\n", + " case campaign_id % 4\n", + " when 0 then '18-24'\n", + " when 1 then '25-34'\n", + " when 2 then '35-44'\n", + " else '45+'\n", + " end as age_bucket,\n", + " case campaign_id % 3\n", + " when 0 then 'Female'\n", + " when 1 then 'Male'\n", + " else 'All'\n", + " end as gender,\n", + " case campaign_id % 4\n", + " when 0 then 'New'\n", + " when 1 then 'Active'\n", + " when 2 then 'Churn Risk'\n", + " else 'Reactivation'\n", + " end as lifecycle_stage\n", + "from campaigns;\n", + "\n", + "create or replace table creatives as\n", + "select\n", + " creative_id,\n", + " 1 + ((creative_id - 1) / {creatives_per_campaign}) as campaign_id,\n", + " 'Creative ' || creative_id as creative,\n", + " case creative_id % 4\n", + " when 0 then 'Video'\n", + " when 1 then 'Display'\n", + " when 2 then 'Native'\n", + " else 'Audio'\n", + " end as format,\n", + " case creative_id % 3\n", + " when 0 then 'Brand'\n", + " when 1 then 'Value'\n", + " else 'Product'\n", + " end as concept\n", + "from range(1, {creative_count + 1}) t(creative_id);\n", + "\n", + "create or replace table creative_tags as\n", + "select\n", + " creative_id,\n", + " case creative_id % 4\n", + " when 0 then 'Bold'\n", + " when 1 then 'Minimal'\n", + " when 2 then 'Story'\n", + " else 'Utility'\n", + " end as message_tone,\n", + " case creative_id % 3\n", + " when 0 then 'Discount'\n", + " when 1 then 'Free Trial'\n", + " else 'No Offer'\n", + " end as offer_type,\n", + " case creative_id % 2\n", + " when 0 then 'English'\n", + " else 'Spanish'\n", + " end as language,\n", + " case creative_id % 3\n", + " when 0 then 'Landing Page'\n", + " when 1 then 'App Store'\n", + " else 'Lead Form'\n", + " end as landing_type\n", + "from creatives;\n", + "\n", + "create or replace table placements as\n", + "select\n", + " placement_id,\n", + " case placement_id % 4\n", + " when 0 then 'NewsCo'\n", + " when 1 then 'Streamly'\n", + " when 2 then 'SocialHub'\n", + " else 'PodSpace'\n", + " end as publisher,\n", + " case placement_id % 3\n", + " when 0 then 'news.com'\n", + " when 1 then 'video.app'\n", + " else 'podcast.fm'\n", + " end as site,\n", + " case placement_id % 3\n", + " when 0 then 'Header'\n", + " when 1 then 'In-Stream'\n", + " else 'Sidebar'\n", + " end as placement_type,\n", + " case when placement_id % 2 = 0 then 'Premium' else 'Standard' end as inventory_tier\n", + "from range(1, {placement_count + 1}) t(placement_id);\n", + "\n", + "create or replace table supply_paths as\n", + "select\n", + " placement_id,\n", + " case placement_id % 4\n", + " when 0 then 'Magnite'\n", + " when 1 then 'PubMatic'\n", + " when 2 then 'OpenX'\n", + " else 'Index'\n", + " end as exchange,\n", + " case placement_id % 3\n", + " when 0 then 'Open Auction'\n", + " when 1 then 'PMP'\n", + " else 'PG'\n", + " end as deal_type,\n", + " case placement_id % 2\n", + " when 0 then 'First Price'\n", + " else 'Second Price'\n", + " end as auction_type,\n", + " case placement_id % 3\n", + " when 0 then 'Direct'\n", + " when 1 then 'Reseller'\n", + " else 'DSP'\n", + " end as supply_type\n", + "from placements;\n", + "\n", + "create or replace table geos as\n", + "select * from (values\n", + " ('New York', 'Northeast'),\n", + " ('California', 'West'),\n", + " ('Texas', 'South'),\n", + " ('Florida', 'South'),\n", + " ('Illinois', 'Midwest'),\n", + " ('Washington', 'West'),\n", + " ('Massachusetts', 'Northeast'),\n", + " ('Colorado', 'West'),\n", + " ('Arizona', 'West'),\n", + " ('Georgia', 'South')\n", + ") as t(geo, region_group);\n", + "\n", + "create or replace table ad_events as\n", + "with dates as (\n", + " select date '2024-01-01' + i::integer as event_date\n", + " from range(0, {date_days}) t(i)\n", + "),\n", + "base as (\n", + " select\n", + " d.event_date,\n", + " c.campaign_id,\n", + " c.advertiser_id,\n", + " c.objective\n", + " from dates d\n", + " join campaigns c\n", + " on d.event_date between c.start_date and c.end_date\n", + " join advertiser_lifecycle al\n", + " on c.advertiser_id = al.advertiser_id\n", + " and d.event_date between al.account_start and al.account_end\n", + "),\n", + "expanded as (\n", + " select\n", + " b.event_date,\n", + " b.advertiser_id,\n", + " b.campaign_id,\n", + " b.objective,\n", + " ch.channel,\n", + " dv.device,\n", + " g.geo,\n", + " p.placement_id,\n", + " abs(hash(b.event_date, b.campaign_id, ch.channel, dv.device, g.geo, p.placement_id)) as seed\n", + " from base b\n", + " cross join (select unnest(['Search', 'Social', 'Display', 'Video']) as channel) ch\n", + " cross join (select unnest(['Desktop', 'Mobile', 'CTV']) as device) dv\n", + " cross join geos g\n", + " cross join placements p\n", + " where (abs(hash(b.event_date, b.campaign_id, ch.channel, dv.device, g.geo, p.placement_id)) % {density_mod}) < {density_cutoff}\n", + "),\n", + "metrics as (\n", + " select\n", + " event_date,\n", + " advertiser_id,\n", + " campaign_id,\n", + " objective,\n", + " channel,\n", + " device,\n", + " geo,\n", + " placement_id,\n", + " 1 + ((campaign_id - 1) * {creatives_per_campaign} + (seed % {creatives_per_campaign})) as creative_id,\n", + " seed,\n", + " 200 + (seed % 1800) as impressions,\n", + " case channel\n", + " when 'Search' then 0.040\n", + " when 'Social' then 0.022\n", + " when 'Display' then 0.012\n", + " else 0.009\n", + " end\n", + " + case device\n", + " when 'Mobile' then 0.006\n", + " when 'CTV' then -0.004\n", + " else 0.0\n", + " end\n", + " + ((seed % 70)::double / 10000.0) as ctr,\n", + " case objective\n", + " when 'Performance' then 0.060\n", + " when 'Acquisition' then 0.045\n", + " else 0.020\n", + " end\n", + " + ((seed % 30)::double / 10000.0) as cvr,\n", + " case channel\n", + " when 'Search' then 18\n", + " when 'Social' then 12\n", + " when 'Display' then 8\n", + " else 16\n", + " end\n", + " + case when placement_id % 2 = 0 then 4 else 0 end\n", + " + ((seed % 30)::double / 10.0) as cpm\n", + " from expanded\n", + "),\n", + "final as (\n", + " select\n", + " event_date,\n", + " advertiser_id,\n", + " campaign_id,\n", + " creative_id,\n", + " placement_id,\n", + " channel,\n", + " device,\n", + " geo,\n", + " impressions,\n", + " floor(impressions * ctr)::integer as clicks,\n", + " floor(impressions * ctr * cvr)::integer as conversions,\n", + " floor(impressions * 0.0004)::integer as view_through,\n", + " round(impressions / 1000.0 * cpm, 2) as spend,\n", + " round(\n", + " (floor(impressions * ctr * cvr)::double) *\n", + " case channel\n", + " when 'Search' then 110\n", + " when 'Social' then 90\n", + " when 'Display' then 70\n", + " else 100\n", + " end\n", + " + (floor(impressions * 0.0004)::double) * 15,\n", + " 2\n", + " ) as revenue\n", + " from metrics\n", + ")\n", + "select * from final;\n", + "\n", + "create or replace view ad_events_wide as\n", + "select\n", + " e.event_date,\n", + " extract(year from e.event_date) as year,\n", + " date_trunc('week', e.event_date) as week,\n", + " date_trunc('month', e.event_date) as month,\n", + " date_trunc('quarter', e.event_date) as quarter,\n", + " extract(dow from e.event_date) as day_of_week,\n", + " case when extract(dow from e.event_date) in (0, 6) then true else false end as is_weekend,\n", + " e.advertiser_id,\n", + " a.advertiser,\n", + " a.vertical,\n", + " a.tier,\n", + " a.account_region,\n", + " aa.agency,\n", + " aa.holding_company,\n", + " aa.buying_model,\n", + " aa.contract_type,\n", + " b.brand,\n", + " b.product_line,\n", + " b.portfolio,\n", + " e.campaign_id,\n", + " c.campaign,\n", + " c.objective,\n", + " c.optimization_goal,\n", + " c.start_date,\n", + " c.end_date,\n", + " c.planned_budget,\n", + " aud.audience_segment,\n", + " aud.age_bucket,\n", + " aud.gender,\n", + " aud.lifecycle_stage,\n", + " e.creative_id,\n", + " cr.creative,\n", + " cr.format as creative_format,\n", + " cr.concept,\n", + " ct.message_tone,\n", + " ct.offer_type,\n", + " ct.language,\n", + " ct.landing_type,\n", + " e.placement_id,\n", + " p.publisher,\n", + " p.site,\n", + " p.placement_type,\n", + " p.inventory_tier,\n", + " sp.exchange,\n", + " sp.deal_type,\n", + " sp.auction_type,\n", + " sp.supply_type,\n", + " e.channel,\n", + " e.device,\n", + " g.geo,\n", + " g.region_group,\n", + " e.impressions,\n", + " e.clicks,\n", + " e.conversions,\n", + " e.view_through,\n", + " e.spend,\n", + " e.revenue,\n", + " e.revenue - e.spend as profit,\n", + " case when e.impressions > 0 then e.clicks::double / e.impressions else null end as row_ctr,\n", + " case when e.clicks > 0 then e.conversions::double / e.clicks else null end as row_cvr,\n", + " datediff('day', c.start_date, e.event_date) as flight_day,\n", + " case\n", + " when datediff('day', c.start_date, c.end_date) <= 0 then null\n", + " else datediff('day', c.start_date, e.event_date)::double / nullif(datediff('day', c.start_date, c.end_date), 0)\n", + " end as flight_progress,\n", + " case\n", + " when datediff('day', c.start_date, c.end_date) <= 0 then 'Single-day'\n", + " when datediff('day', c.start_date, e.event_date) < (datediff('day', c.start_date, c.end_date) / 3) then 'Launch'\n", + " when datediff('day', c.start_date, e.event_date) < (2 * datediff('day', c.start_date, c.end_date) / 3) then 'Mid'\n", + " else 'Tail'\n", + " end as flight_phase,\n", + " case\n", + " when extract(month from e.event_date) in (12, 1, 2) then 'Winter'\n", + " when extract(month from e.event_date) in (3, 4, 5) then 'Spring'\n", + " when extract(month from e.event_date) in (6, 7, 8) then 'Summer'\n", + " else 'Fall'\n", + " end as season\n", + "from ad_events e\n", + "join advertisers a using (advertiser_id)\n", + "join agency_accounts aa using (advertiser_id)\n", + "join brands b using (advertiser_id)\n", + "join campaigns c using (campaign_id)\n", + "join audience_targets aud using (campaign_id)\n", + "join creatives cr using (creative_id)\n", + "join creative_tags ct using (creative_id)\n", + "join placements p using (placement_id)\n", + "join supply_paths sp using (placement_id)\n", + "join geos g using (geo);\n", + "\n", + "create or replace view ad_measures_v as\n", + "select\n", + " event_date,\n", + " year,\n", + " week,\n", + " month,\n", + " quarter,\n", + " day_of_week,\n", + " is_weekend,\n", + " season,\n", + " advertiser,\n", + " vertical,\n", + " tier,\n", + " account_region,\n", + " agency,\n", + " holding_company,\n", + " buying_model,\n", + " contract_type,\n", + " brand,\n", + " product_line,\n", + " portfolio,\n", + " campaign,\n", + " objective,\n", + " optimization_goal,\n", + " audience_segment,\n", + " age_bucket,\n", + " gender,\n", + " lifecycle_stage,\n", + " creative_format,\n", + " concept,\n", + " message_tone,\n", + " offer_type,\n", + " language,\n", + " landing_type,\n", + " publisher,\n", + " site,\n", + " placement_type,\n", + " inventory_tier,\n", + " exchange,\n", + " deal_type,\n", + " auction_type,\n", + " supply_type,\n", + " channel,\n", + " device,\n", + " geo,\n", + " region_group,\n", + " flight_phase,\n", + " sum(impressions) as measure impressions,\n", + " sum(clicks) as measure clicks,\n", + " sum(conversions) as measure conversions,\n", + " sum(view_through) as measure view_through,\n", + " sum(spend) as measure spend,\n", + " sum(revenue) as measure revenue,\n", + " sum(revenue - spend) as measure profit,\n", + " sum(spend * case deal_type when 'PMP' then 0.10 when 'PG' then 0.14 else 0.06 end) as measure supply_fee,\n", + " sum(spend * case buying_model when 'Self-Serve' then 0.03 when 'Hybrid' then 0.05 else 0.06 end) as measure platform_fee,\n", + " sum(revenue - spend - (spend * case deal_type when 'PMP' then 0.10 when 'PG' then 0.14 else 0.06 end)\n", + " - (spend * case buying_model when 'Self-Serve' then 0.03 when 'Hybrid' then 0.05 else 0.06 end)) as measure net_profit\n", + "from ad_events_wide;\n", + "\n", + "create or replace view ad_social_2025_v as\n", + "select\n", + " creative_format,\n", + " sum(spend) as measure spend,\n", + " sum(revenue) as measure revenue\n", + "from ad_events_wide\n", + "where year = 2025 and channel = 'Social';\n", + "\n", + "create or replace table campaign_channel_wide as\n", + "select\n", + " campaign,\n", + " advertiser,\n", + " sum(case when channel = 'Search' then spend else 0 end) as spend_search,\n", + " sum(case when channel = 'Social' then spend else 0 end) as spend_social,\n", + " sum(case when channel = 'Display' then spend else 0 end) as spend_display,\n", + " sum(case when channel = 'Video' then spend else 0 end) as spend_video,\n", + " sum(spend) as spend_total,\n", + " sum(revenue) as revenue_total\n", + "from ad_events_wide\n", + "group by 1, 2;\n", + "\n", + "create or replace table advertiser_month_channel_wide as\n", + "select\n", + " advertiser,\n", + " month,\n", + " sum(case when channel = 'Search' then spend else 0 end) as spend_search,\n", + " sum(case when channel = 'Social' then spend else 0 end) as spend_social,\n", + " sum(case when channel = 'Display' then spend else 0 end) as spend_display,\n", + " sum(case when channel = 'Video' then spend else 0 end) as spend_video,\n", + " sum(spend) as spend_total,\n", + " sum(revenue) as revenue_total\n", + "from ad_events_wide\n", + "group by 1, 2;\n", + "\n", + "create or replace table agency_quarter_channel_wide as\n", + "select\n", + " holding_company,\n", + " quarter,\n", + " sum(case when channel = 'Search' then spend else 0 end) as spend_search,\n", + " sum(case when channel = 'Social' then spend else 0 end) as spend_social,\n", + " sum(case when channel = 'Display' then spend else 0 end) as spend_display,\n", + " sum(case when channel = 'Video' then spend else 0 end) as spend_video,\n", + " sum(spend) as spend_total,\n", + " sum(revenue) as revenue_total\n", + "from ad_events_wide\n", + "group by 1, 2;\n", + "\"\"\")\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "id": "fffb2aa3", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
rows
010360315
\n", + "
" + ], + "text/plain": [ + " rows\n", + "0 10360315" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
event_dateyearweekmonthquarterday_of_weekis_weekendadvertiser_idadvertiservertical...view_throughspendrevenueprofitrow_ctrrow_cvrflight_dayflight_progressflight_phaseseason
02025-02-2220252025-02-172025-02-012025-01-016True6.0Advertiser 6Gaming...012.430.0-12.430.0102520.01320.640777MidWinter
12025-02-2120252025-02-172025-02-012025-01-015False6.0Advertiser 6Gaming...05.900.0-5.900.0145770.01310.635922MidWinter
22025-02-2020252025-02-172025-02-012025-01-014False6.0Advertiser 6Gaming...05.310.0-5.310.0073130.01300.631068MidWinter
32025-02-1920252025-02-172025-02-012025-01-013False6.0Advertiser 6Gaming...010.000.0-10.000.0088000.01290.626214MidWinter
42025-02-1820252025-02-172025-02-012025-01-012False6.0Advertiser 6Gaming...019.120.0-19.120.0095130.01280.621359MidWinter
52025-02-1720252025-02-172025-02-012025-01-011False6.0Advertiser 6Gaming...011.980.0-11.980.0094410.01270.616505MidWinter
\n", + "

6 rows × 64 columns

\n", + "
" + ], + "text/plain": [ + " event_date year week month quarter day_of_week is_weekend \\\n", + "0 2025-02-22 2025 2025-02-17 2025-02-01 2025-01-01 6 True \n", + "1 2025-02-21 2025 2025-02-17 2025-02-01 2025-01-01 5 False \n", + "2 2025-02-20 2025 2025-02-17 2025-02-01 2025-01-01 4 False \n", + "3 2025-02-19 2025 2025-02-17 2025-02-01 2025-01-01 3 False \n", + "4 2025-02-18 2025 2025-02-17 2025-02-01 2025-01-01 2 False \n", + "5 2025-02-17 2025 2025-02-17 2025-02-01 2025-01-01 1 False \n", + "\n", + " advertiser_id advertiser vertical ... view_through spend revenue \\\n", + "0 6.0 Advertiser 6 Gaming ... 0 12.43 0.0 \n", + "1 6.0 Advertiser 6 Gaming ... 0 5.90 0.0 \n", + "2 6.0 Advertiser 6 Gaming ... 0 5.31 0.0 \n", + "3 6.0 Advertiser 6 Gaming ... 0 10.00 0.0 \n", + "4 6.0 Advertiser 6 Gaming ... 0 19.12 0.0 \n", + "5 6.0 Advertiser 6 Gaming ... 0 11.98 0.0 \n", + "\n", + " profit row_ctr row_cvr flight_day flight_progress flight_phase season \n", + "0 -12.43 0.010252 0.0 132 0.640777 Mid Winter \n", + "1 -5.90 0.014577 0.0 131 0.635922 Mid Winter \n", + "2 -5.31 0.007313 0.0 130 0.631068 Mid Winter \n", + "3 -10.00 0.008800 0.0 129 0.626214 Mid Winter \n", + "4 -19.12 0.009513 0.0 128 0.621359 Mid Winter \n", + "5 -11.98 0.009441 0.0 127 0.616505 Mid Winter \n", + "\n", + "[6 rows x 64 columns]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
campaignadvertiserspend_searchspend_socialspend_displayspend_videospend_totalrevenue_total
0Campaign 151Advertiser 31693774.06500811.33371024.28629865.782195475.459126760.0
1Campaign 56Advertiser 121688480.851221615.23900961.121526791.645337848.845123530.0
2Campaign 176Advertiser 36827794.20596041.89440779.41750718.802615334.302511960.0
3Campaign 76Advertiser 161870500.721344195.25995811.211694036.865904544.0424614320.0
4Campaign 171Advertiser 35176342.04128140.9393391.23159398.34557272.543501650.0
5Campaign 106Advertiser 221728980.981248683.98923091.361572619.475473375.7922782160.0
\n", + "
" + ], + "text/plain": [ + " campaign advertiser spend_search spend_social spend_display \\\n", + "0 Campaign 151 Advertiser 31 693774.06 500811.33 371024.28 \n", + "1 Campaign 56 Advertiser 12 1688480.85 1221615.23 900961.12 \n", + "2 Campaign 176 Advertiser 36 827794.20 596041.89 440779.41 \n", + "3 Campaign 76 Advertiser 16 1870500.72 1344195.25 995811.21 \n", + "4 Campaign 171 Advertiser 35 176342.04 128140.93 93391.23 \n", + "5 Campaign 106 Advertiser 22 1728980.98 1248683.98 923091.36 \n", + "\n", + " spend_video spend_total revenue_total \n", + "0 629865.78 2195475.45 9126760.0 \n", + "1 1526791.64 5337848.84 5123530.0 \n", + "2 750718.80 2615334.30 2511960.0 \n", + "3 1694036.86 5904544.04 24614320.0 \n", + "4 159398.34 557272.54 3501650.0 \n", + "5 1572619.47 5473375.79 22782160.0 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
advertisermonthspend_searchspend_socialspend_displayspend_videospend_totalrevenue_total
0Advertiser 122025-05-0117282.2712614.309443.4016127.5755467.5449560.0
1Advertiser 122025-03-01273452.72197560.66144869.69244958.18860841.25833080.0
2Advertiser 312024-06-0125672.6018976.8714211.9523750.8982612.31342040.0
3Advertiser 62025-03-0170908.8349874.0737874.8663130.71221788.47212290.0
4Advertiser 302024-07-01142411.47100770.7475430.41126357.17444969.79428570.0
5Advertiser 302024-05-0118118.3312661.109563.1315873.0056215.5655540.0
\n", + "
" + ], + "text/plain": [ + " advertiser month spend_search spend_social spend_display \\\n", + "0 Advertiser 12 2025-05-01 17282.27 12614.30 9443.40 \n", + "1 Advertiser 12 2025-03-01 273452.72 197560.66 144869.69 \n", + "2 Advertiser 31 2024-06-01 25672.60 18976.87 14211.95 \n", + "3 Advertiser 6 2025-03-01 70908.83 49874.07 37874.86 \n", + "4 Advertiser 30 2024-07-01 142411.47 100770.74 75430.41 \n", + "5 Advertiser 30 2024-05-01 18118.33 12661.10 9563.13 \n", + "\n", + " spend_video spend_total revenue_total \n", + "0 16127.57 55467.54 49560.0 \n", + "1 244958.18 860841.25 833080.0 \n", + "2 23750.89 82612.31 342040.0 \n", + "3 63130.71 221788.47 212290.0 \n", + "4 126357.17 444969.79 428570.0 \n", + "5 15873.00 56215.56 55540.0 " + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
holding_companyquarterspend_searchspend_socialspend_displayspend_videospend_totalrevenue_total
0Publicis-ish2024-04-014163018.722993801.632221118.693780476.2713158415.3154816130.0
1OmniGroup2024-10-016295283.464531029.793357187.305695159.7619878660.3119068180.0
2Indie2025-01-013143644.552260989.951675675.262848689.089928998.8462234000.0
3Indie2024-07-016247881.754498721.813343647.205665079.7919755330.55123762780.0
4Indie2025-04-01185137.75131279.8498614.62167996.69583028.903673830.0
5Indie2024-01-01396088.50287948.82211319.92358030.041253387.287871460.0
\n", + "
" + ], + "text/plain": [ + " holding_company quarter spend_search spend_social spend_display \\\n", + "0 Publicis-ish 2024-04-01 4163018.72 2993801.63 2221118.69 \n", + "1 OmniGroup 2024-10-01 6295283.46 4531029.79 3357187.30 \n", + "2 Indie 2025-01-01 3143644.55 2260989.95 1675675.26 \n", + "3 Indie 2024-07-01 6247881.75 4498721.81 3343647.20 \n", + "4 Indie 2025-04-01 185137.75 131279.84 98614.62 \n", + "5 Indie 2024-01-01 396088.50 287948.82 211319.92 \n", + "\n", + " spend_video spend_total revenue_total \n", + "0 3780476.27 13158415.31 54816130.0 \n", + "1 5695159.76 19878660.31 19068180.0 \n", + "2 2848689.08 9928998.84 62234000.0 \n", + "3 5665079.79 19755330.55 123762780.0 \n", + "4 167996.69 583028.90 3673830.0 \n", + "5 358030.04 1253387.28 7871460.0 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"select count(*) as rows from ad_events\"))\n", + "display(df_sql(\"select * from ad_events_wide limit 6\"))\n", + "display(df_sql(\"select * from campaign_channel_wide limit 6\"))\n", + "display(df_sql(\"select * from advertiser_month_channel_wide limit 6\"))\n", + "display(df_sql(\"select * from agency_quarter_channel_wide limit 6\"))\n" + ] + }, + { + "cell_type": "markdown", + "id": "eb948d92", + "metadata": {}, + "source": [ + "## Yardstick measures + derived calculations\n", + "\n", + "Derived calculations in the view: `profit`, `supply_fee`, `platform_fee`, `net_profit` are defined as `measure` expressions in `ad_measures_v`.\n", + "Ad hoc calculations appear in queries (CTR, CVR, ROAS, margins, take rate).\n" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "id": "1e50825c", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
scopeimpressionsclicksconversionsspendrevenueprofitsupply_feeplatform_feenet_profitroasctrnet_margintake_rate
0All1.138645e+10277979797.07397683.01.929273e+08737298840.05.443716e+081.991016e+078951315.95.155101e+083.8216410.0244130.6991870.046397
\n", + "
" + ], + "text/plain": [ + " scope impressions clicks conversions spend revenue \\\n", + "0 All 1.138645e+10 277979797.0 7397683.0 1.929273e+08 737298840.0 \n", + "\n", + " profit supply_fee platform_fee net_profit roas ctr \\\n", + "0 5.443716e+08 1.991016e+07 8951315.9 5.155101e+08 3.821641 0.024413 \n", + "\n", + " net_margin take_rate \n", + "0 0.699187 0.046397 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"\"\"\n", + "SEMANTIC SELECT\n", + " 'All' as scope,\n", + " aggregate(impressions) as impressions,\n", + " aggregate(clicks) as clicks,\n", + " aggregate(conversions) as conversions,\n", + " aggregate(spend) as spend,\n", + " aggregate(revenue) as revenue,\n", + " aggregate(profit) as profit,\n", + " aggregate(supply_fee) as supply_fee,\n", + " aggregate(platform_fee) as platform_fee,\n", + " aggregate(net_profit) as net_profit,\n", + " aggregate(revenue) / nullif(aggregate(spend), 0) as roas,\n", + " aggregate(clicks) / nullif(aggregate(impressions), 0) as ctr,\n", + " aggregate(net_profit) / nullif(aggregate(revenue), 0) as net_margin,\n", + " aggregate(platform_fee) / nullif(aggregate(spend), 0) as take_rate\n", + "from ad_measures_v as _outer;\n", + "\"\"\"))\n" + ] + }, + { + "cell_type": "markdown", + "id": "ddaebedc", + "metadata": {}, + "source": [ + "## Percent of total by channel\n" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "id": "df355396", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
channelspendpct_total
0Search6.103939e+0731.638551
1Video5.533500e+0728.681792
2Social4.396938e+0722.790648
3Display3.258351e+0716.889010
\n", + "
" + ], + "text/plain": [ + " channel spend pct_total\n", + "0 Search 6.103939e+07 31.638551\n", + "1 Video 5.533500e+07 28.681792\n", + "2 Social 4.396938e+07 22.790648\n", + "3 Display 3.258351e+07 16.889010" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"\"\"\n", + "SEMANTIC SELECT\n", + " _outer.channel,\n", + " aggregate(spend) as spend,\n", + " 100.0 * aggregate(spend) / aggregate(spend) at (all) as pct_total\n", + "from ad_measures_v as _outer\n", + "order by spend desc;\n", + "\"\"\"))\n" + ] + }, + { + "cell_type": "markdown", + "id": "6c48757e", + "metadata": {}, + "source": [ + "## Share within year by vertical\n" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "id": "6e5de35a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearverticalspendpct_of_year
02024SaaS4.471637e+0727.545697
12024FinTech3.968177e+0724.444337
22024Retail3.915766e+0724.121478
32024Gaming3.877944e+0723.888488
42025Retail9.813166e+0632.077520
52025Gaming9.459038e+0630.919937
62025SaaS6.430740e+0621.020964
72025FinTech4.889090e+0615.981579
\n", + "
" + ], + "text/plain": [ + " year vertical spend pct_of_year\n", + "0 2024 SaaS 4.471637e+07 27.545697\n", + "1 2024 FinTech 3.968177e+07 24.444337\n", + "2 2024 Retail 3.915766e+07 24.121478\n", + "3 2024 Gaming 3.877944e+07 23.888488\n", + "4 2025 Retail 9.813166e+06 32.077520\n", + "5 2025 Gaming 9.459038e+06 30.919937\n", + "6 2025 SaaS 6.430740e+06 21.020964\n", + "7 2025 FinTech 4.889090e+06 15.981579" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"\"\"\n", + "SEMANTIC SELECT\n", + " _outer.year,\n", + " _outer.vertical,\n", + " aggregate(spend) as spend,\n", + " 100.0 * aggregate(spend) / aggregate(spend) at (all vertical) as pct_of_year\n", + "from ad_measures_v as _outer\n", + "order by year, spend desc;\n", + "\"\"\"))\n" + ] + }, + { + "cell_type": "markdown", + "id": "ba4769e0", + "metadata": {}, + "source": [ + "## YoY revenue by advertiser (2025 vs 2024)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "d02d09ba", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
advertiserrev_2025rev_2024yoy_changeyoy_pct
0Advertiser 244181110.01334630.02846480.0213.278587
1Advertiser 184299030.01606820.02692210.0167.548948
2Advertiser 123249420.01874110.01375310.073.384700
3Advertiser 61797690.02116960.0-319270.0-15.081532
4Advertiser 2916071150.016632580.0-561430.0-3.375484
5Advertiser 2316847170.018308550.0-1461380.0-7.981954
6Advertiser 1717820520.020050780.0-2230260.0-11.123059
7Advertiser 33317700.05247430.0-4929730.0-93.945608
8Advertiser 27443230.05474620.0-5031390.0-91.903913
9Advertiser 348344890.016203920.0-7859030.0-48.500795
10Advertiser 1110794570.021783310.0-10988740.0-50.445685
11Advertiser 283695910.017369190.0-13673280.0-78.721460
12Advertiser 224253890.018528270.0-14274380.0-77.041084
13Advertiser 164855520.019758800.0-14903280.0-75.426038
14Advertiser 54374420.023545050.0-19170630.0-81.421063
15Advertiser 10232150.020785800.0-20553650.0-98.883132
16Advertiser 38NaN21099650.0NaNNaN
17Advertiser 4NaN20037620.0NaNNaN
18Advertiser 32NaN35182480.0NaNNaN
19Advertiser 3NaN4952070.0NaNNaN
20Advertiser 1NaN19009760.0NaNNaN
21Advertiser 14NaN35244760.0NaNNaN
22Advertiser 25NaN24522350.0NaNNaN
23Advertiser 36NaN2511960.0NaNNaN
24Advertiser 37NaN9263070.0NaNNaN
25Advertiser 35NaN3501650.0NaNNaN
26Advertiser 20NaN32606700.0NaNNaN
27Advertiser 7NaN24356390.0NaNNaN
28Advertiser 26NaN37705570.0NaNNaN
29Advertiser 8NaN37735940.0NaNNaN
30Advertiser 15NaN5501130.0NaNNaN
31Advertiser 13NaN22782110.0NaNNaN
32Advertiser 31NaN9126760.0NaNNaN
33Advertiser 30NaN1286920.0NaNNaN
34Advertiser 9NaN5907520.0NaNNaN
35Advertiser 40NaN11041710.0NaNNaN
36Advertiser 21NaN5111780.0NaNNaN
37Advertiser 2NaN32655640.0NaNNaN
38Advertiser 39NaN2860620.0NaNNaN
39Advertiser 19NaN21095490.0NaNNaN
\n", + "
" + ], + "text/plain": [ + " advertiser rev_2025 rev_2024 yoy_change yoy_pct\n", + "0 Advertiser 24 4181110.0 1334630.0 2846480.0 213.278587\n", + "1 Advertiser 18 4299030.0 1606820.0 2692210.0 167.548948\n", + "2 Advertiser 12 3249420.0 1874110.0 1375310.0 73.384700\n", + "3 Advertiser 6 1797690.0 2116960.0 -319270.0 -15.081532\n", + "4 Advertiser 29 16071150.0 16632580.0 -561430.0 -3.375484\n", + "5 Advertiser 23 16847170.0 18308550.0 -1461380.0 -7.981954\n", + "6 Advertiser 17 17820520.0 20050780.0 -2230260.0 -11.123059\n", + "7 Advertiser 33 317700.0 5247430.0 -4929730.0 -93.945608\n", + "8 Advertiser 27 443230.0 5474620.0 -5031390.0 -91.903913\n", + "9 Advertiser 34 8344890.0 16203920.0 -7859030.0 -48.500795\n", + "10 Advertiser 11 10794570.0 21783310.0 -10988740.0 -50.445685\n", + "11 Advertiser 28 3695910.0 17369190.0 -13673280.0 -78.721460\n", + "12 Advertiser 22 4253890.0 18528270.0 -14274380.0 -77.041084\n", + "13 Advertiser 16 4855520.0 19758800.0 -14903280.0 -75.426038\n", + "14 Advertiser 5 4374420.0 23545050.0 -19170630.0 -81.421063\n", + "15 Advertiser 10 232150.0 20785800.0 -20553650.0 -98.883132\n", + "16 Advertiser 38 NaN 21099650.0 NaN NaN\n", + "17 Advertiser 4 NaN 20037620.0 NaN NaN\n", + "18 Advertiser 32 NaN 35182480.0 NaN NaN\n", + "19 Advertiser 3 NaN 4952070.0 NaN NaN\n", + "20 Advertiser 1 NaN 19009760.0 NaN NaN\n", + "21 Advertiser 14 NaN 35244760.0 NaN NaN\n", + "22 Advertiser 25 NaN 24522350.0 NaN NaN\n", + "23 Advertiser 36 NaN 2511960.0 NaN NaN\n", + "24 Advertiser 37 NaN 9263070.0 NaN NaN\n", + "25 Advertiser 35 NaN 3501650.0 NaN NaN\n", + "26 Advertiser 20 NaN 32606700.0 NaN NaN\n", + "27 Advertiser 7 NaN 24356390.0 NaN NaN\n", + "28 Advertiser 26 NaN 37705570.0 NaN NaN\n", + "29 Advertiser 8 NaN 37735940.0 NaN NaN\n", + "30 Advertiser 15 NaN 5501130.0 NaN NaN\n", + "31 Advertiser 13 NaN 22782110.0 NaN NaN\n", + "32 Advertiser 31 NaN 9126760.0 NaN NaN\n", + "33 Advertiser 30 NaN 1286920.0 NaN NaN\n", + "34 Advertiser 9 NaN 5907520.0 NaN NaN\n", + "35 Advertiser 40 NaN 11041710.0 NaN NaN\n", + "36 Advertiser 21 NaN 5111780.0 NaN NaN\n", + "37 Advertiser 2 NaN 32655640.0 NaN NaN\n", + "38 Advertiser 39 NaN 2860620.0 NaN NaN\n", + "39 Advertiser 19 NaN 21095490.0 NaN NaN" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"\"\"\n", + "SELECT\n", + " _outer.advertiser,\n", + " aggregate(revenue) at (set year = 2025) as rev_2025,\n", + " aggregate(revenue) at (set year = 2024) as rev_2024,\n", + " aggregate(revenue) at (set year = 2025) - aggregate(revenue) at (set year = 2024) as yoy_change,\n", + " 100.0 * (aggregate(revenue) at (set year = 2025) - aggregate(revenue) at (set year = 2024))\n", + " / nullif(aggregate(revenue) at (set year = 2024), 0) as yoy_pct\n", + "from ad_measures_v as _outer\n", + "order by yoy_change desc;\n", + "\"\"\"))\n" + ] + }, + { + "cell_type": "markdown", + "id": "b134686a", + "metadata": {}, + "source": [ + "## Ad hoc performance metrics by objective\n" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "id": "88a769cb", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
objectivespendrevenuectrcvrcpccparoas
0Acquisition6.610773e+07275263600.00.0244050.0289990.69423423.9397594.163864
1Performance6.410890e+07401960490.00.0244160.0440460.69398115.7558926.269964
2Awareness6.271065e+0760074750.00.0244190.0062780.693876110.5269200.957967
\n", + "
" + ], + "text/plain": [ + " objective spend revenue ctr cvr cpc \\\n", + "0 Acquisition 6.610773e+07 275263600.0 0.024405 0.028999 0.694234 \n", + "1 Performance 6.410890e+07 401960490.0 0.024416 0.044046 0.693981 \n", + "2 Awareness 6.271065e+07 60074750.0 0.024419 0.006278 0.693876 \n", + "\n", + " cpa roas \n", + "0 23.939759 4.163864 \n", + "1 15.755892 6.269964 \n", + "2 110.526920 0.957967 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"\"\"\n", + "SEMANTIC SELECT\n", + " _outer.objective,\n", + " aggregate(spend) as spend,\n", + " aggregate(revenue) as revenue,\n", + " aggregate(clicks) / nullif(aggregate(impressions), 0) as ctr,\n", + " aggregate(conversions) / nullif(aggregate(clicks), 0) as cvr,\n", + " aggregate(spend) / nullif(aggregate(clicks), 0) as cpc,\n", + " aggregate(spend) / nullif(aggregate(conversions), 0) as cpa,\n", + " aggregate(revenue) / nullif(aggregate(spend), 0) as roas\n", + "from ad_measures_v as _outer\n", + "order by spend desc;\n", + "\"\"\"))\n" + ] + }, + { + "cell_type": "markdown", + "id": "bcb4910a", + "metadata": {}, + "source": [ + "## Slice vs total with WHERE\n" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "id": "062efd0e", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
devicespendsearch_spendsearch_share
0Desktop6.431682e+076.103939e+0794.904246
1CTV6.430840e+076.103939e+0794.916669
2Mobile6.430205e+076.103939e+0794.926042
\n", + "
" + ], + "text/plain": [ + " device spend search_spend search_share\n", + "0 Desktop 6.431682e+07 6.103939e+07 94.904246\n", + "1 CTV 6.430840e+07 6.103939e+07 94.916669\n", + "2 Mobile 6.430205e+07 6.103939e+07 94.926042" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"\"\"\n", + "SELECT\n", + " _outer.device,\n", + " aggregate(spend) as spend,\n", + " aggregate(spend) at (where channel = 'Search') as search_spend,\n", + " 100.0 * aggregate(spend) at (where channel = 'Search') / aggregate(spend) as search_share\n", + "from ad_measures_v as _outer\n", + "order by spend desc;\n", + "\"\"\"))\n" + ] + }, + { + "cell_type": "markdown", + "id": "634ba58c", + "metadata": {}, + "source": [ + "## Drill-down: Social 2025 creative format mix\n" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "id": "d31fedcf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
creative_formatspendpct_of_filtered
0Native1920970.1127.563197
1Video1782710.3825.579366
2Audio1634392.2223.451211
3Display1631257.1623.406227
\n", + "
" + ], + "text/plain": [ + " creative_format spend pct_of_filtered\n", + "0 Native 1920970.11 27.563197\n", + "1 Video 1782710.38 25.579366\n", + "2 Audio 1634392.22 23.451211\n", + "3 Display 1631257.16 23.406227" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"\"\"\n", + "SELECT\n", + " _outer.creative_format,\n", + " aggregate(spend) as spend,\n", + " 100.0 * aggregate(spend) / aggregate(spend) at (all creative_format) as pct_of_filtered\n", + "from ad_social_2025_v as _outer\n", + "order by spend desc;\n", + "\"\"\"))\n" + ] + }, + { + "cell_type": "markdown", + "id": "a38b1d72", + "metadata": {}, + "source": [ + "## Interactive dashboard (DuckDB re-runs on filter changes)\n", + "\n", + "This section reruns DuckDB queries when filters change, and adds Altair cross-filtering on channel.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "f642c621", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3e2b03e55bd64ba8a58bb8df2c980906", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "VBox(children=(SelectionRangeSlider(continuous_update=False, description='Month', index=(0, 17), layout=Layout…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1e04c2b2da624ae1a5e2bffb0b4ceb5a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Output()" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "month_df = df_sql(\"select distinct month from ad_events_wide order by month\")\n", + "month_options = [pd.to_datetime(m).to_pydatetime() for m in month_df[\"month\"].tolist()]\n", + "\n", + "advertiser_options = df_sql(\"select distinct advertiser from ad_events_wide order by advertiser\")[\"advertiser\"].tolist()\n", + "agency_options = df_sql(\"select distinct agency from ad_events_wide order by agency\")[\"agency\"].tolist()\n", + "brand_options = df_sql(\"select distinct brand from ad_events_wide order by brand\")[\"brand\"].tolist()\n", + "audience_options = df_sql(\"select distinct audience_segment from ad_events_wide order by audience_segment\")[\"audience_segment\"].tolist()\n", + "deal_type_options = df_sql(\"select distinct deal_type from ad_events_wide order by deal_type\")[\"deal_type\"].tolist()\n", + "exchange_options = df_sql(\"select distinct exchange from ad_events_wide order by exchange\")[\"exchange\"].tolist()\n", + "channel_options = df_sql(\"select distinct channel from ad_events_wide order by channel\")[\"channel\"].tolist()\n", + "device_options = df_sql(\"select distinct device from ad_events_wide order by device\")[\"device\"].tolist()\n", + "objective_options = df_sql(\"select distinct objective from ad_events_wide order by objective\")[\"objective\"].tolist()\n", + "vertical_options = df_sql(\"select distinct vertical from ad_events_wide order by vertical\")[\"vertical\"].tolist()\n", + "\n", + "month_slider = widgets.SelectionRangeSlider(\n", + " options=month_options,\n", + " index=(0, len(month_options) - 1),\n", + " description=\"Month\",\n", + " continuous_update=False,\n", + " layout=widgets.Layout(width=\"95%\")\n", + ")\n", + "\n", + "advertiser_select = widgets.SelectMultiple(\n", + " options=advertiser_options,\n", + " value=tuple(advertiser_options),\n", + " description=\"Advertiser\",\n", + " rows=6\n", + ")\n", + "agency_select = widgets.SelectMultiple(\n", + " options=agency_options,\n", + " value=tuple(agency_options),\n", + " description=\"Agency\",\n", + " rows=5\n", + ")\n", + "brand_select = widgets.SelectMultiple(\n", + " options=brand_options,\n", + " value=tuple(brand_options),\n", + " description=\"Brand\",\n", + " rows=5\n", + ")\n", + "audience_select = widgets.SelectMultiple(\n", + " options=audience_options,\n", + " value=tuple(audience_options),\n", + " description=\"Audience\",\n", + " rows=5\n", + ")\n", + "deal_type_select = widgets.SelectMultiple(\n", + " options=deal_type_options,\n", + " value=tuple(deal_type_options),\n", + " description=\"Deal\",\n", + " rows=4\n", + ")\n", + "exchange_select = widgets.SelectMultiple(\n", + " options=exchange_options,\n", + " value=tuple(exchange_options),\n", + " description=\"Exchange\",\n", + " rows=4\n", + ")\n", + "channel_select = widgets.SelectMultiple(\n", + " options=channel_options,\n", + " value=tuple(channel_options),\n", + " description=\"Channel\",\n", + " rows=5\n", + ")\n", + "device_select = widgets.SelectMultiple(\n", + " options=device_options,\n", + " value=tuple(device_options),\n", + " description=\"Device\",\n", + " rows=4\n", + ")\n", + "objective_select = widgets.SelectMultiple(\n", + " options=objective_options,\n", + " value=tuple(objective_options),\n", + " description=\"Objective\",\n", + " rows=4\n", + ")\n", + "vertical_select = widgets.SelectMultiple(\n", + " options=vertical_options,\n", + " value=tuple(vertical_options),\n", + " description=\"Vertical\",\n", + " rows=4\n", + ")\n", + "\n", + "def sql_in(values):\n", + " if not values:\n", + " return None\n", + " return \"(\" + \", \".join([f\"'{v}'\" for v in values]) + \")\"\n", + "\n", + "def build_where():\n", + " start, end = month_slider.value\n", + " start_date = pd.to_datetime(start).strftime(\"%Y-%m-%d\")\n", + " end_date = (pd.to_datetime(end) + pd.offsets.MonthEnd(0)).strftime(\"%Y-%m-%d\")\n", + " clauses = [f\"event_date between date '{start_date}' and date '{end_date}'\"]\n", + "\n", + " adv = sql_in(advertiser_select.value)\n", + " if adv:\n", + " clauses.append(f\"advertiser in {adv}\")\n", + "\n", + " agency = sql_in(agency_select.value)\n", + " if agency:\n", + " clauses.append(f\"agency in {agency}\")\n", + "\n", + " brand = sql_in(brand_select.value)\n", + " if brand:\n", + " clauses.append(f\"brand in {brand}\")\n", + "\n", + " aud = sql_in(audience_select.value)\n", + " if aud:\n", + " clauses.append(f\"audience_segment in {aud}\")\n", + "\n", + " deal = sql_in(deal_type_select.value)\n", + " if deal:\n", + " clauses.append(f\"deal_type in {deal}\")\n", + "\n", + " exch = sql_in(exchange_select.value)\n", + " if exch:\n", + " clauses.append(f\"exchange in {exch}\")\n", + "\n", + " ch = sql_in(channel_select.value)\n", + " if ch:\n", + " clauses.append(f\"channel in {ch}\")\n", + "\n", + " dev = sql_in(device_select.value)\n", + " if dev:\n", + " clauses.append(f\"device in {dev}\")\n", + "\n", + " obj = sql_in(objective_select.value)\n", + " if obj:\n", + " clauses.append(f\"objective in {obj}\")\n", + "\n", + " vert = sql_in(vertical_select.value)\n", + " if vert:\n", + " clauses.append(f\"vertical in {vert}\")\n", + "\n", + " return \" and \".join(clauses)\n", + "\n", + "output = widgets.Output()\n", + "\n", + "def update_dashboard(*_):\n", + " with output:\n", + " clear_output(wait=True)\n", + " where = build_where()\n", + "\n", + " kpi_df = df_sql(f\"\"\"\n", + " SEMANTIC SELECT\n", + " 'Filtered' as scope,\n", + " aggregate(impressions) as impressions,\n", + " aggregate(clicks) as clicks,\n", + " aggregate(conversions) as conversions,\n", + " aggregate(spend) as spend,\n", + " aggregate(revenue) as revenue,\n", + " aggregate(profit) as profit,\n", + " aggregate(supply_fee) as supply_fee,\n", + " aggregate(platform_fee) as platform_fee,\n", + " aggregate(net_profit) as net_profit,\n", + " aggregate(clicks) / nullif(aggregate(impressions), 0) as ctr,\n", + " aggregate(conversions) / nullif(aggregate(clicks), 0) as cvr,\n", + " aggregate(revenue) / nullif(aggregate(spend), 0) as roas,\n", + " aggregate(spend) / nullif(aggregate(clicks), 0) as cpc,\n", + " aggregate(spend) / nullif(aggregate(conversions), 0) as cpa,\n", + " aggregate(net_profit) / nullif(aggregate(revenue), 0) as net_margin,\n", + " aggregate(platform_fee) / nullif(aggregate(spend), 0) as take_rate\n", + " from ad_measures_v as _outer\n", + " where {where};\n", + " \"\"\")\n", + "\n", + " display(kpi_df)\n", + "\n", + " mix_df = df_sql(f\"\"\"\n", + " SEMANTIC SELECT\n", + " _outer.channel,\n", + " _outer.audience_segment,\n", + " _outer.deal_type,\n", + " _outer.device,\n", + " _outer.age_bucket,\n", + " _outer.lifecycle_stage,\n", + " aggregate(spend) as spend,\n", + " aggregate(revenue) as revenue,\n", + " aggregate(net_profit) as net_profit,\n", + " aggregate(clicks) as clicks,\n", + " aggregate(impressions) as impressions,\n", + " aggregate(conversions) as conversions\n", + " from ad_measures_v as _outer\n", + " where {where};\n", + " \"\"\")\n", + "\n", + " ts_df = df_sql(f\"\"\"\n", + " SEMANTIC SELECT\n", + " _outer.week as week,\n", + " _outer.channel,\n", + " _outer.audience_segment,\n", + " _outer.deal_type,\n", + " _outer.device,\n", + " _outer.age_bucket,\n", + " _outer.lifecycle_stage,\n", + " aggregate(spend) as spend,\n", + " aggregate(revenue) as revenue\n", + " from ad_measures_v as _outer\n", + " where {where};\n", + " \"\"\")\n", + "\n", + " campaign_df = df_sql(f\"\"\"\n", + " SEMANTIC SELECT\n", + " _outer.campaign,\n", + " _outer.channel,\n", + " _outer.audience_segment,\n", + " _outer.deal_type,\n", + " _outer.device,\n", + " _outer.age_bucket,\n", + " _outer.lifecycle_stage,\n", + " aggregate(spend) as spend,\n", + " aggregate(revenue) as revenue,\n", + " aggregate(net_profit) as net_profit,\n", + " aggregate(conversions) as conversions\n", + " from ad_measures_v as _outer\n", + " where {where};\n", + " \"\"\")\n", + "\n", + " sel_channel = alt.selection_point(fields=[\"channel\"], empty=\"all\")\n", + " sel_audience = alt.selection_point(fields=[\"audience_segment\"], empty=\"all\")\n", + " sel_deal = alt.selection_point(fields=[\"deal_type\"], empty=\"all\")\n", + " sel_device = alt.selection_point(fields=[\"device\"], empty=\"all\")\n", + " sel_age = alt.selection_point(fields=[\"age_bucket\"], empty=\"all\")\n", + " sel_lifecycle = alt.selection_point(fields=[\"lifecycle_stage\"], empty=\"all\")\n", + "\n", + " channel_chart = (\n", + " alt.Chart(mix_df)\n", + " .transform_filter(sel_audience)\n", + " .transform_filter(sel_deal)\n", + " .transform_filter(sel_device)\n", + " .transform_filter(sel_age)\n", + " .transform_filter(sel_lifecycle)\n", + " .transform_aggregate(\n", + " spend=\"sum(spend)\",\n", + " revenue=\"sum(revenue)\",\n", + " net_profit=\"sum(net_profit)\",\n", + " clicks=\"sum(clicks)\",\n", + " groupby=[\"channel\"]\n", + " )\n", + " .mark_bar()\n", + " .encode(\n", + " y=alt.Y(\"channel:N\", sort=\"-x\"),\n", + " x=alt.X(\"spend:Q\", title=\"Spend\"),\n", + " color=alt.condition(sel_channel, alt.value(\"#2ca02c\"), alt.value(\"#d0d0d0\")),\n", + " tooltip=[\"channel\", \"spend\", \"revenue\", \"net_profit\", \"clicks\"]\n", + " )\n", + " .add_params(sel_channel)\n", + " .properties(width=220, height=170, title=\"Channel mix\")\n", + " )\n", + "\n", + " audience_chart = (\n", + " alt.Chart(mix_df)\n", + " .transform_filter(sel_channel)\n", + " .transform_filter(sel_deal)\n", + " .transform_filter(sel_device)\n", + " .transform_filter(sel_age)\n", + " .transform_filter(sel_lifecycle)\n", + " .transform_aggregate(\n", + " spend=\"sum(spend)\",\n", + " revenue=\"sum(revenue)\",\n", + " conversions=\"sum(conversions)\",\n", + " groupby=[\"audience_segment\"]\n", + " )\n", + " .mark_bar()\n", + " .encode(\n", + " y=alt.Y(\"audience_segment:N\", sort=\"-x\"),\n", + " x=alt.X(\"spend:Q\", title=\"Spend\"),\n", + " color=alt.condition(sel_audience, alt.value(\"#1f77b4\"), alt.value(\"#d0d0d0\")),\n", + " tooltip=[\"audience_segment\", \"spend\", \"revenue\", \"conversions\"]\n", + " )\n", + " .add_params(sel_audience)\n", + " .properties(width=220, height=170, title=\"Audience mix\")\n", + " )\n", + "\n", + " deal_chart = (\n", + " alt.Chart(mix_df)\n", + " .transform_filter(sel_channel)\n", + " .transform_filter(sel_audience)\n", + " .transform_filter(sel_device)\n", + " .transform_filter(sel_age)\n", + " .transform_filter(sel_lifecycle)\n", + " .transform_aggregate(\n", + " spend=\"sum(spend)\",\n", + " revenue=\"sum(revenue)\",\n", + " net_profit=\"sum(net_profit)\",\n", + " groupby=[\"deal_type\"]\n", + " )\n", + " .mark_bar()\n", + " .encode(\n", + " y=alt.Y(\"deal_type:N\", sort=\"-x\"),\n", + " x=alt.X(\"spend:Q\", title=\"Spend\"),\n", + " color=alt.condition(sel_deal, alt.value(\"#ff7f0e\"), alt.value(\"#d0d0d0\")),\n", + " tooltip=[\"deal_type\", \"spend\", \"revenue\", \"net_profit\"]\n", + " )\n", + " .add_params(sel_deal)\n", + " .properties(width=220, height=170, title=\"Deal mix\")\n", + " )\n", + "\n", + " device_chart = (\n", + " alt.Chart(mix_df)\n", + " .transform_filter(sel_channel)\n", + " .transform_filter(sel_audience)\n", + " .transform_filter(sel_deal)\n", + " .transform_filter(sel_age)\n", + " .transform_filter(sel_lifecycle)\n", + " .transform_aggregate(\n", + " spend=\"sum(spend)\",\n", + " clicks=\"sum(clicks)\",\n", + " impressions=\"sum(impressions)\",\n", + " groupby=[\"device\"]\n", + " )\n", + " .mark_bar()\n", + " .encode(\n", + " y=alt.Y(\"device:N\", sort=\"-x\"),\n", + " x=alt.X(\"spend:Q\", title=\"Spend\"),\n", + " color=alt.condition(sel_device, alt.value(\"#9467bd\"), alt.value(\"#d0d0d0\")),\n", + " tooltip=[\"device\", \"spend\", \"clicks\", \"impressions\"]\n", + " )\n", + " .add_params(sel_device)\n", + " .properties(width=220, height=170, title=\"Device mix\")\n", + " )\n", + "\n", + " age_chart = (\n", + " alt.Chart(mix_df)\n", + " .transform_filter(sel_channel)\n", + " .transform_filter(sel_audience)\n", + " .transform_filter(sel_deal)\n", + " .transform_filter(sel_device)\n", + " .transform_filter(sel_lifecycle)\n", + " .transform_aggregate(\n", + " spend=\"sum(spend)\",\n", + " conversions=\"sum(conversions)\",\n", + " groupby=[\"age_bucket\"]\n", + " )\n", + " .mark_bar()\n", + " .encode(\n", + " y=alt.Y(\"age_bucket:N\", sort=\"-x\"),\n", + " x=alt.X(\"spend:Q\", title=\"Spend\"),\n", + " color=alt.condition(sel_age, alt.value(\"#8c564b\"), alt.value(\"#d0d0d0\")),\n", + " tooltip=[\"age_bucket\", \"spend\", \"conversions\"]\n", + " )\n", + " .add_params(sel_age)\n", + " .properties(width=220, height=170, title=\"Age mix\")\n", + " )\n", + "\n", + " lifecycle_chart = (\n", + " alt.Chart(mix_df)\n", + " .transform_filter(sel_channel)\n", + " .transform_filter(sel_audience)\n", + " .transform_filter(sel_deal)\n", + " .transform_filter(sel_device)\n", + " .transform_filter(sel_age)\n", + " .transform_aggregate(\n", + " spend=\"sum(spend)\",\n", + " conversions=\"sum(conversions)\",\n", + " groupby=[\"lifecycle_stage\"]\n", + " )\n", + " .mark_bar()\n", + " .encode(\n", + " y=alt.Y(\"lifecycle_stage:N\", sort=\"-x\"),\n", + " x=alt.X(\"spend:Q\", title=\"Spend\"),\n", + " color=alt.condition(sel_lifecycle, alt.value(\"#17becf\"), alt.value(\"#d0d0d0\")),\n", + " tooltip=[\"lifecycle_stage\", \"spend\", \"conversions\"]\n", + " )\n", + " .add_params(sel_lifecycle)\n", + " .properties(width=220, height=170, title=\"Lifecycle mix\")\n", + " )\n", + "\n", + " line_chart = (\n", + " alt.Chart(ts_df)\n", + " .transform_filter(sel_channel)\n", + " .transform_filter(sel_audience)\n", + " .transform_filter(sel_deal)\n", + " .transform_filter(sel_device)\n", + " .transform_filter(sel_age)\n", + " .transform_filter(sel_lifecycle)\n", + " .transform_aggregate(spend=\"sum(spend)\", revenue=\"sum(revenue)\", groupby=[\"week\"])\n", + " .transform_fold([\"spend\", \"revenue\"], as_=[\"metric\", \"value\"])\n", + " .mark_line()\n", + " .encode(\n", + " x=alt.X(\"week:T\", title=\"Week\"),\n", + " y=alt.Y(\"value:Q\", title=\"Value\"),\n", + " color=\"metric:N\",\n", + " tooltip=[\"week:T\", \"metric:N\", \"value:Q\"]\n", + " )\n", + " .properties(width=700, height=240, title=\"Spend vs Revenue (weekly)\")\n", + " )\n", + "\n", + " campaign_chart = (\n", + " alt.Chart(campaign_df)\n", + " .transform_filter(sel_channel)\n", + " .transform_filter(sel_audience)\n", + " .transform_filter(sel_deal)\n", + " .transform_filter(sel_device)\n", + " .transform_filter(sel_age)\n", + " .transform_filter(sel_lifecycle)\n", + " .transform_aggregate(\n", + " spend=\"sum(spend)\",\n", + " revenue=\"sum(revenue)\",\n", + " net_profit=\"sum(net_profit)\",\n", + " conversions=\"sum(conversions)\",\n", + " groupby=[\"campaign\"]\n", + " )\n", + " .mark_bar()\n", + " .encode(\n", + " y=alt.Y(\"campaign:N\", sort=\"-x\"),\n", + " x=alt.X(\"spend:Q\", title=\"Spend\"),\n", + " tooltip=[\"campaign\", \"spend\", \"revenue\", \"net_profit\", \"conversions\"]\n", + " )\n", + " .properties(width=700, height=280, title=\"Top campaigns (filtered)\")\n", + " )\n", + "\n", + " dashboard = alt.vconcat(\n", + " line_chart,\n", + " alt.hconcat(channel_chart, audience_chart, deal_chart),\n", + " alt.hconcat(device_chart, age_chart, lifecycle_chart),\n", + " campaign_chart\n", + " ).resolve_scale(color=\"independent\")\n", + "\n", + " display(dashboard)\n", + "\n", + "controls = widgets.VBox([\n", + " month_slider,\n", + " widgets.HBox([advertiser_select, agency_select, brand_select]),\n", + " widgets.HBox([channel_select, device_select, objective_select]),\n", + " widgets.HBox([vertical_select, audience_select, deal_type_select, exchange_select])\n", + "])\n", + "\n", + "for w in [\n", + " month_slider, advertiser_select, agency_select, brand_select, audience_select, deal_type_select, exchange_select,\n", + " channel_select, device_select, objective_select, vertical_select\n", + "]:\n", + " w.observe(update_dashboard, \"value\")\n", + "\n", + "display(controls, output)\n", + "update_dashboard()\n" + ] + }, + { + "cell_type": "markdown", + "id": "3d32efa2", + "metadata": {}, + "source": [ + "## Cohort retention (advertiser cohorts)\n", + "\n", + "Cohort = first month with spend. Retention = % of cohort active in later months.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "id": "07190ed2", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/nico/Code/yardstick/.venv/lib/python3.13/site-packages/IPython/core/interactiveshell.py:3701: UserWarning: Automatically deduplicated selection parameter with identical configuration. If you want independent parameters, explicitly name them differently (e.g., name='param1', name='param2'). See https://github.com/vega/altair/issues/3891\n", + " exec(code_obj, self.user_global_ns, self.user_ns)\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "\n", + "
\n", + "" + ], + "text/plain": [ + "alt.VConcatChart(...)" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "where = build_where()\n", + "\n", + "conn.execute(\"drop table if exists cohort_monthly\")\n", + "conn.sql(f\"\"\"\n", + "SEMANTIC SELECT\n", + " _outer.advertiser,\n", + " date_trunc('month', event_date) as month,\n", + " _outer.channel,\n", + " _outer.audience_segment,\n", + " aggregate(spend) as spend\n", + "from ad_measures_v as _outer\n", + "where {where}\n", + "group by 1, 2, 3, 4\n", + "\"\"\").create(\"cohort_monthly\")\n", + "\n", + "cohort_df = df_sql(\"\"\"\n", + "with cohorts as (\n", + " select advertiser, channel, audience_segment, min(month) as cohort_month\n", + " from cohort_monthly\n", + " where spend > 0\n", + " group by 1, 2, 3\n", + "),\n", + "retention as (\n", + " select\n", + " c.cohort_month,\n", + " c.channel,\n", + " c.audience_segment,\n", + " datediff('month', c.cohort_month, m.month) as month_index,\n", + " count(*) as active_advertisers,\n", + " sum(m.spend) as spend\n", + " from cohort_monthly m\n", + " join cohorts c\n", + " on m.advertiser = c.advertiser\n", + " and m.channel = c.channel\n", + " and m.audience_segment = c.audience_segment\n", + " where m.spend > 0\n", + " group by 1, 2, 3, 4\n", + "),\n", + "sizes as (\n", + " select cohort_month, channel, audience_segment, count(*) as cohort_size\n", + " from cohorts\n", + " group by 1, 2, 3\n", + "),\n", + "retention_rates as (\n", + " select\n", + " r.cohort_month,\n", + " r.channel,\n", + " r.audience_segment,\n", + " r.month_index,\n", + " r.active_advertisers,\n", + " s.cohort_size,\n", + " r.active_advertisers::double / nullif(s.cohort_size, 0) as retention_rate,\n", + " r.spend,\n", + " r.spend / nullif(first_value(r.spend) over (partition by r.cohort_month, r.channel, r.audience_segment order by r.month_index), 0) as revenue_retention\n", + " from retention r\n", + " join sizes s using (cohort_month, channel, audience_segment)\n", + ")\n", + "select *\n", + "from retention_rates\n", + "order by cohort_month, channel, audience_segment, month_index;\n", + "\"\"\")\n", + "\n", + "cohort_sizes_df = df_sql(\"\"\"\n", + "with cohorts as (\n", + " select advertiser, channel, audience_segment, min(month) as cohort_month\n", + " from cohort_monthly\n", + " where spend > 0\n", + " group by 1, 2, 3\n", + ")\n", + "select\n", + " cohort_month,\n", + " channel,\n", + " audience_segment,\n", + " count(*) as cohort_size\n", + "from cohorts\n", + "group by 1, 2, 3\n", + "order by cohort_month, channel, audience_segment;\n", + "\"\"\")\n", + "\n", + "sel_channel = alt.selection_point(fields=[\"channel\"], empty=\"all\")\n", + "sel_audience = alt.selection_point(fields=[\"audience_segment\"], empty=\"all\")\n", + "sel_cohort = alt.selection_point(fields=[\"cohort_month\"], empty=\"all\")\n", + "\n", + "channel_picker = (\n", + " alt.Chart(cohort_sizes_df)\n", + " .transform_filter(sel_audience)\n", + " .transform_aggregate(cohort_size=\"sum(cohort_size)\", groupby=[\"channel\"])\n", + " .mark_bar()\n", + " .encode(\n", + " y=alt.Y(\"channel:N\", sort=\"-x\"),\n", + " x=alt.X(\"cohort_size:Q\", title=\"Cohort size\"),\n", + " color=alt.condition(sel_channel, alt.value(\"#2ca02c\"), alt.value(\"#d0d0d0\")),\n", + " tooltip=[\"channel\", \"cohort_size\"]\n", + " )\n", + " .add_params(sel_channel)\n", + " .properties(width=200, height=160, title=\"Channel\")\n", + ")\n", + "\n", + "audience_picker = (\n", + " alt.Chart(cohort_sizes_df)\n", + " .transform_filter(sel_channel)\n", + " .transform_aggregate(cohort_size=\"sum(cohort_size)\", groupby=[\"audience_segment\"])\n", + " .mark_bar()\n", + " .encode(\n", + " y=alt.Y(\"audience_segment:N\", sort=\"-x\"),\n", + " x=alt.X(\"cohort_size:Q\", title=\"Cohort size\"),\n", + " color=alt.condition(sel_audience, alt.value(\"#1f77b4\"), alt.value(\"#d0d0d0\")),\n", + " tooltip=[\"audience_segment\", \"cohort_size\"]\n", + " )\n", + " .add_params(sel_audience)\n", + " .properties(width=200, height=160, title=\"Audience\")\n", + ")\n", + "\n", + "cohort_size_chart = (\n", + " alt.Chart(cohort_sizes_df)\n", + " .transform_filter(sel_channel)\n", + " .transform_filter(sel_audience)\n", + " .transform_aggregate(cohort_size=\"sum(cohort_size)\", groupby=[\"cohort_month\"])\n", + " .mark_bar()\n", + " .encode(\n", + " x=alt.X(\"cohort_month:T\", title=\"Cohort month\"),\n", + " y=alt.Y(\"cohort_size:Q\", title=\"Cohort size\"),\n", + " color=alt.condition(sel_cohort, alt.value(\"#7f7f7f\"), alt.value(\"#d0d0d0\")),\n", + " tooltip=[\"cohort_month:T\", \"cohort_size\"]\n", + " )\n", + " .add_params(sel_cohort)\n", + " .properties(width=640, height=120, title=\"Cohort size\")\n", + ")\n", + "\n", + "cohort_heatmap = (\n", + " alt.Chart(cohort_df)\n", + " .transform_filter(sel_channel)\n", + " .transform_filter(sel_audience)\n", + " .mark_rect()\n", + " .encode(\n", + " x=alt.X(\"month_index:O\", title=\"Months since cohort\"),\n", + " y=alt.Y(\"cohort_month:T\", title=\"Cohort month\"),\n", + " color=alt.Color(\"retention_rate:Q\", scale=alt.Scale(scheme=\"blues\"), title=\"Retention\"),\n", + " tooltip=[\"cohort_month:T\", \"month_index:O\", \"retention_rate:Q\", \"active_advertisers:Q\"]\n", + " )\n", + " .add_params(sel_cohort)\n", + " .properties(width=640, height=220, title=\"Advertiser retention by cohort\")\n", + ")\n", + "\n", + "retention_curve = (\n", + " alt.Chart(cohort_df)\n", + " .transform_filter(sel_channel)\n", + " .transform_filter(sel_audience)\n", + " .transform_filter(sel_cohort)\n", + " .transform_fold([\"retention_rate\", \"revenue_retention\"], as_=[\"metric\", \"value\"])\n", + " .mark_line(point=True)\n", + " .encode(\n", + " x=alt.X(\"month_index:O\", title=\"Months since cohort\"),\n", + " y=alt.Y(\"value:Q\", title=\"Retention\"),\n", + " color=alt.Color(\"metric:N\", title=\"Metric\"),\n", + " tooltip=[\"month_index:O\", \"metric:N\", \"value:Q\"]\n", + " )\n", + " .properties(width=640, height=200, title=\"Retention curve (selected cohort)\")\n", + ")\n", + "\n", + "cohort_dashboard = alt.vconcat(\n", + " alt.hconcat(channel_picker, audience_picker),\n", + " cohort_size_chart,\n", + " cohort_heatmap,\n", + " retention_curve\n", + ")\n", + "\n", + "display(cohort_dashboard)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "204a0b99-6a84-4ae9-80b9-68400a9cf5e4", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "60b09b23-a176-43fb-b189-cf38a7735493", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.0" + }, + "uv.lock": "version = 1\nrevision = 2\nrequires-python = \">=3.13\"\nresolution-markers = [\n \"python_full_version >= '3.14'\",\n \"python_full_version < '3.14'\",\n]\n\n[options]\nexclude-newer = \"2025-12-29T17:27:05.834166Z\"\n\n[manifest]\nrequirements = [\n { name = \"altair\" },\n { name = \"duckdb\" },\n { name = \"ipywidgets\" },\n { name = \"jupyterlab\" },\n { name = \"pandas\" },\n { name = \"plotly\" },\n]\n\n[[package]]\nname = \"altair\"\nversion = \"6.0.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"jinja2\" },\n { name = \"jsonschema\" },\n { name = \"narwhals\" },\n { name = \"packaging\" },\n { name = \"typing-extensions\", marker = \"python_full_version < '3.15'\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/f7/c0/184a89bd5feba14ff3c41cfaf1dd8a82c05f5ceedbc92145e17042eb08a4/altair-6.0.0.tar.gz\", hash = \"sha256:614bf5ecbe2337347b590afb111929aa9c16c9527c4887d96c9bc7f6640756b4\", size = 763834, upload-time = \"2025-11-12T08:59:11.519Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/db/33/ef2f2409450ef6daa61459d5de5c08128e7d3edb773fefd0a324d1310238/altair-6.0.0-py3-none-any.whl\", hash = \"sha256:09ae95b53d5fe5b16987dccc785a7af8588f2dca50de1e7a156efa8a461515f8\", size = 795410, upload-time = \"2025-11-12T08:59:09.804Z\" },\n]\n\n[[package]]\nname = \"anyio\"\nversion = \"4.12.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"idna\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/16/ce/8a777047513153587e5434fd752e89334ac33e379aa3497db860eeb60377/anyio-4.12.0.tar.gz\", hash = \"sha256:73c693b567b0c55130c104d0b43a9baf3aa6a31fc6110116509f27bf75e21ec0\", size = 228266, upload-time = \"2025-11-28T23:37:38.911Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/7f/9c/36c5c37947ebfb8c7f22e0eb6e4d188ee2d53aa3880f3f2744fb894f0cb1/anyio-4.12.0-py3-none-any.whl\", hash = \"sha256:dad2376a628f98eeca4881fc56cd06affd18f659b17a747d3ff0307ced94b1bb\", size = 113362, upload-time = \"2025-11-28T23:36:57.897Z\" },\n]\n\n[[package]]\nname = \"appnope\"\nversion = \"0.1.4\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz\", hash = \"sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee\", size = 4170, upload-time = \"2024-02-06T09:43:11.258Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl\", hash = \"sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c\", size = 4321, upload-time = \"2024-02-06T09:43:09.663Z\" },\n]\n\n[[package]]\nname = \"argon2-cffi\"\nversion = \"25.1.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"argon2-cffi-bindings\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/0e/89/ce5af8a7d472a67cc819d5d998aa8c82c5d860608c4db9f46f1162d7dab9/argon2_cffi-25.1.0.tar.gz\", hash = \"sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1\", size = 45706, upload-time = \"2025-06-03T06:55:32.073Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl\", hash = \"sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741\", size = 14657, upload-time = \"2025-06-03T06:55:30.804Z\" },\n]\n\n[[package]]\nname = \"argon2-cffi-bindings\"\nversion = \"25.1.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"cffi\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz\", hash = \"sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d\", size = 1783441, upload-time = \"2025-07-30T10:02:05.147Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/60/97/3c0a35f46e52108d4707c44b95cfe2afcafc50800b5450c197454569b776/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl\", hash = \"sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f\", size = 54393, upload-time = \"2025-07-30T10:01:40.97Z\" },\n { url = \"https://files.pythonhosted.org/packages/9d/f4/98bbd6ee89febd4f212696f13c03ca302b8552e7dbf9c8efa11ea4a388c3/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl\", hash = \"sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b\", size = 29328, upload-time = \"2025-07-30T10:01:41.916Z\" },\n { url = \"https://files.pythonhosted.org/packages/43/24/90a01c0ef12ac91a6be05969f29944643bc1e5e461155ae6559befa8f00b/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl\", hash = \"sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a\", size = 31269, upload-time = \"2025-07-30T10:01:42.716Z\" },\n { url = \"https://files.pythonhosted.org/packages/d4/d3/942aa10782b2697eee7af5e12eeff5ebb325ccfb86dd8abda54174e377e4/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44\", size = 86558, upload-time = \"2025-07-30T10:01:43.943Z\" },\n { url = \"https://files.pythonhosted.org/packages/0d/82/b484f702fec5536e71836fc2dbc8c5267b3f6e78d2d539b4eaa6f0db8bf8/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb\", size = 92364, upload-time = \"2025-07-30T10:01:44.887Z\" },\n { url = \"https://files.pythonhosted.org/packages/c9/c1/a606ff83b3f1735f3759ad0f2cd9e038a0ad11a3de3b6c673aa41c24bb7b/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl\", hash = \"sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92\", size = 85637, upload-time = \"2025-07-30T10:01:46.225Z\" },\n { url = \"https://files.pythonhosted.org/packages/44/b4/678503f12aceb0262f84fa201f6027ed77d71c5019ae03b399b97caa2f19/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl\", hash = \"sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85\", size = 91934, upload-time = \"2025-07-30T10:01:47.203Z\" },\n { url = \"https://files.pythonhosted.org/packages/f0/c7/f36bd08ef9bd9f0a9cff9428406651f5937ce27b6c5b07b92d41f91ae541/argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl\", hash = \"sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f\", size = 28158, upload-time = \"2025-07-30T10:01:48.341Z\" },\n { url = \"https://files.pythonhosted.org/packages/b3/80/0106a7448abb24a2c467bf7d527fe5413b7fdfa4ad6d6a96a43a62ef3988/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl\", hash = \"sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6\", size = 32597, upload-time = \"2025-07-30T10:01:49.112Z\" },\n { url = \"https://files.pythonhosted.org/packages/05/b8/d663c9caea07e9180b2cb662772865230715cbd573ba3b5e81793d580316/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl\", hash = \"sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623\", size = 28231, upload-time = \"2025-07-30T10:01:49.92Z\" },\n { url = \"https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl\", hash = \"sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500\", size = 54121, upload-time = \"2025-07-30T10:01:50.815Z\" },\n { url = \"https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl\", hash = \"sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44\", size = 29177, upload-time = \"2025-07-30T10:01:51.681Z\" },\n { url = \"https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl\", hash = \"sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0\", size = 31090, upload-time = \"2025-07-30T10:01:53.184Z\" },\n { url = \"https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6\", size = 81246, upload-time = \"2025-07-30T10:01:54.145Z\" },\n { url = \"https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a\", size = 87126, upload-time = \"2025-07-30T10:01:55.074Z\" },\n { url = \"https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl\", hash = \"sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d\", size = 80343, upload-time = \"2025-07-30T10:01:56.007Z\" },\n { url = \"https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl\", hash = \"sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99\", size = 86777, upload-time = \"2025-07-30T10:01:56.943Z\" },\n { url = \"https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl\", hash = \"sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2\", size = 27180, upload-time = \"2025-07-30T10:01:57.759Z\" },\n { url = \"https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl\", hash = \"sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98\", size = 31715, upload-time = \"2025-07-30T10:01:58.56Z\" },\n { url = \"https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl\", hash = \"sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94\", size = 27149, upload-time = \"2025-07-30T10:01:59.329Z\" },\n]\n\n[[package]]\nname = \"arrow\"\nversion = \"1.4.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"python-dateutil\" },\n { name = \"tzdata\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz\", hash = \"sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7\", size = 152931, upload-time = \"2025-10-18T17:46:46.761Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl\", hash = \"sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205\", size = 68797, upload-time = \"2025-10-18T17:46:45.663Z\" },\n]\n\n[[package]]\nname = \"asttokens\"\nversion = \"3.0.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz\", hash = \"sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7\", size = 62308, upload-time = \"2025-11-15T16:43:48.578Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl\", hash = \"sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a\", size = 27047, upload-time = \"2025-11-15T16:43:16.109Z\" },\n]\n\n[[package]]\nname = \"async-lru\"\nversion = \"2.0.5\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/b2/4d/71ec4d3939dc755264f680f6c2b4906423a304c3d18e96853f0a595dfe97/async_lru-2.0.5.tar.gz\", hash = \"sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb\", size = 10380, upload-time = \"2025-03-16T17:25:36.919Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl\", hash = \"sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943\", size = 6069, upload-time = \"2025-03-16T17:25:35.422Z\" },\n]\n\n[[package]]\nname = \"attrs\"\nversion = \"25.4.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz\", hash = \"sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11\", size = 934251, upload-time = \"2025-10-06T13:54:44.725Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl\", hash = \"sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373\", size = 67615, upload-time = \"2025-10-06T13:54:43.17Z\" },\n]\n\n[[package]]\nname = \"babel\"\nversion = \"2.17.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz\", hash = \"sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d\", size = 9951852, upload-time = \"2025-02-01T15:17:41.026Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl\", hash = \"sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2\", size = 10182537, upload-time = \"2025-02-01T15:17:37.39Z\" },\n]\n\n[[package]]\nname = \"beautifulsoup4\"\nversion = \"4.14.3\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"soupsieve\" },\n { name = \"typing-extensions\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz\", hash = \"sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86\", size = 627737, upload-time = \"2025-11-30T15:08:26.084Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl\", hash = \"sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb\", size = 107721, upload-time = \"2025-11-30T15:08:24.087Z\" },\n]\n\n[[package]]\nname = \"bleach\"\nversion = \"6.3.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"webencodings\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz\", hash = \"sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22\", size = 203533, upload-time = \"2025-10-27T17:57:39.211Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl\", hash = \"sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6\", size = 164437, upload-time = \"2025-10-27T17:57:37.538Z\" },\n]\n\n[package.optional-dependencies]\ncss = [\n { name = \"tinycss2\" },\n]\n\n[[package]]\nname = \"certifi\"\nversion = \"2025.11.12\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz\", hash = \"sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316\", size = 160538, upload-time = \"2025-11-12T02:54:51.517Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl\", hash = \"sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b\", size = 159438, upload-time = \"2025-11-12T02:54:49.735Z\" },\n]\n\n[[package]]\nname = \"cffi\"\nversion = \"2.0.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"pycparser\", marker = \"implementation_name != 'PyPy'\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n]\n\n[[package]]\nname = \"charset-normalizer\"\nversion = \"3.4.4\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n]\n\n[[package]]\nname = \"colorama\"\nversion = \"0.4.6\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"comm\"\nversion = \"0.2.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz\", hash = \"sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971\", size = 6319, upload-time = \"2025-07-25T14:02:04.452Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl\", hash = \"sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417\", size = 7294, upload-time = \"2025-07-25T14:02:02.896Z\" },\n]\n\n[[package]]\nname = \"debugpy\"\nversion = \"1.8.19\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/73/75/9e12d4d42349b817cd545b89247696c67917aab907012ae5b64bbfea3199/debugpy-1.8.19.tar.gz\", hash = \"sha256:eea7e5987445ab0b5ed258093722d5ecb8bb72217c5c9b1e21f64efe23ddebdb\", size = 1644590, upload-time = \"2025-12-15T21:53:28.044Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/71/3d/388035a31a59c26f1ecc8d86af607d0c42e20ef80074147cd07b180c4349/debugpy-1.8.19-cp313-cp313-macosx_15_0_universal2.whl\", hash = \"sha256:91e35db2672a0abaf325f4868fcac9c1674a0d9ad9bb8a8c849c03a5ebba3e6d\", size = 2538859, upload-time = \"2025-12-15T21:53:50.478Z\" },\n { url = \"https://files.pythonhosted.org/packages/4a/19/c93a0772d0962294f083dbdb113af1a7427bb632d36e5314297068f55db7/debugpy-1.8.19-cp313-cp313-manylinux_2_34_x86_64.whl\", hash = \"sha256:85016a73ab84dea1c1f1dcd88ec692993bcbe4532d1b49ecb5f3c688ae50c606\", size = 4292575, upload-time = \"2025-12-15T21:53:51.821Z\" },\n { url = \"https://files.pythonhosted.org/packages/5c/56/09e48ab796b0a77e3d7dc250f95251832b8bf6838c9632f6100c98bdf426/debugpy-1.8.19-cp313-cp313-win32.whl\", hash = \"sha256:b605f17e89ba0ecee994391194285fada89cee111cfcd29d6f2ee11cbdc40976\", size = 5286209, upload-time = \"2025-12-15T21:53:53.602Z\" },\n { url = \"https://files.pythonhosted.org/packages/fb/4e/931480b9552c7d0feebe40c73725dd7703dcc578ba9efc14fe0e6d31cfd1/debugpy-1.8.19-cp313-cp313-win_amd64.whl\", hash = \"sha256:c30639998a9f9cd9699b4b621942c0179a6527f083c72351f95c6ab1728d5b73\", size = 5328206, upload-time = \"2025-12-15T21:53:55.433Z\" },\n { url = \"https://files.pythonhosted.org/packages/f6/b9/cbec520c3a00508327476c7fce26fbafef98f412707e511eb9d19a2ef467/debugpy-1.8.19-cp314-cp314-macosx_15_0_universal2.whl\", hash = \"sha256:1e8c4d1bd230067bf1bbcdbd6032e5a57068638eb28b9153d008ecde288152af\", size = 2537372, upload-time = \"2025-12-15T21:53:57.318Z\" },\n { url = \"https://files.pythonhosted.org/packages/88/5e/cf4e4dc712a141e10d58405c58c8268554aec3c35c09cdcda7535ff13f76/debugpy-1.8.19-cp314-cp314-manylinux_2_34_x86_64.whl\", hash = \"sha256:d40c016c1f538dbf1762936e3aeb43a89b965069d9f60f9e39d35d9d25e6b809\", size = 4268729, upload-time = \"2025-12-15T21:53:58.712Z\" },\n { url = \"https://files.pythonhosted.org/packages/82/a3/c91a087ab21f1047db328c1d3eb5d1ff0e52de9e74f9f6f6fa14cdd93d58/debugpy-1.8.19-cp314-cp314-win32.whl\", hash = \"sha256:0601708223fe1cd0e27c6cce67a899d92c7d68e73690211e6788a4b0e1903f5b\", size = 5286388, upload-time = \"2025-12-15T21:54:00.687Z\" },\n { url = \"https://files.pythonhosted.org/packages/17/b8/bfdc30b6e94f1eff09f2dc9cc1f9cd1c6cde3d996bcbd36ce2d9a4956e99/debugpy-1.8.19-cp314-cp314-win_amd64.whl\", hash = \"sha256:8e19a725f5d486f20e53a1dde2ab8bb2c9607c40c00a42ab646def962b41125f\", size = 5327741, upload-time = \"2025-12-15T21:54:02.148Z\" },\n { url = \"https://files.pythonhosted.org/packages/25/3e/e27078370414ef35fafad2c06d182110073daaeb5d3bf734b0b1eeefe452/debugpy-1.8.19-py2.py3-none-any.whl\", hash = \"sha256:360ffd231a780abbc414ba0f005dad409e71c78637efe8f2bd75837132a41d38\", size = 5292321, upload-time = \"2025-12-15T21:54:16.024Z\" },\n]\n\n[[package]]\nname = \"decorator\"\nversion = \"5.2.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz\", hash = \"sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360\", size = 56711, upload-time = \"2025-02-24T04:41:34.073Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl\", hash = \"sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a\", size = 9190, upload-time = \"2025-02-24T04:41:32.565Z\" },\n]\n\n[[package]]\nname = \"defusedxml\"\nversion = \"0.7.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"duckdb\"\nversion = \"1.4.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/7f/da/17c3eb5458af69d54dedc8d18e4a32ceaa8ce4d4c699d45d6d8287e790c3/duckdb-1.4.3.tar.gz\", hash = \"sha256:fea43e03604c713e25a25211ada87d30cd2a044d8f27afab5deba26ac49e5268\", size = 18478418, upload-time = \"2025-12-09T10:59:22.945Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/fd/76/288cca43a10ddd082788e1a71f1dc68d9130b5d078c3ffd0edf2f3a8719f/duckdb-1.4.3-cp313-cp313-macosx_10_13_universal2.whl\", hash = \"sha256:16952ac05bd7e7b39946695452bf450db1ebbe387e1e7178e10f593f2ea7b9a8\", size = 29033392, upload-time = \"2025-12-09T10:58:34.631Z\" },\n { url = \"https://files.pythonhosted.org/packages/64/07/cbad3d3da24af4d1add9bccb5fb390fac726ffa0c0cebd29bf5591cef334/duckdb-1.4.3-cp313-cp313-macosx_10_13_x86_64.whl\", hash = \"sha256:de984cd24a6cbefdd6d4a349f7b9a46e583ca3e58ce10d8def0b20a6e5fcbe78\", size = 15414567, upload-time = \"2025-12-09T10:58:37.051Z\" },\n { url = \"https://files.pythonhosted.org/packages/c4/19/57af0cc66ba2ffb8900f567c9aec188c6ab2a7b3f2260e9c6c3c5f9b57b1/duckdb-1.4.3-cp313-cp313-macosx_11_0_arm64.whl\", hash = \"sha256:1e5457dda91b67258aae30fb1a0df84183a9f6cd27abac1d5536c0d876c6dfa1\", size = 13740960, upload-time = \"2025-12-09T10:58:39.658Z\" },\n { url = \"https://files.pythonhosted.org/packages/73/dd/23152458cf5fd51e813fadda60b9b5f011517634aa4bb9301f5f3aa951d8/duckdb-1.4.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:006aca6a6d6736c441b02ff5c7600b099bb8b7f4de094b8b062137efddce42df\", size = 18484312, upload-time = \"2025-12-09T10:58:42.054Z\" },\n { url = \"https://files.pythonhosted.org/packages/1a/7b/adf3f611f11997fc429d4b00a730604b65d952417f36a10c4be6e38e064d/duckdb-1.4.3-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:a2813f4635f4d6681cc3304020374c46aca82758c6740d7edbc237fe3aae2744\", size = 20495571, upload-time = \"2025-12-09T10:58:44.646Z\" },\n { url = \"https://files.pythonhosted.org/packages/40/d5/6b7ddda7713a788ab2d622c7267ec317718f2bdc746ce1fca49b7ff0e50f/duckdb-1.4.3-cp313-cp313-win_amd64.whl\", hash = \"sha256:6db124f53a3edcb32b0a896ad3519e37477f7e67bf4811cb41ab60c1ef74e4c8\", size = 12335680, upload-time = \"2025-12-09T10:58:46.883Z\" },\n { url = \"https://files.pythonhosted.org/packages/e8/28/0670135cf54525081fded9bac1254f78984e3b96a6059cd15aca262e3430/duckdb-1.4.3-cp313-cp313-win_arm64.whl\", hash = \"sha256:a8b0a8764e1b5dd043d168c8f749314f7a1252b5a260fa415adaa26fa3b958fd\", size = 13075161, upload-time = \"2025-12-09T10:58:49.47Z\" },\n { url = \"https://files.pythonhosted.org/packages/b6/f4/a38651e478fa41eeb8e43a0a9c0d4cd8633adea856e3ac5ac95124b0fdbf/duckdb-1.4.3-cp314-cp314-macosx_10_15_universal2.whl\", hash = \"sha256:316711a9e852bcfe1ed6241a5f654983f67e909e290495f3562cccdf43be8180\", size = 29042272, upload-time = \"2025-12-09T10:58:51.826Z\" },\n { url = \"https://files.pythonhosted.org/packages/16/de/2cf171a66098ce5aeeb7371511bd2b3d7b73a2090603b0b9df39f8aaf814/duckdb-1.4.3-cp314-cp314-macosx_10_15_x86_64.whl\", hash = \"sha256:9e625b2b4d52bafa1fd0ebdb0990c3961dac8bb00e30d327185de95b68202131\", size = 15419343, upload-time = \"2025-12-09T10:58:54.439Z\" },\n { url = \"https://files.pythonhosted.org/packages/35/28/6b0a7830828d4e9a37420d87e80fe6171d2869a9d3d960bf5d7c3b8c7ee4/duckdb-1.4.3-cp314-cp314-macosx_11_0_arm64.whl\", hash = \"sha256:130c6760f6c573f9c9fe9aba56adba0fab48811a4871b7b8fd667318b4a3e8da\", size = 13748905, upload-time = \"2025-12-09T10:58:56.656Z\" },\n { url = \"https://files.pythonhosted.org/packages/15/4d/778628e194d63967870873b9581c8a6b4626974aa4fbe09f32708a2d3d3a/duckdb-1.4.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:20c88effaa557a11267706b01419c542fe42f893dee66e5a6daa5974ea2d4a46\", size = 18487261, upload-time = \"2025-12-09T10:58:58.866Z\" },\n { url = \"https://files.pythonhosted.org/packages/c6/5f/87e43af2e4a0135f9675449563e7c2f9b6f1fe6a2d1691c96b091f3904dd/duckdb-1.4.3-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:1b35491db98ccd11d151165497c084a9d29d3dc42fc80abea2715a6c861ca43d\", size = 20497138, upload-time = \"2025-12-09T10:59:01.241Z\" },\n { url = \"https://files.pythonhosted.org/packages/94/41/abec537cc7c519121a2a83b9a6f180af8915fabb433777dc147744513e74/duckdb-1.4.3-cp314-cp314-win_amd64.whl\", hash = \"sha256:23b12854032c1a58d0452e2b212afa908d4ce64171862f3792ba9a596ba7c765\", size = 12836056, upload-time = \"2025-12-09T10:59:03.388Z\" },\n { url = \"https://files.pythonhosted.org/packages/b1/5a/8af5b96ce5622b6168854f479ce846cf7fb589813dcc7d8724233c37ded3/duckdb-1.4.3-cp314-cp314-win_arm64.whl\", hash = \"sha256:90f241f25cffe7241bf9f376754a5845c74775e00e1c5731119dc88cd71e0cb2\", size = 13527759, upload-time = \"2025-12-09T10:59:05.496Z\" },\n]\n\n[[package]]\nname = \"executing\"\nversion = \"2.2.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz\", hash = \"sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4\", size = 1129488, upload-time = \"2025-09-01T09:48:10.866Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl\", hash = \"sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017\", size = 28317, upload-time = \"2025-09-01T09:48:08.5Z\" },\n]\n\n[[package]]\nname = \"fastjsonschema\"\nversion = \"2.21.2\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz\", hash = \"sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de\", size = 374130, upload-time = \"2025-08-14T18:49:36.666Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl\", hash = \"sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463\", size = 24024, upload-time = \"2025-08-14T18:49:34.776Z\" },\n]\n\n[[package]]\nname = \"fqdn\"\nversion = \"1.5.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz\", hash = \"sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f\", size = 6015, upload-time = \"2021-03-11T07:16:29.08Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl\", hash = \"sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014\", size = 9121, upload-time = \"2021-03-11T07:16:28.351Z\" },\n]\n\n[[package]]\nname = \"h11\"\nversion = \"0.16.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"httpcore\"\nversion = \"1.0.9\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"certifi\" },\n { name = \"h11\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"httpx\"\nversion = \"0.28.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"anyio\" },\n { name = \"certifi\" },\n { name = \"httpcore\" },\n { name = \"idna\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"idna\"\nversion = \"3.11\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz\", hash = \"sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902\", size = 194582, upload-time = \"2025-10-12T14:55:20.501Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl\", hash = \"sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea\", size = 71008, upload-time = \"2025-10-12T14:55:18.883Z\" },\n]\n\n[[package]]\nname = \"ipykernel\"\nversion = \"7.1.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"appnope\", marker = \"sys_platform == 'darwin'\" },\n { name = \"comm\" },\n { name = \"debugpy\" },\n { name = \"ipython\" },\n { name = \"jupyter-client\" },\n { name = \"jupyter-core\" },\n { name = \"matplotlib-inline\" },\n { name = \"nest-asyncio\" },\n { name = \"packaging\" },\n { name = \"psutil\" },\n { name = \"pyzmq\" },\n { name = \"tornado\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/b9/a4/4948be6eb88628505b83a1f2f40d90254cab66abf2043b3c40fa07dfce0f/ipykernel-7.1.0.tar.gz\", hash = \"sha256:58a3fc88533d5930c3546dc7eac66c6d288acde4f801e2001e65edc5dc9cf0db\", size = 174579, upload-time = \"2025-10-27T09:46:39.471Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl\", hash = \"sha256:763b5ec6c5b7776f6a8d7ce09b267693b4e5ce75cb50ae696aaefb3c85e1ea4c\", size = 117968, upload-time = \"2025-10-27T09:46:37.805Z\" },\n]\n\n[[package]]\nname = \"ipython\"\nversion = \"9.8.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"colorama\", marker = \"sys_platform == 'win32'\" },\n { name = \"decorator\" },\n { name = \"ipython-pygments-lexers\" },\n { name = \"jedi\" },\n { name = \"matplotlib-inline\" },\n { name = \"pexpect\", marker = \"sys_platform != 'emscripten' and sys_platform != 'win32'\" },\n { name = \"prompt-toolkit\" },\n { name = \"pygments\" },\n { name = \"stack-data\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/12/51/a703c030f4928646d390b4971af4938a1b10c9dfce694f0d99a0bb073cb2/ipython-9.8.0.tar.gz\", hash = \"sha256:8e4ce129a627eb9dd221c41b1d2cdaed4ef7c9da8c17c63f6f578fe231141f83\", size = 4424940, upload-time = \"2025-12-03T10:18:24.353Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/f1/df/8ee1c5dd1e3308b5d5b2f2dfea323bb2f3827da8d654abb6642051199049/ipython-9.8.0-py3-none-any.whl\", hash = \"sha256:ebe6d1d58d7d988fbf23ff8ff6d8e1622cfdb194daf4b7b73b792c4ec3b85385\", size = 621374, upload-time = \"2025-12-03T10:18:22.335Z\" },\n]\n\n[[package]]\nname = \"ipython-pygments-lexers\"\nversion = \"1.1.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"pygments\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz\", hash = \"sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81\", size = 8393, upload-time = \"2025-01-17T11:24:34.505Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl\", hash = \"sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c\", size = 8074, upload-time = \"2025-01-17T11:24:33.271Z\" },\n]\n\n[[package]]\nname = \"ipywidgets\"\nversion = \"8.1.8\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"comm\" },\n { name = \"ipython\" },\n { name = \"jupyterlab-widgets\" },\n { name = \"traitlets\" },\n { name = \"widgetsnbextension\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/4c/ae/c5ce1edc1afe042eadb445e95b0671b03cee61895264357956e61c0d2ac0/ipywidgets-8.1.8.tar.gz\", hash = \"sha256:61f969306b95f85fba6b6986b7fe45d73124d1d9e3023a8068710d47a22ea668\", size = 116739, upload-time = \"2025-11-01T21:18:12.393Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/56/6d/0d9848617b9f753b87f214f1c682592f7ca42de085f564352f10f0843026/ipywidgets-8.1.8-py3-none-any.whl\", hash = \"sha256:ecaca67aed704a338f88f67b1181b58f821ab5dc89c1f0f5ef99db43c1c2921e\", size = 139808, upload-time = \"2025-11-01T21:18:10.956Z\" },\n]\n\n[[package]]\nname = \"isoduration\"\nversion = \"20.11.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"arrow\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz\", hash = \"sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9\", size = 11649, upload-time = \"2020-11-01T11:00:00.312Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl\", hash = \"sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042\", size = 11321, upload-time = \"2020-11-01T10:59:58.02Z\" },\n]\n\n[[package]]\nname = \"jedi\"\nversion = \"0.19.2\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"parso\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz\", hash = \"sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0\", size = 1231287, upload-time = \"2024-11-11T01:41:42.873Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl\", hash = \"sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9\", size = 1572278, upload-time = \"2024-11-11T01:41:40.175Z\" },\n]\n\n[[package]]\nname = \"jinja2\"\nversion = \"3.1.6\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"markupsafe\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"json5\"\nversion = \"0.12.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/12/ae/929aee9619e9eba9015207a9d2c1c54db18311da7eb4dcf6d41ad6f0eb67/json5-0.12.1.tar.gz\", hash = \"sha256:b2743e77b3242f8d03c143dd975a6ec7c52e2f2afe76ed934e53503dd4ad4990\", size = 52191, upload-time = \"2025-08-12T19:47:42.583Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/85/e2/05328bd2621be49a6fed9e3030b1e51a2d04537d3f816d211b9cc53c5262/json5-0.12.1-py3-none-any.whl\", hash = \"sha256:d9c9b3bc34a5f54d43c35e11ef7cb87d8bdd098c6ace87117a7b7e83e705c1d5\", size = 36119, upload-time = \"2025-08-12T19:47:41.131Z\" },\n]\n\n[[package]]\nname = \"jsonpointer\"\nversion = \"3.0.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz\", hash = \"sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef\", size = 9114, upload-time = \"2024-06-10T19:24:42.462Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl\", hash = \"sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942\", size = 7595, upload-time = \"2024-06-10T19:24:40.698Z\" },\n]\n\n[[package]]\nname = \"jsonschema\"\nversion = \"4.25.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"attrs\" },\n { name = \"jsonschema-specifications\" },\n { name = \"referencing\" },\n { name = \"rpds-py\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz\", hash = \"sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85\", size = 357342, upload-time = \"2025-08-18T17:03:50.038Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl\", hash = \"sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63\", size = 90040, upload-time = \"2025-08-18T17:03:48.373Z\" },\n]\n\n[package.optional-dependencies]\nformat-nongpl = [\n { name = \"fqdn\" },\n { name = \"idna\" },\n { name = \"isoduration\" },\n { name = \"jsonpointer\" },\n { name = \"rfc3339-validator\" },\n { name = \"rfc3986-validator\" },\n { name = \"rfc3987-syntax\" },\n { name = \"uri-template\" },\n { name = \"webcolors\" },\n]\n\n[[package]]\nname = \"jsonschema-specifications\"\nversion = \"2025.9.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"referencing\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"jupyter-client\"\nversion = \"8.7.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"jupyter-core\" },\n { name = \"python-dateutil\" },\n { name = \"pyzmq\" },\n { name = \"tornado\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/a6/27/d10de45e8ad4ce872372c4a3a37b7b35b6b064f6f023a5c14ffcced4d59d/jupyter_client-8.7.0.tar.gz\", hash = \"sha256:3357212d9cbe01209e59190f67a3a7e1f387a4f4e88d1e0433ad84d7b262531d\", size = 344691, upload-time = \"2025-12-09T18:37:01.953Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/bb/f5/fddaec430367be9d62a7ed125530e133bfd4a1c0350fe221149ee0f2b526/jupyter_client-8.7.0-py3-none-any.whl\", hash = \"sha256:3671a94fd25e62f5f2f554f5e95389c2294d89822378a5f2dd24353e1494a9e0\", size = 106215, upload-time = \"2025-12-09T18:37:00.024Z\" },\n]\n\n[[package]]\nname = \"jupyter-core\"\nversion = \"5.9.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"platformdirs\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz\", hash = \"sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508\", size = 89814, upload-time = \"2025-10-16T19:19:18.444Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl\", hash = \"sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407\", size = 29032, upload-time = \"2025-10-16T19:19:16.783Z\" },\n]\n\n[[package]]\nname = \"jupyter-events\"\nversion = \"0.12.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"jsonschema\", extra = [\"format-nongpl\"] },\n { name = \"packaging\" },\n { name = \"python-json-logger\" },\n { name = \"pyyaml\" },\n { name = \"referencing\" },\n { name = \"rfc3339-validator\" },\n { name = \"rfc3986-validator\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/9d/c3/306d090461e4cf3cd91eceaff84bede12a8e52cd821c2d20c9a4fd728385/jupyter_events-0.12.0.tar.gz\", hash = \"sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b\", size = 62196, upload-time = \"2025-02-03T17:23:41.485Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl\", hash = \"sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb\", size = 19430, upload-time = \"2025-02-03T17:23:38.643Z\" },\n]\n\n[[package]]\nname = \"jupyter-lsp\"\nversion = \"2.3.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"jupyter-server\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/eb/5a/9066c9f8e94ee517133cd98dba393459a16cd48bba71a82f16a65415206c/jupyter_lsp-2.3.0.tar.gz\", hash = \"sha256:458aa59339dc868fb784d73364f17dbce8836e906cd75fd471a325cba02e0245\", size = 54823, upload-time = \"2025-08-27T17:47:34.671Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl\", hash = \"sha256:e914a3cb2addf48b1c7710914771aaf1819d46b2e5a79b0f917b5478ec93f34f\", size = 76687, upload-time = \"2025-08-27T17:47:33.15Z\" },\n]\n\n[[package]]\nname = \"jupyter-server\"\nversion = \"2.17.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"anyio\" },\n { name = \"argon2-cffi\" },\n { name = \"jinja2\" },\n { name = \"jupyter-client\" },\n { name = \"jupyter-core\" },\n { name = \"jupyter-events\" },\n { name = \"jupyter-server-terminals\" },\n { name = \"nbconvert\" },\n { name = \"nbformat\" },\n { name = \"packaging\" },\n { name = \"prometheus-client\" },\n { name = \"pywinpty\", marker = \"os_name == 'nt'\" },\n { name = \"pyzmq\" },\n { name = \"send2trash\" },\n { name = \"terminado\" },\n { name = \"tornado\" },\n { name = \"traitlets\" },\n { name = \"websocket-client\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/5b/ac/e040ec363d7b6b1f11304cc9f209dac4517ece5d5e01821366b924a64a50/jupyter_server-2.17.0.tar.gz\", hash = \"sha256:c38ea898566964c888b4772ae1ed58eca84592e88251d2cfc4d171f81f7e99d5\", size = 731949, upload-time = \"2025-08-21T14:42:54.042Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl\", hash = \"sha256:e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f\", size = 388221, upload-time = \"2025-08-21T14:42:52.034Z\" },\n]\n\n[[package]]\nname = \"jupyter-server-terminals\"\nversion = \"0.5.3\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"pywinpty\", marker = \"os_name == 'nt'\" },\n { name = \"terminado\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/fc/d5/562469734f476159e99a55426d697cbf8e7eb5efe89fb0e0b4f83a3d3459/jupyter_server_terminals-0.5.3.tar.gz\", hash = \"sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269\", size = 31430, upload-time = \"2024-03-12T14:37:03.049Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl\", hash = \"sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa\", size = 13656, upload-time = \"2024-03-12T14:37:00.708Z\" },\n]\n\n[[package]]\nname = \"jupyterlab\"\nversion = \"4.5.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"async-lru\" },\n { name = \"httpx\" },\n { name = \"ipykernel\" },\n { name = \"jinja2\" },\n { name = \"jupyter-core\" },\n { name = \"jupyter-lsp\" },\n { name = \"jupyter-server\" },\n { name = \"jupyterlab-server\" },\n { name = \"notebook-shim\" },\n { name = \"packaging\" },\n { name = \"setuptools\" },\n { name = \"tornado\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/09/21/413d142686a4e8f4268d985becbdb4daf060524726248e73be4773786987/jupyterlab-4.5.1.tar.gz\", hash = \"sha256:09da1ddfbd9eec18b5101dbb8515612aa1e47443321fb99503725a88e93d20d9\", size = 23992251, upload-time = \"2025-12-15T16:58:59.361Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/af/c3/acced767eecc11a70c65c45295db5396c4f0c1937874937d5a76d7b177b6/jupyterlab-4.5.1-py3-none-any.whl\", hash = \"sha256:31b059de96de0754ff1f2ce6279774b6aab8c34d7082e9752db58207c99bd514\", size = 12384821, upload-time = \"2025-12-15T16:58:55.563Z\" },\n]\n\n[[package]]\nname = \"jupyterlab-pygments\"\nversion = \"0.3.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz\", hash = \"sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d\", size = 512900, upload-time = \"2023-11-23T09:26:37.44Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl\", hash = \"sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780\", size = 15884, upload-time = \"2023-11-23T09:26:34.325Z\" },\n]\n\n[[package]]\nname = \"jupyterlab-server\"\nversion = \"2.28.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"babel\" },\n { name = \"jinja2\" },\n { name = \"json5\" },\n { name = \"jsonschema\" },\n { name = \"jupyter-server\" },\n { name = \"packaging\" },\n { name = \"requests\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/d6/2c/90153f189e421e93c4bb4f9e3f59802a1f01abd2ac5cf40b152d7f735232/jupyterlab_server-2.28.0.tar.gz\", hash = \"sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c\", size = 76996, upload-time = \"2025-10-22T13:59:18.37Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl\", hash = \"sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968\", size = 59830, upload-time = \"2025-10-22T13:59:16.767Z\" },\n]\n\n[[package]]\nname = \"jupyterlab-widgets\"\nversion = \"3.0.16\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/26/2d/ef58fed122b268c69c0aa099da20bc67657cdfb2e222688d5731bd5b971d/jupyterlab_widgets-3.0.16.tar.gz\", hash = \"sha256:423da05071d55cf27a9e602216d35a3a65a3e41cdf9c5d3b643b814ce38c19e0\", size = 897423, upload-time = \"2025-11-01T21:11:29.724Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/ab/b5/36c712098e6191d1b4e349304ef73a8d06aed77e56ceaac8c0a306c7bda1/jupyterlab_widgets-3.0.16-py3-none-any.whl\", hash = \"sha256:45fa36d9c6422cf2559198e4db481aa243c7a32d9926b500781c830c80f7ecf8\", size = 914926, upload-time = \"2025-11-01T21:11:28.008Z\" },\n]\n\n[[package]]\nname = \"lark\"\nversion = \"1.3.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/da/34/28fff3ab31ccff1fd4f6c7c7b0ceb2b6968d8ea4950663eadcb5720591a0/lark-1.3.1.tar.gz\", hash = \"sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905\", size = 382732, upload-time = \"2025-10-27T18:25:56.653Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl\", hash = \"sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12\", size = 113151, upload-time = \"2025-10-27T18:25:54.882Z\" },\n]\n\n[[package]]\nname = \"markupsafe\"\nversion = \"3.0.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n]\n\n[[package]]\nname = \"matplotlib-inline\"\nversion = \"0.2.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz\", hash = \"sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe\", size = 8110, upload-time = \"2025-10-23T09:00:22.126Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl\", hash = \"sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76\", size = 9516, upload-time = \"2025-10-23T09:00:20.675Z\" },\n]\n\n[[package]]\nname = \"mistune\"\nversion = \"3.2.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/9d/55/d01f0c4b45ade6536c51170b9043db8b2ec6ddf4a35c7ea3f5f559ac935b/mistune-3.2.0.tar.gz\", hash = \"sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a\", size = 95467, upload-time = \"2025-12-23T11:36:34.994Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl\", hash = \"sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1\", size = 53598, upload-time = \"2025-12-23T11:36:33.211Z\" },\n]\n\n[[package]]\nname = \"narwhals\"\nversion = \"2.14.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/4a/84/897fe7b6406d436ef312e57e5a1a13b4a5e7e36d1844e8d934ce8880e3d3/narwhals-2.14.0.tar.gz\", hash = \"sha256:98be155c3599db4d5c211e565c3190c398c87e7bf5b3cdb157dece67641946e0\", size = 600648, upload-time = \"2025-12-16T11:29:13.458Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/79/3e/b8ecc67e178919671695f64374a7ba916cf0adbf86efedc6054f38b5b8ae/narwhals-2.14.0-py3-none-any.whl\", hash = \"sha256:b56796c9a00179bd757d15282c540024e1d5c910b19b8c9944d836566c030acf\", size = 430788, upload-time = \"2025-12-16T11:29:11.699Z\" },\n]\n\n[[package]]\nname = \"nbclient\"\nversion = \"0.10.4\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"jupyter-client\" },\n { name = \"jupyter-core\" },\n { name = \"nbformat\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/56/91/1c1d5a4b9a9ebba2b4e32b8c852c2975c872aec1fe42ab5e516b2cecd193/nbclient-0.10.4.tar.gz\", hash = \"sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9\", size = 62554, upload-time = \"2025-12-23T07:45:46.369Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl\", hash = \"sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440\", size = 25465, upload-time = \"2025-12-23T07:45:44.51Z\" },\n]\n\n[[package]]\nname = \"nbconvert\"\nversion = \"7.16.6\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"beautifulsoup4\" },\n { name = \"bleach\", extra = [\"css\"] },\n { name = \"defusedxml\" },\n { name = \"jinja2\" },\n { name = \"jupyter-core\" },\n { name = \"jupyterlab-pygments\" },\n { name = \"markupsafe\" },\n { name = \"mistune\" },\n { name = \"nbclient\" },\n { name = \"nbformat\" },\n { name = \"packaging\" },\n { name = \"pandocfilters\" },\n { name = \"pygments\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz\", hash = \"sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582\", size = 857715, upload-time = \"2025-01-28T09:29:14.724Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl\", hash = \"sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b\", size = 258525, upload-time = \"2025-01-28T09:29:12.551Z\" },\n]\n\n[[package]]\nname = \"nbformat\"\nversion = \"5.10.4\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"fastjsonschema\" },\n { name = \"jsonschema\" },\n { name = \"jupyter-core\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz\", hash = \"sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a\", size = 142749, upload-time = \"2024-04-04T11:20:37.371Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl\", hash = \"sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b\", size = 78454, upload-time = \"2024-04-04T11:20:34.895Z\" },\n]\n\n[[package]]\nname = \"nest-asyncio\"\nversion = \"1.6.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz\", hash = \"sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe\", size = 7418, upload-time = \"2024-01-21T14:25:19.227Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl\", hash = \"sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c\", size = 5195, upload-time = \"2024-01-21T14:25:17.223Z\" },\n]\n\n[[package]]\nname = \"notebook-shim\"\nversion = \"0.2.4\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"jupyter-server\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz\", hash = \"sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb\", size = 13167, upload-time = \"2024-02-14T23:35:18.353Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl\", hash = \"sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef\", size = 13307, upload-time = \"2024-02-14T23:35:16.286Z\" },\n]\n\n[[package]]\nname = \"numpy\"\nversion = \"2.4.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n]\n\n[[package]]\nname = \"packaging\"\nversion = \"25.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"pandas\"\nversion = \"2.3.3\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"numpy\" },\n { name = \"python-dateutil\" },\n { name = \"pytz\" },\n { name = \"tzdata\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n]\n\n[[package]]\nname = \"pandocfilters\"\nversion = \"1.5.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz\", hash = \"sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e\", size = 8454, upload-time = \"2024-01-18T20:08:13.726Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl\", hash = \"sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc\", size = 8663, upload-time = \"2024-01-18T20:08:11.28Z\" },\n]\n\n[[package]]\nname = \"parso\"\nversion = \"0.8.5\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz\", hash = \"sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a\", size = 401205, upload-time = \"2025-08-23T15:15:28.028Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl\", hash = \"sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887\", size = 106668, upload-time = \"2025-08-23T15:15:25.663Z\" },\n]\n\n[[package]]\nname = \"pexpect\"\nversion = \"4.9.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"ptyprocess\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz\", hash = \"sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f\", size = 166450, upload-time = \"2023-11-25T09:07:26.339Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl\", hash = \"sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523\", size = 63772, upload-time = \"2023-11-25T06:56:14.81Z\" },\n]\n\n[[package]]\nname = \"platformdirs\"\nversion = \"4.5.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"plotly\"\nversion = \"6.5.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"narwhals\" },\n { name = \"packaging\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/94/05/1199e2a03ce6637960bc1e951ca0f928209a48cfceb57355806a88f214cf/plotly-6.5.0.tar.gz\", hash = \"sha256:d5d38224883fd38c1409bef7d6a8dc32b74348d39313f3c52ca998b8e447f5c8\", size = 7013624, upload-time = \"2025-11-17T18:39:24.523Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl\", hash = \"sha256:5ac851e100367735250206788a2b1325412aa4a4917a4fe3e6f0bc5aa6f3d90a\", size = 9893174, upload-time = \"2025-11-17T18:39:20.351Z\" },\n]\n\n[[package]]\nname = \"prometheus-client\"\nversion = \"0.23.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/23/53/3edb5d68ecf6b38fcbcc1ad28391117d2a322d9a1a3eff04bfdb184d8c3b/prometheus_client-0.23.1.tar.gz\", hash = \"sha256:6ae8f9081eaaaf153a2e959d2e6c4f4fb57b12ef76c8c7980202f1e57b48b2ce\", size = 80481, upload-time = \"2025-09-18T20:47:25.043Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl\", hash = \"sha256:dd1913e6e76b59cfe44e7a4b83e01afc9873c1bdfd2ed8739f1e76aeca115f99\", size = 61145, upload-time = \"2025-09-18T20:47:23.875Z\" },\n]\n\n[[package]]\nname = \"prompt-toolkit\"\nversion = \"3.0.52\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"wcwidth\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz\", hash = \"sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855\", size = 434198, upload-time = \"2025-08-27T15:24:02.057Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl\", hash = \"sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955\", size = 391431, upload-time = \"2025-08-27T15:23:59.498Z\" },\n]\n\n[[package]]\nname = \"psutil\"\nversion = \"7.2.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/73/cb/09e5184fb5fc0358d110fc3ca7f6b1d033800734d34cac10f4136cfac10e/psutil-7.2.1.tar.gz\", hash = \"sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3\", size = 490253, upload-time = \"2025-12-29T08:26:00.169Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/77/8e/f0c242053a368c2aa89584ecd1b054a18683f13d6e5a318fc9ec36582c94/psutil-7.2.1-cp313-cp313t-macosx_10_13_x86_64.whl\", hash = \"sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d\", size = 129624, upload-time = \"2025-12-29T08:26:04.255Z\" },\n { url = \"https://files.pythonhosted.org/packages/26/97/a58a4968f8990617decee234258a2b4fc7cd9e35668387646c1963e69f26/psutil-7.2.1-cp313-cp313t-macosx_11_0_arm64.whl\", hash = \"sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49\", size = 130132, upload-time = \"2025-12-29T08:26:06.228Z\" },\n { url = \"https://files.pythonhosted.org/packages/db/6d/ed44901e830739af5f72a85fa7ec5ff1edea7f81bfbf4875e409007149bd/psutil-7.2.1-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc\", size = 180612, upload-time = \"2025-12-29T08:26:08.276Z\" },\n { url = \"https://files.pythonhosted.org/packages/c7/65/b628f8459bca4efbfae50d4bf3feaab803de9a160b9d5f3bd9295a33f0c2/psutil-7.2.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf\", size = 183201, upload-time = \"2025-12-29T08:26:10.622Z\" },\n { url = \"https://files.pythonhosted.org/packages/fb/23/851cadc9764edcc18f0effe7d0bf69f727d4cf2442deb4a9f78d4e4f30f2/psutil-7.2.1-cp313-cp313t-win_amd64.whl\", hash = \"sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f\", size = 139081, upload-time = \"2025-12-29T08:26:12.483Z\" },\n { url = \"https://files.pythonhosted.org/packages/59/82/d63e8494ec5758029f31c6cb06d7d161175d8281e91d011a4a441c8a43b5/psutil-7.2.1-cp313-cp313t-win_arm64.whl\", hash = \"sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672\", size = 134767, upload-time = \"2025-12-29T08:26:14.528Z\" },\n { url = \"https://files.pythonhosted.org/packages/05/c2/5fb764bd61e40e1fe756a44bd4c21827228394c17414ade348e28f83cd79/psutil-7.2.1-cp314-cp314t-macosx_10_15_x86_64.whl\", hash = \"sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679\", size = 129716, upload-time = \"2025-12-29T08:26:16.017Z\" },\n { url = \"https://files.pythonhosted.org/packages/c9/d2/935039c20e06f615d9ca6ca0ab756cf8408a19d298ffaa08666bc18dc805/psutil-7.2.1-cp314-cp314t-macosx_11_0_arm64.whl\", hash = \"sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f\", size = 130133, upload-time = \"2025-12-29T08:26:18.009Z\" },\n { url = \"https://files.pythonhosted.org/packages/77/69/19f1eb0e01d24c2b3eacbc2f78d3b5add8a89bf0bb69465bc8d563cc33de/psutil-7.2.1-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129\", size = 181518, upload-time = \"2025-12-29T08:26:20.241Z\" },\n { url = \"https://files.pythonhosted.org/packages/e1/6d/7e18b1b4fa13ad370787626c95887b027656ad4829c156bb6569d02f3262/psutil-7.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a\", size = 184348, upload-time = \"2025-12-29T08:26:22.215Z\" },\n { url = \"https://files.pythonhosted.org/packages/98/60/1672114392dd879586d60dd97896325df47d9a130ac7401318005aab28ec/psutil-7.2.1-cp314-cp314t-win_amd64.whl\", hash = \"sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79\", size = 140400, upload-time = \"2025-12-29T08:26:23.993Z\" },\n { url = \"https://files.pythonhosted.org/packages/fb/7b/d0e9d4513c46e46897b46bcfc410d51fc65735837ea57a25170f298326e6/psutil-7.2.1-cp314-cp314t-win_arm64.whl\", hash = \"sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266\", size = 135430, upload-time = \"2025-12-29T08:26:25.999Z\" },\n { url = \"https://files.pythonhosted.org/packages/c5/cf/5180eb8c8bdf6a503c6919f1da28328bd1e6b3b1b5b9d5b01ae64f019616/psutil-7.2.1-cp36-abi3-macosx_10_9_x86_64.whl\", hash = \"sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42\", size = 128137, upload-time = \"2025-12-29T08:26:27.759Z\" },\n { url = \"https://files.pythonhosted.org/packages/c5/2c/78e4a789306a92ade5000da4f5de3255202c534acdadc3aac7b5458fadef/psutil-7.2.1-cp36-abi3-macosx_11_0_arm64.whl\", hash = \"sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1\", size = 128947, upload-time = \"2025-12-29T08:26:29.548Z\" },\n { url = \"https://files.pythonhosted.org/packages/29/f8/40e01c350ad9a2b3cb4e6adbcc8a83b17ee50dd5792102b6142385937db5/psutil-7.2.1-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8\", size = 154694, upload-time = \"2025-12-29T08:26:32.147Z\" },\n { url = \"https://files.pythonhosted.org/packages/06/e4/b751cdf839c011a9714a783f120e6a86b7494eb70044d7d81a25a5cd295f/psutil-7.2.1-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6\", size = 156136, upload-time = \"2025-12-29T08:26:34.079Z\" },\n { url = \"https://files.pythonhosted.org/packages/44/ad/bbf6595a8134ee1e94a4487af3f132cef7fce43aef4a93b49912a48c3af7/psutil-7.2.1-cp36-abi3-musllinux_1_2_aarch64.whl\", hash = \"sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8\", size = 148108, upload-time = \"2025-12-29T08:26:36.225Z\" },\n { url = \"https://files.pythonhosted.org/packages/1c/15/dd6fd869753ce82ff64dcbc18356093471a5a5adf4f77ed1f805d473d859/psutil-7.2.1-cp36-abi3-musllinux_1_2_x86_64.whl\", hash = \"sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67\", size = 147402, upload-time = \"2025-12-29T08:26:39.21Z\" },\n { url = \"https://files.pythonhosted.org/packages/34/68/d9317542e3f2b180c4306e3f45d3c922d7e86d8ce39f941bb9e2e9d8599e/psutil-7.2.1-cp37-abi3-win_amd64.whl\", hash = \"sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17\", size = 136938, upload-time = \"2025-12-29T08:26:41.036Z\" },\n { url = \"https://files.pythonhosted.org/packages/3e/73/2ce007f4198c80fcf2cb24c169884f833fe93fbc03d55d302627b094ee91/psutil-7.2.1-cp37-abi3-win_arm64.whl\", hash = \"sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442\", size = 133836, upload-time = \"2025-12-29T08:26:43.086Z\" },\n]\n\n[[package]]\nname = \"ptyprocess\"\nversion = \"0.7.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz\", hash = \"sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220\", size = 70762, upload-time = \"2020-12-28T15:15:30.155Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl\", hash = \"sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35\", size = 13993, upload-time = \"2020-12-28T15:15:28.35Z\" },\n]\n\n[[package]]\nname = \"pure-eval\"\nversion = \"0.2.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz\", hash = \"sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42\", size = 19752, upload-time = \"2024-07-21T12:58:21.801Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl\", hash = \"sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0\", size = 11842, upload-time = \"2024-07-21T12:58:20.04Z\" },\n]\n\n[[package]]\nname = \"pycparser\"\nversion = \"2.23\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz\", hash = \"sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2\", size = 173734, upload-time = \"2025-09-09T13:23:47.91Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl\", hash = \"sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934\", size = 118140, upload-time = \"2025-09-09T13:23:46.651Z\" },\n]\n\n[[package]]\nname = \"pygments\"\nversion = \"2.19.2\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz\", hash = \"sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887\", size = 4968631, upload-time = \"2025-06-21T13:39:12.283Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl\", hash = \"sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b\", size = 1225217, upload-time = \"2025-06-21T13:39:07.939Z\" },\n]\n\n[[package]]\nname = \"python-dateutil\"\nversion = \"2.9.0.post0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"six\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"python-json-logger\"\nversion = \"4.0.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/29/bf/eca6a3d43db1dae7070f70e160ab20b807627ba953663ba07928cdd3dc58/python_json_logger-4.0.0.tar.gz\", hash = \"sha256:f58e68eb46e1faed27e0f574a55a0455eecd7b8a5b88b85a784519ba3cff047f\", size = 17683, upload-time = \"2025-10-06T04:15:18.984Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl\", hash = \"sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2\", size = 15548, upload-time = \"2025-10-06T04:15:17.553Z\" },\n]\n\n[[package]]\nname = \"pytz\"\nversion = \"2025.2\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"pywinpty\"\nversion = \"3.0.2\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/f3/bb/a7cc2967c5c4eceb6cc49cfe39447d4bfc56e6c865e7c2249b6eb978935f/pywinpty-3.0.2.tar.gz\", hash = \"sha256:1505cc4cb248af42cb6285a65c9c2086ee9e7e574078ee60933d5d7fa86fb004\", size = 30669, upload-time = \"2025-10-03T21:16:29.205Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/fc/19/b757fe28008236a4a713e813283721b8a40aa60cd7d3f83549f2e25a3155/pywinpty-3.0.2-cp313-cp313-win_amd64.whl\", hash = \"sha256:18f78b81e4cfee6aabe7ea8688441d30247b73e52cd9657138015c5f4ee13a51\", size = 2050057, upload-time = \"2025-10-03T21:19:26.732Z\" },\n { url = \"https://files.pythonhosted.org/packages/cb/44/cbae12ecf6f4fa4129c36871fd09c6bef4f98d5f625ecefb5e2449765508/pywinpty-3.0.2-cp313-cp313t-win_amd64.whl\", hash = \"sha256:663383ecfab7fc382cc97ea5c4f7f0bb32c2f889259855df6ea34e5df42d305b\", size = 2049874, upload-time = \"2025-10-03T21:18:53.923Z\" },\n { url = \"https://files.pythonhosted.org/packages/ca/15/f12c6055e2d7a617d4d5820e8ac4ceaff849da4cb124640ef5116a230771/pywinpty-3.0.2-cp314-cp314-win_amd64.whl\", hash = \"sha256:28297cecc37bee9f24d8889e47231972d6e9e84f7b668909de54f36ca785029a\", size = 2050386, upload-time = \"2025-10-03T21:18:50.477Z\" },\n { url = \"https://files.pythonhosted.org/packages/de/24/c6907c5bb06043df98ad6a0a0ff5db2e0affcecbc3b15c42404393a3f72a/pywinpty-3.0.2-cp314-cp314t-win_amd64.whl\", hash = \"sha256:34b55ae9a1b671fe3eae071d86618110538e8eaad18fcb1531c0830b91a82767\", size = 2049834, upload-time = \"2025-10-03T21:19:25.688Z\" },\n]\n\n[[package]]\nname = \"pyyaml\"\nversion = \"6.0.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n]\n\n[[package]]\nname = \"pyzmq\"\nversion = \"27.1.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"cffi\", marker = \"implementation_name == 'pypy'\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz\", hash = \"sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540\", size = 281750, upload-time = \"2025-09-08T23:10:18.157Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl\", hash = \"sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc\", size = 1306279, upload-time = \"2025-09-08T23:08:03.807Z\" },\n { url = \"https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl\", hash = \"sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113\", size = 895645, upload-time = \"2025-09-08T23:08:05.301Z\" },\n { url = \"https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233\", size = 652574, upload-time = \"2025-09-08T23:08:06.828Z\" },\n { url = \"https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31\", size = 840995, upload-time = \"2025-09-08T23:08:08.396Z\" },\n { url = \"https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl\", hash = \"sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28\", size = 1642070, upload-time = \"2025-09-08T23:08:09.989Z\" },\n { url = \"https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl\", hash = \"sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856\", size = 2021121, upload-time = \"2025-09-08T23:08:11.907Z\" },\n { url = \"https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl\", hash = \"sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496\", size = 1878550, upload-time = \"2025-09-08T23:08:13.513Z\" },\n { url = \"https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl\", hash = \"sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd\", size = 559184, upload-time = \"2025-09-08T23:08:15.163Z\" },\n { url = \"https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl\", hash = \"sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf\", size = 619480, upload-time = \"2025-09-08T23:08:17.192Z\" },\n { url = \"https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl\", hash = \"sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f\", size = 552993, upload-time = \"2025-09-08T23:08:18.926Z\" },\n { url = \"https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl\", hash = \"sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5\", size = 1122436, upload-time = \"2025-09-08T23:08:20.801Z\" },\n { url = \"https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl\", hash = \"sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6\", size = 1156301, upload-time = \"2025-09-08T23:08:22.47Z\" },\n { url = \"https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl\", hash = \"sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7\", size = 1341197, upload-time = \"2025-09-08T23:08:24.286Z\" },\n { url = \"https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl\", hash = \"sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05\", size = 897275, upload-time = \"2025-09-08T23:08:26.063Z\" },\n { url = \"https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9\", size = 660469, upload-time = \"2025-09-08T23:08:27.623Z\" },\n { url = \"https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128\", size = 847961, upload-time = \"2025-09-08T23:08:29.672Z\" },\n { url = \"https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl\", hash = \"sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39\", size = 1650282, upload-time = \"2025-09-08T23:08:31.349Z\" },\n { url = \"https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl\", hash = \"sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97\", size = 2024468, upload-time = \"2025-09-08T23:08:33.543Z\" },\n { url = \"https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl\", hash = \"sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db\", size = 1885394, upload-time = \"2025-09-08T23:08:35.51Z\" },\n { url = \"https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl\", hash = \"sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c\", size = 574964, upload-time = \"2025-09-08T23:08:37.178Z\" },\n { url = \"https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl\", hash = \"sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2\", size = 641029, upload-time = \"2025-09-08T23:08:40.595Z\" },\n { url = \"https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl\", hash = \"sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e\", size = 561541, upload-time = \"2025-09-08T23:08:42.668Z\" },\n { url = \"https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl\", hash = \"sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a\", size = 1341197, upload-time = \"2025-09-08T23:08:44.973Z\" },\n { url = \"https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl\", hash = \"sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea\", size = 897175, upload-time = \"2025-09-08T23:08:46.601Z\" },\n { url = \"https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96\", size = 660427, upload-time = \"2025-09-08T23:08:48.187Z\" },\n { url = \"https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d\", size = 847929, upload-time = \"2025-09-08T23:08:49.76Z\" },\n { url = \"https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl\", hash = \"sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146\", size = 1650193, upload-time = \"2025-09-08T23:08:51.7Z\" },\n { url = \"https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl\", hash = \"sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd\", size = 2024388, upload-time = \"2025-09-08T23:08:53.393Z\" },\n { url = \"https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl\", hash = \"sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a\", size = 1885316, upload-time = \"2025-09-08T23:08:55.702Z\" },\n { url = \"https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl\", hash = \"sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92\", size = 587472, upload-time = \"2025-09-08T23:08:58.18Z\" },\n { url = \"https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl\", hash = \"sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0\", size = 661401, upload-time = \"2025-09-08T23:08:59.802Z\" },\n { url = \"https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl\", hash = \"sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7\", size = 575170, upload-time = \"2025-09-08T23:09:01.418Z\" },\n]\n\n[[package]]\nname = \"referencing\"\nversion = \"0.37.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"attrs\" },\n { name = \"rpds-py\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"requests\"\nversion = \"2.32.5\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"certifi\" },\n { name = \"charset-normalizer\" },\n { name = \"idna\" },\n { name = \"urllib3\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz\", hash = \"sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf\", size = 134517, upload-time = \"2025-08-18T20:46:02.573Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl\", hash = \"sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6\", size = 64738, upload-time = \"2025-08-18T20:46:00.542Z\" },\n]\n\n[[package]]\nname = \"rfc3339-validator\"\nversion = \"0.1.4\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"six\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz\", hash = \"sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b\", size = 5513, upload-time = \"2021-05-12T16:37:54.178Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl\", hash = \"sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa\", size = 3490, upload-time = \"2021-05-12T16:37:52.536Z\" },\n]\n\n[[package]]\nname = \"rfc3986-validator\"\nversion = \"0.1.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz\", hash = \"sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055\", size = 6760, upload-time = \"2019-10-28T16:00:19.144Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl\", hash = \"sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9\", size = 4242, upload-time = \"2019-10-28T16:00:13.976Z\" },\n]\n\n[[package]]\nname = \"rfc3987-syntax\"\nversion = \"1.1.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"lark\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/2c/06/37c1a5557acf449e8e406a830a05bf885ac47d33270aec454ef78675008d/rfc3987_syntax-1.1.0.tar.gz\", hash = \"sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d\", size = 14239, upload-time = \"2025-07-18T01:05:05.015Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl\", hash = \"sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f\", size = 8046, upload-time = \"2025-07-18T01:05:03.843Z\" },\n]\n\n[[package]]\nname = \"rpds-py\"\nversion = \"0.30.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n]\n\n[[package]]\nname = \"send2trash\"\nversion = \"1.8.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/fd/3a/aec9b02217bb79b87bbc1a21bc6abc51e3d5dcf65c30487ac96c0908c722/Send2Trash-1.8.3.tar.gz\", hash = \"sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf\", size = 17394, upload-time = \"2024-04-07T00:01:09.267Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl\", hash = \"sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9\", size = 18072, upload-time = \"2024-04-07T00:01:07.438Z\" },\n]\n\n[[package]]\nname = \"setuptools\"\nversion = \"80.9.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz\", hash = \"sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c\", size = 1319958, upload-time = \"2025-05-27T00:56:51.443Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl\", hash = \"sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922\", size = 1201486, upload-time = \"2025-05-27T00:56:49.664Z\" },\n]\n\n[[package]]\nname = \"six\"\nversion = \"1.17.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"soupsieve\"\nversion = \"2.8.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/89/23/adf3796d740536d63a6fbda113d07e60c734b6ed5d3058d1e47fc0495e47/soupsieve-2.8.1.tar.gz\", hash = \"sha256:4cf733bc50fa805f5df4b8ef4740fc0e0fa6218cf3006269afd3f9d6d80fd350\", size = 117856, upload-time = \"2025-12-18T13:50:34.655Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/48/f3/b67d6ea49ca9154453b6d70b34ea22f3996b9fa55da105a79d8732227adc/soupsieve-2.8.1-py3-none-any.whl\", hash = \"sha256:a11fe2a6f3d76ab3cf2de04eb339c1be5b506a8a47f2ceb6d139803177f85434\", size = 36710, upload-time = \"2025-12-18T13:50:33.267Z\" },\n]\n\n[[package]]\nname = \"stack-data\"\nversion = \"0.6.3\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"asttokens\" },\n { name = \"executing\" },\n { name = \"pure-eval\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz\", hash = \"sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9\", size = 44707, upload-time = \"2023-09-30T13:58:05.479Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl\", hash = \"sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695\", size = 24521, upload-time = \"2023-09-30T13:58:03.53Z\" },\n]\n\n[[package]]\nname = \"terminado\"\nversion = \"0.18.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"ptyprocess\", marker = \"os_name != 'nt'\" },\n { name = \"pywinpty\", marker = \"os_name == 'nt'\" },\n { name = \"tornado\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz\", hash = \"sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e\", size = 32701, upload-time = \"2024-03-12T14:34:39.026Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl\", hash = \"sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0\", size = 14154, upload-time = \"2024-03-12T14:34:36.569Z\" },\n]\n\n[[package]]\nname = \"tinycss2\"\nversion = \"1.4.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"webencodings\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz\", hash = \"sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7\", size = 87085, upload-time = \"2024-10-24T14:58:29.895Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl\", hash = \"sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289\", size = 26610, upload-time = \"2024-10-24T14:58:28.029Z\" },\n]\n\n[[package]]\nname = \"tornado\"\nversion = \"6.5.4\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/37/1d/0a336abf618272d53f62ebe274f712e213f5a03c0b2339575430b8362ef2/tornado-6.5.4.tar.gz\", hash = \"sha256:a22fa9047405d03260b483980635f0b041989d8bcc9a313f8fe18b411d84b1d7\", size = 513632, upload-time = \"2025-12-15T19:21:03.836Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/ab/a9/e94a9d5224107d7ce3cc1fab8d5dc97f5ea351ccc6322ee4fb661da94e35/tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl\", hash = \"sha256:d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9\", size = 443909, upload-time = \"2025-12-15T19:20:48.382Z\" },\n { url = \"https://files.pythonhosted.org/packages/db/7e/f7b8d8c4453f305a51f80dbb49014257bb7d28ccb4bbb8dd328ea995ecad/tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl\", hash = \"sha256:2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843\", size = 442163, upload-time = \"2025-12-15T19:20:49.791Z\" },\n { url = \"https://files.pythonhosted.org/packages/ba/b5/206f82d51e1bfa940ba366a8d2f83904b15942c45a78dd978b599870ab44/tornado-6.5.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\", hash = \"sha256:d1cf66105dc6acb5af613c054955b8137e34a03698aa53272dbda4afe252be17\", size = 445746, upload-time = \"2025-12-15T19:20:51.491Z\" },\n { url = \"https://files.pythonhosted.org/packages/8e/9d/1a3338e0bd30ada6ad4356c13a0a6c35fbc859063fa7eddb309183364ac1/tornado-6.5.4-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl\", hash = \"sha256:50ff0a58b0dc97939d29da29cd624da010e7f804746621c78d14b80238669335\", size = 445083, upload-time = \"2025-12-15T19:20:52.778Z\" },\n { url = \"https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl\", hash = \"sha256:e5fb5e04efa54cf0baabdd10061eb4148e0be137166146fff835745f59ab9f7f\", size = 445315, upload-time = \"2025-12-15T19:20:53.996Z\" },\n { url = \"https://files.pythonhosted.org/packages/27/07/2273972f69ca63dbc139694a3fc4684edec3ea3f9efabf77ed32483b875c/tornado-6.5.4-cp39-abi3-musllinux_1_2_aarch64.whl\", hash = \"sha256:9c86b1643b33a4cd415f8d0fe53045f913bf07b4a3ef646b735a6a86047dda84\", size = 446003, upload-time = \"2025-12-15T19:20:56.101Z\" },\n { url = \"https://files.pythonhosted.org/packages/d1/83/41c52e47502bf7260044413b6770d1a48dda2f0246f95ee1384a3cd9c44a/tornado-6.5.4-cp39-abi3-musllinux_1_2_i686.whl\", hash = \"sha256:6eb82872335a53dd063a4f10917b3efd28270b56a33db69009606a0312660a6f\", size = 445412, upload-time = \"2025-12-15T19:20:57.398Z\" },\n { url = \"https://files.pythonhosted.org/packages/10/c7/bc96917f06cbee182d44735d4ecde9c432e25b84f4c2086143013e7b9e52/tornado-6.5.4-cp39-abi3-musllinux_1_2_x86_64.whl\", hash = \"sha256:6076d5dda368c9328ff41ab5d9dd3608e695e8225d1cd0fd1e006f05da3635a8\", size = 445392, upload-time = \"2025-12-15T19:20:58.692Z\" },\n { url = \"https://files.pythonhosted.org/packages/0c/1a/d7592328d037d36f2d2462f4bc1fbb383eec9278bc786c1b111cbbd44cfa/tornado-6.5.4-cp39-abi3-win32.whl\", hash = \"sha256:1768110f2411d5cd281bac0a090f707223ce77fd110424361092859e089b38d1\", size = 446481, upload-time = \"2025-12-15T19:21:00.008Z\" },\n { url = \"https://files.pythonhosted.org/packages/d6/6d/c69be695a0a64fd37a97db12355a035a6d90f79067a3cf936ec2b1dc38cd/tornado-6.5.4-cp39-abi3-win_amd64.whl\", hash = \"sha256:fa07d31e0cd85c60713f2b995da613588aa03e1303d75705dca6af8babc18ddc\", size = 446886, upload-time = \"2025-12-15T19:21:01.287Z\" },\n { url = \"https://files.pythonhosted.org/packages/50/49/8dc3fd90902f70084bd2cd059d576ddb4f8bb44c2c7c0e33a11422acb17e/tornado-6.5.4-cp39-abi3-win_arm64.whl\", hash = \"sha256:053e6e16701eb6cbe641f308f4c1a9541f91b6261991160391bfc342e8a551a1\", size = 445910, upload-time = \"2025-12-15T19:21:02.571Z\" },\n]\n\n[[package]]\nname = \"traitlets\"\nversion = \"5.14.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz\", hash = \"sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7\", size = 161621, upload-time = \"2024-04-19T11:11:49.746Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl\", hash = \"sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f\", size = 85359, upload-time = \"2024-04-19T11:11:46.763Z\" },\n]\n\n[[package]]\nname = \"typing-extensions\"\nversion = \"4.15.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"tzdata\"\nversion = \"2025.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"uri-template\"\nversion = \"1.3.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz\", hash = \"sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7\", size = 21678, upload-time = \"2023-06-21T01:49:05.374Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl\", hash = \"sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363\", size = 11140, upload-time = \"2023-06-21T01:49:03.467Z\" },\n]\n\n[[package]]\nname = \"urllib3\"\nversion = \"2.6.2\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/1e/24/a2a2ed9addd907787d7aa0355ba36a6cadf1768b934c652ea78acbd59dcd/urllib3-2.6.2.tar.gz\", hash = \"sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797\", size = 432930, upload-time = \"2025-12-11T15:56:40.252Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl\", hash = \"sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd\", size = 131182, upload-time = \"2025-12-11T15:56:38.584Z\" },\n]\n\n[[package]]\nname = \"wcwidth\"\nversion = \"0.2.14\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz\", hash = \"sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605\", size = 102293, upload-time = \"2025-09-22T16:29:53.023Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl\", hash = \"sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1\", size = 37286, upload-time = \"2025-09-22T16:29:51.641Z\" },\n]\n\n[[package]]\nname = \"webcolors\"\nversion = \"25.10.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz\", hash = \"sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf\", size = 53491, upload-time = \"2025-10-31T07:51:03.977Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl\", hash = \"sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d\", size = 14905, upload-time = \"2025-10-31T07:51:01.778Z\" },\n]\n\n[[package]]\nname = \"webencodings\"\nversion = \"0.5.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz\", hash = \"sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923\", size = 9721, upload-time = \"2017-04-05T20:21:34.189Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl\", hash = \"sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78\", size = 11774, upload-time = \"2017-04-05T20:21:32.581Z\" },\n]\n\n[[package]]\nname = \"websocket-client\"\nversion = \"1.9.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz\", hash = \"sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98\", size = 70576, upload-time = \"2025-10-07T21:16:36.495Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl\", hash = \"sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef\", size = 82616, upload-time = \"2025-10-07T21:16:34.951Z\" },\n]\n\n[[package]]\nname = \"widgetsnbextension\"\nversion = \"4.0.15\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/bd/f4/c67440c7fb409a71b7404b7aefcd7569a9c0d6bd071299bf4198ae7a5d95/widgetsnbextension-4.0.15.tar.gz\", hash = \"sha256:de8610639996f1567952d763a5a41af8af37f2575a41f9852a38f947eb82a3b9\", size = 1097402, upload-time = \"2025-11-01T21:15:55.178Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/3f/0e/fa3b193432cfc60c93b42f3be03365f5f909d2b3ea410295cf36df739e31/widgetsnbextension-4.0.15-py3-none-any.whl\", hash = \"sha256:8156704e4346a571d9ce73b84bee86a29906c9abfd7223b7228a28899ccf3366\", size = 2196503, upload-time = \"2025-11-01T21:15:53.565Z\" },\n]\n", + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": { + "088c7c3f8d9b4bd29a2a78bae166420c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "SelectionRangeSliderModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "SelectionRangeSliderModel", + "_options_labels": [ + "2024-01-01 00:00:00", + "2024-02-01 00:00:00", + "2024-03-01 00:00:00", + "2024-04-01 00:00:00", + "2024-05-01 00:00:00", + "2024-06-01 00:00:00", + "2024-07-01 00:00:00", + "2024-08-01 00:00:00", + "2024-09-01 00:00:00", + "2024-10-01 00:00:00", + "2024-11-01 00:00:00", + "2024-12-01 00:00:00", + "2025-01-01 00:00:00", + "2025-02-01 00:00:00", + "2025-03-01 00:00:00", + "2025-04-01 00:00:00", + "2025-05-01 00:00:00", + "2025-06-01 00:00:00" + ], + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "SelectionRangeSliderView", + "behavior": "drag-tap", + "continuous_update": false, + "description": "Month", + "description_allow_html": false, + "disabled": false, + "index": [ + 0, + 17 + ], + "layout": "IPY_MODEL_b784d3b841c343599202ae36d0e5a5e1", + "orientation": "horizontal", + "readout": true, + "style": "IPY_MODEL_4c60b86805b94f74ab04eb892d0ae160", + "tabbable": null, + "tooltip": null + } + }, + "08f565b790644ac7b0a3a970515ce6df": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2734bb50df5c43b2ba90057134674bce", + "IPY_MODEL_5443d921afaf48b098afda61073ab571", + "IPY_MODEL_beef61f9f14645f5bea269baf1b0f83e" + ], + "layout": "IPY_MODEL_7031e135fa504202886dcc22ff1f670e", + "tabbable": null, + "tooltip": null + } + }, + "0cf5843f76c04d06964d00319c0000ea": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1115d4d272b34429abcaca95c0ab92d9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1f6791c4c0c2425abdc64c76daa8d9d6": { + "model_module": "@jupyter-widgets/output", + "model_module_version": "1.0.0", + "model_name": "OutputModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/output", + "_model_module_version": "1.0.0", + "_model_name": "OutputModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/output", + "_view_module_version": "1.0.0", + "_view_name": "OutputView", + "layout": "IPY_MODEL_5dded62f90ce43438e43a79f95423160", + "msg_id": "", + "outputs": [ + { + "data": { + "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
scopeimpressionsclicksconversionsspendrevenueprofitsupply_feeplatform_feenet_profitctrcvrroascpccpanet_margintake_rate
0Filtered1.138645e+10277979797.07397683.01.929273e+08737298840.05.443716e+081.991016e+078951315.95.155101e+080.0244130.0266123.8216410.69403326.079420.6991870.046397
\n
", + "text/plain": " scope impressions clicks conversions spend \\\n0 Filtered 1.138645e+10 277979797.0 7397683.0 1.929273e+08 \n\n revenue profit supply_fee platform_fee net_profit \\\n0 737298840.0 5.443716e+08 1.991016e+07 8951315.9 5.155101e+08 \n\n ctr cvr roas cpc cpa net_margin take_rate \n0 0.024413 0.026612 3.821641 0.694033 26.07942 0.699187 0.046397 " + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": "\n\n
\n", + "text/plain": "alt.VConcatChart(...)" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "tabbable": null, + "tooltip": null + } + }, + "2416c43735a64cfb8e0ae2fcbb460d3d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2442712c975e43e28f5d71a810b11195": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2501a6988d4e4b408c55f83e07a7d0d3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "258369c451204f05a62cfd1fb2bba8b5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "SelectMultipleModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "SelectMultipleModel", + "_options_labels": [ + "Index", + "Magnite", + "OpenX", + "PubMatic" + ], + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "SelectMultipleView", + "description": "Exchange", + "description_allow_html": false, + "disabled": false, + "index": [ + 0, + 1, + 2, + 3 + ], + "layout": "IPY_MODEL_2416c43735a64cfb8e0ae2fcbb460d3d", + "rows": 4, + "style": "IPY_MODEL_1115d4d272b34429abcaca95c0ab92d9", + "tabbable": null, + "tooltip": null + } + }, + "2734bb50df5c43b2ba90057134674bce": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "SelectMultipleModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "SelectMultipleModel", + "_options_labels": [ + "Advertiser 1", + "Advertiser 10", + "Advertiser 11", + "Advertiser 12", + "Advertiser 13", + "Advertiser 14", + "Advertiser 15", + "Advertiser 16", + "Advertiser 17", + "Advertiser 18", + "Advertiser 19", + "Advertiser 2", + "Advertiser 20", + "Advertiser 21", + "Advertiser 22", + "Advertiser 23", + "Advertiser 24", + "Advertiser 25", + "Advertiser 26", + "Advertiser 27", + "Advertiser 28", + "Advertiser 29", + "Advertiser 3", + "Advertiser 30", + "Advertiser 31", + "Advertiser 32", + "Advertiser 33", + "Advertiser 34", + "Advertiser 35", + "Advertiser 36", + "Advertiser 37", + "Advertiser 38", + "Advertiser 39", + "Advertiser 4", + "Advertiser 40", + "Advertiser 5", + "Advertiser 6", + "Advertiser 7", + "Advertiser 8", + "Advertiser 9" + ], + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "SelectMultipleView", + "description": "Advertiser", + "description_allow_html": false, + "disabled": false, + "index": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39 + ], + "layout": "IPY_MODEL_a3f3f4c0fb024c2da3fefe2efb40c0de", + "rows": 6, + "style": "IPY_MODEL_83cf19f12d544812acab3bf945f1ba37", + "tabbable": null, + "tooltip": null + } + }, + "392e76018cec4e71ba28c940cd308990": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "ProgressView", + "bar_style": "", + "description": "", + "description_allow_html": false, + "layout": "IPY_MODEL_6a0e1d8317d244a397d14093736e95d7", + "max": 100, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_672073c4cc1141b39fc3c76a1c2fe7cf", + "tabbable": null, + "tooltip": null, + "value": 100 + } + }, + "3ad42145c7744b5b89718815c436167f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "417e66bf72cf4c15bc15a621638ac371": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "42afee2d377647e2b8f5d5fb4267b052": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ef5450b5fa65484598e26457c8f50871", + "IPY_MODEL_a4d8c22f02314db6b17a5699a0392e2d", + "IPY_MODEL_b66d23ccd5b34bf19b77579175fb7a3d", + "IPY_MODEL_258369c451204f05a62cfd1fb2bba8b5" + ], + "layout": "IPY_MODEL_8ea6af0b0a29402098094488a03e0a56", + "tabbable": null, + "tooltip": null + } + }, + "43979a5bfcf144ff804e82cd92f29853": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "442698e762b3444ebd58a719f8d830ef": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "VBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "VBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "VBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_088c7c3f8d9b4bd29a2a78bae166420c", + "IPY_MODEL_08f565b790644ac7b0a3a970515ce6df", + "IPY_MODEL_a397a09ab2d04d5883ee7b80de5a8ea0", + "IPY_MODEL_42afee2d377647e2b8f5d5fb4267b052" + ], + "layout": "IPY_MODEL_43979a5bfcf144ff804e82cd92f29853", + "tabbable": null, + "tooltip": null + } + }, + "45b82ceefdbf4731827f31ddd63d4a8d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "46310ddef2284c00bae8edaed903a282": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4c60b86805b94f74ab04eb892d0ae160": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "SliderStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "SliderStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "description_width": "", + "handle_color": null + } + }, + "5443d921afaf48b098afda61073ab571": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "SelectMultipleModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "SelectMultipleModel", + "_options_labels": [ + "BlueSky Growth", + "Nimbus Creative", + "Northwind Media", + "Starlight Performance", + "Vertex Digital" + ], + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "SelectMultipleView", + "description": "Agency", + "description_allow_html": false, + "disabled": false, + "index": [ + 0, + 1, + 2, + 3, + 4 + ], + "layout": "IPY_MODEL_a20aa0513bf043deb890e86e96f2e94f", + "rows": 5, + "style": "IPY_MODEL_9321680d656a41388f46b9dbaff5d605", + "tabbable": null, + "tooltip": null + } + }, + "5dded62f90ce43438e43a79f95423160": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "60da1d80b0264bdbb81efd2ac7196e5e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "669fadada7bd48659dcf4083f5bd69d7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "SelectMultipleModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "SelectMultipleModel", + "_options_labels": [ + "CTV", + "Desktop", + "Mobile" + ], + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "SelectMultipleView", + "description": "Device", + "description_allow_html": false, + "disabled": false, + "index": [ + 0, + 1, + 2 + ], + "layout": "IPY_MODEL_2501a6988d4e4b408c55f83e07a7d0d3", + "rows": 4, + "style": "IPY_MODEL_0cf5843f76c04d06964d00319c0000ea", + "tabbable": null, + "tooltip": null + } + }, + "671241300dbc4e4fa6a9a043780ecbcf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "672073c4cc1141b39fc3c76a1c2fe7cf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "bar_color": "black", + "description_width": "" + } + }, + "6a0e1d8317d244a397d14093736e95d7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "auto" + } + }, + "7031e135fa504202886dcc22ff1f670e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "83cf19f12d544812acab3bf945f1ba37": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "85365bd24d5b4cb78fb936ed851f7039": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8ea6af0b0a29402098094488a03e0a56": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "91721e937a6b4cd58bf1752b734bfc91": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9321680d656a41388f46b9dbaff5d605": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9866a56aa0b342139522c25c7ba21059": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "SelectMultipleModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "SelectMultipleModel", + "_options_labels": [ + "Display", + "Search", + "Social", + "Video" + ], + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "SelectMultipleView", + "description": "Channel", + "description_allow_html": false, + "disabled": false, + "index": [ + 0, + 1, + 2, + 3 + ], + "layout": "IPY_MODEL_3ad42145c7744b5b89718815c436167f", + "rows": 5, + "style": "IPY_MODEL_671241300dbc4e4fa6a9a043780ecbcf", + "tabbable": null, + "tooltip": null + } + }, + "9ec64a79bbd24b61b4424ae4bcea4961": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a20aa0513bf043deb890e86e96f2e94f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a397a09ab2d04d5883ee7b80de5a8ea0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9866a56aa0b342139522c25c7ba21059", + "IPY_MODEL_669fadada7bd48659dcf4083f5bd69d7", + "IPY_MODEL_ed01e541e44e459e9b5394bc1890570a" + ], + "layout": "IPY_MODEL_b8054c040a2e402b8d85d8f6470593e6", + "tabbable": null, + "tooltip": null + } + }, + "a3f3f4c0fb024c2da3fefe2efb40c0de": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a4d8c22f02314db6b17a5699a0392e2d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "SelectMultipleModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "SelectMultipleModel", + "_options_labels": [ + "Retargeting" + ], + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "SelectMultipleView", + "description": "Audience", + "description_allow_html": false, + "disabled": false, + "index": [ + 0 + ], + "layout": "IPY_MODEL_d912510393724a45a8496efcf920a00f", + "rows": 5, + "style": "IPY_MODEL_2442712c975e43e28f5d71a810b11195", + "tabbable": null, + "tooltip": null + } + }, + "b66d23ccd5b34bf19b77579175fb7a3d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "SelectMultipleModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "SelectMultipleModel", + "_options_labels": [ + "Open Auction", + "PG", + "PMP" + ], + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "SelectMultipleView", + "description": "Deal", + "description_allow_html": false, + "disabled": false, + "index": [ + 0, + 1, + 2 + ], + "layout": "IPY_MODEL_45b82ceefdbf4731827f31ddd63d4a8d", + "rows": 4, + "style": "IPY_MODEL_417e66bf72cf4c15bc15a621638ac371", + "tabbable": null, + "tooltip": null + } + }, + "b784d3b841c343599202ae36d0e5a5e1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "95%" + } + }, + "b8054c040a2e402b8d85d8f6470593e6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "beef61f9f14645f5bea269baf1b0f83e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "SelectMultipleModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "SelectMultipleModel", + "_options_labels": [ + "Brand 1", + "Brand 10", + "Brand 11", + "Brand 12", + "Brand 13", + "Brand 14", + "Brand 15", + "Brand 16", + "Brand 17", + "Brand 18", + "Brand 19", + "Brand 2", + "Brand 20", + "Brand 21", + "Brand 22", + "Brand 23", + "Brand 24", + "Brand 25", + "Brand 26", + "Brand 27", + "Brand 28", + "Brand 29", + "Brand 3", + "Brand 30", + "Brand 31", + "Brand 32", + "Brand 33", + "Brand 34", + "Brand 35", + "Brand 36", + "Brand 37", + "Brand 38", + "Brand 39", + "Brand 4", + "Brand 40", + "Brand 5", + "Brand 6", + "Brand 7", + "Brand 8", + "Brand 9" + ], + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "SelectMultipleView", + "description": "Brand", + "description_allow_html": false, + "disabled": false, + "index": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39 + ], + "layout": "IPY_MODEL_91721e937a6b4cd58bf1752b734bfc91", + "rows": 5, + "style": "IPY_MODEL_9ec64a79bbd24b61b4424ae4bcea4961", + "tabbable": null, + "tooltip": null + } + }, + "d912510393724a45a8496efcf920a00f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ed01e541e44e459e9b5394bc1890570a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "SelectMultipleModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "SelectMultipleModel", + "_options_labels": [ + "Acquisition", + "Awareness", + "Performance" + ], + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "SelectMultipleView", + "description": "Objective", + "description_allow_html": false, + "disabled": false, + "index": [ + 0, + 1, + 2 + ], + "layout": "IPY_MODEL_60da1d80b0264bdbb81efd2ac7196e5e", + "rows": 4, + "style": "IPY_MODEL_85365bd24d5b4cb78fb936ed851f7039", + "tabbable": null, + "tooltip": null + } + }, + "ef5450b5fa65484598e26457c8f50871": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "2.0.0", + "model_name": "SelectMultipleModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "2.0.0", + "_model_name": "SelectMultipleModel", + "_options_labels": [ + "FinTech", + "Gaming", + "Retail", + "SaaS" + ], + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "2.0.0", + "_view_name": "SelectMultipleView", + "description": "Vertical", + "description_allow_html": false, + "disabled": false, + "index": [ + 0, + 1, + 2, + 3 + ], + "layout": "IPY_MODEL_f60e9cea5b834859b3fea5faf57b9b5a", + "rows": 4, + "style": "IPY_MODEL_46310ddef2284c00bae8edaed903a282", + "tabbable": null, + "tooltip": null + } + }, + "f60e9cea5b834859b3fea5faf57b9b5a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "2.0.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "2.0.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "2.0.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border_bottom": null, + "border_left": null, + "border_right": null, + "border_top": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + } + }, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}\n \ No newline at end of file diff --git a/docs/yardstick_looker_demo.ipynb b/docs/yardstick_looker_demo.ipynb new file mode 100644 index 0000000..d1ae2b7 --- /dev/null +++ b/docs/yardstick_looker_demo.ipynb @@ -0,0 +1,3302 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "a2f68818", + "metadata": { + "jupyter": { + "source_hidden": true + } + }, + "outputs": [], + "source": [ + "# /// script\n", + "# requires-python = \">=3.13\"\n", + "# dependencies = [\n", + "# \"duckdb\",\n", + "# \"jupyterlab\",\n", + "# \"pandas\",\n", + "# \"plotly\",\n", + "# ]\n", + "#\n", + "# [tool.uv]\n", + "# exclude-newer = \"2025-12-29T09:27:12.558381-08:00\"\n", + "# ///" + ] + }, + { + "cell_type": "markdown", + "id": "eaf7f6df", + "metadata": {}, + "source": [ + "# Yardstick + DuckDB: Looker-style measures\n", + "\n", + "This notebook builds a small ecommerce dataset, defines measures with Yardstick, and runs Looker-style analyses: percent of total, filtered totals, YoY, and drill-downs.\n", + "\n", + "Run from the repo root with juv:\n", + "\n", + "```bash\n", + "# optional install\n", + "uv tool install juv\n", + "\n", + "# run (no install)\n", + "uvx juv run docs/yardstick_looker_demo.ipynb\n", + "# or\n", + "juv run docs/yardstick_looker_demo.ipynb\n", + "```\n", + "\n", + "If the local extension is built, the notebook loads it from `build/release/extension/yardstick/yardstick.duckdb_extension`. Otherwise it falls back to `INSTALL yardstick FROM community`.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "f295506a", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "import duckdb\n", + "import pandas as pd\n", + "import plotly.express as px\n", + "from IPython.display import display\n", + "\n", + "conn = duckdb.connect(database=\":memory:\", config={\"allow_unsigned_extensions\": \"true\"})\n", + "\n", + "ext_path = Path(\"build/release/extension/yardstick/yardstick.duckdb_extension\").resolve()\n", + "if ext_path.exists():\n", + " conn.execute(f\"LOAD '{ext_path.as_posix()}'\")\n", + "else:\n", + " conn.execute(\"INSTALL yardstick FROM community\")\n", + " conn.execute(\"LOAD yardstick\")\n", + "\n", + "def exec_sql(sql: str) -> None:\n", + " conn.execute(sql)\n", + "\n", + "def df_sql(sql: str) -> pd.DataFrame:\n", + " return conn.sql(sql).df()\n" + ] + }, + { + "cell_type": "markdown", + "id": "7f33446d", + "metadata": {}, + "source": [ + "## Create sample data\n", + "\n", + "Deterministic data with 2 years of orders, region, channel, and category.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "d2377c65", + "metadata": {}, + "outputs": [], + "source": [ + "exec_sql(\"\"\"\n", + "create or replace table orders as\n", + "with seed as (\n", + " select\n", + " order_id,\n", + " date '2023-01-01' + (order_id % 730)::integer as order_date,\n", + " case\n", + " when order_id % 4 = 0 then 'North'\n", + " when order_id % 4 = 1 then 'South'\n", + " when order_id % 4 = 2 then 'East'\n", + " else 'West'\n", + " end as region,\n", + " case\n", + " when order_id % 3 = 0 then 'Online'\n", + " when order_id % 3 = 1 then 'Retail'\n", + " else 'Partner'\n", + " end as channel,\n", + " case\n", + " when order_id % 5 = 0 then 'Hardware'\n", + " when order_id % 5 = 1 then 'Software'\n", + " when order_id % 5 = 2 then 'Accessories'\n", + " when order_id % 5 = 3 then 'Services'\n", + " else 'Support'\n", + " end as category,\n", + " 1 + (order_id % 5) as quantity,\n", + " 1 + (order_id % 800) as customer_id\n", + " from range(1, 2401) t(order_id)\n", + "),\n", + "dated as (\n", + " select\n", + " *,\n", + " extract(year from order_date) as year,\n", + " extract(month from order_date) as month\n", + " from seed\n", + "),\n", + "priced as (\n", + " select\n", + " *,\n", + " case category\n", + " when 'Hardware' then 120 + (order_id % 80)\n", + " when 'Software' then 60 + (order_id % 50)\n", + " when 'Accessories' then 25 + (order_id % 20)\n", + " when 'Services' then 90 + (order_id % 40)\n", + " else 30 + (order_id % 25)\n", + " end as unit_price,\n", + " case\n", + " when month in (11, 12) then 1.2\n", + " when month in (6, 7) then 1.08\n", + " when month in (3, 4) then 0.97\n", + " else 1.0\n", + " end as seasonality\n", + " from dated\n", + ")\n", + "select\n", + " order_id,\n", + " order_date,\n", + " year,\n", + " month,\n", + " region,\n", + " channel,\n", + " category,\n", + " quantity,\n", + " unit_price,\n", + " round(quantity * unit_price * seasonality, 2) as revenue,\n", + " customer_id\n", + "from priced;\n", + "\"\"\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "b1849761", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
order_idorder_dateyearmonthregionchannelcategoryquantityunit_pricerevenuecustomer_id
012023-01-0220231SouthRetailSoftware261122.02
122023-01-0320231EastPartnerAccessories32781.03
232023-01-0420231WestOnlineServices493372.04
342023-01-0520231NorthRetailSupport534170.05
452023-01-0620231SouthPartnerHardware1125125.06
562023-01-0720231EastOnlineSoftware266132.07
672023-01-0820231WestRetailAccessories33296.08
782023-01-0920231NorthPartnerServices498392.09
\n", + "
" + ], + "text/plain": [ + " order_id order_date year month region channel category quantity \\\n", + "0 1 2023-01-02 2023 1 South Retail Software 2 \n", + "1 2 2023-01-03 2023 1 East Partner Accessories 3 \n", + "2 3 2023-01-04 2023 1 West Online Services 4 \n", + "3 4 2023-01-05 2023 1 North Retail Support 5 \n", + "4 5 2023-01-06 2023 1 South Partner Hardware 1 \n", + "5 6 2023-01-07 2023 1 East Online Software 2 \n", + "6 7 2023-01-08 2023 1 West Retail Accessories 3 \n", + "7 8 2023-01-09 2023 1 North Partner Services 4 \n", + "\n", + " unit_price revenue customer_id \n", + "0 61 122.0 2 \n", + "1 27 81.0 3 \n", + "2 93 372.0 4 \n", + "3 34 170.0 5 \n", + "4 125 125.0 6 \n", + "5 66 132.0 7 \n", + "6 32 96.0 8 \n", + "7 98 392.0 9 " + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"select * from orders limit 8\"))\n" + ] + }, + { + "cell_type": "markdown", + "id": "1e81d25a", + "metadata": {}, + "source": [ + "## Define measures\n", + "\n", + "Measures live in views. Yardstick handles the grouping.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c8a8fe58", + "metadata": {}, + "outputs": [], + "source": [ + "exec_sql(\"\"\"\n", + "create or replace view orders_v as\n", + "select\n", + " year,\n", + " month,\n", + " region,\n", + " channel,\n", + " category,\n", + " sum(revenue) as measure revenue,\n", + " count(*) as measure orders\n", + "from orders;\n", + "\n", + "create or replace view orders_online_2024_v as\n", + "select\n", + " category,\n", + " sum(revenue) as measure revenue\n", + "from orders\n", + "where year = 2024 and channel = 'Online';\n", + "\"\"\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "693a5a02", + "metadata": {}, + "source": [ + "## KPI overview\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "6881be7a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
scoperevenueordersaov
0All543530.971276425.96471
\n", + "
" + ], + "text/plain": [ + " scope revenue orders aov\n", + "0 All 543530.97 1276 425.96471" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"\"\"\n", + "SEMANTIC SELECT\n", + " 'All' as scope,\n", + " aggregate(revenue) as revenue,\n", + " aggregate(orders) as orders,\n", + " aggregate(revenue) / aggregate(orders) as aov\n", + "from orders_v as _outer;\n", + "\"\"\"))\n" + ] + }, + { + "cell_type": "markdown", + "id": "45e73efb", + "metadata": {}, + "source": [ + "## Revenue by region and percent of total\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7a06a14c", + "metadata": { + "execution": { + "iopub.execute_input": "2025-12-29T07:58:57.845175Z", + "iopub.status.busy": "2025-12-29T07:58:57.845069Z", + "iopub.status.idle": "2025-12-29T07:58:57.853831Z", + "shell.execute_reply": "2025-12-29T07:58:57.853473Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
regionrevenuepct_total
0South138988.2725.571362
1East137768.6025.346964
2North135297.3524.892298
3West131476.7524.189376
\n", + "
" + ], + "text/plain": [ + " region revenue pct_total\n", + "0 South 138988.27 25.571362\n", + "1 East 137768.60 25.346964\n", + "2 North 135297.35 24.892298\n", + "3 West 131476.75 24.189376" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"\"\"\n", + "SELECT\n", + " _outer.region,\n", + " aggregate(revenue) as revenue,\n", + " 100.0 * aggregate(revenue) / aggregate(revenue) at (all) as pct_total\n", + "from orders_v as _outer\n", + "order by revenue desc;\n", + "\"\"\"))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "a7374c90", + "metadata": { + "execution": { + "iopub.execute_input": "2025-12-29T07:58:57.854979Z", + "iopub.status.busy": "2025-12-29T07:58:57.854893Z", + "iopub.status.idle": "2025-12-29T07:58:58.541046Z", + "shell.execute_reply": "2025-12-29T07:58:58.540582Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
regionrevenuepct_totalpct_total_label
0South138988.2725.57136225.6%
1East137768.6025.34696425.3%
2North135297.3524.89229824.9%
3West131476.7524.18937624.2%
\n", + "
" + ], + "text/plain": [ + " region revenue pct_total pct_total_label\n", + "0 South 138988.27 25.571362 25.6%\n", + "1 East 137768.60 25.346964 25.3%\n", + "2 North 135297.35 24.892298 24.9%\n", + "3 West 131476.75 24.189376 24.2%" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "region=%{x}
revenue=%{y}
pct_total_label=%{text}", + "legendgroup": "", + "marker": { + "color": "#636efa", + "pattern": { + "shape": "" + } + }, + "name": "", + "orientation": "v", + "showlegend": false, + "text": [ + "25.6%", + "25.3%", + "24.9%", + "24.2%" + ], + "textposition": "outside", + "type": "bar", + "x": [ + "South", + "East", + "North", + "West" + ], + "xaxis": "x", + "y": { + "bdata": "j8L1KGL3AEHNzMzMRNEAQc3MzMwKhABBAAAAAKYMAEE=", + "dtype": "f8" + }, + "yaxis": "y" + } + ], + "layout": { + "barmode": "relative", + "legend": { + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "Revenue by Region (share of total)" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "region" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "revenue" + } + } + } + }, + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "region_df = df_sql(\"\"\"\n", + "SELECT\n", + " _outer.region,\n", + " aggregate(revenue) as revenue,\n", + " 100.0 * aggregate(revenue) / aggregate(revenue) at (all) as pct_total\n", + "from orders_v as _outer\n", + "order by revenue desc;\n", + "\"\"\")\n", + "region_df[\"pct_total_label\"] = region_df[\"pct_total\"].map(lambda v: f\"{float(v):.1f}%\")\n", + "display(region_df)\n", + "fig = px.bar(\n", + " region_df,\n", + " x=\"region\",\n", + " y=\"revenue\",\n", + " text=\"pct_total_label\",\n", + " title=\"Revenue by Region (share of total)\"\n", + ")\n", + "fig.update_traces(textposition=\"outside\")\n", + "fig.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "81f05cb8", + "metadata": {}, + "source": [ + "## Share within year\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "21e0af1c", + "metadata": { + "execution": { + "iopub.execute_input": "2025-12-29T07:58:58.542326Z", + "iopub.status.busy": "2025-12-29T07:58:58.542219Z", + "iopub.status.idle": "2025-12-29T07:58:58.550217Z", + "shell.execute_reply": "2025-12-29T07:58:58.549719Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearregionrevenuepct_of_year
02023South75422.4625.558945
12023East74828.9525.357818
22023North73286.7024.835185
32023West71554.1224.248053
42024South63565.8125.586110
52024East62939.6525.334072
62024North62010.6524.960137
72024West59922.6324.119680
\n", + "
" + ], + "text/plain": [ + " year region revenue pct_of_year\n", + "0 2023 South 75422.46 25.558945\n", + "1 2023 East 74828.95 25.357818\n", + "2 2023 North 73286.70 24.835185\n", + "3 2023 West 71554.12 24.248053\n", + "4 2024 South 63565.81 25.586110\n", + "5 2024 East 62939.65 25.334072\n", + "6 2024 North 62010.65 24.960137\n", + "7 2024 West 59922.63 24.119680" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"\"\"\n", + "SELECT\n", + " _outer.year,\n", + " _outer.region,\n", + " aggregate(revenue) as revenue,\n", + " 100.0 * aggregate(revenue) / aggregate(revenue) at (all region) as pct_of_year\n", + "from orders_v as _outer\n", + "order by year, revenue desc;\n", + "\"\"\"))\n" + ] + }, + { + "cell_type": "markdown", + "id": "a261a368", + "metadata": {}, + "source": [ + "## Channel mix within region\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "58eb0380", + "metadata": { + "execution": { + "iopub.execute_input": "2025-12-29T07:58:58.551573Z", + "iopub.status.busy": "2025-12-29T07:58:58.551477Z", + "iopub.status.idle": "2025-12-29T07:58:58.560535Z", + "shell.execute_reply": "2025-12-29T07:58:58.560051Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
yearregionchannelrevenuechannel_share
02023EastRetail25290.3033.797481
12023EastPartner24981.3033.384539
22023EastOnline24557.3532.817980
32023NorthOnline25001.0534.114034
42023NorthPartner24288.4533.141689
52023NorthRetail23997.2032.744277
62023SouthRetail25165.8033.366453
72023SouthPartner25148.4633.343463
82023SouthOnline25108.2033.290084
92023WestPartner23940.2533.457542
102023WestOnline23822.0633.292367
112023WestRetail23791.8133.250091
122024EastOnline21349.2033.920112
132024EastPartner20942.3533.273699
142024EastRetail20648.1032.806188
152024NorthRetail21071.0033.979647
162024NorthPartner20784.7033.517952
172024NorthOnline20154.9532.502401
182024SouthPartner21217.7533.379186
192024SouthOnline21180.5833.320711
202024SouthRetail21167.4833.300103
212024WestRetail20085.3033.518722
222024WestOnline20002.2533.380127
232024WestPartner19835.0833.101151
\n", + "
" + ], + "text/plain": [ + " year region channel revenue channel_share\n", + "0 2023 East Retail 25290.30 33.797481\n", + "1 2023 East Partner 24981.30 33.384539\n", + "2 2023 East Online 24557.35 32.817980\n", + "3 2023 North Online 25001.05 34.114034\n", + "4 2023 North Partner 24288.45 33.141689\n", + "5 2023 North Retail 23997.20 32.744277\n", + "6 2023 South Retail 25165.80 33.366453\n", + "7 2023 South Partner 25148.46 33.343463\n", + "8 2023 South Online 25108.20 33.290084\n", + "9 2023 West Partner 23940.25 33.457542\n", + "10 2023 West Online 23822.06 33.292367\n", + "11 2023 West Retail 23791.81 33.250091\n", + "12 2024 East Online 21349.20 33.920112\n", + "13 2024 East Partner 20942.35 33.273699\n", + "14 2024 East Retail 20648.10 32.806188\n", + "15 2024 North Retail 21071.00 33.979647\n", + "16 2024 North Partner 20784.70 33.517952\n", + "17 2024 North Online 20154.95 32.502401\n", + "18 2024 South Partner 21217.75 33.379186\n", + "19 2024 South Online 21180.58 33.320711\n", + "20 2024 South Retail 21167.48 33.300103\n", + "21 2024 West Retail 20085.30 33.518722\n", + "22 2024 West Online 20002.25 33.380127\n", + "23 2024 West Partner 19835.08 33.101151" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"\"\"\n", + "SELECT\n", + " _outer.year,\n", + " _outer.region,\n", + " _outer.channel,\n", + " aggregate(revenue) as revenue,\n", + " 100.0 * aggregate(revenue) / aggregate(revenue) at (all channel) as channel_share\n", + "from orders_v as _outer\n", + "order by year, region, revenue desc;\n", + "\"\"\"))\n" + ] + }, + { + "cell_type": "markdown", + "id": "7391cd14", + "metadata": {}, + "source": [ + "## Year over year growth\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "069053d7", + "metadata": { + "execution": { + "iopub.execute_input": "2025-12-29T07:58:58.561693Z", + "iopub.status.busy": "2025-12-29T07:58:58.561605Z", + "iopub.status.idle": "2025-12-29T07:58:58.584527Z", + "shell.execute_reply": "2025-12-29T07:58:58.583944Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
regionrev_2024rev_2023yoy_changeyoy_pct
0North62010.6573286.70-11276.05-15.386216
1West59922.6371554.12-11631.49-16.255514
2South63565.8175422.46-11856.65-15.720317
3East62939.6574828.95-11889.30-15.888637
\n", + "
" + ], + "text/plain": [ + " region rev_2024 rev_2023 yoy_change yoy_pct\n", + "0 North 62010.65 73286.70 -11276.05 -15.386216\n", + "1 West 59922.63 71554.12 -11631.49 -16.255514\n", + "2 South 63565.81 75422.46 -11856.65 -15.720317\n", + "3 East 62939.65 74828.95 -11889.30 -15.888637" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"\"\"\n", + "SELECT\n", + " _outer.region,\n", + " aggregate(revenue) at (set year = 2024) as rev_2024,\n", + " aggregate(revenue) at (set year = 2023) as rev_2023,\n", + " aggregate(revenue) at (set year = 2024) - aggregate(revenue) at (set year = 2023) as yoy_change,\n", + " 100.0 * (aggregate(revenue) at (set year = 2024) - aggregate(revenue) at (set year = 2023))\n", + " / nullif(aggregate(revenue) at (set year = 2023), 0) as yoy_pct\n", + "from orders_v as _outer\n", + "order by yoy_change desc;\n", + "\"\"\"))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "c2dd9184", + "metadata": { + "execution": { + "iopub.execute_input": "2025-12-29T07:58:58.585799Z", + "iopub.status.busy": "2025-12-29T07:58:58.585697Z", + "iopub.status.idle": "2025-12-29T07:58:58.690246Z", + "shell.execute_reply": "2025-12-29T07:58:58.689629Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
regionrev_2024rev_2023yoy_changeyoy_pctyoy_pct_label
0North62010.6573286.70-11276.05-15.386216-15.4%
1West59922.6371554.12-11631.49-16.255514-16.3%
2South63565.8175422.46-11856.65-15.720317-15.7%
3East62939.6574828.95-11889.30-15.888637-15.9%
\n", + "
" + ], + "text/plain": [ + " region rev_2024 rev_2023 yoy_change yoy_pct yoy_pct_label\n", + "0 North 62010.65 73286.70 -11276.05 -15.386216 -15.4%\n", + "1 West 59922.63 71554.12 -11631.49 -16.255514 -16.3%\n", + "2 South 63565.81 75422.46 -11856.65 -15.720317 -15.7%\n", + "3 East 62939.65 74828.95 -11889.30 -15.888637 -15.9%" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.plotly.v1+json": { + "config": { + "plotlyServerURL": "https://plot.ly" + }, + "data": [ + { + "hovertemplate": "region=%{x}
yoy_change=%{y}
yoy_pct_label=%{text}
yoy_pct=%{marker.color}", + "legendgroup": "", + "marker": { + "color": { + "bdata": "llBIHL7FLsCUn7RdaUEwwI+to2zNcC/AnykwY/vGL8A=", + "dtype": "f8" + }, + "coloraxis": "coloraxis", + "pattern": { + "shape": "" + } + }, + "name": "", + "orientation": "v", + "showlegend": false, + "text": [ + "-15.4%", + "-16.3%", + "-15.7%", + "-15.9%" + ], + "textposition": "outside", + "type": "bar", + "x": [ + "North", + "West", + "South", + "East" + ], + "xaxis": "x", + "y": { + "bdata": "ZmZmZgYGxsCF61G4vrfGwDMzMzNTKMfAZmZmZqY4x8A=", + "dtype": "f8" + }, + "yaxis": "y" + } + ], + "layout": { + "barmode": "relative", + "coloraxis": { + "colorbar": { + "title": { + "text": "yoy_pct" + } + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "legend": { + "tracegroupgap": 0 + }, + "template": { + "data": { + "bar": [ + { + "error_x": { + "color": "#2a3f5f" + }, + "error_y": { + "color": "#2a3f5f" + }, + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "bar" + } + ], + "barpolar": [ + { + "marker": { + "line": { + "color": "#E5ECF6", + "width": 0.5 + }, + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "barpolar" + } + ], + "carpet": [ + { + "aaxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "baxis": { + "endlinecolor": "#2a3f5f", + "gridcolor": "white", + "linecolor": "white", + "minorgridcolor": "white", + "startlinecolor": "#2a3f5f" + }, + "type": "carpet" + } + ], + "choropleth": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "choropleth" + } + ], + "contour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "contour" + } + ], + "contourcarpet": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "contourcarpet" + } + ], + "heatmap": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "heatmap" + } + ], + "histogram": [ + { + "marker": { + "pattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + } + }, + "type": "histogram" + } + ], + "histogram2d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2d" + } + ], + "histogram2dcontour": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "histogram2dcontour" + } + ], + "mesh3d": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "type": "mesh3d" + } + ], + "parcoords": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "parcoords" + } + ], + "pie": [ + { + "automargin": true, + "type": "pie" + } + ], + "scatter": [ + { + "fillpattern": { + "fillmode": "overlay", + "size": 10, + "solidity": 0.2 + }, + "type": "scatter" + } + ], + "scatter3d": [ + { + "line": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatter3d" + } + ], + "scattercarpet": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattercarpet" + } + ], + "scattergeo": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergeo" + } + ], + "scattergl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattergl" + } + ], + "scattermap": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermap" + } + ], + "scattermapbox": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scattermapbox" + } + ], + "scatterpolar": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolar" + } + ], + "scatterpolargl": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterpolargl" + } + ], + "scatterternary": [ + { + "marker": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "type": "scatterternary" + } + ], + "surface": [ + { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + }, + "colorscale": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "type": "surface" + } + ], + "table": [ + { + "cells": { + "fill": { + "color": "#EBF0F8" + }, + "line": { + "color": "white" + } + }, + "header": { + "fill": { + "color": "#C8D4E3" + }, + "line": { + "color": "white" + } + }, + "type": "table" + } + ] + }, + "layout": { + "annotationdefaults": { + "arrowcolor": "#2a3f5f", + "arrowhead": 0, + "arrowwidth": 1 + }, + "autotypenumbers": "strict", + "coloraxis": { + "colorbar": { + "outlinewidth": 0, + "ticks": "" + } + }, + "colorscale": { + "diverging": [ + [ + 0, + "#8e0152" + ], + [ + 0.1, + "#c51b7d" + ], + [ + 0.2, + "#de77ae" + ], + [ + 0.3, + "#f1b6da" + ], + [ + 0.4, + "#fde0ef" + ], + [ + 0.5, + "#f7f7f7" + ], + [ + 0.6, + "#e6f5d0" + ], + [ + 0.7, + "#b8e186" + ], + [ + 0.8, + "#7fbc41" + ], + [ + 0.9, + "#4d9221" + ], + [ + 1, + "#276419" + ] + ], + "sequential": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ], + "sequentialminus": [ + [ + 0, + "#0d0887" + ], + [ + 0.1111111111111111, + "#46039f" + ], + [ + 0.2222222222222222, + "#7201a8" + ], + [ + 0.3333333333333333, + "#9c179e" + ], + [ + 0.4444444444444444, + "#bd3786" + ], + [ + 0.5555555555555556, + "#d8576b" + ], + [ + 0.6666666666666666, + "#ed7953" + ], + [ + 0.7777777777777778, + "#fb9f3a" + ], + [ + 0.8888888888888888, + "#fdca26" + ], + [ + 1, + "#f0f921" + ] + ] + }, + "colorway": [ + "#636efa", + "#EF553B", + "#00cc96", + "#ab63fa", + "#FFA15A", + "#19d3f3", + "#FF6692", + "#B6E880", + "#FF97FF", + "#FECB52" + ], + "font": { + "color": "#2a3f5f" + }, + "geo": { + "bgcolor": "white", + "lakecolor": "white", + "landcolor": "#E5ECF6", + "showlakes": true, + "showland": true, + "subunitcolor": "white" + }, + "hoverlabel": { + "align": "left" + }, + "hovermode": "closest", + "mapbox": { + "style": "light" + }, + "paper_bgcolor": "white", + "plot_bgcolor": "#E5ECF6", + "polar": { + "angularaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "radialaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "scene": { + "xaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "yaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + }, + "zaxis": { + "backgroundcolor": "#E5ECF6", + "gridcolor": "white", + "gridwidth": 2, + "linecolor": "white", + "showbackground": true, + "ticks": "", + "zerolinecolor": "white" + } + }, + "shapedefaults": { + "line": { + "color": "#2a3f5f" + } + }, + "ternary": { + "aaxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "baxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + }, + "bgcolor": "#E5ECF6", + "caxis": { + "gridcolor": "white", + "linecolor": "white", + "ticks": "" + } + }, + "title": { + "x": 0.05 + }, + "xaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + }, + "yaxis": { + "automargin": true, + "gridcolor": "white", + "linecolor": "white", + "ticks": "", + "title": { + "standoff": 15 + }, + "zerolinecolor": "white", + "zerolinewidth": 2 + } + } + }, + "title": { + "text": "YoY Change by Region (2024 vs 2023)" + }, + "xaxis": { + "anchor": "y", + "domain": [ + 0, + 1 + ], + "title": { + "text": "region" + } + }, + "yaxis": { + "anchor": "x", + "domain": [ + 0, + 1 + ], + "title": { + "text": "yoy_change" + } + } + } + }, + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "yoy_df = df_sql(\"\"\"\n", + "SELECT\n", + " _outer.region,\n", + " aggregate(revenue) at (set year = 2024) as rev_2024,\n", + " aggregate(revenue) at (set year = 2023) as rev_2023,\n", + " aggregate(revenue) at (set year = 2024) - aggregate(revenue) at (set year = 2023) as yoy_change,\n", + " 100.0 * (aggregate(revenue) at (set year = 2024) - aggregate(revenue) at (set year = 2023))\n", + " / nullif(aggregate(revenue) at (set year = 2023), 0) as yoy_pct\n", + "from orders_v as _outer\n", + "order by yoy_change desc;\n", + "\"\"\")\n", + "yoy_df[\"yoy_pct_label\"] = yoy_df[\"yoy_pct\"].map(lambda v: f\"{float(v):.1f}%\")\n", + "display(yoy_df)\n", + "fig = px.bar(\n", + " yoy_df,\n", + " x=\"region\",\n", + " y=\"yoy_change\",\n", + " color=\"yoy_pct\",\n", + " text=\"yoy_pct_label\",\n", + " title=\"YoY Change by Region (2024 vs 2023)\"\n", + ")\n", + "fig.update_traces(textposition=\"outside\")\n", + "fig.show()\n" + ] + }, + { + "cell_type": "markdown", + "id": "4e072da6", + "metadata": {}, + "source": [ + "## Drill-down: Online categories in 2024\n", + "\n", + "Uses a filtered view plus `AT (ALL category)` to compute share within the slice.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "b1915f28", + "metadata": { + "execution": { + "iopub.execute_input": "2025-12-29T07:58:58.691987Z", + "iopub.status.busy": "2025-12-29T07:58:58.691848Z", + "iopub.status.idle": "2025-12-29T07:58:58.697719Z", + "shell.execute_reply": "2025-12-29T07:58:58.697240Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
categoryrevenuepct_of_filtered
0Services33558.8040.585350
1Support16655.7520.143135
2Software12701.4015.360822
3Hardware11902.4514.394588
4Accessories7868.589.516105
\n", + "
" + ], + "text/plain": [ + " category revenue pct_of_filtered\n", + "0 Services 33558.80 40.585350\n", + "1 Support 16655.75 20.143135\n", + "2 Software 12701.40 15.360822\n", + "3 Hardware 11902.45 14.394588\n", + "4 Accessories 7868.58 9.516105" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"\"\"\n", + "SELECT\n", + " _outer.category,\n", + " aggregate(revenue) as revenue,\n", + " 100.0 * aggregate(revenue) / aggregate(revenue) at (all category) as pct_of_filtered\n", + "from orders_online_2024_v as _outer\n", + "order by revenue desc;\n", + "\"\"\"))\n" + ] + }, + { + "cell_type": "markdown", + "id": "aa59faaa", + "metadata": {}, + "source": [ + "## Compare a slice to total with WHERE\n", + "\n", + "`AT (WHERE ...)` calculates a measure with an extra filter.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "dcb41222", + "metadata": { + "execution": { + "iopub.execute_input": "2025-12-29T07:58:58.699218Z", + "iopub.status.busy": "2025-12-29T07:58:58.699100Z", + "iopub.status.idle": "2025-12-29T07:58:58.705658Z", + "shell.execute_reply": "2025-12-29T07:58:58.705315Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
scoperevenueonline_revenueonline_share
0All543530.97181175.6433.333085
\n", + "
" + ], + "text/plain": [ + " scope revenue online_revenue online_share\n", + "0 All 543530.97 181175.64 33.333085" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "display(df_sql(\"\"\"\n", + "SELECT\n", + " 'All' as scope,\n", + " aggregate(revenue) as revenue,\n", + " aggregate(revenue) at (where channel = 'Online') as online_revenue,\n", + " 100.0 * aggregate(revenue) at (where channel = 'Online') / aggregate(revenue) as online_share\n", + "from orders_v as _outer;\n", + "\"\"\"))\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.0" + }, + "uv.lock": "version = 1\nrevision = 2\nrequires-python = \">=3.13\"\nresolution-markers = [\n \"python_full_version >= '3.14'\",\n \"python_full_version < '3.14'\",\n]\n\n[options]\nexclude-newer = \"2025-12-29T17:27:12.558381Z\"\n\n[manifest]\nrequirements = [\n { name = \"duckdb\" },\n { name = \"jupyterlab\" },\n { name = \"pandas\" },\n { name = \"plotly\" },\n]\n\n[[package]]\nname = \"anyio\"\nversion = \"4.12.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"idna\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/16/ce/8a777047513153587e5434fd752e89334ac33e379aa3497db860eeb60377/anyio-4.12.0.tar.gz\", hash = \"sha256:73c693b567b0c55130c104d0b43a9baf3aa6a31fc6110116509f27bf75e21ec0\", size = 228266, upload-time = \"2025-11-28T23:37:38.911Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/7f/9c/36c5c37947ebfb8c7f22e0eb6e4d188ee2d53aa3880f3f2744fb894f0cb1/anyio-4.12.0-py3-none-any.whl\", hash = \"sha256:dad2376a628f98eeca4881fc56cd06affd18f659b17a747d3ff0307ced94b1bb\", size = 113362, upload-time = \"2025-11-28T23:36:57.897Z\" },\n]\n\n[[package]]\nname = \"appnope\"\nversion = \"0.1.4\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz\", hash = \"sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee\", size = 4170, upload-time = \"2024-02-06T09:43:11.258Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl\", hash = \"sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c\", size = 4321, upload-time = \"2024-02-06T09:43:09.663Z\" },\n]\n\n[[package]]\nname = \"argon2-cffi\"\nversion = \"25.1.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"argon2-cffi-bindings\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/0e/89/ce5af8a7d472a67cc819d5d998aa8c82c5d860608c4db9f46f1162d7dab9/argon2_cffi-25.1.0.tar.gz\", hash = \"sha256:694ae5cc8a42f4c4e2bf2ca0e64e51e23a040c6a517a85074683d3959e1346c1\", size = 45706, upload-time = \"2025-06-03T06:55:32.073Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/4f/d3/a8b22fa575b297cd6e3e3b0155c7e25db170edf1c74783d6a31a2490b8d9/argon2_cffi-25.1.0-py3-none-any.whl\", hash = \"sha256:fdc8b074db390fccb6eb4a3604ae7231f219aa669a2652e0f20e16ba513d5741\", size = 14657, upload-time = \"2025-06-03T06:55:30.804Z\" },\n]\n\n[[package]]\nname = \"argon2-cffi-bindings\"\nversion = \"25.1.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"cffi\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/5c/2d/db8af0df73c1cf454f71b2bbe5e356b8c1f8041c979f505b3d3186e520a9/argon2_cffi_bindings-25.1.0.tar.gz\", hash = \"sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d\", size = 1783441, upload-time = \"2025-07-30T10:02:05.147Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/60/97/3c0a35f46e52108d4707c44b95cfe2afcafc50800b5450c197454569b776/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl\", hash = \"sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f\", size = 54393, upload-time = \"2025-07-30T10:01:40.97Z\" },\n { url = \"https://files.pythonhosted.org/packages/9d/f4/98bbd6ee89febd4f212696f13c03ca302b8552e7dbf9c8efa11ea4a388c3/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl\", hash = \"sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b\", size = 29328, upload-time = \"2025-07-30T10:01:41.916Z\" },\n { url = \"https://files.pythonhosted.org/packages/43/24/90a01c0ef12ac91a6be05969f29944643bc1e5e461155ae6559befa8f00b/argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl\", hash = \"sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a\", size = 31269, upload-time = \"2025-07-30T10:01:42.716Z\" },\n { url = \"https://files.pythonhosted.org/packages/d4/d3/942aa10782b2697eee7af5e12eeff5ebb325ccfb86dd8abda54174e377e4/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44\", size = 86558, upload-time = \"2025-07-30T10:01:43.943Z\" },\n { url = \"https://files.pythonhosted.org/packages/0d/82/b484f702fec5536e71836fc2dbc8c5267b3f6e78d2d539b4eaa6f0db8bf8/argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb\", size = 92364, upload-time = \"2025-07-30T10:01:44.887Z\" },\n { url = \"https://files.pythonhosted.org/packages/c9/c1/a606ff83b3f1735f3759ad0f2cd9e038a0ad11a3de3b6c673aa41c24bb7b/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl\", hash = \"sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92\", size = 85637, upload-time = \"2025-07-30T10:01:46.225Z\" },\n { url = \"https://files.pythonhosted.org/packages/44/b4/678503f12aceb0262f84fa201f6027ed77d71c5019ae03b399b97caa2f19/argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl\", hash = \"sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85\", size = 91934, upload-time = \"2025-07-30T10:01:47.203Z\" },\n { url = \"https://files.pythonhosted.org/packages/f0/c7/f36bd08ef9bd9f0a9cff9428406651f5937ce27b6c5b07b92d41f91ae541/argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl\", hash = \"sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f\", size = 28158, upload-time = \"2025-07-30T10:01:48.341Z\" },\n { url = \"https://files.pythonhosted.org/packages/b3/80/0106a7448abb24a2c467bf7d527fe5413b7fdfa4ad6d6a96a43a62ef3988/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl\", hash = \"sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6\", size = 32597, upload-time = \"2025-07-30T10:01:49.112Z\" },\n { url = \"https://files.pythonhosted.org/packages/05/b8/d663c9caea07e9180b2cb662772865230715cbd573ba3b5e81793d580316/argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl\", hash = \"sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623\", size = 28231, upload-time = \"2025-07-30T10:01:49.92Z\" },\n { url = \"https://files.pythonhosted.org/packages/1d/57/96b8b9f93166147826da5f90376e784a10582dd39a393c99bb62cfcf52f0/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl\", hash = \"sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500\", size = 54121, upload-time = \"2025-07-30T10:01:50.815Z\" },\n { url = \"https://files.pythonhosted.org/packages/0a/08/a9bebdb2e0e602dde230bdde8021b29f71f7841bd54801bcfd514acb5dcf/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl\", hash = \"sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44\", size = 29177, upload-time = \"2025-07-30T10:01:51.681Z\" },\n { url = \"https://files.pythonhosted.org/packages/b6/02/d297943bcacf05e4f2a94ab6f462831dc20158614e5d067c35d4e63b9acb/argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl\", hash = \"sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0\", size = 31090, upload-time = \"2025-07-30T10:01:53.184Z\" },\n { url = \"https://files.pythonhosted.org/packages/c1/93/44365f3d75053e53893ec6d733e4a5e3147502663554b4d864587c7828a7/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6\", size = 81246, upload-time = \"2025-07-30T10:01:54.145Z\" },\n { url = \"https://files.pythonhosted.org/packages/09/52/94108adfdd6e2ddf58be64f959a0b9c7d4ef2fa71086c38356d22dc501ea/argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a\", size = 87126, upload-time = \"2025-07-30T10:01:55.074Z\" },\n { url = \"https://files.pythonhosted.org/packages/72/70/7a2993a12b0ffa2a9271259b79cc616e2389ed1a4d93842fac5a1f923ffd/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl\", hash = \"sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d\", size = 80343, upload-time = \"2025-07-30T10:01:56.007Z\" },\n { url = \"https://files.pythonhosted.org/packages/78/9a/4e5157d893ffc712b74dbd868c7f62365618266982b64accab26bab01edc/argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl\", hash = \"sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99\", size = 86777, upload-time = \"2025-07-30T10:01:56.943Z\" },\n { url = \"https://files.pythonhosted.org/packages/74/cd/15777dfde1c29d96de7f18edf4cc94c385646852e7c7b0320aa91ccca583/argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl\", hash = \"sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2\", size = 27180, upload-time = \"2025-07-30T10:01:57.759Z\" },\n { url = \"https://files.pythonhosted.org/packages/e2/c6/a759ece8f1829d1f162261226fbfd2c6832b3ff7657384045286d2afa384/argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl\", hash = \"sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98\", size = 31715, upload-time = \"2025-07-30T10:01:58.56Z\" },\n { url = \"https://files.pythonhosted.org/packages/42/b9/f8d6fa329ab25128b7e98fd83a3cb34d9db5b059a9847eddb840a0af45dd/argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl\", hash = \"sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94\", size = 27149, upload-time = \"2025-07-30T10:01:59.329Z\" },\n]\n\n[[package]]\nname = \"arrow\"\nversion = \"1.4.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"python-dateutil\" },\n { name = \"tzdata\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/b9/33/032cdc44182491aa708d06a68b62434140d8c50820a087fac7af37703357/arrow-1.4.0.tar.gz\", hash = \"sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7\", size = 152931, upload-time = \"2025-10-18T17:46:46.761Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/ed/c9/d7977eaacb9df673210491da99e6a247e93df98c715fc43fd136ce1d3d33/arrow-1.4.0-py3-none-any.whl\", hash = \"sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205\", size = 68797, upload-time = \"2025-10-18T17:46:45.663Z\" },\n]\n\n[[package]]\nname = \"asttokens\"\nversion = \"3.0.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz\", hash = \"sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7\", size = 62308, upload-time = \"2025-11-15T16:43:48.578Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl\", hash = \"sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a\", size = 27047, upload-time = \"2025-11-15T16:43:16.109Z\" },\n]\n\n[[package]]\nname = \"async-lru\"\nversion = \"2.0.5\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/b2/4d/71ec4d3939dc755264f680f6c2b4906423a304c3d18e96853f0a595dfe97/async_lru-2.0.5.tar.gz\", hash = \"sha256:481d52ccdd27275f42c43a928b4a50c3bfb2d67af4e78b170e3e0bb39c66e5bb\", size = 10380, upload-time = \"2025-03-16T17:25:36.919Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/03/49/d10027df9fce941cb8184e78a02857af36360d33e1721df81c5ed2179a1a/async_lru-2.0.5-py3-none-any.whl\", hash = \"sha256:ab95404d8d2605310d345932697371a5f40def0487c03d6d0ad9138de52c9943\", size = 6069, upload-time = \"2025-03-16T17:25:35.422Z\" },\n]\n\n[[package]]\nname = \"attrs\"\nversion = \"25.4.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz\", hash = \"sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11\", size = 934251, upload-time = \"2025-10-06T13:54:44.725Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl\", hash = \"sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373\", size = 67615, upload-time = \"2025-10-06T13:54:43.17Z\" },\n]\n\n[[package]]\nname = \"babel\"\nversion = \"2.17.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/7d/6b/d52e42361e1aa00709585ecc30b3f9684b3ab62530771402248b1b1d6240/babel-2.17.0.tar.gz\", hash = \"sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d\", size = 9951852, upload-time = \"2025-02-01T15:17:41.026Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/b7/b8/3fe70c75fe32afc4bb507f75563d39bc5642255d1d94f1f23604725780bf/babel-2.17.0-py3-none-any.whl\", hash = \"sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2\", size = 10182537, upload-time = \"2025-02-01T15:17:37.39Z\" },\n]\n\n[[package]]\nname = \"beautifulsoup4\"\nversion = \"4.14.3\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"soupsieve\" },\n { name = \"typing-extensions\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz\", hash = \"sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86\", size = 627737, upload-time = \"2025-11-30T15:08:26.084Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl\", hash = \"sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb\", size = 107721, upload-time = \"2025-11-30T15:08:24.087Z\" },\n]\n\n[[package]]\nname = \"bleach\"\nversion = \"6.3.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"webencodings\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/07/18/3c8523962314be6bf4c8989c79ad9531c825210dd13a8669f6b84336e8bd/bleach-6.3.0.tar.gz\", hash = \"sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22\", size = 203533, upload-time = \"2025-10-27T17:57:39.211Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/cd/3a/577b549de0cc09d95f11087ee63c739bba856cd3952697eec4c4bb91350a/bleach-6.3.0-py3-none-any.whl\", hash = \"sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6\", size = 164437, upload-time = \"2025-10-27T17:57:37.538Z\" },\n]\n\n[package.optional-dependencies]\ncss = [\n { name = \"tinycss2\" },\n]\n\n[[package]]\nname = \"certifi\"\nversion = \"2025.11.12\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz\", hash = \"sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316\", size = 160538, upload-time = \"2025-11-12T02:54:51.517Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl\", hash = \"sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b\", size = 159438, upload-time = \"2025-11-12T02:54:49.735Z\" },\n]\n\n[[package]]\nname = \"cffi\"\nversion = \"2.0.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"pycparser\", marker = \"implementation_name != 'PyPy'\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n]\n\n[[package]]\nname = \"charset-normalizer\"\nversion = \"3.4.4\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n]\n\n[[package]]\nname = \"colorama\"\nversion = \"0.4.6\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"comm\"\nversion = \"0.2.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz\", hash = \"sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971\", size = 6319, upload-time = \"2025-07-25T14:02:04.452Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl\", hash = \"sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417\", size = 7294, upload-time = \"2025-07-25T14:02:02.896Z\" },\n]\n\n[[package]]\nname = \"debugpy\"\nversion = \"1.8.19\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/73/75/9e12d4d42349b817cd545b89247696c67917aab907012ae5b64bbfea3199/debugpy-1.8.19.tar.gz\", hash = \"sha256:eea7e5987445ab0b5ed258093722d5ecb8bb72217c5c9b1e21f64efe23ddebdb\", size = 1644590, upload-time = \"2025-12-15T21:53:28.044Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/71/3d/388035a31a59c26f1ecc8d86af607d0c42e20ef80074147cd07b180c4349/debugpy-1.8.19-cp313-cp313-macosx_15_0_universal2.whl\", hash = \"sha256:91e35db2672a0abaf325f4868fcac9c1674a0d9ad9bb8a8c849c03a5ebba3e6d\", size = 2538859, upload-time = \"2025-12-15T21:53:50.478Z\" },\n { url = \"https://files.pythonhosted.org/packages/4a/19/c93a0772d0962294f083dbdb113af1a7427bb632d36e5314297068f55db7/debugpy-1.8.19-cp313-cp313-manylinux_2_34_x86_64.whl\", hash = \"sha256:85016a73ab84dea1c1f1dcd88ec692993bcbe4532d1b49ecb5f3c688ae50c606\", size = 4292575, upload-time = \"2025-12-15T21:53:51.821Z\" },\n { url = \"https://files.pythonhosted.org/packages/5c/56/09e48ab796b0a77e3d7dc250f95251832b8bf6838c9632f6100c98bdf426/debugpy-1.8.19-cp313-cp313-win32.whl\", hash = \"sha256:b605f17e89ba0ecee994391194285fada89cee111cfcd29d6f2ee11cbdc40976\", size = 5286209, upload-time = \"2025-12-15T21:53:53.602Z\" },\n { url = \"https://files.pythonhosted.org/packages/fb/4e/931480b9552c7d0feebe40c73725dd7703dcc578ba9efc14fe0e6d31cfd1/debugpy-1.8.19-cp313-cp313-win_amd64.whl\", hash = \"sha256:c30639998a9f9cd9699b4b621942c0179a6527f083c72351f95c6ab1728d5b73\", size = 5328206, upload-time = \"2025-12-15T21:53:55.433Z\" },\n { url = \"https://files.pythonhosted.org/packages/f6/b9/cbec520c3a00508327476c7fce26fbafef98f412707e511eb9d19a2ef467/debugpy-1.8.19-cp314-cp314-macosx_15_0_universal2.whl\", hash = \"sha256:1e8c4d1bd230067bf1bbcdbd6032e5a57068638eb28b9153d008ecde288152af\", size = 2537372, upload-time = \"2025-12-15T21:53:57.318Z\" },\n { url = \"https://files.pythonhosted.org/packages/88/5e/cf4e4dc712a141e10d58405c58c8268554aec3c35c09cdcda7535ff13f76/debugpy-1.8.19-cp314-cp314-manylinux_2_34_x86_64.whl\", hash = \"sha256:d40c016c1f538dbf1762936e3aeb43a89b965069d9f60f9e39d35d9d25e6b809\", size = 4268729, upload-time = \"2025-12-15T21:53:58.712Z\" },\n { url = \"https://files.pythonhosted.org/packages/82/a3/c91a087ab21f1047db328c1d3eb5d1ff0e52de9e74f9f6f6fa14cdd93d58/debugpy-1.8.19-cp314-cp314-win32.whl\", hash = \"sha256:0601708223fe1cd0e27c6cce67a899d92c7d68e73690211e6788a4b0e1903f5b\", size = 5286388, upload-time = \"2025-12-15T21:54:00.687Z\" },\n { url = \"https://files.pythonhosted.org/packages/17/b8/bfdc30b6e94f1eff09f2dc9cc1f9cd1c6cde3d996bcbd36ce2d9a4956e99/debugpy-1.8.19-cp314-cp314-win_amd64.whl\", hash = \"sha256:8e19a725f5d486f20e53a1dde2ab8bb2c9607c40c00a42ab646def962b41125f\", size = 5327741, upload-time = \"2025-12-15T21:54:02.148Z\" },\n { url = \"https://files.pythonhosted.org/packages/25/3e/e27078370414ef35fafad2c06d182110073daaeb5d3bf734b0b1eeefe452/debugpy-1.8.19-py2.py3-none-any.whl\", hash = \"sha256:360ffd231a780abbc414ba0f005dad409e71c78637efe8f2bd75837132a41d38\", size = 5292321, upload-time = \"2025-12-15T21:54:16.024Z\" },\n]\n\n[[package]]\nname = \"decorator\"\nversion = \"5.2.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz\", hash = \"sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360\", size = 56711, upload-time = \"2025-02-24T04:41:34.073Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl\", hash = \"sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a\", size = 9190, upload-time = \"2025-02-24T04:41:32.565Z\" },\n]\n\n[[package]]\nname = \"defusedxml\"\nversion = \"0.7.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"duckdb\"\nversion = \"1.4.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/7f/da/17c3eb5458af69d54dedc8d18e4a32ceaa8ce4d4c699d45d6d8287e790c3/duckdb-1.4.3.tar.gz\", hash = \"sha256:fea43e03604c713e25a25211ada87d30cd2a044d8f27afab5deba26ac49e5268\", size = 18478418, upload-time = \"2025-12-09T10:59:22.945Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/fd/76/288cca43a10ddd082788e1a71f1dc68d9130b5d078c3ffd0edf2f3a8719f/duckdb-1.4.3-cp313-cp313-macosx_10_13_universal2.whl\", hash = \"sha256:16952ac05bd7e7b39946695452bf450db1ebbe387e1e7178e10f593f2ea7b9a8\", size = 29033392, upload-time = \"2025-12-09T10:58:34.631Z\" },\n { url = \"https://files.pythonhosted.org/packages/64/07/cbad3d3da24af4d1add9bccb5fb390fac726ffa0c0cebd29bf5591cef334/duckdb-1.4.3-cp313-cp313-macosx_10_13_x86_64.whl\", hash = \"sha256:de984cd24a6cbefdd6d4a349f7b9a46e583ca3e58ce10d8def0b20a6e5fcbe78\", size = 15414567, upload-time = \"2025-12-09T10:58:37.051Z\" },\n { url = \"https://files.pythonhosted.org/packages/c4/19/57af0cc66ba2ffb8900f567c9aec188c6ab2a7b3f2260e9c6c3c5f9b57b1/duckdb-1.4.3-cp313-cp313-macosx_11_0_arm64.whl\", hash = \"sha256:1e5457dda91b67258aae30fb1a0df84183a9f6cd27abac1d5536c0d876c6dfa1\", size = 13740960, upload-time = \"2025-12-09T10:58:39.658Z\" },\n { url = \"https://files.pythonhosted.org/packages/73/dd/23152458cf5fd51e813fadda60b9b5f011517634aa4bb9301f5f3aa951d8/duckdb-1.4.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:006aca6a6d6736c441b02ff5c7600b099bb8b7f4de094b8b062137efddce42df\", size = 18484312, upload-time = \"2025-12-09T10:58:42.054Z\" },\n { url = \"https://files.pythonhosted.org/packages/1a/7b/adf3f611f11997fc429d4b00a730604b65d952417f36a10c4be6e38e064d/duckdb-1.4.3-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:a2813f4635f4d6681cc3304020374c46aca82758c6740d7edbc237fe3aae2744\", size = 20495571, upload-time = \"2025-12-09T10:58:44.646Z\" },\n { url = \"https://files.pythonhosted.org/packages/40/d5/6b7ddda7713a788ab2d622c7267ec317718f2bdc746ce1fca49b7ff0e50f/duckdb-1.4.3-cp313-cp313-win_amd64.whl\", hash = \"sha256:6db124f53a3edcb32b0a896ad3519e37477f7e67bf4811cb41ab60c1ef74e4c8\", size = 12335680, upload-time = \"2025-12-09T10:58:46.883Z\" },\n { url = \"https://files.pythonhosted.org/packages/e8/28/0670135cf54525081fded9bac1254f78984e3b96a6059cd15aca262e3430/duckdb-1.4.3-cp313-cp313-win_arm64.whl\", hash = \"sha256:a8b0a8764e1b5dd043d168c8f749314f7a1252b5a260fa415adaa26fa3b958fd\", size = 13075161, upload-time = \"2025-12-09T10:58:49.47Z\" },\n { url = \"https://files.pythonhosted.org/packages/b6/f4/a38651e478fa41eeb8e43a0a9c0d4cd8633adea856e3ac5ac95124b0fdbf/duckdb-1.4.3-cp314-cp314-macosx_10_15_universal2.whl\", hash = \"sha256:316711a9e852bcfe1ed6241a5f654983f67e909e290495f3562cccdf43be8180\", size = 29042272, upload-time = \"2025-12-09T10:58:51.826Z\" },\n { url = \"https://files.pythonhosted.org/packages/16/de/2cf171a66098ce5aeeb7371511bd2b3d7b73a2090603b0b9df39f8aaf814/duckdb-1.4.3-cp314-cp314-macosx_10_15_x86_64.whl\", hash = \"sha256:9e625b2b4d52bafa1fd0ebdb0990c3961dac8bb00e30d327185de95b68202131\", size = 15419343, upload-time = \"2025-12-09T10:58:54.439Z\" },\n { url = \"https://files.pythonhosted.org/packages/35/28/6b0a7830828d4e9a37420d87e80fe6171d2869a9d3d960bf5d7c3b8c7ee4/duckdb-1.4.3-cp314-cp314-macosx_11_0_arm64.whl\", hash = \"sha256:130c6760f6c573f9c9fe9aba56adba0fab48811a4871b7b8fd667318b4a3e8da\", size = 13748905, upload-time = \"2025-12-09T10:58:56.656Z\" },\n { url = \"https://files.pythonhosted.org/packages/15/4d/778628e194d63967870873b9581c8a6b4626974aa4fbe09f32708a2d3d3a/duckdb-1.4.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:20c88effaa557a11267706b01419c542fe42f893dee66e5a6daa5974ea2d4a46\", size = 18487261, upload-time = \"2025-12-09T10:58:58.866Z\" },\n { url = \"https://files.pythonhosted.org/packages/c6/5f/87e43af2e4a0135f9675449563e7c2f9b6f1fe6a2d1691c96b091f3904dd/duckdb-1.4.3-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:1b35491db98ccd11d151165497c084a9d29d3dc42fc80abea2715a6c861ca43d\", size = 20497138, upload-time = \"2025-12-09T10:59:01.241Z\" },\n { url = \"https://files.pythonhosted.org/packages/94/41/abec537cc7c519121a2a83b9a6f180af8915fabb433777dc147744513e74/duckdb-1.4.3-cp314-cp314-win_amd64.whl\", hash = \"sha256:23b12854032c1a58d0452e2b212afa908d4ce64171862f3792ba9a596ba7c765\", size = 12836056, upload-time = \"2025-12-09T10:59:03.388Z\" },\n { url = \"https://files.pythonhosted.org/packages/b1/5a/8af5b96ce5622b6168854f479ce846cf7fb589813dcc7d8724233c37ded3/duckdb-1.4.3-cp314-cp314-win_arm64.whl\", hash = \"sha256:90f241f25cffe7241bf9f376754a5845c74775e00e1c5731119dc88cd71e0cb2\", size = 13527759, upload-time = \"2025-12-09T10:59:05.496Z\" },\n]\n\n[[package]]\nname = \"executing\"\nversion = \"2.2.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz\", hash = \"sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4\", size = 1129488, upload-time = \"2025-09-01T09:48:10.866Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl\", hash = \"sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017\", size = 28317, upload-time = \"2025-09-01T09:48:08.5Z\" },\n]\n\n[[package]]\nname = \"fastjsonschema\"\nversion = \"2.21.2\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz\", hash = \"sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de\", size = 374130, upload-time = \"2025-08-14T18:49:36.666Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl\", hash = \"sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463\", size = 24024, upload-time = \"2025-08-14T18:49:34.776Z\" },\n]\n\n[[package]]\nname = \"fqdn\"\nversion = \"1.5.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/30/3e/a80a8c077fd798951169626cde3e239adeba7dab75deb3555716415bd9b0/fqdn-1.5.1.tar.gz\", hash = \"sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f\", size = 6015, upload-time = \"2021-03-11T07:16:29.08Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/cf/58/8acf1b3e91c58313ce5cb67df61001fc9dcd21be4fadb76c1a2d540e09ed/fqdn-1.5.1-py3-none-any.whl\", hash = \"sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014\", size = 9121, upload-time = \"2021-03-11T07:16:28.351Z\" },\n]\n\n[[package]]\nname = \"h11\"\nversion = \"0.16.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"httpcore\"\nversion = \"1.0.9\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"certifi\" },\n { name = \"h11\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"httpx\"\nversion = \"0.28.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"anyio\" },\n { name = \"certifi\" },\n { name = \"httpcore\" },\n { name = \"idna\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"idna\"\nversion = \"3.11\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz\", hash = \"sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902\", size = 194582, upload-time = \"2025-10-12T14:55:20.501Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl\", hash = \"sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea\", size = 71008, upload-time = \"2025-10-12T14:55:18.883Z\" },\n]\n\n[[package]]\nname = \"ipykernel\"\nversion = \"7.1.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"appnope\", marker = \"sys_platform == 'darwin'\" },\n { name = \"comm\" },\n { name = \"debugpy\" },\n { name = \"ipython\" },\n { name = \"jupyter-client\" },\n { name = \"jupyter-core\" },\n { name = \"matplotlib-inline\" },\n { name = \"nest-asyncio\" },\n { name = \"packaging\" },\n { name = \"psutil\" },\n { name = \"pyzmq\" },\n { name = \"tornado\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/b9/a4/4948be6eb88628505b83a1f2f40d90254cab66abf2043b3c40fa07dfce0f/ipykernel-7.1.0.tar.gz\", hash = \"sha256:58a3fc88533d5930c3546dc7eac66c6d288acde4f801e2001e65edc5dc9cf0db\", size = 174579, upload-time = \"2025-10-27T09:46:39.471Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/a3/17/20c2552266728ceba271967b87919664ecc0e33efca29c3efc6baf88c5f9/ipykernel-7.1.0-py3-none-any.whl\", hash = \"sha256:763b5ec6c5b7776f6a8d7ce09b267693b4e5ce75cb50ae696aaefb3c85e1ea4c\", size = 117968, upload-time = \"2025-10-27T09:46:37.805Z\" },\n]\n\n[[package]]\nname = \"ipython\"\nversion = \"9.8.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"colorama\", marker = \"sys_platform == 'win32'\" },\n { name = \"decorator\" },\n { name = \"ipython-pygments-lexers\" },\n { name = \"jedi\" },\n { name = \"matplotlib-inline\" },\n { name = \"pexpect\", marker = \"sys_platform != 'emscripten' and sys_platform != 'win32'\" },\n { name = \"prompt-toolkit\" },\n { name = \"pygments\" },\n { name = \"stack-data\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/12/51/a703c030f4928646d390b4971af4938a1b10c9dfce694f0d99a0bb073cb2/ipython-9.8.0.tar.gz\", hash = \"sha256:8e4ce129a627eb9dd221c41b1d2cdaed4ef7c9da8c17c63f6f578fe231141f83\", size = 4424940, upload-time = \"2025-12-03T10:18:24.353Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/f1/df/8ee1c5dd1e3308b5d5b2f2dfea323bb2f3827da8d654abb6642051199049/ipython-9.8.0-py3-none-any.whl\", hash = \"sha256:ebe6d1d58d7d988fbf23ff8ff6d8e1622cfdb194daf4b7b73b792c4ec3b85385\", size = 621374, upload-time = \"2025-12-03T10:18:22.335Z\" },\n]\n\n[[package]]\nname = \"ipython-pygments-lexers\"\nversion = \"1.1.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"pygments\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz\", hash = \"sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81\", size = 8393, upload-time = \"2025-01-17T11:24:34.505Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl\", hash = \"sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c\", size = 8074, upload-time = \"2025-01-17T11:24:33.271Z\" },\n]\n\n[[package]]\nname = \"isoduration\"\nversion = \"20.11.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"arrow\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/7c/1a/3c8edc664e06e6bd06cce40c6b22da5f1429aa4224d0c590f3be21c91ead/isoduration-20.11.0.tar.gz\", hash = \"sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9\", size = 11649, upload-time = \"2020-11-01T11:00:00.312Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/7b/55/e5326141505c5d5e34c5e0935d2908a74e4561eca44108fbfb9c13d2911a/isoduration-20.11.0-py3-none-any.whl\", hash = \"sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042\", size = 11321, upload-time = \"2020-11-01T10:59:58.02Z\" },\n]\n\n[[package]]\nname = \"jedi\"\nversion = \"0.19.2\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"parso\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz\", hash = \"sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0\", size = 1231287, upload-time = \"2024-11-11T01:41:42.873Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl\", hash = \"sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9\", size = 1572278, upload-time = \"2024-11-11T01:41:40.175Z\" },\n]\n\n[[package]]\nname = \"jinja2\"\nversion = \"3.1.6\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"markupsafe\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"json5\"\nversion = \"0.12.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/12/ae/929aee9619e9eba9015207a9d2c1c54db18311da7eb4dcf6d41ad6f0eb67/json5-0.12.1.tar.gz\", hash = \"sha256:b2743e77b3242f8d03c143dd975a6ec7c52e2f2afe76ed934e53503dd4ad4990\", size = 52191, upload-time = \"2025-08-12T19:47:42.583Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/85/e2/05328bd2621be49a6fed9e3030b1e51a2d04537d3f816d211b9cc53c5262/json5-0.12.1-py3-none-any.whl\", hash = \"sha256:d9c9b3bc34a5f54d43c35e11ef7cb87d8bdd098c6ace87117a7b7e83e705c1d5\", size = 36119, upload-time = \"2025-08-12T19:47:41.131Z\" },\n]\n\n[[package]]\nname = \"jsonpointer\"\nversion = \"3.0.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/6a/0a/eebeb1fa92507ea94016a2a790b93c2ae41a7e18778f85471dc54475ed25/jsonpointer-3.0.0.tar.gz\", hash = \"sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef\", size = 9114, upload-time = \"2024-06-10T19:24:42.462Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/71/92/5e77f98553e9e75130c78900d000368476aed74276eb8ae8796f65f00918/jsonpointer-3.0.0-py2.py3-none-any.whl\", hash = \"sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942\", size = 7595, upload-time = \"2024-06-10T19:24:40.698Z\" },\n]\n\n[[package]]\nname = \"jsonschema\"\nversion = \"4.25.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"attrs\" },\n { name = \"jsonschema-specifications\" },\n { name = \"referencing\" },\n { name = \"rpds-py\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz\", hash = \"sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85\", size = 357342, upload-time = \"2025-08-18T17:03:50.038Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl\", hash = \"sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63\", size = 90040, upload-time = \"2025-08-18T17:03:48.373Z\" },\n]\n\n[package.optional-dependencies]\nformat-nongpl = [\n { name = \"fqdn\" },\n { name = \"idna\" },\n { name = \"isoduration\" },\n { name = \"jsonpointer\" },\n { name = \"rfc3339-validator\" },\n { name = \"rfc3986-validator\" },\n { name = \"rfc3987-syntax\" },\n { name = \"uri-template\" },\n { name = \"webcolors\" },\n]\n\n[[package]]\nname = \"jsonschema-specifications\"\nversion = \"2025.9.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"referencing\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"jupyter-client\"\nversion = \"8.7.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"jupyter-core\" },\n { name = \"python-dateutil\" },\n { name = \"pyzmq\" },\n { name = \"tornado\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/a6/27/d10de45e8ad4ce872372c4a3a37b7b35b6b064f6f023a5c14ffcced4d59d/jupyter_client-8.7.0.tar.gz\", hash = \"sha256:3357212d9cbe01209e59190f67a3a7e1f387a4f4e88d1e0433ad84d7b262531d\", size = 344691, upload-time = \"2025-12-09T18:37:01.953Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/bb/f5/fddaec430367be9d62a7ed125530e133bfd4a1c0350fe221149ee0f2b526/jupyter_client-8.7.0-py3-none-any.whl\", hash = \"sha256:3671a94fd25e62f5f2f554f5e95389c2294d89822378a5f2dd24353e1494a9e0\", size = 106215, upload-time = \"2025-12-09T18:37:00.024Z\" },\n]\n\n[[package]]\nname = \"jupyter-core\"\nversion = \"5.9.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"platformdirs\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz\", hash = \"sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508\", size = 89814, upload-time = \"2025-10-16T19:19:18.444Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl\", hash = \"sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407\", size = 29032, upload-time = \"2025-10-16T19:19:16.783Z\" },\n]\n\n[[package]]\nname = \"jupyter-events\"\nversion = \"0.12.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"jsonschema\", extra = [\"format-nongpl\"] },\n { name = \"packaging\" },\n { name = \"python-json-logger\" },\n { name = \"pyyaml\" },\n { name = \"referencing\" },\n { name = \"rfc3339-validator\" },\n { name = \"rfc3986-validator\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/9d/c3/306d090461e4cf3cd91eceaff84bede12a8e52cd821c2d20c9a4fd728385/jupyter_events-0.12.0.tar.gz\", hash = \"sha256:fc3fce98865f6784c9cd0a56a20644fc6098f21c8c33834a8d9fe383c17e554b\", size = 62196, upload-time = \"2025-02-03T17:23:41.485Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/e2/48/577993f1f99c552f18a0428731a755e06171f9902fa118c379eb7c04ea22/jupyter_events-0.12.0-py3-none-any.whl\", hash = \"sha256:6464b2fa5ad10451c3d35fabc75eab39556ae1e2853ad0c0cc31b656731a97fb\", size = 19430, upload-time = \"2025-02-03T17:23:38.643Z\" },\n]\n\n[[package]]\nname = \"jupyter-lsp\"\nversion = \"2.3.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"jupyter-server\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/eb/5a/9066c9f8e94ee517133cd98dba393459a16cd48bba71a82f16a65415206c/jupyter_lsp-2.3.0.tar.gz\", hash = \"sha256:458aa59339dc868fb784d73364f17dbce8836e906cd75fd471a325cba02e0245\", size = 54823, upload-time = \"2025-08-27T17:47:34.671Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/1a/60/1f6cee0c46263de1173894f0fafcb3475ded276c472c14d25e0280c18d6d/jupyter_lsp-2.3.0-py3-none-any.whl\", hash = \"sha256:e914a3cb2addf48b1c7710914771aaf1819d46b2e5a79b0f917b5478ec93f34f\", size = 76687, upload-time = \"2025-08-27T17:47:33.15Z\" },\n]\n\n[[package]]\nname = \"jupyter-server\"\nversion = \"2.17.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"anyio\" },\n { name = \"argon2-cffi\" },\n { name = \"jinja2\" },\n { name = \"jupyter-client\" },\n { name = \"jupyter-core\" },\n { name = \"jupyter-events\" },\n { name = \"jupyter-server-terminals\" },\n { name = \"nbconvert\" },\n { name = \"nbformat\" },\n { name = \"packaging\" },\n { name = \"prometheus-client\" },\n { name = \"pywinpty\", marker = \"os_name == 'nt'\" },\n { name = \"pyzmq\" },\n { name = \"send2trash\" },\n { name = \"terminado\" },\n { name = \"tornado\" },\n { name = \"traitlets\" },\n { name = \"websocket-client\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/5b/ac/e040ec363d7b6b1f11304cc9f209dac4517ece5d5e01821366b924a64a50/jupyter_server-2.17.0.tar.gz\", hash = \"sha256:c38ea898566964c888b4772ae1ed58eca84592e88251d2cfc4d171f81f7e99d5\", size = 731949, upload-time = \"2025-08-21T14:42:54.042Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/92/80/a24767e6ca280f5a49525d987bf3e4d7552bf67c8be07e8ccf20271f8568/jupyter_server-2.17.0-py3-none-any.whl\", hash = \"sha256:e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f\", size = 388221, upload-time = \"2025-08-21T14:42:52.034Z\" },\n]\n\n[[package]]\nname = \"jupyter-server-terminals\"\nversion = \"0.5.3\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"pywinpty\", marker = \"os_name == 'nt'\" },\n { name = \"terminado\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/fc/d5/562469734f476159e99a55426d697cbf8e7eb5efe89fb0e0b4f83a3d3459/jupyter_server_terminals-0.5.3.tar.gz\", hash = \"sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269\", size = 31430, upload-time = \"2024-03-12T14:37:03.049Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/07/2d/2b32cdbe8d2a602f697a649798554e4f072115438e92249624e532e8aca6/jupyter_server_terminals-0.5.3-py3-none-any.whl\", hash = \"sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa\", size = 13656, upload-time = \"2024-03-12T14:37:00.708Z\" },\n]\n\n[[package]]\nname = \"jupyterlab\"\nversion = \"4.5.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"async-lru\" },\n { name = \"httpx\" },\n { name = \"ipykernel\" },\n { name = \"jinja2\" },\n { name = \"jupyter-core\" },\n { name = \"jupyter-lsp\" },\n { name = \"jupyter-server\" },\n { name = \"jupyterlab-server\" },\n { name = \"notebook-shim\" },\n { name = \"packaging\" },\n { name = \"setuptools\" },\n { name = \"tornado\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/09/21/413d142686a4e8f4268d985becbdb4daf060524726248e73be4773786987/jupyterlab-4.5.1.tar.gz\", hash = \"sha256:09da1ddfbd9eec18b5101dbb8515612aa1e47443321fb99503725a88e93d20d9\", size = 23992251, upload-time = \"2025-12-15T16:58:59.361Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/af/c3/acced767eecc11a70c65c45295db5396c4f0c1937874937d5a76d7b177b6/jupyterlab-4.5.1-py3-none-any.whl\", hash = \"sha256:31b059de96de0754ff1f2ce6279774b6aab8c34d7082e9752db58207c99bd514\", size = 12384821, upload-time = \"2025-12-15T16:58:55.563Z\" },\n]\n\n[[package]]\nname = \"jupyterlab-pygments\"\nversion = \"0.3.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz\", hash = \"sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d\", size = 512900, upload-time = \"2023-11-23T09:26:37.44Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl\", hash = \"sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780\", size = 15884, upload-time = \"2023-11-23T09:26:34.325Z\" },\n]\n\n[[package]]\nname = \"jupyterlab-server\"\nversion = \"2.28.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"babel\" },\n { name = \"jinja2\" },\n { name = \"json5\" },\n { name = \"jsonschema\" },\n { name = \"jupyter-server\" },\n { name = \"packaging\" },\n { name = \"requests\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/d6/2c/90153f189e421e93c4bb4f9e3f59802a1f01abd2ac5cf40b152d7f735232/jupyterlab_server-2.28.0.tar.gz\", hash = \"sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c\", size = 76996, upload-time = \"2025-10-22T13:59:18.37Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/e0/07/a000fe835f76b7e1143242ab1122e6362ef1c03f23f83a045c38859c2ae0/jupyterlab_server-2.28.0-py3-none-any.whl\", hash = \"sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968\", size = 59830, upload-time = \"2025-10-22T13:59:16.767Z\" },\n]\n\n[[package]]\nname = \"lark\"\nversion = \"1.3.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/da/34/28fff3ab31ccff1fd4f6c7c7b0ceb2b6968d8ea4950663eadcb5720591a0/lark-1.3.1.tar.gz\", hash = \"sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905\", size = 382732, upload-time = \"2025-10-27T18:25:56.653Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/82/3d/14ce75ef66813643812f3093ab17e46d3a206942ce7376d31ec2d36229e7/lark-1.3.1-py3-none-any.whl\", hash = \"sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12\", size = 113151, upload-time = \"2025-10-27T18:25:54.882Z\" },\n]\n\n[[package]]\nname = \"markupsafe\"\nversion = \"3.0.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n]\n\n[[package]]\nname = \"matplotlib-inline\"\nversion = \"0.2.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz\", hash = \"sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe\", size = 8110, upload-time = \"2025-10-23T09:00:22.126Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl\", hash = \"sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76\", size = 9516, upload-time = \"2025-10-23T09:00:20.675Z\" },\n]\n\n[[package]]\nname = \"mistune\"\nversion = \"3.2.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/9d/55/d01f0c4b45ade6536c51170b9043db8b2ec6ddf4a35c7ea3f5f559ac935b/mistune-3.2.0.tar.gz\", hash = \"sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a\", size = 95467, upload-time = \"2025-12-23T11:36:34.994Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/9b/f7/4a5e785ec9fbd65146a27b6b70b6cdc161a66f2024e4b04ac06a67f5578b/mistune-3.2.0-py3-none-any.whl\", hash = \"sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1\", size = 53598, upload-time = \"2025-12-23T11:36:33.211Z\" },\n]\n\n[[package]]\nname = \"narwhals\"\nversion = \"2.14.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/4a/84/897fe7b6406d436ef312e57e5a1a13b4a5e7e36d1844e8d934ce8880e3d3/narwhals-2.14.0.tar.gz\", hash = \"sha256:98be155c3599db4d5c211e565c3190c398c87e7bf5b3cdb157dece67641946e0\", size = 600648, upload-time = \"2025-12-16T11:29:13.458Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/79/3e/b8ecc67e178919671695f64374a7ba916cf0adbf86efedc6054f38b5b8ae/narwhals-2.14.0-py3-none-any.whl\", hash = \"sha256:b56796c9a00179bd757d15282c540024e1d5c910b19b8c9944d836566c030acf\", size = 430788, upload-time = \"2025-12-16T11:29:11.699Z\" },\n]\n\n[[package]]\nname = \"nbclient\"\nversion = \"0.10.4\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"jupyter-client\" },\n { name = \"jupyter-core\" },\n { name = \"nbformat\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/56/91/1c1d5a4b9a9ebba2b4e32b8c852c2975c872aec1fe42ab5e516b2cecd193/nbclient-0.10.4.tar.gz\", hash = \"sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9\", size = 62554, upload-time = \"2025-12-23T07:45:46.369Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/83/a0/5b0c2f11142ed1dddec842457d3f65eaf71a0080894eb6f018755b319c3a/nbclient-0.10.4-py3-none-any.whl\", hash = \"sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440\", size = 25465, upload-time = \"2025-12-23T07:45:44.51Z\" },\n]\n\n[[package]]\nname = \"nbconvert\"\nversion = \"7.16.6\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"beautifulsoup4\" },\n { name = \"bleach\", extra = [\"css\"] },\n { name = \"defusedxml\" },\n { name = \"jinja2\" },\n { name = \"jupyter-core\" },\n { name = \"jupyterlab-pygments\" },\n { name = \"markupsafe\" },\n { name = \"mistune\" },\n { name = \"nbclient\" },\n { name = \"nbformat\" },\n { name = \"packaging\" },\n { name = \"pandocfilters\" },\n { name = \"pygments\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/a3/59/f28e15fc47ffb73af68a8d9b47367a8630d76e97ae85ad18271b9db96fdf/nbconvert-7.16.6.tar.gz\", hash = \"sha256:576a7e37c6480da7b8465eefa66c17844243816ce1ccc372633c6b71c3c0f582\", size = 857715, upload-time = \"2025-01-28T09:29:14.724Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/cc/9a/cd673b2f773a12c992f41309ef81b99da1690426bd2f96957a7ade0d3ed7/nbconvert-7.16.6-py3-none-any.whl\", hash = \"sha256:1375a7b67e0c2883678c48e506dc320febb57685e5ee67faa51b18a90f3a712b\", size = 258525, upload-time = \"2025-01-28T09:29:12.551Z\" },\n]\n\n[[package]]\nname = \"nbformat\"\nversion = \"5.10.4\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"fastjsonschema\" },\n { name = \"jsonschema\" },\n { name = \"jupyter-core\" },\n { name = \"traitlets\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz\", hash = \"sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a\", size = 142749, upload-time = \"2024-04-04T11:20:37.371Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl\", hash = \"sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b\", size = 78454, upload-time = \"2024-04-04T11:20:34.895Z\" },\n]\n\n[[package]]\nname = \"nest-asyncio\"\nversion = \"1.6.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz\", hash = \"sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe\", size = 7418, upload-time = \"2024-01-21T14:25:19.227Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl\", hash = \"sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c\", size = 5195, upload-time = \"2024-01-21T14:25:17.223Z\" },\n]\n\n[[package]]\nname = \"notebook-shim\"\nversion = \"0.2.4\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"jupyter-server\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/54/d2/92fa3243712b9a3e8bafaf60aac366da1cada3639ca767ff4b5b3654ec28/notebook_shim-0.2.4.tar.gz\", hash = \"sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb\", size = 13167, upload-time = \"2024-02-14T23:35:18.353Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/f9/33/bd5b9137445ea4b680023eb0469b2bb969d61303dedb2aac6560ff3d14a1/notebook_shim-0.2.4-py3-none-any.whl\", hash = \"sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef\", size = 13307, upload-time = \"2024-02-14T23:35:16.286Z\" },\n]\n\n[[package]]\nname = \"numpy\"\nversion = \"2.4.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n]\n\n[[package]]\nname = \"packaging\"\nversion = \"25.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"pandas\"\nversion = \"2.3.3\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"numpy\" },\n { name = \"python-dateutil\" },\n { name = \"pytz\" },\n { name = \"tzdata\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n]\n\n[[package]]\nname = \"pandocfilters\"\nversion = \"1.5.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz\", hash = \"sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e\", size = 8454, upload-time = \"2024-01-18T20:08:13.726Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl\", hash = \"sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc\", size = 8663, upload-time = \"2024-01-18T20:08:11.28Z\" },\n]\n\n[[package]]\nname = \"parso\"\nversion = \"0.8.5\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz\", hash = \"sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a\", size = 401205, upload-time = \"2025-08-23T15:15:28.028Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl\", hash = \"sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887\", size = 106668, upload-time = \"2025-08-23T15:15:25.663Z\" },\n]\n\n[[package]]\nname = \"pexpect\"\nversion = \"4.9.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"ptyprocess\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz\", hash = \"sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f\", size = 166450, upload-time = \"2023-11-25T09:07:26.339Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl\", hash = \"sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523\", size = 63772, upload-time = \"2023-11-25T06:56:14.81Z\" },\n]\n\n[[package]]\nname = \"platformdirs\"\nversion = \"4.5.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"plotly\"\nversion = \"6.5.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"narwhals\" },\n { name = \"packaging\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/94/05/1199e2a03ce6637960bc1e951ca0f928209a48cfceb57355806a88f214cf/plotly-6.5.0.tar.gz\", hash = \"sha256:d5d38224883fd38c1409bef7d6a8dc32b74348d39313f3c52ca998b8e447f5c8\", size = 7013624, upload-time = \"2025-11-17T18:39:24.523Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/e7/c3/3031c931098de393393e1f93a38dc9ed6805d86bb801acc3cf2d5bd1e6b7/plotly-6.5.0-py3-none-any.whl\", hash = \"sha256:5ac851e100367735250206788a2b1325412aa4a4917a4fe3e6f0bc5aa6f3d90a\", size = 9893174, upload-time = \"2025-11-17T18:39:20.351Z\" },\n]\n\n[[package]]\nname = \"prometheus-client\"\nversion = \"0.23.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/23/53/3edb5d68ecf6b38fcbcc1ad28391117d2a322d9a1a3eff04bfdb184d8c3b/prometheus_client-0.23.1.tar.gz\", hash = \"sha256:6ae8f9081eaaaf153a2e959d2e6c4f4fb57b12ef76c8c7980202f1e57b48b2ce\", size = 80481, upload-time = \"2025-09-18T20:47:25.043Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/b8/db/14bafcb4af2139e046d03fd00dea7873e48eafe18b7d2797e73d6681f210/prometheus_client-0.23.1-py3-none-any.whl\", hash = \"sha256:dd1913e6e76b59cfe44e7a4b83e01afc9873c1bdfd2ed8739f1e76aeca115f99\", size = 61145, upload-time = \"2025-09-18T20:47:23.875Z\" },\n]\n\n[[package]]\nname = \"prompt-toolkit\"\nversion = \"3.0.52\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"wcwidth\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz\", hash = \"sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855\", size = 434198, upload-time = \"2025-08-27T15:24:02.057Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl\", hash = \"sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955\", size = 391431, upload-time = \"2025-08-27T15:23:59.498Z\" },\n]\n\n[[package]]\nname = \"psutil\"\nversion = \"7.2.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/73/cb/09e5184fb5fc0358d110fc3ca7f6b1d033800734d34cac10f4136cfac10e/psutil-7.2.1.tar.gz\", hash = \"sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3\", size = 490253, upload-time = \"2025-12-29T08:26:00.169Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/77/8e/f0c242053a368c2aa89584ecd1b054a18683f13d6e5a318fc9ec36582c94/psutil-7.2.1-cp313-cp313t-macosx_10_13_x86_64.whl\", hash = \"sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d\", size = 129624, upload-time = \"2025-12-29T08:26:04.255Z\" },\n { url = \"https://files.pythonhosted.org/packages/26/97/a58a4968f8990617decee234258a2b4fc7cd9e35668387646c1963e69f26/psutil-7.2.1-cp313-cp313t-macosx_11_0_arm64.whl\", hash = \"sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49\", size = 130132, upload-time = \"2025-12-29T08:26:06.228Z\" },\n { url = \"https://files.pythonhosted.org/packages/db/6d/ed44901e830739af5f72a85fa7ec5ff1edea7f81bfbf4875e409007149bd/psutil-7.2.1-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc\", size = 180612, upload-time = \"2025-12-29T08:26:08.276Z\" },\n { url = \"https://files.pythonhosted.org/packages/c7/65/b628f8459bca4efbfae50d4bf3feaab803de9a160b9d5f3bd9295a33f0c2/psutil-7.2.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf\", size = 183201, upload-time = \"2025-12-29T08:26:10.622Z\" },\n { url = \"https://files.pythonhosted.org/packages/fb/23/851cadc9764edcc18f0effe7d0bf69f727d4cf2442deb4a9f78d4e4f30f2/psutil-7.2.1-cp313-cp313t-win_amd64.whl\", hash = \"sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f\", size = 139081, upload-time = \"2025-12-29T08:26:12.483Z\" },\n { url = \"https://files.pythonhosted.org/packages/59/82/d63e8494ec5758029f31c6cb06d7d161175d8281e91d011a4a441c8a43b5/psutil-7.2.1-cp313-cp313t-win_arm64.whl\", hash = \"sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672\", size = 134767, upload-time = \"2025-12-29T08:26:14.528Z\" },\n { url = \"https://files.pythonhosted.org/packages/05/c2/5fb764bd61e40e1fe756a44bd4c21827228394c17414ade348e28f83cd79/psutil-7.2.1-cp314-cp314t-macosx_10_15_x86_64.whl\", hash = \"sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679\", size = 129716, upload-time = \"2025-12-29T08:26:16.017Z\" },\n { url = \"https://files.pythonhosted.org/packages/c9/d2/935039c20e06f615d9ca6ca0ab756cf8408a19d298ffaa08666bc18dc805/psutil-7.2.1-cp314-cp314t-macosx_11_0_arm64.whl\", hash = \"sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f\", size = 130133, upload-time = \"2025-12-29T08:26:18.009Z\" },\n { url = \"https://files.pythonhosted.org/packages/77/69/19f1eb0e01d24c2b3eacbc2f78d3b5add8a89bf0bb69465bc8d563cc33de/psutil-7.2.1-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129\", size = 181518, upload-time = \"2025-12-29T08:26:20.241Z\" },\n { url = \"https://files.pythonhosted.org/packages/e1/6d/7e18b1b4fa13ad370787626c95887b027656ad4829c156bb6569d02f3262/psutil-7.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a\", size = 184348, upload-time = \"2025-12-29T08:26:22.215Z\" },\n { url = \"https://files.pythonhosted.org/packages/98/60/1672114392dd879586d60dd97896325df47d9a130ac7401318005aab28ec/psutil-7.2.1-cp314-cp314t-win_amd64.whl\", hash = \"sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79\", size = 140400, upload-time = \"2025-12-29T08:26:23.993Z\" },\n { url = \"https://files.pythonhosted.org/packages/fb/7b/d0e9d4513c46e46897b46bcfc410d51fc65735837ea57a25170f298326e6/psutil-7.2.1-cp314-cp314t-win_arm64.whl\", hash = \"sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266\", size = 135430, upload-time = \"2025-12-29T08:26:25.999Z\" },\n { url = \"https://files.pythonhosted.org/packages/c5/cf/5180eb8c8bdf6a503c6919f1da28328bd1e6b3b1b5b9d5b01ae64f019616/psutil-7.2.1-cp36-abi3-macosx_10_9_x86_64.whl\", hash = \"sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42\", size = 128137, upload-time = \"2025-12-29T08:26:27.759Z\" },\n { url = \"https://files.pythonhosted.org/packages/c5/2c/78e4a789306a92ade5000da4f5de3255202c534acdadc3aac7b5458fadef/psutil-7.2.1-cp36-abi3-macosx_11_0_arm64.whl\", hash = \"sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1\", size = 128947, upload-time = \"2025-12-29T08:26:29.548Z\" },\n { url = \"https://files.pythonhosted.org/packages/29/f8/40e01c350ad9a2b3cb4e6adbcc8a83b17ee50dd5792102b6142385937db5/psutil-7.2.1-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8\", size = 154694, upload-time = \"2025-12-29T08:26:32.147Z\" },\n { url = \"https://files.pythonhosted.org/packages/06/e4/b751cdf839c011a9714a783f120e6a86b7494eb70044d7d81a25a5cd295f/psutil-7.2.1-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6\", size = 156136, upload-time = \"2025-12-29T08:26:34.079Z\" },\n { url = \"https://files.pythonhosted.org/packages/44/ad/bbf6595a8134ee1e94a4487af3f132cef7fce43aef4a93b49912a48c3af7/psutil-7.2.1-cp36-abi3-musllinux_1_2_aarch64.whl\", hash = \"sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8\", size = 148108, upload-time = \"2025-12-29T08:26:36.225Z\" },\n { url = \"https://files.pythonhosted.org/packages/1c/15/dd6fd869753ce82ff64dcbc18356093471a5a5adf4f77ed1f805d473d859/psutil-7.2.1-cp36-abi3-musllinux_1_2_x86_64.whl\", hash = \"sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67\", size = 147402, upload-time = \"2025-12-29T08:26:39.21Z\" },\n { url = \"https://files.pythonhosted.org/packages/34/68/d9317542e3f2b180c4306e3f45d3c922d7e86d8ce39f941bb9e2e9d8599e/psutil-7.2.1-cp37-abi3-win_amd64.whl\", hash = \"sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17\", size = 136938, upload-time = \"2025-12-29T08:26:41.036Z\" },\n { url = \"https://files.pythonhosted.org/packages/3e/73/2ce007f4198c80fcf2cb24c169884f833fe93fbc03d55d302627b094ee91/psutil-7.2.1-cp37-abi3-win_arm64.whl\", hash = \"sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442\", size = 133836, upload-time = \"2025-12-29T08:26:43.086Z\" },\n]\n\n[[package]]\nname = \"ptyprocess\"\nversion = \"0.7.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz\", hash = \"sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220\", size = 70762, upload-time = \"2020-12-28T15:15:30.155Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl\", hash = \"sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35\", size = 13993, upload-time = \"2020-12-28T15:15:28.35Z\" },\n]\n\n[[package]]\nname = \"pure-eval\"\nversion = \"0.2.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz\", hash = \"sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42\", size = 19752, upload-time = \"2024-07-21T12:58:21.801Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl\", hash = \"sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0\", size = 11842, upload-time = \"2024-07-21T12:58:20.04Z\" },\n]\n\n[[package]]\nname = \"pycparser\"\nversion = \"2.23\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz\", hash = \"sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2\", size = 173734, upload-time = \"2025-09-09T13:23:47.91Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl\", hash = \"sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934\", size = 118140, upload-time = \"2025-09-09T13:23:46.651Z\" },\n]\n\n[[package]]\nname = \"pygments\"\nversion = \"2.19.2\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz\", hash = \"sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887\", size = 4968631, upload-time = \"2025-06-21T13:39:12.283Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl\", hash = \"sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b\", size = 1225217, upload-time = \"2025-06-21T13:39:07.939Z\" },\n]\n\n[[package]]\nname = \"python-dateutil\"\nversion = \"2.9.0.post0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"six\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"python-json-logger\"\nversion = \"4.0.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/29/bf/eca6a3d43db1dae7070f70e160ab20b807627ba953663ba07928cdd3dc58/python_json_logger-4.0.0.tar.gz\", hash = \"sha256:f58e68eb46e1faed27e0f574a55a0455eecd7b8a5b88b85a784519ba3cff047f\", size = 17683, upload-time = \"2025-10-06T04:15:18.984Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/51/e5/fecf13f06e5e5f67e8837d777d1bc43fac0ed2b77a676804df5c34744727/python_json_logger-4.0.0-py3-none-any.whl\", hash = \"sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2\", size = 15548, upload-time = \"2025-10-06T04:15:17.553Z\" },\n]\n\n[[package]]\nname = \"pytz\"\nversion = \"2025.2\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"pywinpty\"\nversion = \"3.0.2\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/f3/bb/a7cc2967c5c4eceb6cc49cfe39447d4bfc56e6c865e7c2249b6eb978935f/pywinpty-3.0.2.tar.gz\", hash = \"sha256:1505cc4cb248af42cb6285a65c9c2086ee9e7e574078ee60933d5d7fa86fb004\", size = 30669, upload-time = \"2025-10-03T21:16:29.205Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/fc/19/b757fe28008236a4a713e813283721b8a40aa60cd7d3f83549f2e25a3155/pywinpty-3.0.2-cp313-cp313-win_amd64.whl\", hash = \"sha256:18f78b81e4cfee6aabe7ea8688441d30247b73e52cd9657138015c5f4ee13a51\", size = 2050057, upload-time = \"2025-10-03T21:19:26.732Z\" },\n { url = \"https://files.pythonhosted.org/packages/cb/44/cbae12ecf6f4fa4129c36871fd09c6bef4f98d5f625ecefb5e2449765508/pywinpty-3.0.2-cp313-cp313t-win_amd64.whl\", hash = \"sha256:663383ecfab7fc382cc97ea5c4f7f0bb32c2f889259855df6ea34e5df42d305b\", size = 2049874, upload-time = \"2025-10-03T21:18:53.923Z\" },\n { url = \"https://files.pythonhosted.org/packages/ca/15/f12c6055e2d7a617d4d5820e8ac4ceaff849da4cb124640ef5116a230771/pywinpty-3.0.2-cp314-cp314-win_amd64.whl\", hash = \"sha256:28297cecc37bee9f24d8889e47231972d6e9e84f7b668909de54f36ca785029a\", size = 2050386, upload-time = \"2025-10-03T21:18:50.477Z\" },\n { url = \"https://files.pythonhosted.org/packages/de/24/c6907c5bb06043df98ad6a0a0ff5db2e0affcecbc3b15c42404393a3f72a/pywinpty-3.0.2-cp314-cp314t-win_amd64.whl\", hash = \"sha256:34b55ae9a1b671fe3eae071d86618110538e8eaad18fcb1531c0830b91a82767\", size = 2049834, upload-time = \"2025-10-03T21:19:25.688Z\" },\n]\n\n[[package]]\nname = \"pyyaml\"\nversion = \"6.0.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n]\n\n[[package]]\nname = \"pyzmq\"\nversion = \"27.1.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"cffi\", marker = \"implementation_name == 'pypy'\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz\", hash = \"sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540\", size = 281750, upload-time = \"2025-09-08T23:10:18.157Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl\", hash = \"sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc\", size = 1306279, upload-time = \"2025-09-08T23:08:03.807Z\" },\n { url = \"https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl\", hash = \"sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113\", size = 895645, upload-time = \"2025-09-08T23:08:05.301Z\" },\n { url = \"https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233\", size = 652574, upload-time = \"2025-09-08T23:08:06.828Z\" },\n { url = \"https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31\", size = 840995, upload-time = \"2025-09-08T23:08:08.396Z\" },\n { url = \"https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl\", hash = \"sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28\", size = 1642070, upload-time = \"2025-09-08T23:08:09.989Z\" },\n { url = \"https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl\", hash = \"sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856\", size = 2021121, upload-time = \"2025-09-08T23:08:11.907Z\" },\n { url = \"https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl\", hash = \"sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496\", size = 1878550, upload-time = \"2025-09-08T23:08:13.513Z\" },\n { url = \"https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl\", hash = \"sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd\", size = 559184, upload-time = \"2025-09-08T23:08:15.163Z\" },\n { url = \"https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl\", hash = \"sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf\", size = 619480, upload-time = \"2025-09-08T23:08:17.192Z\" },\n { url = \"https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl\", hash = \"sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f\", size = 552993, upload-time = \"2025-09-08T23:08:18.926Z\" },\n { url = \"https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl\", hash = \"sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5\", size = 1122436, upload-time = \"2025-09-08T23:08:20.801Z\" },\n { url = \"https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl\", hash = \"sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6\", size = 1156301, upload-time = \"2025-09-08T23:08:22.47Z\" },\n { url = \"https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl\", hash = \"sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7\", size = 1341197, upload-time = \"2025-09-08T23:08:24.286Z\" },\n { url = \"https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl\", hash = \"sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05\", size = 897275, upload-time = \"2025-09-08T23:08:26.063Z\" },\n { url = \"https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9\", size = 660469, upload-time = \"2025-09-08T23:08:27.623Z\" },\n { url = \"https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128\", size = 847961, upload-time = \"2025-09-08T23:08:29.672Z\" },\n { url = \"https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl\", hash = \"sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39\", size = 1650282, upload-time = \"2025-09-08T23:08:31.349Z\" },\n { url = \"https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl\", hash = \"sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97\", size = 2024468, upload-time = \"2025-09-08T23:08:33.543Z\" },\n { url = \"https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl\", hash = \"sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db\", size = 1885394, upload-time = \"2025-09-08T23:08:35.51Z\" },\n { url = \"https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl\", hash = \"sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c\", size = 574964, upload-time = \"2025-09-08T23:08:37.178Z\" },\n { url = \"https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl\", hash = \"sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2\", size = 641029, upload-time = \"2025-09-08T23:08:40.595Z\" },\n { url = \"https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl\", hash = \"sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e\", size = 561541, upload-time = \"2025-09-08T23:08:42.668Z\" },\n { url = \"https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl\", hash = \"sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a\", size = 1341197, upload-time = \"2025-09-08T23:08:44.973Z\" },\n { url = \"https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl\", hash = \"sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea\", size = 897175, upload-time = \"2025-09-08T23:08:46.601Z\" },\n { url = \"https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl\", hash = \"sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96\", size = 660427, upload-time = \"2025-09-08T23:08:48.187Z\" },\n { url = \"https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl\", hash = \"sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d\", size = 847929, upload-time = \"2025-09-08T23:08:49.76Z\" },\n { url = \"https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl\", hash = \"sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146\", size = 1650193, upload-time = \"2025-09-08T23:08:51.7Z\" },\n { url = \"https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl\", hash = \"sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd\", size = 2024388, upload-time = \"2025-09-08T23:08:53.393Z\" },\n { url = \"https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl\", hash = \"sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a\", size = 1885316, upload-time = \"2025-09-08T23:08:55.702Z\" },\n { url = \"https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl\", hash = \"sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92\", size = 587472, upload-time = \"2025-09-08T23:08:58.18Z\" },\n { url = \"https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl\", hash = \"sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0\", size = 661401, upload-time = \"2025-09-08T23:08:59.802Z\" },\n { url = \"https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl\", hash = \"sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7\", size = 575170, upload-time = \"2025-09-08T23:09:01.418Z\" },\n]\n\n[[package]]\nname = \"referencing\"\nversion = \"0.37.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"attrs\" },\n { name = \"rpds-py\" },\n]\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"requests\"\nversion = \"2.32.5\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"certifi\" },\n { name = \"charset-normalizer\" },\n { name = \"idna\" },\n { name = \"urllib3\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz\", hash = \"sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf\", size = 134517, upload-time = \"2025-08-18T20:46:02.573Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl\", hash = \"sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6\", size = 64738, upload-time = \"2025-08-18T20:46:00.542Z\" },\n]\n\n[[package]]\nname = \"rfc3339-validator\"\nversion = \"0.1.4\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"six\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/28/ea/a9387748e2d111c3c2b275ba970b735e04e15cdb1eb30693b6b5708c4dbd/rfc3339_validator-0.1.4.tar.gz\", hash = \"sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b\", size = 5513, upload-time = \"2021-05-12T16:37:54.178Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/7b/44/4e421b96b67b2daff264473f7465db72fbdf36a07e05494f50300cc7b0c6/rfc3339_validator-0.1.4-py2.py3-none-any.whl\", hash = \"sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa\", size = 3490, upload-time = \"2021-05-12T16:37:52.536Z\" },\n]\n\n[[package]]\nname = \"rfc3986-validator\"\nversion = \"0.1.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/da/88/f270de456dd7d11dcc808abfa291ecdd3f45ff44e3b549ffa01b126464d0/rfc3986_validator-0.1.1.tar.gz\", hash = \"sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055\", size = 6760, upload-time = \"2019-10-28T16:00:19.144Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/9e/51/17023c0f8f1869d8806b979a2bffa3f861f26a3f1a66b094288323fba52f/rfc3986_validator-0.1.1-py2.py3-none-any.whl\", hash = \"sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9\", size = 4242, upload-time = \"2019-10-28T16:00:13.976Z\" },\n]\n\n[[package]]\nname = \"rfc3987-syntax\"\nversion = \"1.1.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"lark\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/2c/06/37c1a5557acf449e8e406a830a05bf885ac47d33270aec454ef78675008d/rfc3987_syntax-1.1.0.tar.gz\", hash = \"sha256:717a62cbf33cffdd16dfa3a497d81ce48a660ea691b1ddd7be710c22f00b4a0d\", size = 14239, upload-time = \"2025-07-18T01:05:05.015Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/7e/71/44ce230e1b7fadd372515a97e32a83011f906ddded8d03e3c6aafbdedbb7/rfc3987_syntax-1.1.0-py3-none-any.whl\", hash = \"sha256:6c3d97604e4c5ce9f714898e05401a0445a641cfa276432b0a648c80856f6a3f\", size = 8046, upload-time = \"2025-07-18T01:05:03.843Z\" },\n]\n\n[[package]]\nname = \"rpds-py\"\nversion = \"0.30.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n { 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\" },\n]\n\n[[package]]\nname = \"send2trash\"\nversion = \"1.8.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/fd/3a/aec9b02217bb79b87bbc1a21bc6abc51e3d5dcf65c30487ac96c0908c722/Send2Trash-1.8.3.tar.gz\", hash = \"sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf\", size = 17394, upload-time = \"2024-04-07T00:01:09.267Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/40/b0/4562db6223154aa4e22f939003cb92514c79f3d4dccca3444253fd17f902/Send2Trash-1.8.3-py3-none-any.whl\", hash = \"sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9\", size = 18072, upload-time = \"2024-04-07T00:01:07.438Z\" },\n]\n\n[[package]]\nname = \"setuptools\"\nversion = \"80.9.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz\", hash = \"sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c\", size = 1319958, upload-time = \"2025-05-27T00:56:51.443Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl\", hash = \"sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922\", size = 1201486, upload-time = \"2025-05-27T00:56:49.664Z\" },\n]\n\n[[package]]\nname = \"six\"\nversion = \"1.17.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"soupsieve\"\nversion = \"2.8.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/89/23/adf3796d740536d63a6fbda113d07e60c734b6ed5d3058d1e47fc0495e47/soupsieve-2.8.1.tar.gz\", hash = \"sha256:4cf733bc50fa805f5df4b8ef4740fc0e0fa6218cf3006269afd3f9d6d80fd350\", size = 117856, upload-time = \"2025-12-18T13:50:34.655Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/48/f3/b67d6ea49ca9154453b6d70b34ea22f3996b9fa55da105a79d8732227adc/soupsieve-2.8.1-py3-none-any.whl\", hash = \"sha256:a11fe2a6f3d76ab3cf2de04eb339c1be5b506a8a47f2ceb6d139803177f85434\", size = 36710, upload-time = \"2025-12-18T13:50:33.267Z\" },\n]\n\n[[package]]\nname = \"stack-data\"\nversion = \"0.6.3\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"asttokens\" },\n { name = \"executing\" },\n { name = \"pure-eval\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz\", hash = \"sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9\", size = 44707, upload-time = \"2023-09-30T13:58:05.479Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl\", hash = \"sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695\", size = 24521, upload-time = \"2023-09-30T13:58:03.53Z\" },\n]\n\n[[package]]\nname = \"terminado\"\nversion = \"0.18.1\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"ptyprocess\", marker = \"os_name != 'nt'\" },\n { name = \"pywinpty\", marker = \"os_name == 'nt'\" },\n { name = \"tornado\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/8a/11/965c6fd8e5cc254f1fe142d547387da17a8ebfd75a3455f637c663fb38a0/terminado-0.18.1.tar.gz\", hash = \"sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e\", size = 32701, upload-time = \"2024-03-12T14:34:39.026Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/6a/9e/2064975477fdc887e47ad42157e214526dcad8f317a948dee17e1659a62f/terminado-0.18.1-py3-none-any.whl\", hash = \"sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0\", size = 14154, upload-time = \"2024-03-12T14:34:36.569Z\" },\n]\n\n[[package]]\nname = \"tinycss2\"\nversion = \"1.4.0\"\nsource = { registry = \"https://pypi.org/simple\" }\ndependencies = [\n { name = \"webencodings\" },\n]\nsdist = { url = \"https://files.pythonhosted.org/packages/7a/fd/7a5ee21fd08ff70d3d33a5781c255cbe779659bd03278feb98b19ee550f4/tinycss2-1.4.0.tar.gz\", hash = \"sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7\", size = 87085, upload-time = \"2024-10-24T14:58:29.895Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl\", hash = \"sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289\", size = 26610, upload-time = \"2024-10-24T14:58:28.029Z\" },\n]\n\n[[package]]\nname = \"tornado\"\nversion = \"6.5.4\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/37/1d/0a336abf618272d53f62ebe274f712e213f5a03c0b2339575430b8362ef2/tornado-6.5.4.tar.gz\", hash = \"sha256:a22fa9047405d03260b483980635f0b041989d8bcc9a313f8fe18b411d84b1d7\", size = 513632, upload-time = \"2025-12-15T19:21:03.836Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/ab/a9/e94a9d5224107d7ce3cc1fab8d5dc97f5ea351ccc6322ee4fb661da94e35/tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl\", hash = \"sha256:d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9\", size = 443909, upload-time = \"2025-12-15T19:20:48.382Z\" },\n { url = \"https://files.pythonhosted.org/packages/db/7e/f7b8d8c4453f305a51f80dbb49014257bb7d28ccb4bbb8dd328ea995ecad/tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl\", hash = \"sha256:2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843\", size = 442163, upload-time = \"2025-12-15T19:20:49.791Z\" },\n { url = \"https://files.pythonhosted.org/packages/ba/b5/206f82d51e1bfa940ba366a8d2f83904b15942c45a78dd978b599870ab44/tornado-6.5.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl\", hash = \"sha256:d1cf66105dc6acb5af613c054955b8137e34a03698aa53272dbda4afe252be17\", size = 445746, upload-time = \"2025-12-15T19:20:51.491Z\" },\n { url = \"https://files.pythonhosted.org/packages/8e/9d/1a3338e0bd30ada6ad4356c13a0a6c35fbc859063fa7eddb309183364ac1/tornado-6.5.4-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl\", hash = \"sha256:50ff0a58b0dc97939d29da29cd624da010e7f804746621c78d14b80238669335\", size = 445083, upload-time = \"2025-12-15T19:20:52.778Z\" },\n { url = \"https://files.pythonhosted.org/packages/50/d4/e51d52047e7eb9a582da59f32125d17c0482d065afd5d3bc435ff2120dc5/tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl\", hash = \"sha256:e5fb5e04efa54cf0baabdd10061eb4148e0be137166146fff835745f59ab9f7f\", size = 445315, upload-time = \"2025-12-15T19:20:53.996Z\" },\n { url = \"https://files.pythonhosted.org/packages/27/07/2273972f69ca63dbc139694a3fc4684edec3ea3f9efabf77ed32483b875c/tornado-6.5.4-cp39-abi3-musllinux_1_2_aarch64.whl\", hash = \"sha256:9c86b1643b33a4cd415f8d0fe53045f913bf07b4a3ef646b735a6a86047dda84\", size = 446003, upload-time = \"2025-12-15T19:20:56.101Z\" },\n { url = \"https://files.pythonhosted.org/packages/d1/83/41c52e47502bf7260044413b6770d1a48dda2f0246f95ee1384a3cd9c44a/tornado-6.5.4-cp39-abi3-musllinux_1_2_i686.whl\", hash = \"sha256:6eb82872335a53dd063a4f10917b3efd28270b56a33db69009606a0312660a6f\", size = 445412, upload-time = \"2025-12-15T19:20:57.398Z\" },\n { url = \"https://files.pythonhosted.org/packages/10/c7/bc96917f06cbee182d44735d4ecde9c432e25b84f4c2086143013e7b9e52/tornado-6.5.4-cp39-abi3-musllinux_1_2_x86_64.whl\", hash = \"sha256:6076d5dda368c9328ff41ab5d9dd3608e695e8225d1cd0fd1e006f05da3635a8\", size = 445392, upload-time = \"2025-12-15T19:20:58.692Z\" },\n { url = \"https://files.pythonhosted.org/packages/0c/1a/d7592328d037d36f2d2462f4bc1fbb383eec9278bc786c1b111cbbd44cfa/tornado-6.5.4-cp39-abi3-win32.whl\", hash = \"sha256:1768110f2411d5cd281bac0a090f707223ce77fd110424361092859e089b38d1\", size = 446481, upload-time = \"2025-12-15T19:21:00.008Z\" },\n { url = \"https://files.pythonhosted.org/packages/d6/6d/c69be695a0a64fd37a97db12355a035a6d90f79067a3cf936ec2b1dc38cd/tornado-6.5.4-cp39-abi3-win_amd64.whl\", hash = \"sha256:fa07d31e0cd85c60713f2b995da613588aa03e1303d75705dca6af8babc18ddc\", size = 446886, upload-time = \"2025-12-15T19:21:01.287Z\" },\n { url = \"https://files.pythonhosted.org/packages/50/49/8dc3fd90902f70084bd2cd059d576ddb4f8bb44c2c7c0e33a11422acb17e/tornado-6.5.4-cp39-abi3-win_arm64.whl\", hash = \"sha256:053e6e16701eb6cbe641f308f4c1a9541f91b6261991160391bfc342e8a551a1\", size = 445910, upload-time = \"2025-12-15T19:21:02.571Z\" },\n]\n\n[[package]]\nname = \"traitlets\"\nversion = \"5.14.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz\", hash = \"sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7\", size = 161621, upload-time = \"2024-04-19T11:11:49.746Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl\", hash = \"sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f\", size = 85359, upload-time = \"2024-04-19T11:11:46.763Z\" },\n]\n\n[[package]]\nname = \"typing-extensions\"\nversion = \"4.15.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"tzdata\"\nversion = \"2025.3\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { 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\" }\nwheels = [\n { 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\" },\n]\n\n[[package]]\nname = \"uri-template\"\nversion = \"1.3.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/31/c7/0336f2bd0bcbada6ccef7aaa25e443c118a704f828a0620c6fa0207c1b64/uri-template-1.3.0.tar.gz\", hash = \"sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7\", size = 21678, upload-time = \"2023-06-21T01:49:05.374Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/e7/00/3fca040d7cf8a32776d3d81a00c8ee7457e00f80c649f1e4a863c8321ae9/uri_template-1.3.0-py3-none-any.whl\", hash = \"sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363\", size = 11140, upload-time = \"2023-06-21T01:49:03.467Z\" },\n]\n\n[[package]]\nname = \"urllib3\"\nversion = \"2.6.2\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/1e/24/a2a2ed9addd907787d7aa0355ba36a6cadf1768b934c652ea78acbd59dcd/urllib3-2.6.2.tar.gz\", hash = \"sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797\", size = 432930, upload-time = \"2025-12-11T15:56:40.252Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/6d/b9/4095b668ea3678bf6a0af005527f39de12fb026516fb3df17495a733b7f8/urllib3-2.6.2-py3-none-any.whl\", hash = \"sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd\", size = 131182, upload-time = \"2025-12-11T15:56:38.584Z\" },\n]\n\n[[package]]\nname = \"wcwidth\"\nversion = \"0.2.14\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz\", hash = \"sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605\", size = 102293, upload-time = \"2025-09-22T16:29:53.023Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl\", hash = \"sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1\", size = 37286, upload-time = \"2025-09-22T16:29:51.641Z\" },\n]\n\n[[package]]\nname = \"webcolors\"\nversion = \"25.10.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/1d/7a/eb316761ec35664ea5174709a68bbd3389de60d4a1ebab8808bfc264ed67/webcolors-25.10.0.tar.gz\", hash = \"sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf\", size = 53491, upload-time = \"2025-10-31T07:51:03.977Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/e2/cc/e097523dd85c9cf5d354f78310927f1656c422bd7b2613b2db3e3f9a0f2c/webcolors-25.10.0-py3-none-any.whl\", hash = \"sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d\", size = 14905, upload-time = \"2025-10-31T07:51:01.778Z\" },\n]\n\n[[package]]\nname = \"webencodings\"\nversion = \"0.5.1\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz\", hash = \"sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923\", size = 9721, upload-time = \"2017-04-05T20:21:34.189Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl\", hash = \"sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78\", size = 11774, upload-time = \"2017-04-05T20:21:32.581Z\" },\n]\n\n[[package]]\nname = \"websocket-client\"\nversion = \"1.9.0\"\nsource = { registry = \"https://pypi.org/simple\" }\nsdist = { url = \"https://files.pythonhosted.org/packages/2c/41/aa4bf9664e4cda14c3b39865b12251e8e7d239f4cd0e3cc1b6c2ccde25c1/websocket_client-1.9.0.tar.gz\", hash = \"sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98\", size = 70576, upload-time = \"2025-10-07T21:16:36.495Z\" }\nwheels = [\n { url = \"https://files.pythonhosted.org/packages/34/db/b10e48aa8fff7407e67470363eac595018441cf32d5e1001567a7aeba5d2/websocket_client-1.9.0-py3-none-any.whl\", hash = \"sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef\", size = 82616, upload-time = \"2025-10-07T21:16:34.951Z\" },\n]\n" + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file