diff --git a/.devenv-version b/.devenv-version index 0ea3a944b..d3b5ba4bf 100644 --- a/.devenv-version +++ b/.devenv-version @@ -1 +1 @@ -0.2.0 +0.2.11 diff --git a/.dockerignore b/.dockerignore index 25221073b..5676953cc 100644 --- a/.dockerignore +++ b/.dockerignore @@ -12,7 +12,8 @@ *~ .*cache .DS_Store -.claude +.claude/settings.local.json +.claude/worktrees .coverage* .docker-token .env* diff --git a/.github/actions/devenv-lint-tools/action.yml b/.github/actions/devenv-lint-tools/action.yml new file mode 100644 index 000000000..8e199a2e2 --- /dev/null +++ b/.github/actions/devenv-lint-tools/action.yml @@ -0,0 +1,27 @@ +# Managed by devenv (copy/ci). Edit it there, not in a child repo. +name: devenv lint tools +description: >- + Install the lint tools devenv's bin/ scripts run with Homebrew and put them + on PATH for later steps. The latest of each, as on the dev machines. Works + on ubuntu runners, where Homebrew is installed but not on PATH, and on macOS. +inputs: + tools: + description: Space-separated Homebrew formulae to install. + default: shellcheck shellharden shfmt hadolint dockerfmt actionlint +runs: + using: composite + steps: + - name: Install lint tools with Homebrew + shell: bash + env: + TOOLS: ${{ inputs.tools }} + HOMEBREW_NO_AUTO_UPDATE: "1" + HOMEBREW_NO_INSTALL_CLEANUP: "1" + HOMEBREW_NO_ANALYTICS: "1" + run: | + if [[ -x /home/linuxbrew/.linuxbrew/bin/brew ]]; then + eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)" + fi + read -ra formulae <<<"$TOOLS" + brew install "${formulae[@]}" + echo "$(brew --prefix)/bin" >>"$GITHUB_PATH" diff --git a/.github/workflows/devenv-check.yml b/.github/workflows/devenv-check.yml index cd0f700b2..9023b988b 100644 --- a/.github/workflows/devenv-check.yml +++ b/.github/workflows/devenv-check.yml @@ -2,9 +2,10 @@ # # Gate, one CI image build, a fail-fast lint/test/build matrix that pulls that # image, and the required-check aggregator. With container: false the matrix -# runs natively on inputs.runner instead (for macOS-only projects) and no -# image is built. Call it from a job in ci.yml; later jobs read its outputs -# instead of repeating any trigger logic: +# runs natively on inputs.runner instead (for macOS-only projects), no image +# is built and the lint combo installs the lint tools with brew. Call it from +# a job in ci.yml; later jobs read its outputs instead of repeating any +# trigger logic: # # ci: # uses: ./.github/workflows/devenv-check.yml @@ -36,15 +37,16 @@ on: description: >- true runs every combo in the CI image built from the Dockerfile. false runs it natively on the runner after setup-uv, setup-bun and - make install, for projects that cannot run in a Linux container. + make install, for projects that cannot run in a Linux container; a + combo that runs lint installs the lint tools with brew first. type: boolean default: true runner: description: >- Runner for the check matrix, e.g. macos-latest with container false. - The gate, image and result jobs stay on ubuntu-24.04. + The gate, image and result jobs stay on ubuntu-latest. type: string - default: ubuntu-24.04 + default: ubuntu-latest release-preflight: description: >- Run bin/release-tag.sh preflight in the gate on main pushes and pull @@ -52,7 +54,7 @@ on: type: boolean default: true retention-days: - description: Days to keep python-dist and the ci-passed marker. + description: Days to keep python-dist, the ci-passed marker and coverage. type: number default: 7 outputs: @@ -93,7 +95,7 @@ jobs: # --------------------------------------------------------------------------- gate: name: Gate - runs-on: ubuntu-24.04 + runs-on: ubuntu-latest timeout-minutes: 10 if: >- (github.event_name == 'push' && github.ref_name == 'main') @@ -179,7 +181,7 @@ jobs: name: CI Image needs: gate if: inputs.container && needs.gate.outputs.dist_found != 'true' - runs-on: ubuntu-24.04 + runs-on: ubuntu-latest # The slowest job: a cold build without the registry cache. timeout-minutes: 45 permissions: @@ -235,7 +237,7 @@ jobs: prune: name: Prune CI Images needs: image - runs-on: ubuntu-24.04 + runs-on: ubuntu-latest timeout-minutes: 10 continue-on-error: true permissions: @@ -296,6 +298,12 @@ jobs: if: ${{ !inputs.container }} uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 + # Only the combo that lints pays for the install. In container mode the + # CI stage of the project's Dockerfile has the tools. + - name: Install lint tools + if: ${{ !inputs.container && contains(matrix.make, 'lint') }} + uses: ./.github/actions/devenv-lint-tools + - name: Install if: ${{ !inputs.container }} run: | @@ -326,6 +334,17 @@ jobs: name: test-results-${{ strategy.job-index }} path: "**/test-results/pytest/*.xml" + # pytest-cov's HTML report. A project whose tests write none, such as + # one with pytest addopts of its own, has nothing to upload. + - name: Upload Coverage + if: matrix.junit && !cancelled() && steps.work.outcome != 'skipped' + uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2 + with: + name: coverage-${{ strategy.job-index }} + path: "**/test-results/coverage/" + retention-days: ${{ inputs.retention-days }} + if-no-files-found: ignore + - name: Publish Test Report if: matrix.junit && !cancelled() && steps.upload-tests.outcome == 'success' uses: mikepenz/action-junit-report@b7b80d7ac5b1da46d6aaff9fb57ad50d8453bcb3 # v6.6.0 @@ -354,7 +373,7 @@ jobs: # always(), not !cancelled(): a skipped required check counts as passing, # so a cancelled run must still reach this job and go red. if: ${{ always() && needs.gate.result != 'skipped' }} - runs-on: ubuntu-24.04 + runs-on: ubuntu-latest timeout-minutes: 5 permissions: {} steps: diff --git a/.github/workflows/devenv-release.yml b/.github/workflows/devenv-release.yml index d864b8685..70f66ff40 100644 --- a/.github/workflows/devenv-release.yml +++ b/.github/workflows/devenv-release.yml @@ -20,7 +20,7 @@ env: jobs: release: name: Tag, Release & Merge to Develop - runs-on: ubuntu-24.04 + runs-on: ubuntu-latest timeout-minutes: 10 permissions: contents: write # tag push, develop push, gh release create diff --git a/.gitignore b/.gitignore index 0dcf06eb9..ecdb1a231 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,8 @@ .DS_Store .Python .claude +.claude/settings.local.json +.claude/worktrees/ .coverage* .coverage.* .dmypy.json @@ -48,7 +50,6 @@ MANIFEST TODO.md __pycache__/ __pypackages__/ -__snapshots__ build celerybeat-schedule celerybeat.pid diff --git a/.prettierignore b/.prettierignore index 5da432334..69dea2d24 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,7 +1,8 @@ *.sh *Dockerfile .*cache -.claude +.claude/settings.local.json +.claude/worktrees/ .git .venv* __pycache__ diff --git a/.readthedocs.yaml b/.readthedocs.yaml index fab4e39b0..7a4f7b798 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -1,5 +1,5 @@ build: - os: ubuntu-24.04 + os: ubuntu-lts-latest tools: python: "3" mkdocs: diff --git a/Dockerfile b/Dockerfile index 351c07927..b135496db 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,7 +13,7 @@ ############################################################################### # ---- Stage 1: builder (build tools + Node for compilation) ----------------- -FROM nikolaik/python-nodejs:python3.14-nodejs26 AS builder-base +FROM nikolaik/python-nodejs:python3.15-nodejs26 AS builder-base # nodejs25 blocked on bug https://github.com/nodejs/node/issues/60303 COPY debian.sources /etc/apt/sources.list.d/ @@ -40,17 +40,18 @@ RUN pip3 install --no-cache --upgrade pip FROM oven/bun:latest AS bun-source FROM builder-base AS codex-ci -# hadolint ignore=DL3008 -RUN apt-get clean \ - && apt-get update \ - && apt-get install --no-install-recommends -y \ - shellcheck \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/* - COPY --from=bun-source /usr/local/bin/bun /usr/local/bin/bun COPY --from=bun-source /usr/local/bin/bunx /usr/local/bin/bunx +# Lint tools devenv's bin/ scripts run, unpinned on purpose. +COPY --from=koalaman/shellcheck:stable /bin/shellcheck /usr/local/bin/ +COPY --from=mvdan/shfmt:latest /bin/shfmt /usr/local/bin/ +COPY --from=hadolint/hadolint:latest /bin/hadolint /usr/local/bin/ +COPY --from=rhysd/actionlint:latest /usr/local/bin/actionlint /usr/local/bin/ +COPY --from=ghcr.io/reteps/dockerfmt:latest /ko-app/dockerfmt /usr/local/bin/ +ADD https://github.com/anordal/shellharden/releases/latest/download/shellharden-x86_64-unknown-linux-musl.tar.gz /tmp/shellharden.tar.gz +RUN tar -xzf /tmp/shellharden.tar.gz -C /usr/local/bin shellharden && rm /tmp/shellharden.tar.gz + WORKDIR /app # Python deps (cacheable when lockfiles unchanged) @@ -86,7 +87,7 @@ COPY pyproject.toml uv.lock ./ COPY dist/${CODEX_WHEEL} ./ # Pin the runtime closure to uv.lock; install the wheel itself without deps. RUN uv export --frozen --no-default-groups --no-emit-project -o requirements.txt \ - && uv venv --python /usr/local/bin/python3.14 /opt/codex \ + && uv venv --python /usr/local/bin/python3.15 /opt/codex \ && PYMUPDF_SETUP_PY_LIMITED_API=0 uv pip install --python /opt/codex/bin/python \ --no-cache --compile-bytecode -r requirements.txt \ && uv pip install --python /opt/codex/bin/python --no-cache --no-deps \ @@ -96,15 +97,15 @@ RUN uv export --frozen --no-default-groups --no-emit-project -o requirements.txt # English: LANGUAGE_CODE is en-us and nothing activates another language. # hadolint ignore=SC2016 RUN set -eux \ - && find /opt/codex -type f \( -name '*.so' -o -name '*.so.*' \) \ - -exec strip --strip-unneeded {} + \ - && find /opt/codex -name '*.pyi' -delete \ - && rm -rf /opt/codex/lib/python3.14/site-packages/pycountry/locales \ - && find /opt/codex/lib/python3.14/site-packages -type d -name locale -prune \ - -exec sh -c 'for d in "$1"/*/; do case "$(basename "$d")" in en|__pycache__) ;; *) rm -rf "$d";; esac; done' _ {} \; + && find /opt/codex -type f \( -name '*.so' -o -name '*.so.*' \) \ + -exec strip --strip-unneeded {} + \ + && find /opt/codex -name '*.pyi' -delete \ + && rm -rf /opt/codex/lib/python3.15/site-packages/pycountry/locales \ + && find /opt/codex/lib/python3.15/site-packages -type d -name locale -prune \ + -exec sh -c 'for d in "$1"/*/; do case "$(basename "$d")" in en|__pycache__) ;; *) rm -rf "$d";; esac; done' _ {} \; # ---- Stage 4: final (production image) ------------------------------------ -FROM ghcr.io/ajslater/python-debian:3.14.6-slim-trixie_0 AS final +FROM ghcr.io/ajslater/python-debian:3.15.0-slim-trixie_0 AS final ARG CODEX_VERSION=dev LABEL org.opencontainers.image.title="Codex" \ org.opencontainers.image.description="Codex Comic Server" \ diff --git a/NEWS.md b/NEWS.md index 23a3ac8dc..625a8bdda 100644 --- a/NEWS.md +++ b/NEWS.md @@ -6,6 +6,19 @@ width: 128px; border-radius: 128px; " /> +## v2.5.5 + +- Features + - `csrf_trusted_origins` setting for CSRF 403s behind a reverse proxy. + - Docker images now use Python 3.15 +- Fixes + - Online tagging matches saved for review by 2.5.3 no longer break the + review list and scan status with "No module named 'numpy'". They are + dropped, so those comics need tagging again. + - Renamed comics no longer contain colons or other characters Windows and + SMB shares can't store. + - A Metron API key is no longer overridden by a `~/.netrc` login. + ## v2.5.4 - Features diff --git a/README.md b/README.md index d382facab..76e5fe4a0 100644 --- a/README.md +++ b/README.md @@ -471,6 +471,11 @@ present. # websockets = true # HTTP path prefix for codex (e.g. "/codex" for reverse proxy sub-path) # url_path_prefix = "" +# Public origins accepted for CSRF when a reverse proxy serves Codex under +# another scheme or host than Codex sees (e.g. https in front of http). +# First make sure the proxy sends X-Forwarded-Proto and X-Forwarded-Host. +# A correctly configured proxy does, and then you shouldn't need this. +# csrf_trusted_origins = ["https://comics.example.com"] # [logging] # Log level: TRACE, DEBUG, INFO, SUCCESS, WARNING, ERROR, CRITICAL @@ -569,6 +574,9 @@ Environment variables override values set in the TOML config file. Default true. - `GRANIAN_URL_PATH_PREFIX` HTTP path prefix for codex (e.g. "/codex" for reverse proxy sub-path). Defaults to "". +- `CODEX_CSRF_TRUSTED_ORIGINS` Comma-separated public origins (e.g. + `https://comics.example.com`) accepted for CSRF behind a reverse proxy. See + [CSRF 403 behind a proxy](#csrf-403-behind-a-proxy). Defaults to none. ##### Repair @@ -697,6 +705,28 @@ of the `/codex` location with `auth_request`, exempt the API the way Codex's own examples do (`location /codex/api { auth_request off; ... }`); the `^~` note above is what keeps the static assets reachable. +#### CSRF 403 behind a proxy + +If logging in or saving changes fails with a 403 "CSRF Failed" error behind a +reverse proxy, first make sure the proxy sends `X-Forwarded-Proto` and +`X-Forwarded-Host` (the nginx example above does). Codex compares them with the +browser's `Origin` header, so a correctly configured proxy ordinarily needs no +CSRF setting at all. Only if the proxy can't send them, or the error persists, +add the public origin the browser uses to `config/codex.toml`: + +```toml +[server] +csrf_trusted_origins = ["https://comics.example.com"] +``` + +or set `CODEX_CSRF_TRUSTED_ORIGINS="https://comics.example.com"` (comma +separated for more than one). An origin is `scheme://host[:port]` with no path; +`https://*.example.com` trusts every subdomain. + +Do not remove Django's `CsrfViewMiddleware` to work around the error. The API +enforces CSRF through Django REST Framework anyway, so removing it doesn't fix +the API, and it strips CSRF protection from Codex's other pages. + #### Preserving the Codex Server Header Codex identifies itself with a `Server: codex/` response header, which diff --git a/bin/_lib.sh b/bin/_lib.sh index e281ddd6c..098d86697 100644 --- a/bin/_lib.sh +++ b/bin/_lib.sh @@ -17,11 +17,16 @@ is_darwin() { } # Succeed when the tool is on PATH. Otherwise say so and how to install it, and -# fail, so a caller can skip that tool visibly instead of silently. +# fail, so a caller can skip that tool visibly instead of silently. In CI (CI +# set, as GitHub sets it) a missing tool is an error instead, so a green CI +# run means every tool ran. need() { if command -v "$1" >/dev/null 2>&1; then return 0 fi + if [[ -n ${CI:-} ]]; then + die "$1 not installed. CI must install it: brew install $1, or add it to the Dockerfile's CI stage" + fi echo "skipped: $1 not installed (brew install $1)" >&2 return 1 } diff --git a/bin/collectstatic.sh b/bin/collectstatic.sh index 7da853dfa..c815c4de1 100755 --- a/bin/collectstatic.sh +++ b/bin/collectstatic.sh @@ -1,6 +1,57 @@ #!/usr/bin/env bash -# Run the django collectstatic command to collect static files from all -# locations specified in settings.STATIC_DIRS and place them in -# settings.STATIC_ROOT for production builds. +# Run django's collectstatic to gather static files from settings.STATICFILES_DIRS +# into settings.STATIC_ROOT for production builds -- when there are any. +# +# Chronicle's django side is a telemetry receiver with no templates and no +# static files of its own, so django.contrib.staticfiles is not installed and +# `collectstatic` is not a registered command: calling it is a hard error, not +# a no-op. The dashboard's frontend is built by vite and served by fastapi out +# of its own dist directory, which django never sees. +# +# `make build` runs this, and a build should not fail over a step that does not +# apply to it. So ask django what it has before asking it to collect, and say +# why when the answer is nothing. set -euo pipefail -BUILD=1 ./bin/pm collectstatic --clear --no-input --ignore "rest_framework" +IGNORE="rest_framework" + +# Asked of django rather than of the settings file, so a settings module that +# grows staticfiles later turns this on without anyone editing the script. +# --verbosity 0: django's shell announces how many models it auto-imported, +# on stdout, which would otherwise be most of the answer read back here. +VERDICT="$(BUILD=1 COLLECTSTATIC_IGNORE="$IGNORE" ./bin/pm shell --verbosity 0 --command " +import os + +from django.apps import apps +from django.conf import settings + +if not apps.is_installed('django.contrib.staticfiles'): + print('no-app') +elif not settings.STATIC_ROOT: + print('no-root') +else: + from django.contrib.staticfiles.finders import get_finders + + ignore = [os.environ['COLLECTSTATIC_IGNORE']] + found = any(True for finder in get_finders() for _ in finder.list(ignore)) + print('collect' if found else 'no-files') +")" + +case "$VERDICT" in +collect) + BUILD=1 ./bin/pm collectstatic --clear --no-input --ignore "$IGNORE" + ;; +no-app) + echo "django.contrib.staticfiles is not installed. Nothing to collect." + ;; +no-root) + echo "settings.STATIC_ROOT is unset. Nothing to collect." + ;; +no-files) + echo "No static files found outside $IGNORE. Nothing to collect." + ;; +*) + echo "Could not tell whether to collect static files. django said:" >&2 + echo "$VERDICT" >&2 + exit 1 + ;; +esac diff --git a/bin/fix-complexity.sh b/bin/fix-complexity.sh new file mode 100755 index 000000000..0fd18f559 --- /dev/null +++ b/bin/fix-complexity.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# Fix complexity +# Rewrites only functions over the complexity limit; lint-complexity.sh fails on +# what it leaves. --quiet would undo --ignore-complexity (complexipy 8.1.0). +# ruff formats its rewrites. +set -euxo pipefail +uv run --group lint complexipy --fix --ignore-complexity +uv run --group lint ruff format . diff --git a/bin/fix-python.sh b/bin/fix-python.sh index da51a1c63..4dee66f00 100755 --- a/bin/fix-python.sh +++ b/bin/fix-python.sh @@ -3,5 +3,6 @@ set -euxo pipefail # Python +bin/fix-complexity.sh uv run --group lint ruff check --fix . uv run --group lint ruff format . diff --git a/bin/fix.sh b/bin/fix.sh index 539bda83b..a49b07e13 100755 --- a/bin/fix.sh +++ b/bin/fix.sh @@ -5,7 +5,7 @@ set -euxo pipefail ##################### ###### Makefile ##### ##################### -uv run mbake format Makefile cfg/*.mk +uvx mbake@latest format Makefile cfg/*.mk ################ # Ignore files # @@ -15,7 +15,8 @@ bin/sort-ignore.sh ############################################ ##### Javascript, JSON, Markdown, YAML ##### ############################################ -bun run fix +# node_root merges a fix script; a project without node_root may have none. +bun run --if-present fix ################### ###### Shell ###### diff --git a/bin/lint-ci.sh b/bin/lint-ci.sh index b05051586..c6dd443e1 100755 --- a/bin/lint-ci.sh +++ b/bin/lint-ci.sh @@ -6,6 +6,12 @@ set -euxo pipefail . "$(dirname "${BASH_SOURCE[0]}")/_lib.sh" # Every workflow, so ci.yml's calls into the devenv-* workflows are checked. -if [[ -d .github/workflows ]] && need actionlint; then - actionlint +# The files are named: bare actionlint finds them by a .git entry, and the CI +# image has none (.dockerignore). Given .git, named files are checked the same +# way, calls into local reusable workflows included; without it that one check +# is skipped. +shopt -s nullglob +files=(.github/workflows/*.yml .github/workflows/*.yaml) +if ((${#files[@]})) && need actionlint; then + actionlint "${files[@]}" fi diff --git a/bin/lint.sh b/bin/lint.sh index 3c4fb18fc..5589a45b9 100755 --- a/bin/lint.sh +++ b/bin/lint.sh @@ -2,10 +2,11 @@ # Lint checks set -euxo pipefail -uv run mbake validate Makefile cfg/*.mk +uvx mbake@latest validate Makefile cfg/*.mk # Javascript, JSON, Markdown, YAML ##### -bun run lint +# node_root merges a lint script; a project without node_root may have none. +bun run --if-present lint bin/sh-tools.sh --lint diff --git a/bin/release-tag.sh b/bin/release-tag.sh index 2f098cf7d..c00dd7c68 100755 --- a/bin/release-tag.sh +++ b/bin/release-tag.sh @@ -280,8 +280,11 @@ cmd_publish() { return 0 ;; esac - latest=$(git ls-remote --tags --refs "$REMOTE" 'v*' | - python3 "$RELEASE_INFO" is-latest --version "$VERSION") || + # A file, not a pipe: is-latest may stop reading early (always for an + # alpha), and under pipefail the SIGPIPE it gives ls-remote fails the run. + git ls-remote --tags --refs "$REMOTE" 'v*' >"$TMP/tags" || + die "could not list tags on $REMOTE" + latest=$(python3 "$RELEASE_INFO" is-latest --version "$VERSION" <"$TMP/tags") || die "could not work out whether $TAG is the latest release" if [ "$FINAL" != true ]; then flags=(--prerelease --latest=false) diff --git a/bin/roman.py b/bin/roman.py index 323147bdd..75cba0bcb 100755 --- a/bin/roman.py +++ b/bin/roman.py @@ -29,7 +29,11 @@ # Constants # --------------------------------------------------------------------------- -SHELL_SHEBANG_PATTERN: re.Pattern[str] = re.compile(r"^#!.*sh") +# The interpreter, or the command after env and its options, is a shell like +# sh, bash or zsh. Matching "sh" anywhere would catch paths like .local/share. +SHELL_SHEBANG_PATTERN: re.Pattern[str] = re.compile( + r"^#!\s*(?:\S*/)?(?:env\s+(?:-\S+\s+)*(?:\S*/)?)?[a-z]*sh(?:\s|$)" +) # Patterns that are always excluded regardless of an ignore file. DEFAULT_EXCLUDE_PATTERNS: list[str] = [ diff --git a/bun.lock b/bun.lock index 17ae7f960..ea223047a 100644 --- a/bun.lock +++ b/bun.lock @@ -12,10 +12,10 @@ "@prettier/plugin-xml": "^3.4.2", "@stylistic/eslint-plugin": "^5.10.0", "@vitest/eslint-plugin": "^1.6.27", - "eslint": "^10.12.0", + "eslint": "^10.13.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-compat": "^7.0.2", - "eslint-plugin-de-morgan": "^2.2.0", + "eslint-plugin-de-morgan": "^2.2.1", "eslint-plugin-depend": "^1.5.0", "eslint-plugin-html": "^8.2.1", "eslint-plugin-import-x": "^4.17.1", @@ -24,7 +24,7 @@ "eslint-plugin-no-unsanitized": "^4.1.5", "eslint-plugin-no-use-extend-native": "^0.7.3", "eslint-plugin-perfectionist": "^5.12.1", - "eslint-plugin-prettier": "^5.5.6", + "eslint-plugin-prettier": "^5.5.7", "eslint-plugin-promise": "^7.3.0", "eslint-plugin-regexp": "^3.3.1", "eslint-plugin-security": "^4.2.0", @@ -33,13 +33,13 @@ "eslint-plugin-unicorn": ">=74.0.0", "eslint-plugin-vue": "^10.11.1", "eslint-plugin-vue-scoped-css": "^3.1.3", - "eslint-plugin-yml": "^3.8.1", + "eslint-plugin-yml": "^3.9.0", "eslint_d": "^15.0.3", "postcss-scss": "^4.0.9", - "prettier": "^3.9.9", + "prettier": "^3.9.10", "prettier-plugin-nginx": "^2.0.0", "prettier-plugin-packagejson": "^3.0.2", - "prettier-plugin-toml": "^3.0.2", + "prettier-plugin-toml": "^4.0.0", "svgo": "^4.1.0", }, }, @@ -80,7 +80,7 @@ "@eslint/core": ["@eslint/core@1.2.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ=="], - "@eslint/css-tree": ["@eslint/css-tree@4.1.1", "", { "dependencies": { "mdn-data": "2.35.0", "source-map-js": "^1.2.1" } }, "sha512-A+s89eP+yDAPkKjnIOfjlkGifg5J7GPn01nWx14UjBVWktfkxOU4975F9ZZ13xNxkGiblNcBaAqgKhnQrW6SWA=="], + "@eslint/css-tree": ["@eslint/css-tree@4.1.2", "", { "dependencies": { "mdn-data": "2.37.2", "source-map-js": "^1.2.1" } }, "sha512-rVcxLmwSkEL3aWS3vAgsTRrQHoYE1b0XcgDtKHDJ92XOkyUpcbS/g0tUJKhvCtlEhYzgKBWsgDd+Z/aPhd166w=="], "@eslint/js": ["@eslint/js@10.0.1", "", { "peerDependencies": { "eslint": "^10.0.0" }, "optionalPeers": ["eslint"] }, "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA=="], @@ -124,7 +124,23 @@ "@stylistic/eslint-plugin": ["@stylistic/eslint-plugin@5.10.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/types": "^8.56.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "estraverse": "^5.3.0", "picomatch": "^4.0.3" }, "peerDependencies": { "eslint": "^9.0.0 || ^10.0.0" } }, "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ=="], - "@tombi-toml/wasm-lib": ["@tombi-toml/wasm-lib@1.7.3", "", {}, "sha512-5q2gg7zIHJNkeP6yz5n9rKq84diNU4UzzE12TDcqg5BWiuLLFfdeoFnP9B71qiS2dNNONsCnHzV5XUSoWAgUhg=="], + "@tombi-toml/lib": ["@tombi-toml/lib@1.8.8", "", { "optionalDependencies": { "@tombi-toml/lib-darwin-arm64": "1.8.8", "@tombi-toml/lib-darwin-x64": "1.8.8", "@tombi-toml/lib-linux-arm64": "1.8.8", "@tombi-toml/lib-linux-arm64-musl": "1.8.8", "@tombi-toml/lib-linux-x64": "1.8.8", "@tombi-toml/lib-linux-x64-musl": "1.8.8", "@tombi-toml/lib-win32-arm64": "1.8.8", "@tombi-toml/lib-win32-x64": "1.8.8" } }, "sha512-LhXK7qS7wd834bRmJRcVmPHu4hzPmelgWfIMTCs8sXrkIqHRmLYzvxfXbSbmAN89gOouBxgiSekZ9y8HL+uoZQ=="], + + "@tombi-toml/lib-darwin-arm64": ["@tombi-toml/lib-darwin-arm64@1.8.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-u1A5blxDS+8wTKz84N++uH5Cr+M5Msh3fC5Vwurdk3Zi9jBsvGLgy3EiIvUD/q6li8JrgUdKWsp8c1qKe3uhoA=="], + + "@tombi-toml/lib-darwin-x64": ["@tombi-toml/lib-darwin-x64@1.8.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-y5rBcy9pqRmdFUEZ5TrSNbu/OQMFlS4vNJ9wMABe3U4i1A9cSEOfsTU39Cs0AB8dBZz93u9BRFEQeWaGBVqgpQ=="], + + "@tombi-toml/lib-linux-arm64": ["@tombi-toml/lib-linux-arm64@1.8.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-uz/+hG/oGiD1hNkpqOIulY5NDN100aOa7aIcEzXWhE4RKdqXuQTQpfd/OGssNMu/YXT/RRT1wKIi1DX7WPzO2w=="], + + "@tombi-toml/lib-linux-arm64-musl": ["@tombi-toml/lib-linux-arm64-musl@1.8.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-M/ZSds0WqX+P2tV5d52e/qOfDvvk4u7tg/pXA9qJPavxcejS6LZAdI7KgCGA0qZfRcIux7KgvFxiowbQ+yv3+w=="], + + "@tombi-toml/lib-linux-x64": ["@tombi-toml/lib-linux-x64@1.8.8", "", { "os": "linux", "cpu": "x64" }, "sha512-GFxfMw1WhUvo3PO2lKKr0I1/oejBbHLTAqYp4hamX3iKMQO8reIs/f4BWu8tyFtrkLy52WcULm/PoqCTtJzJiw=="], + + "@tombi-toml/lib-linux-x64-musl": ["@tombi-toml/lib-linux-x64-musl@1.8.8", "", { "os": "linux", "cpu": "x64" }, "sha512-Jvot8wP4Vz+3rrL35EDgJx13/oj0B5LxN3cPc5o7VIafqDxOOSNqJsxc7c4Y4AKaXY37NtHBDaKIzNXjnhoyJg=="], + + "@tombi-toml/lib-win32-arm64": ["@tombi-toml/lib-win32-arm64@1.8.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-gtuuH1dbXghaq6h63jn6YojYOvwndeUHmKRv+cHHIhfVcs3obF7EMgDKfeTy0H/nla8ojM2ZUh+XheqWcJZisA=="], + + "@tombi-toml/lib-win32-x64": ["@tombi-toml/lib-win32-x64@1.8.8", "", { "os": "win32", "cpu": "x64" }, "sha512-QyCwnMFurpZ+kxafZvB+7zFPi18lkl4KuMORNqgDlPUWx5/uuU+h1LK50rTv8SwQCLwyTVOupZYokWlHf/bO6Q=="], "@tybys/wasm-util": ["@tybys/wasm-util@0.10.4", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A=="], @@ -144,23 +160,21 @@ "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - "@types/node": ["@types/node@26.6.4", "", { "dependencies": { "undici-types": "~8.9.0" } }, "sha512-ldVPDCzj7fsaGZrLB0NuHuTvJcsNasysBAqMolr/cgxrLd1xbqxIr3XJiPnHHJUCxj5sNF1vnRj9aWnrVh5Jcg=="], - "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.71.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.71.1", "@typescript-eslint/types": "^8.71.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Oijc9RUsohHjncg6iGi7gCtjnEjYt9FWv9u6ygK8uKcHK5eLjLAkqERQ9BaytbpceOFdk6kifPCS/zAZE+A99g=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.71.2", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.71.2", "@typescript-eslint/types": "^8.71.2", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-Pd68GsLVh5ZXlcEccFPdhSOvtHZ/2WU0XsA8zmXOS3F158lVlcTLhfQ6qvtL1RzbMie0Kp8xtbVwAg4nejKPHw=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.71.1", "", { "dependencies": { "@typescript-eslint/types": "8.71.1", "@typescript-eslint/visitor-keys": "8.71.1" } }, "sha512-1YUDZXdTnXLlob03SFHBipdyMBsDVm7zoSz0ytTJ39dk5J1TgsTK03VlR/dLXG/RLLUrPcYbD4rp23BmHxHP0w=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.71.2", "", { "dependencies": { "@typescript-eslint/types": "8.71.2", "@typescript-eslint/visitor-keys": "8.71.2" } }, "sha512-YF4wgg5iUX5Obywoac27B56FhozMNFhdJSbh11H5GBAwmBtfyRhmgTQqW9tRNNmHDvsZ2CX6UGzoz+YfYn2Leg=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.71.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-oTvkml5SxXhgg+WWKhod5qWQICDXtOB+/Hi9VdPKFAANJ2b7YOgMffgvzXuqog7R6A/JtrzRf128dsxummyWhg=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.71.2", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-jz49TAWokm/7yWD9/o837nYax9DyALxIPOImdImvVzo6canBCZYzin8zJyqNR5k1j9K1DE0bVvr0XYB+99uAdg=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.71.1", "", {}, "sha512-ybYnPTUwg3VQQOFEiBPLs8Jxl1ry2vXdn1kVKguomBbvxpetdu3MKTNDqFNUrlG8ylP9MpZosmXMFYlGQHk1oQ=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.71.2", "", {}, "sha512-y5Ukl3oVp7e/VGxqIoEXoeb/Roj71PAJ4WG/N/RGj+eeDvKRLM15kGr9MijLbN0i03S52zxu31Z98E5gWChJKw=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.71.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.71.1", "@typescript-eslint/tsconfig-utils": "8.71.1", "@typescript-eslint/types": "8.71.1", "@typescript-eslint/visitor-keys": "8.71.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-pSKSEK1JJpHs6KiKVtABCE4iJK5d7FLFzDXQNBQ2oRY7LEd3UwOt3TZemTgu9syTIf56dJWlTn/pdmrO9oKUXQ=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.71.2", "", { "dependencies": { "@typescript-eslint/project-service": "8.71.2", "@typescript-eslint/tsconfig-utils": "8.71.2", "@typescript-eslint/types": "8.71.2", "@typescript-eslint/visitor-keys": "8.71.2", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-DgNOEsl4pdYzwSL+N/Cl33tX1Hlw3FvId73LnKXfq7jnrF2viOEn7X+P7RBkkSWCVm92gnWd28GIC5vJuLREeA=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.71.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.71.1", "@typescript-eslint/types": "8.71.1", "@typescript-eslint/typescript-estree": "8.71.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-CBjT6gfAz3DW2j9Q4moFnqt208Aq+506sVGXfpRcyAeqn0EpayL0mjdWoCO2t3RC7GewNrFxdeehuEaPg6DMzQ=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.71.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.71.2", "@typescript-eslint/types": "8.71.2", "@typescript-eslint/typescript-estree": "8.71.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-RyKa1G1M9rKHDhrk+HJtiF1MvLD5Ux2JW3TSkzw+02pRALdpJb+QzG1Y5em+LvCgzGwgg8H7mBRFKljNz7ImPw=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.71.1", "", { "dependencies": { "@typescript-eslint/types": "8.71.1", "eslint-visitor-keys": "^5.0.0" } }, "sha512-0GxiUGqMU0qXJt58cBsiG3DP8lUmBaFo2vChtUX+CT7PnR3v/VGLLrzVP4K9r1lNiZXjHYefMBbPunplr09v6w=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.71.2", "", { "dependencies": { "@typescript-eslint/types": "8.71.2", "eslint-visitor-keys": "^5.0.0" } }, "sha512-zozlN0UA32bSG2zkKAgQyRYSbEISVoyU6vvkKYo2aSny74D8Jh4e+POkJ6Lk0dlezZi5x7TtD+88Xb06IB8nhg=="], "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.12.2", "", { "os": "android", "cpu": "arm" }, "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w=="], @@ -208,7 +222,7 @@ "@vitest/eslint-plugin": ["@vitest/eslint-plugin@1.6.27", "", { "dependencies": { "@typescript-eslint/scope-manager": "^8.58.0", "@typescript-eslint/utils": "^8.58.0" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "*", "eslint": ">=8.57.0", "typescript": ">=5.0.0", "vitest": "*" }, "optionalPeers": ["@typescript-eslint/eslint-plugin", "typescript", "vitest"] }, "sha512-X1RCAfwbatG4GFbJ/1PIHP9MSZMt0JJThqbYID+vS4L783k6QGlLPe421wQE8dHXuGCcenVLsydiM4qzsYWxhg=="], - "@xml-tools/parser": ["@xml-tools/parser@1.0.11", "", { "dependencies": { "chevrotain": "7.1.1" } }, "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA=="], + "@xml-tools/parser": ["@xml-tools/parser@1.0.12", "", { "dependencies": { "chevrotain": "7.1.1" } }, "sha512-YNIPbmr/7ClPpWyk0MLImLBLyVLgW+BeOkbd4UDp8w0tCcgU8lmA4karXBF9EQwaQzDTzaBbJtmSA0G2NKKlPA=="], "acorn": ["acorn@8.19.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw=="], @@ -220,7 +234,7 @@ "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.11.27", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-ElY12DaROGuan+lMmZ8Cvo/ZUbXPe7Enc/9VU/b1T3Kp4dwytRcNdR8DoSJN5SNJT/CuvcCA0DHDVmMOCePdRQ=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.29", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-YeesxhUmR4h5y5V8KF8iBCqJb8YFrBJ++XBTeGcWIaQOYXGN19JM0FoiOjAhwuDoln8owMgXcWBmgHtYSkky2w=="], "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], @@ -234,7 +248,7 @@ "cacheable": ["cacheable@2.5.0", "", { "dependencies": { "@cacheable/memory": "^2.2.0", "@cacheable/utils": "^2.5.0", "hookified": "^1.15.0", "keyv": "^5.6.0", "qified": "^0.10.1" } }, "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g=="], - "caniuse-lite": ["caniuse-lite@1.0.30001815", "", {}, "sha512-uDybUEyfgbyJJ93J1vikTylBX31AkdVYeVPeffMQpf8XN7hSfr0oZOn4VFOIMNvtU5+rHvC5Udg2TgtJKHm23Q=="], + "caniuse-lite": ["caniuse-lite@1.0.30001816", "", {}, "sha512-+8Yx7BXCoqk6IF8yTicjfUR6D/ldJzdlsodlEOiOSPmhK844WIgk67/zIQaGAOxNkZyyvBlrRFnLvqKIoqbAFw=="], "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], @@ -290,7 +304,7 @@ "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="], - "electron-to-chromium": ["electron-to-chromium@1.5.451", "", {}, "sha512-vUNKPrUzw8ByEMOxloq0a71iD/mPuPxVkbDm3G5YhnxTzOw/I6qAg2MUS0cYj/c267lWmw26yW4Vv7foxTxPLg=="], + "electron-to-chromium": ["electron-to-chromium@1.5.459", "", {}, "sha512-4SC9HHSFjO/liAhifpdOL5hG9b4BP7/5G3y3UPZVO8trlAXr1CaUEEJL0gWK3kOcYcZrOA5rkwG45Gra/lTIgg=="], "empathic": ["empathic@2.1.0", "", {}, "sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw=="], @@ -302,7 +316,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.12.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.7.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "11.1.5 || >11.1.6 <12", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-npHjrHb2o4ehH3mE+YuxABR+0gyb0aVWCIolgJDArwCiHEIsonBm3ZKjel5b0U5+a+MbEvIyRCGCzD3eKKK2NA=="], + "eslint": ["eslint@10.13.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.7.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "11.1.5 || >11.1.6 <12", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-UohDjD4zSzEwhf58M3O7vc/ycc8O1I7dNlhtD0WxE8Px8EHNJKtUwzBqrzeGhisRuv2ag4sAYswszCJRgKXYUg=="], "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], @@ -310,7 +324,7 @@ "eslint-plugin-compat": ["eslint-plugin-compat@7.0.2", "", { "dependencies": { "@mdn/browser-compat-data": "^6.1.1", "ast-metadata-inferer": "^0.8.1", "browserslist": "^4.25.2", "find-up": "^5.0.0", "globals": "^15.7.0", "lodash.memoize": "^4.1.2", "semver": "^7.6.2" }, "peerDependencies": { "eslint": "^9.0.0 || ^10.0.0" } }, "sha512-gN8hF+4NzMsHUbr4m/TYZK0FtW3DcV4g8rXpTsY2EV5xiRD8jsilUlB9lNSkGGX0veDCxMhKSWbSd+faJByQDA=="], - "eslint-plugin-de-morgan": ["eslint-plugin-de-morgan@2.2.0", "", { "peerDependencies": { "eslint": "^8.45.0 || ^9.0.0 || ^10.0.0" } }, "sha512-bHg8e68rQTJ01av4sxhgNWQeoSzPWDjb6MqeKgmgRGaCzq83Ou6/g5S1ZssvFdHHS4BsblkJkagoioUmSEHPMg=="], + "eslint-plugin-de-morgan": ["eslint-plugin-de-morgan@2.2.1", "", { "peerDependencies": { "eslint": "^8.45.0 || ^9.0.0 || ^10.0.0" } }, "sha512-uJeLrx8bt1wGn9GCPy+2jTfH6OLBw/59ipjrhWolKijzty8F3VrnerKKtclQhIIizuy/QrRIV5fYrrALo6psyw=="], "eslint-plugin-depend": ["eslint-plugin-depend@1.5.0", "", { "dependencies": { "empathic": "^2.0.0", "module-replacements": "^2.10.1", "semver": "^7.6.3" }, "peerDependencies": { "eslint": ">=8.40.0" } }, "sha512-i3UeLYmclf1Icp35+6W7CR4Bp2PIpDgBuf/mpmXK5UeLkZlvYJ21VuQKKHHAIBKRTPivPGX/gZl5JGno1o9Y0A=="], @@ -328,7 +342,7 @@ "eslint-plugin-perfectionist": ["eslint-plugin-perfectionist@5.12.1", "", { "dependencies": { "@typescript-eslint/types": "^8.70.0", "@typescript-eslint/utils": "^8.70.0", "natural-orderby": "^5.0.0" }, "peerDependencies": { "eslint": "^8.45.0 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["eslint"] }, "sha512-krdSE7Dz+TCtcVr2+rfNhlOIFFBJcUdoRvjaN7JQnsaVnxJw+BZh9wMkY3MSLCJat+yW+UPTQLKS82Epc7MGZA=="], - "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.6", "", { "dependencies": { "prettier-linter-helpers": "^1.0.1", "synckit": "^0.11.13" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ=="], + "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.7", "", { "dependencies": { "prettier-linter-helpers": "^1.0.1", "synckit": "^0.12.3" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-WjHyn3GrFd+ZR0rzsLiM4zJZ35PZMOE0SUIxzGmnWNG0126yNfJKJzObmmkYDwHJfGlkz3PSlzyG9ez/LJntwg=="], "eslint-plugin-promise": ["eslint-plugin-promise@7.3.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, "sha512-6uGiOR0INuujr6PEQmeSSP7GbIMJ/ebEXXiEzb/nOj68LknH5Pxzb/AbZivmr6VE6TkTE8rTjRK9zhKpK6HsRA=="], @@ -340,13 +354,13 @@ "eslint-plugin-toml": ["eslint-plugin-toml@1.5.0", "", { "dependencies": { "@eslint/core": "^1.0.1", "@eslint/plugin-kit": "^0.7.0", "@ota-meshi/ast-token-store": "^0.3.0", "debug": "^4.1.1", "toml-eslint-parser": "^1.0.1" }, "peerDependencies": { "eslint": ">=9.38.0" } }, "sha512-qBjRywEkKxO2uYOjus//6GVF1r+Hg5QDkRO8RTY6XcaXgWfBU0DhwpFmJa2Ljf0Sz49r7DdZlpKwwHmJ4nmH1Q=="], - "eslint-plugin-unicorn": ["eslint-plugin-unicorn@77.0.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.10.1", "@eslint/css-tree": "^4.1.1", "browserslist": "^4.29.1", "change-case": "^5.4.4", "ci-info": "^4.4.0", "core-js-compat": "^3.50.0", "detect-indent": "^7.0.2", "entities": "^8.1.0", "find-up-simple": "^1.0.1", "globals": "^17.12.0", "identifier-regex": "^1.1.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "pluralize": "^8.0.0", "quote-js-string": "^0.1.0", "regjsparser": "^0.13.3", "reserved-identifiers": "^1.2.0", "semver": "^7.8.5", "strip-indent": "^4.1.1", "yaml": "^2.9.1" }, "peerDependencies": { "eslint": ">=10.4" } }, "sha512-aayznMCKTXlPAsoyUjRok862sz3BJAfxpQX/t79AT/uVQTmWsCx3FXfXo+9hfhL8aR2mMZQYyXoDZo3/ly6lJw=="], + "eslint-plugin-unicorn": ["eslint-plugin-unicorn@78.0.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.10.1", "@eslint/css-tree": "^4.1.1", "browserslist": "^4.29.1", "change-case": "^5.4.4", "ci-info": "^4.4.0", "core-js-compat": "^3.50.0", "detect-indent": "^7.0.2", "entities": "^8.1.0", "find-up-simple": "^1.0.1", "globals": "^17.12.0", "identifier-regex": "^1.1.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "micromark": "^4.0.3", "parse5": "^8.0.1", "pluralize": "^8.0.0", "quote-js-string": "^0.1.0", "regjsparser": "^0.13.3", "reserved-identifiers": "^1.2.0", "semver": "^7.8.5", "strip-indent": "^4.1.1", "yaml": "^2.9.1" }, "peerDependencies": { "eslint": ">=10.4", "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-XTDqxcJeAmh2lhgU75TpuMDdFtPDnAU+DCW56nR5UzXTG+uOyvOGjV80O11my7kNb2bYSCPlWa8c4K8/rwlYog=="], "eslint-plugin-vue": ["eslint-plugin-vue@10.11.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^7.1.4", "semver": "^7.8.5", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "vue-eslint-parser": "^10.3.0" }, "optionalPeers": ["@stylistic/eslint-plugin", "@typescript-eslint/parser"] }, "sha512-pasVXhl7wUmIvhujoqs/m0mJ9r59QW1IR9XXYKGR0FETzSM+Hhlf4qKIYgWiDDP+9YKv4YfbwskD7LqIdVcgQw=="], "eslint-plugin-vue-scoped-css": ["eslint-plugin-vue-scoped-css@3.1.3", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "es-toolkit": "^1.46.1", "postcss": "^8.4.31", "postcss-safe-parser": "^7.0.0", "postcss-selector-parser": "^7.0.0" }, "peerDependencies": { "eslint": ">=9.38.0", "postcss-scss": "^4.0.3", "postcss-styl": "^0.12.0", "vue-eslint-parser": ">=7.1.0" }, "optionalPeers": ["postcss-scss", "postcss-styl"] }, "sha512-Kt3VC6C14HnbAzkumVA+p420BBdoym/gJjQtyYBX6V2ktOTDOVRfPDj9qJwHfVevJ0nOY5WeLXa0SV1wvSwGMQ=="], - "eslint-plugin-yml": ["eslint-plugin-yml@3.8.1", "", { "dependencies": { "@eslint/core": "^1.0.1", "@eslint/plugin-kit": "^0.7.0", "@ota-meshi/ast-token-store": "^0.3.0", "diff-sequences": "^29.0.0", "escape-string-regexp": "5.0.0", "natural-compare": "^1.4.0", "yaml-eslint-parser": "^2.0.0" }, "peerDependencies": { "eslint": ">=9.38.0" } }, "sha512-E/70psRwxz5EJ8dBtzrFfqSiiInuSytbdtFCjueb/GcKjsWzPBfxfhtQePImMAPjHwMA/VDurO7DJwStDJ4wWg=="], + "eslint-plugin-yml": ["eslint-plugin-yml@3.9.0", "", { "dependencies": { "@eslint/core": "^1.0.1", "@eslint/plugin-kit": "^0.7.0", "@ota-meshi/ast-token-store": "^0.3.0", "diff-sequences": "^29.0.0", "escape-string-regexp": "5.0.0", "natural-compare": "^1.4.0", "yaml-eslint-parser": "^2.0.0" }, "peerDependencies": { "eslint": ">=9.38.0" } }, "sha512-o4ByMVFd/mGc0Q/vJmbG9pz7Kyg/BiKAGnWCzvMLqzpa2KMdpUrLgF5a6yYeL2mf1Br/9dckd0ADl3vw7uF+jA=="], "eslint-scope": ["eslint-scope@9.1.2", "", { "dependencies": { "@types/esrecurse": "^4.3.1", "@types/estree": "^1.0.8", "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ=="], @@ -440,7 +454,7 @@ "js-types": ["js-types@4.0.0", "", {}, "sha512-/c+n06zvqFQGxdz1BbElF7S3nEghjNchLN1TjQnk2j10HYDaUc57rcvl6BbnziTx8NQmrg0JOs/iwRpvcYaxjQ=="], - "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@9.2.2", "", { "dependencies": { "@types/estree": "^1.0.9", "@types/node": "^26.4.0" } }, "sha512-eFY7Rlscvv/BpY6UsVsjKwMhu1tJO/F4U/vC9g3yeRy/JqszuO1UP6Vdq+85G+3FP6fEw/sWR8a5ftPFY86csw=="], + "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@9.2.3", "", { "dependencies": { "@types/estree": "^1.0.9" } }, "sha512-xsCb5EbmLWNlQ8v5zQIgSYSyf1rSyVPjh8p9G2xviOl1weHm8a611fHWUOGn7ISquCL6LoBKZvh0tcKmpVGgzw=="], "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], @@ -494,7 +508,7 @@ "mdast-util-to-string": ["mdast-util-to-string@4.0.0", "", { "dependencies": { "@types/mdast": "^4.0.0" } }, "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg=="], - "mdn-data": ["mdn-data@2.35.0", "", {}, "sha512-k+1+dEIm2z/BEfdvYzT/fIyAGeDBo/1AJNJI4ilFXJRYoxP/3Ds+GP8shAOIq8jYXY9N5nGB3Ag104NsagmLAA=="], + "mdn-data": ["mdn-data@2.37.2", "", {}, "sha512-rz9YOBGItdSbe7HcSArUbhiAv4SB/4DKRYg96CSFS2CcIYMbUvBtZlzA1NCbk2AdgbmYwMqwNblLpR441lLeiQ=="], "micromark": ["micromark@4.0.3", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-edit-map": "^1.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-oGYfQzHSG5dOMovQcJ3fyTmZlWAWpi0XA0sJwJs+i6OT88o1+Jtw/8z0CmdowSLxGhhFK89rQ/oXph/wN02PNw=="], @@ -572,7 +586,7 @@ "natural-orderby": ["natural-orderby@5.0.0", "", {}, "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg=="], - "node-releases": ["node-releases@2.0.57", "", {}, "sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw=="], + "node-releases": ["node-releases@2.0.59", "", {}, "sha512-5qr2okC4ItAI0hG5SaV0HoYMpnM/Y6+Oqr7AmPYy/2uEoGvS+GbSKLeRxSS1uAdu59yz0ouzcuXievSgg///WA=="], "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], @@ -584,6 +598,8 @@ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + "parse5": ["parse5@8.0.1", "", { "dependencies": { "entities": "^8.0.0" } }, "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw=="], + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], @@ -594,7 +610,7 @@ "pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="], - "postcss": ["postcss@8.5.29", "", { "dependencies": { "nanoid": "^3.3.19", "picocolors": "^1.1.1", "source-map-js": "^1.2.2" } }, "sha512-49cGhUbXj8Qenv0iTMxA1cFBzxXoctpC9Ujd77t1WcbJIr6nF/eI7g/8MgxrYldFRuAXvja7xQRwavoW7kgrxQ=="], + "postcss": ["postcss@8.5.31", "", { "dependencies": { "nanoid": "^3.3.20", "picocolors": "^1.1.1", "source-map-js": "^1.2.2" } }, "sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg=="], "postcss-safe-parser": ["postcss-safe-parser@7.1.0", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-1WzZxRLaAFwEh6Do+zyGpjWV3nGJNxxhuh7Ubu/q1ICImMgZJnLwhoaEpRbG4pJppp2Y1ncL9ffA2f+LhrefQg=="], @@ -604,7 +620,7 @@ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - "prettier": ["prettier@3.9.9", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg=="], + "prettier": ["prettier@3.9.10", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-skGHTH1Yb9QvaTC4hWnRTzEYtCpApF0UMBPz+t/0ZPzP8ihefo/btKd+QA7pUE0fEwA1SbS/NmhyEcstdXOIdA=="], "prettier-linter-helpers": ["prettier-linter-helpers@1.0.1", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg=="], @@ -612,7 +628,7 @@ "prettier-plugin-packagejson": ["prettier-plugin-packagejson@3.0.2", "", { "dependencies": { "sort-package-json": "^3.6.0" }, "peerDependencies": { "prettier": "^3" }, "optionalPeers": ["prettier"] }, "sha512-kmoj3hEynXwoHDo8ZhmWAIjRBoQWCDUVackiWfSDWdgD0rS3LGB61T9zoVbume/cotYdCoadUh4sqViAmXvpBQ=="], - "prettier-plugin-toml": ["prettier-plugin-toml@3.0.2", "", { "dependencies": { "@dual-bundle/import-meta-resolve": "^4.2.1", "@tombi-toml/wasm-lib": "^1.5.5", "smol-toml": "^1.8.0" }, "peerDependencies": { "prettier": "^3.0.3" } }, "sha512-1t1FOSGaXNy7xN6ffE7ND71VqsnbUtanGEKAD1hTwFDrGIH1cwZ0KH6lMThDVItjdV/UUJWqD3f1+16AHG3eUQ=="], + "prettier-plugin-toml": ["prettier-plugin-toml@4.0.0", "", { "dependencies": { "@tombi-toml/lib": "^1.8.4", "smol-toml": "^1.8.0" }, "peerDependencies": { "prettier": "^3.0.3" } }, "sha512-kx4a0gdNKH40/NOj/gSkiRKqXmOq8hXb6fNWW6Txd3T0fyq+Wq8ly0qtjNoGGiLUPhvS/3PIRVyVJpzHw6RNwA=="], "prototype-properties": ["prototype-properties@5.1.0", "", {}, "sha512-lq/vK1+nYV/bbjZ70pDmaTzin143xX9hVAU5CrsNQL57A8j4Q6AfjsY8kRFoUpCBncaUdfkz9MdsQ8PFtiKrUQ=="], @@ -648,7 +664,7 @@ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "smol-toml": ["smol-toml@1.9.0", "", {}, "sha512-hpd+HLON7HdZXqYchMM/+LaTTbdK0AU3NngIJ4KVyWbY9bfQqdL9cD+4yf6dUoU2Ap4VsU0JkQi6FxAI1B2mXQ=="], + "smol-toml": ["smol-toml@1.9.1", "", {}, "sha512-j7WyPdf0CJoutMzMoPLF/bVXHtKZIT9Rb4eGeEbWw8X2t5oirjPgpL+OpaENZrILYaXqYwnVH+qgUwVbl+pUJQ=="], "sort-object-keys": ["sort-object-keys@2.1.0", "", {}, "sha512-SOiEnthkJKPv2L6ec6HMwhUcN0/lppkeYuN1x63PbyPRrgSPIuBJCiYxYyvWRTtjMlOi14vQUCGUJqS6PLVm8g=="], @@ -664,7 +680,7 @@ "svgo": ["svgo@4.1.0", "", { "dependencies": { "commander": "^11.1.0", "css-select": "^6.0.0", "css-tree": "^3.0.1", "css-what": "^7.0.0", "csso": "^5.0.5", "picocolors": "^1.1.1", "sax": "1.6.1" }, "bin": { "svgo": "bin/svgo.js" } }, "sha512-bkxnTg1kSU0guhIBmibA6UUhrQmPVA1XsQLN+ylCd+UWzbnLkySOcXpyk1mrl05f+pcaCx2eHb+sp6BgMZWX+Q=="], - "synckit": ["synckit@0.11.13", "", { "dependencies": { "@pkgr/core": "^0.3.6" } }, "sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg=="], + "synckit": ["synckit@0.12.3", "", { "dependencies": { "@dual-bundle/import-meta-resolve": "^4.2.1", "@pkgr/core": "^0.3.6" } }, "sha512-U+/AXT6LWsxnj2vz9HeUuPWBNgdWxjyIEjEPdbJARC9txmgPzo2VEdqnFo4hHaNyMPtycyVJrSaQYeQv/PoyyA=="], "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], @@ -678,8 +694,6 @@ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], - "undici-types": ["undici-types@8.9.0", "", {}, "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg=="], - "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="], "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="], diff --git a/cfg/django.mk b/cfg/django.mk index 3aa211554..9a6676a28 100644 --- a/cfg/django.mk +++ b/cfg/django.mk @@ -25,6 +25,10 @@ django-check: collectstatic: build-frontend bin/collectstatic.sh +# Does nothing unless frontend.mk or the project's own .mk gives it a recipe. +.PHONY: build-frontend +build-frontend: + .PHONY: build-only ## Build python package without collecting static files ## @category Build diff --git a/cfg/eslint.config.base.js b/cfg/eslint.config.base.js index 46278dd95..98f7cbf4d 100644 --- a/cfg/eslint.config.base.js +++ b/cfg/eslint.config.base.js @@ -150,24 +150,28 @@ export const MARKDOWN_CONFIGS = [ const baseConfig = defineConfig([ { ignores: [ + // Unlike a .gitignore line, an ESLint pattern is anchored at the project + // root: "dist/" ignores dist/ but lints frontend/dist/. Tool output can + // land in any subproject, so it takes "**/". The last four are root-level + // state; deeper down, tasks/ and typings/ can be real source directories. "**/*.min.css", "**/*.min.js", + "**/*~", + "**/.*cache/", + "**/.eslintcache", + "**/.venv/", "**/__pycache__/", + "**/bun.lock", "**/coverage/", + "**/dist/", "**/htmlcov/", "**/node_modules/", - "*~", + "**/test-results/", + "**/uv.lock", ".claude", - ".eslintcache", ".git/", - ".*cache/", - ".venv/", - "bun.lock", - "dist/", "tasks/", - "test-results/", "typings/", - "uv.lock", ], name: "globalIgnores", }, diff --git a/cfg/python.mk b/cfg/python.mk index eb41840be..4bd3a6bbd 100644 --- a/cfg/python.mk +++ b/cfg/python.mk @@ -43,6 +43,12 @@ version:: fix-python: ./bin/fix-python.sh +.PHONY: fix-complexity +## Refactor python functions over the complexity limit +## @category Fix +fix-complexity: + ./bin/fix-complexity.sh + .PHONY: fix ## Fix python lint errors ## @category Fix diff --git a/codex/cache.py b/codex/cache.py index 0b4ae872c..0b9d6acc7 100644 --- a/codex/cache.py +++ b/codex/cache.py @@ -8,9 +8,17 @@ (a write killed mid-flush leaves a file Django can't decompress) and the right behaviour is just "treat it as a miss". -``ResilientFileBasedCache`` catches those decode errors, deletes the -bad file, and reports a miss so the caller continues with the -underlying query instead of returning a 500 to the user. +An intact entry can be just as unreadable after an upgrade. A pickle +names the module and class of every object in it, so an entry written +before a dependency was dropped raises ``ModuleNotFoundError`` on load, +and one naming a since-removed class raises ``AttributeError``. Codex +2.5.3 pickled comicbox's numpy cover scores into pending online-tag +prompts; 2.5.4 ships without numpy, and every read of those prompts +returned a 500. + +``ResilientFileBasedCache`` catches those errors, deletes the bad file, +and reports a miss so the caller continues with the underlying query +instead of returning a 500 to the user. It also no-ops ``validate_key``: the base class checks every key for memcached compatibility (no spaces / control chars / length > 250) @@ -31,36 +39,44 @@ from django.utils.connection import ConnectionProxy from loguru import logger -_CORRUPT_CACHE_ERRORS: tuple[type[BaseException], ...] = ( +_UNREADABLE_CACHE_ERRORS: tuple[type[BaseException], ...] = ( zlib.error, UnpicklingError, EOFError, + # A stale pickle: its module (ModuleNotFoundError) or class is gone. + ImportError, + AttributeError, ) class ResilientFileBasedCache(FileBasedCache): - """Cache backend that tolerates corrupt cache entries.""" + """Cache backend that tolerates unreadable cache entries.""" - def _discard_corrupt(self, fname: str, exc: BaseException) -> None: - logger.debug(f"Discarded corrupt cache file {fname}: {exc}") + def _discard_unreadable(self, key, version, exc: BaseException) -> None: + # The file is deleted here, so this warning is the only record of + # what was dropped and why. It carries the key and the traceback: + # an admin whose review queue just emptied can see the cause, and an + # error caught here that should not have been shows where it came from. + fname = self._key_to_file(key, version) # pyright: ignore[reportAttributeAccessIssue], # ty: ignore[unresolved-attribute] + logger.opt(exception=exc).warning( + f"Discarded unreadable cache entry {key!r} ({fname}): {exc!r}" + ) self._delete(fname) # pyright: ignore[reportAttributeAccessIssue], # ty: ignore[unresolved-attribute] @override def get(self, key, default=None, version=None): try: return super().get(key, default=default, version=version) - except _CORRUPT_CACHE_ERRORS as exc: - fname = self._key_to_file(key, version) # pyright: ignore[reportAttributeAccessIssue], # ty: ignore[unresolved-attribute] - self._discard_corrupt(fname, exc) + except _UNREADABLE_CACHE_ERRORS as exc: + self._discard_unreadable(key, version, exc) return default @override def touch(self, key, timeout=DEFAULT_TIMEOUT, version=None): try: return super().touch(key, timeout=timeout, version=version) - except _CORRUPT_CACHE_ERRORS as exc: - fname = self._key_to_file(key, version) # pyright: ignore[reportAttributeAccessIssue], # ty: ignore[unresolved-attribute] - self._discard_corrupt(fname, exc) + except _UNREADABLE_CACHE_ERRORS as exc: + self._discard_unreadable(key, version, exc) return False @override diff --git a/codex/choices/browser.py b/codex/choices/browser.py index f4b42aa98..6c6aab844 100644 --- a/codex/choices/browser.py +++ b/codex/choices/browser.py @@ -776,8 +776,6 @@ def clean_table_columns(value) -> tuple[dict[str, list[str]], list[str]]: BROWSER_DEFAULTS = MappingProxyType( { - "custom_covers": True, - "dynamic_covers": True, "filters": _DEFAULT_FILTERS, "order_by": "sort_name", "order_reverse": False, diff --git a/codex/choices/reader.py b/codex/choices/reader.py index fcf587c00..d6419a470 100644 --- a/codex/choices/reader.py +++ b/codex/choices/reader.py @@ -24,10 +24,8 @@ ) READER_DEFAULTS = MappingProxyType( { - "finish_on_last_page": True, "fit_to": "W", "reading_direction": "ltr", - "read_rtl_in_reverse": False, "two_pages": False, "page_transition": True, "cache_book": False, diff --git a/codex/doctor/checks.py b/codex/doctor/checks.py index 40603e552..1a33cb14d 100644 --- a/codex/doctor/checks.py +++ b/codex/doctor/checks.py @@ -248,9 +248,9 @@ def check_watcher() -> Iterator[CheckResult]: yield _row("watcher", Status.OK, found=found, detail=detail) -def check_credentials() -> Iterator[CheckResult]: +def _stored_credentials() -> dict[str, str]: """ - Whether the stored tagging credentials still decrypt. + Read the tagging credentials as stored, still encrypted, by field name. The field decrypts on load and, on failure, hands back the ciphertext as if it were the value, so the Tagging tab would show gibberish and a @@ -268,9 +268,12 @@ def check_credentials() -> Iterator[CheckResult]: .values(*(f"raw_{f.name}" for f in fields)) .first() ) or {} - stored: dict[str, str] = { - f.name: token for f in fields if (token := raw.get(f"raw_{f.name}")) - } + return {f.name: token for f in fields if (token := raw.get(f"raw_{f.name}"))} + + +def check_credentials() -> Iterator[CheckResult]: + """Whether the stored tagging credentials still decrypt.""" + stored = _stored_credentials() if not stored: yield _row("credentials", Status.OFF, detail="no tagging credentials stored") return diff --git a/codex/librarian/onlinetag/session_state.py b/codex/librarian/onlinetag/session_state.py index cd11bd833..bf25c4ab5 100644 --- a/codex/librarian/onlinetag/session_state.py +++ b/codex/librarian/onlinetag/session_state.py @@ -172,6 +172,10 @@ def serialize_prompt( } +def _plain_float(value) -> float | None: + return None if value is None else float(value) + + def serialize_candidate(c) -> dict[str, Any]: """ Serialize a comicbox Candidate to a JSON-safe dict. @@ -180,6 +184,11 @@ def serialize_candidate(c) -> dict[str, Any]: comicbox, or a shape that changes under us, degrades to a missing display field rather than an exception in the librarian. + Scores are cast to plain ``float``. The dict is pickled into the + tagging cache, and a pickle names the class of every value in it: + comicbox 5.2's cover scores were ``numpy.float64``, so prompts stored + then could not be read once numpy was gone. + Adding display fields here must NOT bump ``PROMPT_VERSION``: that gates the fingerprint scheme, and raising it discards every prompt a user has pending. The frontend tolerates their absence instead. @@ -207,16 +216,16 @@ def serialize_candidate(c) -> dict[str, Any]: # Comic Vine's search results have no equivalent. "volume": getattr(summary, "volume", None), }, - "score": c.score, + "score": float(c.score), # What the blended score is made of. Two candidates can read # identically — same series, issue and year — and differ only # here, which is exactly the case the reporter could not choose # between. - "metadata_score": getattr(c, "metadata_score", None), + "metadata_score": _plain_float(getattr(c, "metadata_score", None)), # None when the cover was never compared: either this candidate # has no usable image, or it fell outside the top few the matcher # pays to hash. ``cover_hash_attempted`` tells those apart. - "cover_score": getattr(c, "cover_score", None), + "cover_score": _plain_float(getattr(c, "cover_score", None)), "cover_hash_attempted": getattr(c, "cover_hash_attempted", False), "url": getattr(c, "url", ""), # The candidate's parent container id (CV volume, Metron series). diff --git a/codex/librarian/telemeter/per_user_stats.py b/codex/librarian/telemeter/per_user_stats.py index caddaa1f0..bcbd5c3f0 100644 --- a/codex/librarian/telemeter/per_user_stats.py +++ b/codex/librarian/telemeter/per_user_stats.py @@ -53,8 +53,6 @@ "order_by", "view_mode", "table_cover_size", - "dynamic_covers", - "custom_covers", ) # Ordered, unlike SettingsReader.DIRECT_KEYS which is a frozenset. A test pins # the two to the same set so this cannot drift from the model. @@ -62,8 +60,6 @@ "fit_to", "two_pages", "reading_direction", - "read_rtl_in_reverse", - "finish_on_last_page", "page_transition", "cache_book", ) diff --git a/codex/librarian/telemeter/stats.py b/codex/librarian/telemeter/stats.py index 17084b978..52ad1e3dd 100644 --- a/codex/librarian/telemeter/stats.py +++ b/codex/librarian/telemeter/stats.py @@ -62,13 +62,11 @@ ( "top_collection", "order_by", - "dynamic_covers", "view_mode", "table_cover_size", - "custom_covers", ), ), - (SettingsReader, ("finish_on_last_page", "fit_to", "reading_direction")), + (SettingsReader, ("fit_to", "reading_direction")), ) # Sections built by a single collector function, in payload order. _SIMPLE_SECTIONS: Final = ( diff --git a/codex/migrations/0001_init.py b/codex/migrations/0001_init.py index 979c1fb59..51eb61ad1 100644 --- a/codex/migrations/0001_init.py +++ b/codex/migrations/0001_init.py @@ -1,6 +1,6 @@ """Generated by Django 3.1 on 2020-08-21 18:59.""" -import datetime +import datetime as dt from decimal import Decimal import django.db.models.deletion @@ -88,7 +88,7 @@ class Migration(migrations.Migration): ("enable_scan_cron", models.BooleanField(db_index=True, default=True)), ( "scan_frequency", - models.DurationField(default=datetime.timedelta(seconds=43200)), + models.DurationField(default=dt.timedelta(seconds=43200)), ), ("last_scan", models.DateTimeField(null=True)), ("scan_in_progress", models.BooleanField(default=False)), diff --git a/codex/migrations/0007_auto_20211210_1710.py b/codex/migrations/0007_auto_20211210_1710.py index 2a637e2c4..108057dd9 100644 --- a/codex/migrations/0007_auto_20211210_1710.py +++ b/codex/migrations/0007_auto_20211210_1710.py @@ -1,6 +1,6 @@ """Generated by Django 3.2.9 on 2021-12-11 01:10.""" -import datetime +import datetime as dt import django.db.models.deletion from django.db import migrations, models @@ -111,7 +111,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name="library", name="poll_every", - field=models.DurationField(default=datetime.timedelta(seconds=3600)), + field=models.DurationField(default=dt.timedelta(seconds=3600)), ), migrations.AlterField( model_name="comic", diff --git a/codex/migrations/0057_remove_pinned_settings.py b/codex/migrations/0057_remove_pinned_settings.py new file mode 100644 index 000000000..8f33e4a75 --- /dev/null +++ b/codex/migrations/0057_remove_pinned_settings.py @@ -0,0 +1,39 @@ +"""Generated by Django 6.1.2 on 2026-10-19 04:16.""" + +from django.db import migrations + + +class Migration(migrations.Migration): + """ + Remove four settings that stopped being user options. + + v2.5.x pinned dynamic covers and custom covers on, finishing a book on its + last page on, and reading RTL comics in reverse off, and dropped their + checkboxes, but kept the columns so the toggles could come back with a + revert. They are gone for good now. All four shipped in 0038, so they + come out here rather than in a fold. Reversible: the browser columns have + defaults and the reader columns are nullable. + """ + + dependencies = [ + ("codex", "0056_match_mode_ask"), + ] + + operations = [ + migrations.RemoveField( + model_name="settingsbrowser", + name="custom_covers", + ), + migrations.RemoveField( + model_name="settingsbrowser", + name="dynamic_covers", + ), + migrations.RemoveField( + model_name="settingsreader", + name="finish_on_last_page", + ), + migrations.RemoveField( + model_name="settingsreader", + name="read_rtl_in_reverse", + ), + ] diff --git a/codex/models/admin.py b/codex/models/admin.py index e5c9e1535..34a45312c 100644 --- a/codex/models/admin.py +++ b/codex/models/admin.py @@ -167,7 +167,8 @@ class EffortChoices(TextChoices): # metron_user & metron_password are legacy. Metron authenticates with an # API token now, and the admin UI only accepts one. Existing logins keep # working (metron.cloud and comicbox still accept them) until an API key - # is saved, which clears them. mokkari prefers the token when both exist. + # is saved, which clears them. comicbox sends only the token when both + # exist. metron_key = EncryptedCharField() metron_user = EncryptedCharField() metron_password = EncryptedCharField() diff --git a/codex/models/settings.py b/codex/models/settings.py index 64668c840..7b776414b 100644 --- a/codex/models/settings.py +++ b/codex/models/settings.py @@ -362,18 +362,6 @@ class SettingsBrowser(SettingsBase): search = CharField(max_length=4095, default="", blank=True) # Display preferences - # - # PENDING SCHEMA REMOVAL - # - # The next two are no longer user options: their checkboxes are gone - # from the browser settings drawer and the behavior is pinned on in - # ``views/browser/annotate/cover.py``. The columns stay so nobody's - # stored preference is destroyed while we find out whether anyone misses - # the toggles -- restoring them is a revert, not a data migration. Drop - # these two, their serializer fields and their ``BROWSER_DEFAULTS`` - # entries together. - custom_covers = BooleanField(default=True) - dynamic_covers = BooleanField(default=True) twenty_four_hour_time = BooleanField(default=False) always_show_filename = BooleanField(default=False) @@ -408,8 +396,6 @@ class SettingsBrowser(SettingsBase): "order_extra_keys", "collection_order_memory", "search", - "custom_covers", - "dynamic_covers", "twenty_four_hour_time", "always_show_filename", "view_mode", @@ -488,17 +474,6 @@ class SettingsReader(SettingsBase): default="", max_length=max_choices_len(ReadingDirectionChoices), ) - # PENDING SCHEMA REMOVAL - # - # The next two are no longer user options: their checkboxes are gone from - # the reader settings drawer and the behavior is pinned in - # ``stores/reader.js`` -- finish-on-last-page on, read-RTL-in-reverse off - # (its default, so a right-to-left book is read right to left). The - # columns stay so nobody's stored preference is destroyed; restoring the - # toggles is a revert, not a data migration. Drop these two, their - # serializer fields and their ``READER_DEFAULTS`` entries together. - read_rtl_in_reverse = BooleanField(default=None, null=True) - finish_on_last_page = BooleanField(default=None, null=True) page_transition = BooleanField(default=None, null=True) cache_book = BooleanField(default=None, null=True) @@ -508,8 +483,6 @@ class SettingsReader(SettingsBase): "fit_to", "two_pages", "reading_direction", - "read_rtl_in_reverse", - "finish_on_last_page", "page_transition", "cache_book", } diff --git a/codex/serializers/admin/stats.py b/codex/serializers/admin/stats.py index a3bf48a61..5d0cec547 100644 --- a/codex/serializers/admin/stats.py +++ b/codex/serializers/admin/stats.py @@ -80,13 +80,10 @@ class StatsSessionsSerializer(Serializer): top_collection = CountDictField(required=False, read_only=True) order_by = CountDictField(required=False, read_only=True) - dynamic_covers = CountDictField(required=False, read_only=True) - finish_on_last_page = CountDictField(required=False, read_only=True) fit_to = CountDictField(required=False, read_only=True) reading_direction = CountDictField(required=False, read_only=True) view_mode = CountDictField(required=False, read_only=True) table_cover_size = CountDictField(required=False, read_only=True) - custom_covers = CountDictField(required=False, read_only=True) multi_sort_count = IntegerField(required=False, read_only=True) @@ -268,26 +265,18 @@ class StatsPerUserSerializer(Serializer): browser_order_by_users = CountDictField(required=False) browser_view_mode_users = CountDictField(required=False) browser_table_cover_size_users = CountDictField(required=False) - browser_dynamic_covers_users = CountDictField(required=False) - browser_custom_covers_users = CountDictField(required=False) browser_chosen_top_collection_users = CountDictField(required=False) browser_chosen_order_by_users = CountDictField(required=False) browser_chosen_view_mode_users = CountDictField(required=False) browser_chosen_table_cover_size_users = CountDictField(required=False) - browser_chosen_dynamic_covers_users = CountDictField(required=False) - browser_chosen_custom_covers_users = CountDictField(required=False) reader_global_fit_to_users = CountDictField(required=False) reader_global_two_pages_users = CountDictField(required=False) reader_global_reading_direction_users = CountDictField(required=False) - reader_global_read_rtl_in_reverse_users = CountDictField(required=False) - reader_global_finish_on_last_page_users = CountDictField(required=False) reader_global_page_transition_users = CountDictField(required=False) reader_global_cache_book_users = CountDictField(required=False) reader_chosen_fit_to_users = CountDictField(required=False) reader_chosen_two_pages_users = CountDictField(required=False) reader_chosen_reading_direction_users = CountDictField(required=False) - reader_chosen_read_rtl_in_reverse_users = CountDictField(required=False) - reader_chosen_finish_on_last_page_users = CountDictField(required=False) reader_chosen_page_transition_users = CountDictField(required=False) reader_chosen_cache_book_users = CountDictField(required=False) diff --git a/codex/serializers/admin/tagging.py b/codex/serializers/admin/tagging.py index 02f0cb61a..2af06f1bd 100644 --- a/codex/serializers/admin/tagging.py +++ b/codex/serializers/admin/tagging.py @@ -193,7 +193,7 @@ def update(self, instance, validated_data): The key is the only Metron credential the UI offers now, so saving one (or clearing it) drops the old login rather than leaving a stale - fallback that mokkari would silently ignore anyway. + fallback that comicbox would never send anyway. """ if "metron_key" in validated_data: validated_data["metron_user"] = "" diff --git a/codex/serializers/auth.py b/codex/serializers/auth.py index 730c338e5..a003f2d82 100644 --- a/codex/serializers/auth.py +++ b/codex/serializers/auth.py @@ -128,8 +128,6 @@ class SessionReaderDefaultsSerializer(Serializer): two_pages = BooleanField(read_only=True) page_transition = BooleanField(read_only=True) cache_book = BooleanField(read_only=True) - finish_on_last_page = BooleanField(read_only=True) - read_rtl_in_reverse = BooleanField(read_only=True) class SessionDefaultsSerializer(Serializer): diff --git a/codex/serializers/browser/settings.py b/codex/serializers/browser/settings.py index d72daf850..bd585f2d6 100644 --- a/codex/serializers/browser/settings.py +++ b/codex/serializers/browser/settings.py @@ -30,7 +30,6 @@ BrowserRouteCollectionField, ) from codex.serializers.mixins import JSONFieldSerializer -from codex.serializers.route import SimpleRouteSerializer from codex.serializers.settings import SettingsInputSerializer # Sorts worth remembering per top collection. ``search_score`` only means @@ -113,33 +112,16 @@ class BrowserFilterChoicesInputSerializer(JSONFieldSerializer): search = CharField(allow_blank=True, required=False) -class BrowserCoverInputSerializerBase(BrowserFilterChoicesInputSerializer): - """Base Serializer for Cover and Settings.""" +class BrowserSettingsSerializerBase(BrowserFilterChoicesInputSerializer): + """Base Serializer for Browser & OPDS Settings.""" JSON_FIELDS = frozenset(BrowserFilterChoicesInputSerializer.JSON_FIELDS | {"show"}) - custom_covers = BooleanField(required=False) - dynamic_covers = BooleanField(required=False) order_by = ChoiceField( choices=tuple(BROWSER_ORDER_BY_CHOICES.keys()), required=False ) order_reverse = BooleanField(required=False) show = BrowserSettingsShowCollectionFlagsSerializer(required=False) - - -class BrowserCoverInputSerializer(BrowserCoverInputSerializerBase): - """Browser Settings for the cover response.""" - - JSON_FIELDS = frozenset( - BrowserCoverInputSerializerBase.JSON_FIELDS | {"parent_route"} - ) - - parent_route = SimpleRouteSerializer(required=False) - - -class BrowserSettingsSerializerBase(BrowserCoverInputSerializerBase): - """Base Serializer for Browser & OPDS Settings.""" - top_collection = BrowseCollectionField(required=False) @override diff --git a/codex/serializers/fields/vuetify.py b/codex/serializers/fields/vuetify.py index 7e41aa2b0..73150460d 100644 --- a/codex/serializers/fields/vuetify.py +++ b/codex/serializers/fields/vuetify.py @@ -21,7 +21,8 @@ class VuetifyNullCodeFieldMixin: """Convert Vuetify null codes to None.""" - NULL_CODE: int = VUETIFY_NULL_CODE + # Compared against the parsed value, so char fields set it as a str. + NULL_CODE: int | str = VUETIFY_NULL_CODE def to_internal_value(self, data): """Convert numeric null code to None.""" @@ -57,7 +58,7 @@ class VuetifyIntegerField(VuetifyNullCodeFieldMixin, IntegerField): # pyright: class VuetifyCharField(VuetifyNullCodeFieldMixin, CharField): # pyright: ignore[reportIncompatibleMethodOverride], # ty: ignore[invalid-method-override] """Char Field with null code conversion.""" - NULL_CODE: str = str(VUETIFY_NULL_CODE) # pyright: ignore[reportIncompatibleVariableOverride] + NULL_CODE = str(VUETIFY_NULL_CODE) class VuetifyBooleanField(VuetifyNullCodeFieldMixin, BooleanField): # pyright: ignore[reportIncompatibleMethodOverride], # ty: ignore[invalid-method-override] diff --git a/codex/serializers/reader.py b/codex/serializers/reader.py index 8e9df826d..b2487a4a7 100644 --- a/codex/serializers/reader.py +++ b/codex/serializers/reader.py @@ -30,8 +30,6 @@ class ReaderSettingsSerializer(Serializer): reading_direction = ReadingDirectionField( allow_blank=True, allow_null=True, required=False ) - read_rtl_in_reverse = BooleanField(allow_null=True, required=False) - finish_on_last_page = BooleanField(allow_null=True, required=False) mtime = TimestampField(read_only=True) page_transition = BooleanField(allow_null=True, required=False) cache_book = BooleanField(allow_null=True, required=False) diff --git a/codex/settings/__init__.py b/codex/settings/__init__.py index cf7a3ff77..936f39bad 100644 --- a/codex/settings/__init__.py +++ b/codex/settings/__init__.py @@ -31,7 +31,9 @@ get_float, get_int, get_str, + get_str_list, load_codex_config, + normalize_csrf_trusted_origins, normalize_url_path_prefix, ) from codex.settings.logging import get_logging_settings @@ -535,6 +537,14 @@ def _get_secure_csp(features: FeatureFlags) -> dict[str, list[str]]: # Proxy headers USE_X_FORWARDED_HOST = True SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https") +# Public origins (e.g. "https://comics.example.com") a proxy serves Codex under +# when the scheme or host Django sees differs. DRF's SessionAuthentication +# enforces CSRF on the API too, so this is the fix, not removing the middleware. +CSRF_TRUSTED_ORIGINS = list( + normalize_csrf_trusted_origins( + get_str_list(CODEX_CONFIG, "server.csrf_trusted_origins") + ) +) # Debug INTERNAL_IPS = ("127.0.0.1",) diff --git a/codex/settings/codex.toml.default b/codex/settings/codex.toml.default index 7e0e38f43..a7bedd7a1 100644 --- a/codex/settings/codex.toml.default +++ b/codex/settings/codex.toml.default @@ -15,6 +15,11 @@ # websockets = true # HTTP path prefix for codex (e.g. "/codex" for reverse proxy sub-path) # url_path_prefix = "" +# Public origins accepted for CSRF when a reverse proxy serves Codex under +# another scheme or host than Codex sees (e.g. https in front of http). +# First make sure the proxy sends X-Forwarded-Proto and X-Forwarded-Host. +# A correctly configured proxy does, and then you shouldn't need this. +# csrf_trusted_origins = ["https://comics.example.com"] # Worker threads that keep a warm database connection between requests. # Opening one costs a few milliseconds, mostly SQLite re-reading the # schema, so reusing them makes short requests noticeably cheaper. Each diff --git a/codex/settings/config.py b/codex/settings/config.py index f0258bfbb..6e6b102b3 100644 --- a/codex/settings/config.py +++ b/codex/settings/config.py @@ -2,7 +2,7 @@ import shutil import tomllib -from collections.abc import Mapping, MutableMapping +from collections.abc import Iterable, Mapping, MutableMapping from os import environ from pathlib import Path @@ -20,6 +20,7 @@ "GRANIAN_HTTP": "server.http", "GRANIAN_WEBSOCKETS": "server.websockets", "GRANIAN_URL_PATH_PREFIX": "server.url_path_prefix", + "CODEX_CSRF_TRUSTED_ORIGINS": "server.csrf_trusted_origins", # Logging "LOGLEVEL": "logging.loglevel", "CODEX_LOG_RETENTION": "logging.log_retention", @@ -150,6 +151,33 @@ def normalize_url_path_prefix(prefix: str) -> str: return f"/{prefix}" if prefix else "" +def normalize_csrf_trusted_origins(origins: Iterable[str]) -> tuple[str, ...]: + """ + Normalize origins for Django's ``CSRF_TRUSTED_ORIGINS``. + + Django matches the ``Origin`` header against each entry by exact string, + or by subdomain for a ``https://*.example.com`` wildcard. A trailing slash + never matches, so it is stripped. An entry without a scheme can never + match either (and fails system check 4_0.E001), so it is dropped with a + warning. Duplicates are removed, keeping the first. + """ + normalized: dict[str, None] = {} + for raw_origin in origins: + origin = raw_origin.rstrip("/") + if "://" not in origin: + reason = ( + f"Ignoring server.csrf_trusted_origins entry {raw_origin!r}:" + " an origin has the form scheme://host[:port], e.g." + " https://comics.example.com. If CSRF 403s persist behind a" + " proxy, first check that it sends X-Forwarded-Proto and" + " X-Forwarded-Host." + ) + logger.warning(reason) + continue + normalized[origin] = None + return tuple(normalized) + + def get_int(config: Mapping, keypath: str, default: int = 0) -> int: """Get an integer value from the config.""" val = _deep_get(config, keypath, default) @@ -172,3 +200,25 @@ def get_bool(config: Mapping, keypath: str, *, default: bool = False) -> bool: if isinstance(val, str): return val.lower() not in {"", "false", "0", "no"} return bool(val) + + +def get_str_list( + config: Mapping, keypath: str, default: tuple[str, ...] = () +) -> tuple[str, ...]: + """ + Get a list of strings from the config. + + TOML gives a native array; an env override gives one comma-separated + string. Items are stripped of whitespace and empty items are dropped. + """ + val = _deep_get(config, keypath) + match val: + case None: + return default + case str(): + items = val.split(",") + case list() | tuple(): + items = val + case _: + items = (val,) + return tuple(item for raw in items if (item := str(raw).strip())) diff --git a/codex/settings/db.py b/codex/settings/db.py index 61ddeeb53..b9adb06e9 100644 --- a/codex/settings/db.py +++ b/codex/settings/db.py @@ -241,13 +241,6 @@ def _in_choices_or_factory(row: SettingsDefaults, key: str) -> Any: "bookmark", "table_columns", ) -_READER_DEFAULTS_KEYS: tuple[str, ...] = ( - "fit_to", - "reading_direction", - "two_pages", - "page_transition", - "cache_book", -) def get_browser_defaults() -> dict[str, Any]: @@ -270,17 +263,9 @@ def get_browser_defaults() -> dict[str, Any]: def get_reader_defaults() -> dict[str, Any]: - """ - Resolve the site default global reader settings. - - Keeps the two pinned ``READER_DEFAULTS`` keys seeded alongside the - admin-configurable ones. - """ + """Resolve the site default global reader settings.""" row = _get_settings_defaults_or_factory() - return { - **READER_DEFAULTS, - **{key: _in_choices_or_factory(row, key) for key in _READER_DEFAULTS_KEYS}, - } + return {key: _in_choices_or_factory(row, key) for key in READER_DEFAULTS} def get_throttle_settings() -> ThrottleSettings | None: diff --git a/codex/user_data/restore.py b/codex/user_data/restore.py index 6d99b1755..70f39870c 100644 --- a/codex/user_data/restore.py +++ b/codex/user_data/restore.py @@ -270,7 +270,7 @@ def _restore_libraries( store: SidecarStore, report: RestoreReport, *, dry_run: bool ) -> None: """Restore Library rows.""" - import datetime + import datetime as dt from codex.models.library import Library @@ -285,9 +285,7 @@ def _restore_libraries( } if row["poll_every"]: # Stored as total-seconds float by ``serialize_library``. - defaults["poll_every"] = datetime.timedelta( - seconds=float(row["poll_every"]) - ) + defaults["poll_every"] = dt.timedelta(seconds=float(row["poll_every"])) Library.objects.update_or_create(path=row["path"], defaults=defaults) report.note_written("libraries") @@ -777,8 +775,6 @@ def _rename_table_columns(raw) -> dict: ) _BROWSER_BOOL_COLUMNS: Final[tuple[str, ...]] = ( "order_reverse", - "custom_covers", - "dynamic_covers", "twenty_four_hour_time", "always_show_filename", ) diff --git a/codex/user_data/schema.sql b/codex/user_data/schema.sql index 7048aee35..52e00a1b7 100644 --- a/codex/user_data/schema.sql +++ b/codex/user_data/schema.sql @@ -88,8 +88,6 @@ CREATE TABLE IF NOT EXISTS settings_browser ( order_extra_keys TEXT NOT NULL DEFAULT '[]', collection_order_memory TEXT NOT NULL DEFAULT '{}', search TEXT NOT NULL DEFAULT '', - custom_covers INTEGER NOT NULL DEFAULT 1, - dynamic_covers INTEGER NOT NULL DEFAULT 1, twenty_four_hour_time INTEGER NOT NULL DEFAULT 0, always_show_filename INTEGER NOT NULL DEFAULT 0, view_mode TEXT NOT NULL DEFAULT '', diff --git a/codex/user_data/serializers.py b/codex/user_data/serializers.py index 8256f8411..6815f78dd 100644 --- a/codex/user_data/serializers.py +++ b/codex/user_data/serializers.py @@ -207,8 +207,6 @@ def serialize_settings_browser( browser.collection_order_memory, separators=(",", ":") ), "search": browser.search, - "custom_covers": int(browser.custom_covers), - "dynamic_covers": int(browser.dynamic_covers), "twenty_four_hour_time": int(browser.twenty_four_hour_time), "always_show_filename": int(browser.always_show_filename), "view_mode": browser.view_mode, diff --git a/codex/views/admin/tagwrite.py b/codex/views/admin/tagwrite.py index 6fced5581..188497d57 100644 --- a/codex/views/admin/tagwrite.py +++ b/codex/views/admin/tagwrite.py @@ -1,13 +1,12 @@ """Admin Tag Write View.""" import json -from collections.abc import Sequence from functools import cached_property from pathlib import Path from types import MappingProxyType from typing import override -from rest_framework.permissions import BasePermission, IsAdminUser +from rest_framework.permissions import IsAdminUser from rest_framework.response import Response from rest_framework.status import HTTP_202_ACCEPTED @@ -43,7 +42,7 @@ class FilteredComicPksView(BrowserFilterView): :class:`~codex.views.browser.force_update.ForceUpdateView`. """ - permission_classes: Sequence[type[BasePermission]] = (IsAdminUser,) + permission_classes = (IsAdminUser,) TARGET: str = "force_update" # recursive folder rel + filter semantics def __init__(self, *args, **kwargs) -> None: diff --git a/codex/views/auth.py b/codex/views/auth.py index 287414a2b..6b19ccec4 100644 --- a/codex/views/auth.py +++ b/codex/views/auth.py @@ -52,7 +52,7 @@ from rest_framework.authtoken.serializers import AuthTokenSerializer from rest_framework.exceptions import NotAuthenticated from rest_framework.generics import GenericAPIView -from rest_framework.permissions import BasePermission, IsAuthenticated +from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView @@ -72,6 +72,8 @@ from codex.views.envelope import EnvelopeJSONRenderer as _EnvelopeJSONRenderer if TYPE_CHECKING: + # _PermissionClass exists only in djangorestframework-stubs, not at runtime. + from rest_framework.permissions import _PermissionClass from rest_framework.request import Request @@ -111,7 +113,9 @@ class AuthMixin: # of the GET dict when the URL pattern doesn't carry it. requires_page: bool = False - permission_classes: Sequence[type[BasePermission]] = ( + # DRF's own type, so subclasses that set their own classes override + # APIView's declaration and this one alike. + permission_classes: Sequence["_PermissionClass"] = ( IsAuthenticatedOrEnabledNonUsers, ) renderer_classes = (_EnvelopeJSONRenderer,) @@ -177,11 +181,11 @@ def _ensure_session_key(self) -> str | None: return session.session_key -class AuthAPIView(AuthMixin, APIView): # pyright: ignore[reportIncompatibleVariableOverride] +class AuthAPIView(AuthMixin, APIView): """Auth Policy APIView.""" -class AuthGenericAPIView(AuthMixin, GenericAPIView): # pyright: ignore[reportIncompatibleVariableOverride] +class AuthGenericAPIView(AuthMixin, GenericAPIView): """Auth Policy GenericAPIView.""" diff --git a/codex/views/browser/annotate/cover.py b/codex/views/browser/annotate/cover.py index 653a71d1d..e16e5e3c6 100644 --- a/codex/views/browser/annotate/cover.py +++ b/codex/views/browser/annotate/cover.py @@ -1,33 +1,12 @@ """Cover pk annotation for browser card querysets.""" -from typing import Final - from django.db.models import OuterRef, Q, Subquery -from codex.models import Comic, Folder, Volume +from codex.models import Comic, Folder from codex.models.paths import CustomCover -from codex.views.browser.annotate.card import _COLLECTION_BY, BrowserAnnotateCardView +from codex.views.browser.annotate.card import BrowserAnnotateCardView from codex.views.const import COLLECTION_RELATION, CUSTOM_COVER_COLLECTION_RELATION -# PENDING SCHEMA REMOVAL -# -# Dynamic covers and custom covers are no longer user options. -# They are pinned on here instead of read from ``self.params``, and their -# toggles are gone from the browser settings drawer. -# -# What is deliberately still here: ``SettingsBrowser.dynamic_covers`` and -# ``.custom_covers``, their serializer fields, and the query params. Every -# user's stored preference is therefore untouched, so putting the toggles back -# means reverting the code — no data migration, and nobody's setting is lost in -# the meantime. -# -# When we commit to this, drop the two columns, their serializer and -# ``BROWSER_DEFAULTS`` entries, the params the client sends, and the branches -# below that can no longer be reached: the sort-name fuzzy match in -# ``_cover_collection_q`` and the early return in ``_cover_custom_subqueries``. -_DYNAMIC_COVERS: Final[bool] = True -_CUSTOM_COVERS: Final[bool] = True - class BrowserAnnotateCoverView(BrowserAnnotateCardView): """ @@ -35,40 +14,23 @@ class BrowserAnnotateCoverView(BrowserAnnotateCardView): Pre-computes the representative comic pk per card via a correlated subquery, replacing the 72-request fan-out to ``CoverView`` with a - single aggregation pass. Reproduces ``CoverView.get_collection_filter`` - semantics exactly: direct collection-fk match when ``dynamic_covers`` is - on or the model is Volume/Folder; sort-name fuzzy match (correlated - on the GROUP BY columns) otherwise. Dynamic covers are now pinned on, so - the fuzzy branch is unreachable — see the note above. + single aggregation pass. The cover comic comes from a direct + collection-fk match; Folder cards match through the ``folders`` M2M so + descendant subfolders count. A custom cover, when one exists, overrides it. """ def _cover_collection_q(self, collection_model) -> Q: """Build the collection filter Q for a cover subquery (correlated via OuterRef).""" + # Folders are hierarchical: parent_folder is the direct FK, but the + # browse filter uses the ``folders`` M2M that includes every + # ancestor folder. A Folder card's cover must be pickable from any + # comic in a descendant subfolder, not just direct children — + # otherwise parent folders that contain only subfolders fall back + # to the card's own pk and serve the missing-cover placeholder. + if collection_model is Folder: + return Q(folders__pk=OuterRef("pk")) collection_rel = COLLECTION_RELATION[self.model_collection] - if _DYNAMIC_COVERS or collection_model in (Volume, Folder): - # Folders are hierarchical: parent_folder is the direct FK, but the - # browse filter uses the ``folders`` M2M that includes every - # ancestor folder. A Folder card's cover must be pickable from any - # comic in a descendant subfolder, not just direct children — - # otherwise parent folders that contain only subfolders fall back - # to the card's own pk and serve the missing-cover placeholder. - if collection_model is Folder: - return Q(folders__pk=OuterRef("pk")) - return Q(**{f"{collection_rel}__pk": OuterRef("pk")}) - - # Fuzzy match: correlate on the GROUP BY columns. These are the - # same columns used by add_group_by, so ``ids`` (the JsonGroupArray - # of merged collection pks) and the cover subquery pick the exact same - # comic set — without recomputing sort_names in Python. - collection_by_cols = _COLLECTION_BY.get(collection_model, ("sort_name",)) - correlation: dict = { - f"{collection_rel}__{col}": OuterRef(col) for col in collection_by_cols - } - parent_route = self.params.get("parent_route", {}) - if parent_pks := parent_route.get("pks"): - parent_rel = COLLECTION_RELATION[parent_route["collection"]] - correlation[f"{parent_rel}__pk__in"] = parent_pks - return Q(**correlation) + return Q(**{f"{collection_rel}__pk": OuterRef("pk")}) def _cover_filter_q(self, collection_model) -> Q: """Build the full filter Q for the cover comic subquery.""" @@ -121,8 +83,6 @@ def _cover_comic_ordered_qs(self, collection_model): def _cover_custom_subqueries(self): """Return (pk, updated_at) subqueries for a CustomCover, or (None, None).""" - if not _CUSTOM_COVERS: - return None, None # ``model_collection`` is the collection the cards being annotated belong to # (the *child* of the URL collection). ``kwargs["collection"]`` is the URL # collection itself, which is one level too high for the cover lookup — diff --git a/codex/views/browser/choices.py b/codex/views/browser/choices.py index 8f5ed6b64..b39158df7 100644 --- a/codex/views/browser/choices.py +++ b/codex/views/browser/choices.py @@ -83,9 +83,7 @@ class BrowserChoicesViewBase(BrowserFilterView): """Get choices for filter dialog.""" - input_serializer_class: type[BrowserFilterChoicesInputSerializer] = ( # pyright: ignore[reportIncompatibleVariableOverride] - BrowserFilterChoicesInputSerializer - ) + input_serializer_class = BrowserFilterChoicesInputSerializer TARGET: str = "choices" @staticmethod diff --git a/codex/views/browser/force_update.py b/codex/views/browser/force_update.py index 996354d31..26cd0223d 100644 --- a/codex/views/browser/force_update.py +++ b/codex/views/browser/force_update.py @@ -1,12 +1,11 @@ """Force update browser view: re-import metadata for a filtered comic set.""" -from collections.abc import Sequence from functools import cached_property from types import MappingProxyType from typing import override from drf_spectacular.utils import extend_schema -from rest_framework.permissions import BasePermission, IsAdminUser +from rest_framework.permissions import IsAdminUser from rest_framework.response import Response from codex.librarian.mp_queue import LIBRARIAN_QUEUE @@ -19,7 +18,7 @@ class ForceUpdateView(BrowserFilterView): """Force a metadata re-import for every comic under a collection + filters.""" - permission_classes: Sequence[type[BasePermission]] = (IsAdminUser,) + permission_classes = (IsAdminUser,) serializer_class = OKSerializer TARGET: str = "force_update" diff --git a/codex/views/browser/metadata/__init__.py b/codex/views/browser/metadata/__init__.py index d74fa362b..52015d16f 100644 --- a/codex/views/browser/metadata/__init__.py +++ b/codex/views/browser/metadata/__init__.py @@ -22,9 +22,7 @@ class MetadataView(MetadataCopyIntersectionsView): """Aggregate Collection and Comic Metadata View.""" serializer_class: type[BaseSerializer] | None = MetadataSerializer - input_serializer_class: type[BrowserFilterChoicesInputSerializer] = ( # pyright: ignore[reportIncompatibleVariableOverride] - BrowserFilterChoicesInputSerializer - ) + input_serializer_class = BrowserFilterChoicesInputSerializer TARGET: str = "metadata" ADMIN_FLAGS = (AdminFlagChoices.FOLDER_VIEW,) diff --git a/codex/views/browser/mtime.py b/codex/views/browser/mtime.py index c19b60ce0..3f6fd76f0 100644 --- a/codex/views/browser/mtime.py +++ b/codex/views/browser/mtime.py @@ -24,9 +24,7 @@ class MtimeView(BrowserCollectionMtimeView): """Get the mtimes for the submitted collections.""" - input_serializer_class: type[CollectionsMtimeSerializer] = ( # pyright: ignore[reportIncompatibleVariableOverride] - CollectionsMtimeSerializer - ) + input_serializer_class = CollectionsMtimeSerializer serializer_class: type[BaseSerializer] | None = MtimeSerializer TARGET: str = "mtime" diff --git a/codex/views/browser/params.py b/codex/views/browser/params.py index 61b4f76f6..65a39c41b 100644 --- a/codex/views/browser/params.py +++ b/codex/views/browser/params.py @@ -10,8 +10,8 @@ from codex.librarian.bookmark.tasks import LastRouteUpdateTask from codex.librarian.mp_queue import LIBRARIAN_QUEUE from codex.serializers.browser.settings import ( + BrowserFilterChoicesInputSerializer, BrowserSettingsSerializer, - BrowserSettingsSerializerBase, ) from codex.views.browser.settings import BrowserSettingsBaseView @@ -19,7 +19,9 @@ class BrowserParamsView(BrowserSettingsBaseView): """Browser Params Parsing.""" - input_serializer_class: type[BrowserSettingsSerializerBase] = ( + # The common base of every input serializer a subclass sets: choices + # and metadata take filters only, mtime its own shape. + input_serializer_class: type[BrowserFilterChoicesInputSerializer] = ( BrowserSettingsSerializer ) diff --git a/codex/views/frontend.py b/codex/views/frontend.py index f817f6812..573011721 100644 --- a/codex/views/frontend.py +++ b/codex/views/frontend.py @@ -3,7 +3,7 @@ from collections.abc import Sequence from caseconverter import camelcase -from rest_framework.permissions import AllowAny, BasePermission +from rest_framework.permissions import AllowAny from rest_framework.renderers import BaseRenderer, TemplateHTMLRenderer from rest_framework.response import Response @@ -15,7 +15,7 @@ class IndexView(BrowserSettingsBaseView, UserActiveMixin): """The main app.""" - permission_classes: Sequence[type[BasePermission]] = (AllowAny,) + permission_classes = (AllowAny,) renderer_classes: Sequence[type[BaseRenderer]] = [TemplateHTMLRenderer] template_name = "index.html" diff --git a/codex/views/opds/binary.py b/codex/views/opds/binary.py index e7c003462..ccc73cc24 100644 --- a/codex/views/opds/binary.py +++ b/codex/views/opds/binary.py @@ -45,6 +45,8 @@ class OPDSDownloadView(OPDSAuthMixin, DownloadView): class OPDSPageView(OPDSAuthMixin, ReaderPageView): """Page View with Basic Auth.""" - content_negotiation_class: type[BaseContentNegotiation] = ( # pyright:ignore[reportIncompatibleVariableOverride] + # djangorestframework-stubs types this `str | None`, but DRF resolves + # the DEFAULT_CONTENT_NEGOTIATION_CLASS import string to a class. + content_negotiation_class: type[BaseContentNegotiation] = ( # pyright: ignore[reportIncompatibleVariableOverride], # ty: ignore[invalid-attribute-override] IgnoreClientContentNegotiation ) diff --git a/codex/views/opds/opensearch/v1.py b/codex/views/opds/opensearch/v1.py index c5bd1fe21..d58ebfd42 100644 --- a/codex/views/opds/opensearch/v1.py +++ b/codex/views/opds/opensearch/v1.py @@ -39,7 +39,7 @@ class _OpenSearchTemplateMixin(CodexXMLTemplateMixin): @extend_schema(responses={("200", MimeType.OPENSEARCH): OpenApiTypes.BYTE}) -class OpenSearch1View(_OpenSearchTemplateMixin, OPDSAuthMixin, CodexAPIView): # pyright: ignore[reportIncompatibleVariableOverride] +class OpenSearch1View(_OpenSearchTemplateMixin, OPDSAuthMixin, CodexAPIView): """OpenSearchView.""" # ``_OpenSearchTemplateMixin`` must precede ``OPDSAuthMixin`` so its diff --git a/codex/views/opds/v1/feed.py b/codex/views/opds/v1/feed.py index c2d1dace1..185da6eac 100644 --- a/codex/views/opds/v1/feed.py +++ b/codex/views/opds/v1/feed.py @@ -77,7 +77,7 @@ class OPDS1FeedView(OPDS1LinksView): template_name = "opds_v1/index.xml" serializer_class: type[BaseSerializer] | None = OPDS1TemplateSerializer - input_serializer_class: type[OPDSSettingsSerializer] = OPDSSettingsSerializer + input_serializer_class = OPDSSettingsSerializer throttle_classes: Sequence[type[BaseThrottle]] = (ScopedRateThrottle,) throttle_scope = "opds" # The collection feed URLs carry no page segment; AuthMixin pulls diff --git a/compose.yaml b/compose.yaml index bfdb90b7c..552166153 100644 --- a/compose.yaml +++ b/compose.yaml @@ -9,6 +9,7 @@ services: - infinity environment: - PYTHONUNBUFFERED=1 + - CI image: ${CI_IMAGE} volumes: - ./test-results:/app/test-results diff --git a/frontend/.gitignore b/frontend/.gitignore index 03dc9ccb2..c8a132dc3 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -1,66 +1,61 @@ -__pycache__/ -__pypackages__/ -__snapshots__ +*$py.class +*.cover +*.egg +*.egg-info/ +*.log +*.manifest +*.mo +*.pot +*.py,cover +*.py[cod] +*.sage.py +*.so +*.spec +*~ .*cache +.DS_Store +.Python .claude .coverage* .dmypy.json .docker-token -.DS_Store .eggs/ .env .env-* -.eslintcache .hypothesis/ .installed.cfg .ipynb_checkpoints -.mypy_cache/ .nox/ .npm .pypi-token .pypirc .pyre/ -.pytest_cache/ -.Python .python-version .ropeproject -.ruff_cache/ .scrapy .spyderproject .spyproject .tox/ .uv-publish-env .venv* -.webassets-cache -*.cover -*.egg -*.egg-info/ -*.log -*.manifest -*.mo -*.pot -*.py,cover -*.py[cod] -*.sage.py -*.so -*.spec -*~ -*$py.class +ENV/ +MANIFEST +TODO.md +__pycache__/ +__pypackages__/ +__snapshots__ build -build/ celerybeat-schedule celerybeat.pid coverage.xml develop-eggs/ dist -dist/ dmypy.json docs/_build/ downloads/ eggs/ env.bak/ env/ -ENV/ htmlcov/ instance/ ipython_config.py @@ -68,10 +63,8 @@ jspm_packages/ lib/ lib64/ local_settings.py -MANIFEST monkeytype.sqlite3 node_modules -node_modules/ nosetests.xml parts/ pip-delete-this-directory.txt @@ -81,8 +74,8 @@ profile_default/ sdist/ share/python-wheels/ target/ +tasks/ test-results -TODO.md var/ venv.bak/ venv/ diff --git a/frontend/.prettierignore b/frontend/.prettierignore index e0da06154..1624078ea 100644 --- a/frontend/.prettierignore +++ b/frontend/.prettierignore @@ -1,19 +1,18 @@ -__pycache__ -.*cache/ -.circleci -.claude -.git -.venv *.sh *Dockerfile +.claude +.claude/settings.local.json +.claude/worktrees/ +.git +__pycache__ bun.lock components.d.ts coverage dist node_modules -package-lock.json public src/choices +tasks test-results tests/**/*.json tests/**/*.xml diff --git a/frontend/.remarkignore b/frontend/.remarkignore deleted file mode 100644 index 985675e63..000000000 --- a/frontend/.remarkignore +++ /dev/null @@ -1,102 +0,0 @@ -__pycache__ -__pycache__/ -__pypackages__/ -__snapshots__ -.*cache -.*cache/ -.circleci -.claude -.coverage* -.dmypy.json -.docker-token -.DS_Store -.eggs/ -.env -.env-* -.eslintcache -.git -.hypothesis/ -.installed.cfg -.ipynb_checkpoints -.mypy_cache/ -.nox/ -.npm -.pypi-token -.pypirc -.pyre/ -.pytest_cache/ -.Python -.python-version -.ropeproject -.ruff_cache/ -.scrapy -.spyderproject -.spyproject -.tox/ -.uv-publish-env -.venv -.venv* -.webassets-cache -*.cover -*.egg -*.egg-info/ -*.log -*.manifest -*.mo -*.pot -*.py,cover -*.py[cod] -*.sage.py -*.sh -*.so -*.spec -*~ -*$py.class -*Dockerfile -build -build/ -bun.lock -celerybeat-schedule -celerybeat.pid -coverage.xml -develop-eggs/ -dist -dist/ -dmypy.json -docs/_build/ -downloads/ -eggs/ -env.bak/ -env/ -ENV/ -htmlcov/ -instance/ -ipython_config.py -jspm_packages/ -lib/ -lib64/ -local_settings.py -MANIFEST -monkeytype.sqlite3 -node_modules -node_modules/ -nosetests.xml -parts/ -pip-delete-this-directory.txt -pip-log.txt -pip-wheel-metadata/ -profile_default/ -sdist/ -share/python-wheels/ -target/ -test-results -tests/**/*.json -tests/**/*.xml -tests/**/*.yaml -tests/**/*.yml -TODO.md -uv.lock -var/ -venv.bak/ -venv/ -wheels/ diff --git a/frontend/.shellignore b/frontend/.shellignore new file mode 100644 index 000000000..0c32d98d0 --- /dev/null +++ b/frontend/.shellignore @@ -0,0 +1,2 @@ +.* +node_modules diff --git a/frontend/bin/_lib.sh b/frontend/bin/_lib.sh new file mode 100644 index 000000000..e281ddd6c --- /dev/null +++ b/frontend/bin/_lib.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +# Shared helpers for bin/ scripts. Source it, do not run it. +# Bash 3.2 safe, as that is macOS's /bin/bash: no mapfile, namerefs or ${x^^}. + +# Print an error and exit 1. +die() { + echo "ERROR: $*" >&2 + exit 1 +} + +warn() { + echo "WARNING: $*" >&2 +} + +is_darwin() { + [[ $(uname) == Darwin ]] +} + +# Succeed when the tool is on PATH. Otherwise say so and how to install it, and +# fail, so a caller can skip that tool visibly instead of silently. +need() { + if command -v "$1" >/dev/null 2>&1; then + return 0 + fi + echo "skipped: $1 not installed (brew install $1)" >&2 + return 1 +} + +# Run a command and read its NUL-delimited output into the global array files. +# Fails with the command's status, so a broken finder cannot pass for zero +# files. A temp file stands in for mapfile -d '' and wait on a process +# substitution, which both need bash 4.4. +load_files() { + local out file status=0 + out=$(mktemp) + "$@" >"$out" || status=$? + files=() + if ((status == 0)); then + while IFS= read -r -d '' file; do + files+=("$file") + done <"$out" + fi + rm -f "$out" + return "$status" +} diff --git a/frontend/bin/find-files.sh b/frontend/bin/find-files.sh new file mode 100755 index 000000000..9472cc7a1 --- /dev/null +++ b/frontend/bin/find-files.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env bash +# List files to fix and lint, minus an ignore file's patterns, NUL-delimited +# +# Usage: bin/find-files.sh [-i IGNOREFILE] [-- PREDICATE...] +# e.g. bin/find-files.sh -- -name '*Dockerfile' +# +# Prints every regular file under the current directory that the find +# PREDICATEs match (every file without any) as `find` prints it +# (./path/to/file), sorted bytewise, each followed by a NUL. Skips what +# IGNOREFILE excludes, ./.shellignore by default. A missing default file +# excludes nothing; a missing -i file is an error. +# +# The ignore file holds one pattern per line: +# - Blank lines and lines starting with # are ignored. +# - A leading ! re-includes what an earlier pattern excluded. +# - A leading ./ or / and a trailing / are stripped. +# - A pattern with a / is anchored to this directory: a/b matches ./a/b but +# not ./x/a/b. +# - A pattern without a / matches a file or directory name at any depth. +# - * ? and [...] are glob characters. As in find -path, * also matches /. +# +# Excluded directories are pruned, never descended. Like gitignore, a file +# under an excluded directory cannot be re-included, so ! only helps when it +# names the pruned directory itself: `.*` then `!.github` keeps ./.github +# and everything in it. +# +# Portable to BSD and GNU find: only -mindepth -name -path -prune -type +# -print0 -o ! and parentheses, plus whatever PREDICATEs the caller passes. +set -euo pipefail + +usage() { + echo "usage: $0 [-i IGNOREFILE] [-- PREDICATE...]" >&2 + exit 2 +} + +ignore_file=.shellignore +while getopts i: opt; do + case $opt in + i) + ignore_file=$OPTARG + if [[ ! -f $ignore_file ]]; then + echo "$0: no ignore file $ignore_file" >&2 + exit 2 + fi + ;; + *) usage ;; + esac +done +shift $((OPTIND - 1)) + +ignore_tests=() +keep_tests=() + +if [[ -f $ignore_file ]]; then + while read -r line || [[ -n $line ]]; do + line=${line//$'\r'/} + case $line in + '' | '#'*) continue ;; + esac + + negated=false + if [[ $line == '!'* ]]; then + negated=true + line=${line#!} + fi + line=${line#./} + line=${line#/} + line=${line%/} + if [[ -z $line ]]; then + continue + fi + + if [[ $line == */* ]]; then + match=(-path "./$line") + else + match=(-name "$line") + fi + + if [[ $negated == true ]]; then + if ((${#keep_tests[@]})); then + keep_tests+=(-o) + fi + keep_tests+=("${match[@]}") + else + if ((${#ignore_tests[@]})); then + ignore_tests+=(-o) + fi + ignore_tests+=("${match[@]}") + fi + done <"$ignore_file" +fi + +find_args=(. -mindepth 1) +if ((${#ignore_tests[@]})); then + prune=(\( "${ignore_tests[@]}" \)) + if ((${#keep_tests[@]})); then + prune+=(! \( "${keep_tests[@]}" \)) + fi + find_args+=(\( "${prune[@]}" \) -prune -o) +fi +find_args+=(-type f) +if (($#)); then + find_args+=(\( "$@" \)) +fi +find_args+=(-print0) + +find "${find_args[@]}" | LC_ALL=C sort -z diff --git a/frontend/bin/find-sh.sh b/frontend/bin/find-sh.sh new file mode 100755 index 000000000..9d905ce4c --- /dev/null +++ b/frontend/bin/find-sh.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash +# List shell scripts to fix and lint, honoring .shellignore, NUL-delimited +# +# Prints every regular *.sh file, and every extensionless file whose first +# line is a sh or bash shebang (such as bin/pm), under the current directory +# as find prints it (./path/to/file.sh), sorted bytewise, each followed by a +# NUL. Skips what the optional ./.shellignore excludes; find-files.sh +# describes its syntax. +set -euo pipefail + +shebang='^#![[:space:]]*([^[:space:]]*/)?(env[[:space:]]+)?(ba)?sh([[:space:]]|$)' + +"$(dirname "${BASH_SOURCE[0]}")/find-files.sh" -- -name '*.sh' -o ! -name '*.*' | + while IFS= read -r -d '' file; do + if [[ $file != *.sh ]]; then + line='' + IFS= read -r line <"$file" || true + [[ $line =~ $shebang ]] || continue + fi + printf '%s\0' "$file" + done diff --git a/frontend/bin/fix-sh.sh b/frontend/bin/fix-sh.sh deleted file mode 100755 index 1633c82cd..000000000 --- a/frontend/bin/fix-sh.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash -# Fix shell script formatting -set -euxo pipefail -shopt -s globstar - -shellharden --replace ./**/*.sh -shfmt --simplify --indent 2 --write ./**/*.sh diff --git a/frontend/bin/fix.sh b/frontend/bin/fix.sh index 46866d068..a49b07e13 100755 --- a/frontend/bin/fix.sh +++ b/frontend/bin/fix.sh @@ -5,7 +5,7 @@ set -euxo pipefail ##################### ###### Makefile ##### ##################### -uv run mbake format Makefile cfg/*.mk +uvx mbake@latest format Makefile cfg/*.mk ################ # Ignore files # @@ -15,9 +15,10 @@ bin/sort-ignore.sh ############################################ ##### Javascript, JSON, Markdown, YAML ##### ############################################ -bun run fix +# node_root merges a fix script; a project without node_root may have none. +bun run --if-present fix ################### ###### Shell ###### ################### -bin/fix-sh.sh +bin/sh-tools.sh --fix diff --git a/frontend/bin/kill-eslint_d.sh b/frontend/bin/kill-eslint_d.sh index 85d9a3751..320d067d5 100755 --- a/frontend/bin/kill-eslint_d.sh +++ b/frontend/bin/kill-eslint_d.sh @@ -1,5 +1,12 @@ #!/usr/bin/env bash # eslint_d can get into a bad state if git switches branches underneath it -bunx eslint_d stop -pkill eslint_d +set -euo pipefail +# The project's own eslint_d only: bunx would download one just to stop it. +# A daemon in a bad state may not stop cleanly; pkill gets it then. +if [[ -x node_modules/.bin/eslint_d ]]; then + node_modules/.bin/eslint_d stop || true +fi +# Any daemon left, by the title eslint_d gives itself or by its script's path. +# A bare -f eslint_d would also match this script and make kill-eslint_d. +pkill -f '^eslint_d - |node_modules/eslint_d/' || true rm -f .eslintcache diff --git a/frontend/bin/lint-darwin.sh b/frontend/bin/lint-darwin.sh deleted file mode 100755 index 298fc1a97..000000000 --- a/frontend/bin/lint-darwin.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash -# Lint checks -set -euxo pipefail - -if [ "$(uname)" != "Darwin" ]; then - # subdirs aren't copied into docker builder - # .env files aren't copied into docker - exit 0 -fi -bin/lint-sh.sh diff --git a/frontend/bin/lint-sh.sh b/frontend/bin/lint-sh.sh deleted file mode 100755 index 303a26c30..000000000 --- a/frontend/bin/lint-sh.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -# Lint shell scripts -set -euxo pipefail -shopt -s globstar - -shellcheck --external-sources ./**/*.sh -shellharden --check ./**/*.sh -shfmt --simplify --indent 2 --diff ./**/*.sh diff --git a/frontend/bin/lint.sh b/frontend/bin/lint.sh index 966b3a777..5589a45b9 100755 --- a/frontend/bin/lint.sh +++ b/frontend/bin/lint.sh @@ -2,11 +2,13 @@ # Lint checks set -euxo pipefail -uv run mbake validate Makefile cfg/*.mk +uvx mbake@latest validate Makefile cfg/*.mk # Javascript, JSON, Markdown, YAML ##### -bun run lint +# node_root merges a lint script; a project without node_root may have none. +bun run --if-present lint -bin/lint-darwin.sh +bin/sh-tools.sh --lint -uv run bin/roman.py -i .prettierignore . +# Not .prettierignore: it lists *.sh, which would hide every script from roman. +uv run bin/roman.py -i .shellignore . diff --git a/frontend/bin/remark-for-claude.sh b/frontend/bin/remark-for-claude.sh deleted file mode 100755 index 7cc25e204..000000000 --- a/frontend/bin/remark-for-claude.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash -# Run remark but not when in a claude workspace -set -euo pipefail -if echo "$PWD" | grep -q '.claude'; then - exit 0 -fi -bun remark --quiet . diff --git a/frontend/bin/roman.py b/frontend/bin/roman.py index 099357ff6..75cba0bcb 100755 --- a/frontend/bin/roman.py +++ b/frontend/bin/roman.py @@ -1,4 +1,9 @@ #!/usr/bin/env python3 +# uv run reads this block, so pathspec arrives without the lint group. +# /// script +# requires-python = ">=3.10" +# dependencies = ["pathspec~=1.1"] +# /// """ Check shell scripts recursively for a descriptive comment on line 2. @@ -24,7 +29,11 @@ # Constants # --------------------------------------------------------------------------- -SHELL_SHEBANG_PATTERN: re.Pattern[str] = re.compile(r"^#!.*sh") +# The interpreter, or the command after env and its options, is a shell like +# sh, bash or zsh. Matching "sh" anywhere would catch paths like .local/share. +SHELL_SHEBANG_PATTERN: re.Pattern[str] = re.compile( + r"^#!\s*(?:\S*/)?(?:env\s+(?:-\S+\s+)*(?:\S*/)?)?[a-z]*sh(?:\s|$)" +) # Patterns that are always excluded regardless of an ignore file. DEFAULT_EXCLUDE_PATTERNS: list[str] = [ @@ -78,6 +87,31 @@ def has_description_comment(line2: str) -> bool: return bool(COMMENT_PATTERN.match(line2)) +def _scan_dir( + current: str, root_str: str, spec: PathSpec, stack: list[str] +) -> Generator[Path]: + """ + Yield the files directly in *current* not excluded by *spec*. + + Pushes the subdirectories not excluded by *spec* onto *stack* instead. + """ + try: + scanner = os.scandir(current) + except OSError: + return + with scanner: + for entry in scanner: + rel = os.path.relpath(entry.path, root_str) + try: + if entry.is_dir(follow_symlinks=False): + if not spec.match_file(rel + "/"): + stack.append(entry.path) + elif entry.is_file() and not spec.match_file(rel): + yield Path(entry.path) + except OSError: + continue + + def _walk_tree(root: Path, spec: PathSpec) -> Generator[Path]: """ Yield every file under *root* not excluded by *spec*. @@ -88,22 +122,7 @@ def _walk_tree(root: Path, spec: PathSpec) -> Generator[Path]: root_str = str(root) stack: list[str] = [root_str] while stack: - current = stack.pop() - try: - scanner = os.scandir(current) - except OSError: - continue - with scanner: - for entry in scanner: - rel = os.path.relpath(entry.path, root_str) - try: - if entry.is_dir(follow_symlinks=False): - if not spec.match_file(rel + "/"): - stack.append(entry.path) - elif entry.is_file() and not spec.match_file(rel): - yield Path(entry.path) - except OSError: - continue + yield from _scan_dir(stack.pop(), root_str, spec, stack) def iter_files(path_strs: Sequence[str], spec: PathSpec) -> Generator[Path]: @@ -116,7 +135,7 @@ def iter_files(path_strs: Sequence[str], spec: PathSpec) -> Generator[Path]: for path_str in path_strs: path = Path(path_str) if not path.exists(): - print(f"👎 Path does not exist: {path}", file=sys.stderr) # noqa: T201 + print(f"👎 Path does not exist: {path}", file=sys.stderr) sys.exit(2) root = path.resolve() @@ -163,13 +182,13 @@ def _parse_ignore_file(args: Namespace) -> PathSpec: if args.ignore_file: ignore_path = Path(args.ignore_file) if not ignore_path.is_file(): - print(f"👎 Can't read ignore file: {ignore_path}", file=sys.stderr) # noqa: T201 + print(f"👎 Can't read ignore file: {ignore_path}", file=sys.stderr) sys.exit(2) try: return build_ignore_spec(ignore_path) except OSError as exc: - print(f"👎 Failed to parse ignore file: {exc}", file=sys.stderr) # noqa: T201 + print(f"👎 Failed to parse ignore file: {exc}", file=sys.stderr) sys.exit(2) @@ -188,17 +207,17 @@ def main() -> None: continue if not has_description_comment(line2): - print(f"🔪 {path}") # noqa: T201 + print(f"🔪 {path}") offenders.append(path) if offenders: - print( # noqa: T201 + print( f"\n{len(offenders)} script(s) missing a description comment.", file=sys.stderr, ) sys.exit(1) - print("👍") # noqa: T201 + print("👍") if __name__ == "__main__": diff --git a/frontend/bin/sh-tools.sh b/frontend/bin/sh-tools.sh new file mode 100755 index 000000000..0d6b9ace3 --- /dev/null +++ b/frontend/bin/sh-tools.sh @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +# Fix or lint the shell scripts find-sh.sh lists: bin/sh-tools.sh --fix|--lint +# Both modes live here so the shellharden and shfmt flags cannot drift apart. +# A tool that is not installed is skipped with a message on stderr. +set -euxo pipefail + +bin=$(dirname "${BASH_SOURCE[0]}") +# shellcheck source=bin/_lib.sh +. "$bin/_lib.sh" + +case ${1:-} in +--fix) + harden=--replace + format=--write + ;; +--lint) + harden=--check + format=--diff + ;; +*) + echo "usage: $0 --fix|--lint" >&2 + exit 2 + ;; +esac + +load_files "$bin/find-sh.sh" +if ((${#files[@]} == 0)); then + exit 0 +fi + +if [[ $1 == --lint ]] && need shellcheck; then + shellcheck "${files[@]}" +fi +if need shellharden; then + shellharden "$harden" "${files[@]}" +fi +if need shfmt; then + shfmt --simplify --indent 2 "$format" "${files[@]}" +fi diff --git a/frontend/bin/sort-ignore.sh b/frontend/bin/sort-ignore.sh index 971a30f5f..a14b5defd 100755 --- a/frontend/bin/sort-ignore.sh +++ b/frontend/bin/sort-ignore.sh @@ -1,10 +1,22 @@ #!/usr/bin/env bash # Sort all ignore files in place and remove duplicates -# Set locale to make output deterministic across shells -export LC_ALL=en_US.UTF-8 +# Negations (lines starting with !) go after every other line: git, docker and +# prettier let the last matching line win, so a negation only works after the +# patterns it overrides. +set -euo pipefail +# Bytewise order: every machine has the C locale, and it is the codepoint +# order merge_dotfiles.py sorts in, so the two never reorder each other. +export LC_ALL=C +sorted=$(mktemp) +trap 'rm -f "$sorted"' EXIT for f in .*ignore; do - if [ ! -L "$f" ]; then - sort --mmap --unique --output="$f" "$f" + if [ -f "$f" ] && [ ! -L "$f" ]; then + { + sed '/^!/d' "$f" | sort --unique + sed -n '/^!/p' "$f" | sort --unique + } >"$sorted" + # Write through the file, not over it, to keep its mode. + cat "$sorted" >"$f" echo "$f" sorted fi done diff --git a/frontend/bin/version-node.sh b/frontend/bin/version-node.sh index 6bfc6d868..3ebf36d5c 100755 --- a/frontend/bin/version-node.sh +++ b/frontend/bin/version-node.sh @@ -1,15 +1,17 @@ #!/usr/bin/env bash -# Get version or set version in Frontend & API. +# Get or set the node version: frontend/package.json if there is one, else ./package.json set -euo pipefail VERSION="${1:-}" -if [ "$VERSION" = "" ]; then - if [ -d frontend ]; then - cd frontend - node -e "const {name, version} = require('./package.json'); console.log(name, version);" - fi +if [[ -d frontend ]]; then + cd frontend +fi +if [[ ! -f package.json ]]; then + echo "ERROR: no package.json in $PWD" >&2 + exit 1 +fi +if [[ $VERSION == "" ]]; then + bun pm pkg get name version else - if [ -d frontend ]; then - cd frontend - bunx npm version --allow-same-version "$VERSION" - fi + # pkg set, unlike bun pm version, never commits or tags. + bun pm pkg set "version=$VERSION" fi diff --git a/frontend/bun.lock b/frontend/bun.lock index 94a1e8c53..42ff510bf 100644 --- a/frontend/bun.lock +++ b/frontend/bun.lock @@ -5,38 +5,38 @@ "": { "name": "codex", "dependencies": { - "@unhead/vue": "^3.4.2", + "@unhead/vue": "^3.4.3", "@vueuse/core": "^15.0.0", "dequal": "^2.0.3", "eslint-import-resolver-oxc": "^0.15.0", - "pinia": "^4.0.3", + "pinia": "^4.1.0", "pretty-bytes": "^7.2.0", "text-case": "^1.2.11", - "vue": "^3.5.43", - "vue-pdf-embed": "^2.1.6", + "vue": "^3.5.44", + "vue-pdf-embed": "^2.1.7", "vue-router": "^5.4.0", - "vuetify": "^4.2.4", + "vuetify": "^4.2.6", "xior": "^0.8.5", }, "devDependencies": { "@mdi/js": "^7.4.47", - "@pinia/testing": "^2.0.1", - "@types/node": "^26.6.4", - "@unhead/bundler": "^3.4.2", - "@vitejs/plugin-vue": "^6.0.9", + "@pinia/testing": "^2.0.2", + "@types/node": "^26.6.5", + "@unhead/bundler": "^3.4.3", + "@vitejs/plugin-vue": "^6.0.10", "@vue/test-utils": "^2.5.1", - "@vue/typescript-plugin": "^3.3.12", - "happy-dom": "^20.14.5", + "@vue/typescript-plugin": "^3.3.13", + "happy-dom": "^21.0.3", "rollup-plugin-visualizer": "^7.1.1", - "sass": "^1.105.1", + "sass": "^1.105.2", "sass-loader": "^17.0.1", - "toml": "^5.0.0", - "vite": "^8.3.3", + "toml": "^5.0.1", + "vite": "^8.3.4", "vite-plugin-checker": "^0.14.5", "vite-plugin-dynamic-base": "^1.4.1", "vite-plugin-run": "^0.9.1", "vite-plugin-vuetify": "^2.1.3", - "vitest": "^5.0.3", + "vitest": "^5.0.5", "vue-eslint-parser": "^10.4.1", }, }, @@ -104,35 +104,35 @@ "@mdi/js": ["@mdi/js@7.4.47", "", {}, "sha512-KPnNOtm5i2pMabqZxpUz7iQf+mfrYZyKCZ8QNz85czgEt7cuHcGorWfdzUMWYA0SD+a6Hn4FmJ+YhzzzjkTZrQ=="], - "@napi-rs/canvas": ["@napi-rs/canvas@1.0.10", "", { "optionalDependencies": { "@napi-rs/canvas-android-arm64": "1.0.10", "@napi-rs/canvas-darwin-arm64": "1.0.10", "@napi-rs/canvas-darwin-x64": "1.0.10", "@napi-rs/canvas-linux-arm-gnueabihf": "1.0.10", "@napi-rs/canvas-linux-arm64-gnu": "1.0.10", "@napi-rs/canvas-linux-arm64-musl": "1.0.10", "@napi-rs/canvas-linux-riscv64-gnu": "1.0.10", "@napi-rs/canvas-linux-x64-gnu": "1.0.10", "@napi-rs/canvas-linux-x64-musl": "1.0.10", "@napi-rs/canvas-win32-arm64-msvc": "1.0.10", "@napi-rs/canvas-win32-x64-msvc": "1.0.10" } }, "sha512-V+qptzsGnPMFxEbhwc6eDNMe5eDrfiBIp8qGpuRjAVIX4Kn2zxvwQ1Xco6Fwe+3tYIe3iLW8LM9D+SvjyJhqbQ=="], + "@napi-rs/canvas": ["@napi-rs/canvas@1.0.11", "", { "optionalDependencies": { "@napi-rs/canvas-android-arm64": "1.0.11", "@napi-rs/canvas-darwin-arm64": "1.0.11", "@napi-rs/canvas-darwin-x64": "1.0.11", "@napi-rs/canvas-linux-arm-gnueabihf": "1.0.11", "@napi-rs/canvas-linux-arm64-gnu": "1.0.11", "@napi-rs/canvas-linux-arm64-musl": "1.0.11", "@napi-rs/canvas-linux-riscv64-gnu": "1.0.11", "@napi-rs/canvas-linux-x64-gnu": "1.0.11", "@napi-rs/canvas-linux-x64-musl": "1.0.11", "@napi-rs/canvas-win32-arm64-msvc": "1.0.11", "@napi-rs/canvas-win32-x64-msvc": "1.0.11" } }, "sha512-vt5tog1cr+QKadIddGe+3LrcX0EmjEd0izF717Uwf92mBmgYfq2XRmL2r4bZU40spB69exxhrBn9I91HYEr/7w=="], - "@napi-rs/canvas-android-arm64": ["@napi-rs/canvas-android-arm64@1.0.10", "", { "os": "android", "cpu": "arm64" }, "sha512-0sDMvme+7fj6bHERUaBs5SvEyWaORc91VUkaB4RrtG7p6dBrBNGy1of8cyEKDxygd1FlHtW+Thunj8lSixzY7A=="], + "@napi-rs/canvas-android-arm64": ["@napi-rs/canvas-android-arm64@1.0.11", "", { "os": "android", "cpu": "arm64" }, "sha512-dtJS4FQEfH9OwSYLtMrEnj7T8DzBbJc/97LI/OkiWOYpW/iW5t6R/gcxVrUXS8l45gCVpwMufgucRe/pe0ISqA=="], - "@napi-rs/canvas-darwin-arm64": ["@napi-rs/canvas-darwin-arm64@1.0.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-pdHL1TEfFMrnchRYqmPWXKN7hR4XtOYmzJqnh4XhpfWD4/eeSokOGVzrdFP/iQ3sfr2rf0939gOGq9uCp8BGmg=="], + "@napi-rs/canvas-darwin-arm64": ["@napi-rs/canvas-darwin-arm64@1.0.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-J/JylWoJTG8OQqZaiqly4IODyAxNofUlZo0wtSBJtHk6AdymbdIkPynAM1JvQaZpPaG5h+msk9QuK8y4i1ooqw=="], - "@napi-rs/canvas-darwin-x64": ["@napi-rs/canvas-darwin-x64@1.0.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-iuuk5plGxAcxurxv2ycF2yR20y5zvaBZ4heQdhPpg3EMFD21PhlY1V+YwSRmYRWzbvKL474UYdw3WIg2qfafyw=="], + "@napi-rs/canvas-darwin-x64": ["@napi-rs/canvas-darwin-x64@1.0.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-nlecCk3xy06eAGC7krZtzNDm9UNTHKuHQYK8ZYegdjzgSL8anGt/eLJZm86OWaNgZkwQwvDqfSmG8Nqe6MPZNQ=="], - "@napi-rs/canvas-linux-arm-gnueabihf": ["@napi-rs/canvas-linux-arm-gnueabihf@1.0.10", "", { "os": "linux", "cpu": "arm" }, "sha512-kH7GFR5Unpm77pKSEsmkqvzeQCRD7/MQ7upmeLLjg4XpQ62dX/R6THFsp6vkF1Pkco2aKUq9KhoLM4W5twdk7g=="], + "@napi-rs/canvas-linux-arm-gnueabihf": ["@napi-rs/canvas-linux-arm-gnueabihf@1.0.11", "", { "os": "linux", "cpu": "arm" }, "sha512-DKImmG+sTPolE0kGPsYPBxTtOjb3INALp32O2lW2CfSr0bAzSEKKuu+GrQbtilClyoPOahUErS3OrznFDraoWA=="], - "@napi-rs/canvas-linux-arm64-gnu": ["@napi-rs/canvas-linux-arm64-gnu@1.0.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-0/Hj7IwM9pmzdwxiqkp4YLJ8dKqASBrWQ3Y7dWUSU/4dgvCL9O6YNvX7xVUJjonQvdD3IE9ESS/nXa5srQqoVw=="], + "@napi-rs/canvas-linux-arm64-gnu": ["@napi-rs/canvas-linux-arm64-gnu@1.0.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-55sykACGENj5j1rhj+81AO8JbR9HYgGjRZ7/H+pNr4VE1DvINKYNMTcutk8ZmWxk276jAQvUKJ3+Kdj9GXU3lQ=="], - "@napi-rs/canvas-linux-arm64-musl": ["@napi-rs/canvas-linux-arm64-musl@1.0.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-fmjKM0P2MLF9O6XzCQsRjhB+jlLzaf6tFQU36hMPMsYup+VThYvpjjhqNLOc/Ee3tHUE3r13H2BSJx/yXz4pFA=="], + "@napi-rs/canvas-linux-arm64-musl": ["@napi-rs/canvas-linux-arm64-musl@1.0.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-6Jz6jys17yXydO+WdJgu7JhoB4K7/w9sWHByzzTmLjQghUx3TDMWvLv+UcCdnWhg4oprET67EMymnrETdeGNAg=="], - "@napi-rs/canvas-linux-riscv64-gnu": ["@napi-rs/canvas-linux-riscv64-gnu@1.0.10", "", { "os": "linux", "cpu": "none" }, "sha512-O/BUrGwrs3pVP9PpD/3++ZiOpjHMJlmiB7aBgswP8rbe4egPfiFkFxmcCczoLvZa72TaQX5lJ8Udedb6rc/Hvg=="], + "@napi-rs/canvas-linux-riscv64-gnu": ["@napi-rs/canvas-linux-riscv64-gnu@1.0.11", "", { "os": "linux", "cpu": "none" }, "sha512-lf2XeEebWiUYVOVEjLXxF7dfXrBBSEOBn9AqBh39VYXrPt5cDqI+1t58IFSjn8npqkg5jIOs8TQbjKABbFW1gQ=="], - "@napi-rs/canvas-linux-x64-gnu": ["@napi-rs/canvas-linux-x64-gnu@1.0.10", "", { "os": "linux", "cpu": "x64" }, "sha512-48HkZPQeAN/R+9NPpY64tceoyCUW5xYYtHKZnC+BG11qiihXJCbH+xfbgGU+OdYp1Q4s84HDl9ILU0KBK6SBOQ=="], + "@napi-rs/canvas-linux-x64-gnu": ["@napi-rs/canvas-linux-x64-gnu@1.0.11", "", { "os": "linux", "cpu": "x64" }, "sha512-iDapw7nFSE5tsmQxcH2+KotJhyfVPmHd6vUOQN/Em+8WNbkZJwJ/rDowlJMFnMl0SYSDSfgKCNUGi6Sn5++Smg=="], - "@napi-rs/canvas-linux-x64-musl": ["@napi-rs/canvas-linux-x64-musl@1.0.10", "", { "os": "linux", "cpu": "x64" }, "sha512-QYHVi7WZ9v+Wm9OQyHLMTnJ8QiBPVX94BgbCHFJC/4bCFMfvX7fRzo4FJPgkRP0ISz3ulYNow/FCbQOPjzhYjg=="], + "@napi-rs/canvas-linux-x64-musl": ["@napi-rs/canvas-linux-x64-musl@1.0.11", "", { "os": "linux", "cpu": "x64" }, "sha512-26q26AyITo3CGZX4HWFIMgBMA1lu3YN07gxzBm4tW6Hglq/OVyTP50kDrmWuKybCX6dh3m8Ly+c7YhI+sqCgCQ=="], - "@napi-rs/canvas-win32-arm64-msvc": ["@napi-rs/canvas-win32-arm64-msvc@1.0.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-bWK+YajM/8sL0mMgLtug2s063FVBPzFV4QAn987CQomMKlmzrBY6Trz43KY+24hq7IOa3qNhUAgP/XMEF50ZEQ=="], + "@napi-rs/canvas-win32-arm64-msvc": ["@napi-rs/canvas-win32-arm64-msvc@1.0.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-cUO96IdsfvIj2S+2PNcDSkTcLhjPj8pIOEWRV1Kj70MOP4wnE9zSk7N4C1EKHlFGRcgdR5AkbnBZj0dfHK9nbQ=="], - "@napi-rs/canvas-win32-x64-msvc": ["@napi-rs/canvas-win32-x64-msvc@1.0.10", "", { "os": "win32", "cpu": "x64" }, "sha512-9WtzW85PaIhtB27iXaR/9RrLCqHLbqD3Z8Q+kh17NjFxwQXFXU5vWbYH4vEH+drM307TTyK3hidZgpt09G5T3g=="], + "@napi-rs/canvas-win32-x64-msvc": ["@napi-rs/canvas-win32-x64-msvc@1.0.11", "", { "os": "win32", "cpu": "x64" }, "sha512-DFYp/ZQRdKunI/LPc0UkRXG1vlNjJKOJf8O8Ctb8+wm2Nt2ELg9Eamc31D2VoakkfGo8L+z0Iejz6WtFbQwyGw=="], "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.2.5", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" } }, "sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA=="], "@one-ini/wasm": ["@one-ini/wasm@0.2.1", "", {}, "sha512-TUqERXGNTifZ9y2g3wPxQrw3HpHv/02DsW3D90T9x0hhonrL1ZqpSmNrU2XkoIq0fP1N6gZfVQzy2Fw1ZvGBNg=="], - "@oxc-project/types": ["@oxc-project/types@0.153.0", "", {}, "sha512-jSNrRIyvPVLL5E1z/tS5zLAprosGz/FuI1PWwEOz59j3E4TTTzSpqKb/RDGqJhhW0QHYISGXxq582wGx6T11Tw=="], + "@oxc-project/types": ["@oxc-project/types@0.154.0", "", {}, "sha512-KYOUGQFlLWR+s4QMV2Q9ko38TZm7EdO87Qm7rvZLqk/webse/cDjtyxKhg/47l0byCbs/k46LT8qc4PKjAikzA=="], "@oxc-resolver/binding-android-arm-eabi": ["@oxc-resolver/binding-android-arm-eabi@11.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-y09e0L0SRI2OA2tUIrjBgoV3eH5hvUKXNkJqXmNo5V2WxIjyC7I7aJfRLMEVpA8yi95f90gFDvO0VMgrDw+vwA=="], @@ -198,65 +198,65 @@ "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.6.0", "", { "os": "win32", "cpu": "x64" }, "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A=="], - "@pinia/testing": ["@pinia/testing@2.0.1", "", { "dependencies": { "nostics": "^1.1.4" }, "peerDependencies": { "pinia": ">=4.0.2" } }, "sha512-pQ4a4SCzdiLrhM4yv/TQG2ufNmktNlLZjjN6X/qMhXvZIiDN3L4L4WrChmcufX2LIarbl/ZPWOty1RB5KZIb2A=="], + "@pinia/testing": ["@pinia/testing@2.0.2", "", { "dependencies": { "nostics": "^1.2.0" }, "peerDependencies": { "pinia": ">=4.1.0" } }, "sha512-Dfbng8WYNTeS2ufcg+cL/prWES95RVx8VIY5JITFl8c19vs4Fx0Gd/ufkBRDLhWlQXugSkZ1kwKSXJg1c+eTkw=="], - "@rolldown/binding-android-arm-eabi": ["@rolldown/binding-android-arm-eabi@1.2.13", "", { "os": "android", "cpu": "arm" }, "sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA=="], + "@rolldown/binding-android-arm-eabi": ["@rolldown/binding-android-arm-eabi@1.2.14", "", { "os": "android", "cpu": "arm" }, "sha512-aWR+XKH9+rW7m5fWq/5360J3mHycrx/o6xZM2DQFdJnTMdyP7/WzxPjhtLbVWdKo2y612/4U1bWqb3HQhiF7vg=="], - "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.13", "", { "os": "android", "cpu": "arm64" }, "sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ=="], + "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.14", "", { "os": "android", "cpu": "arm64" }, "sha512-QiVxHofl6A8lQU7WAtOUY4QMVZXohxwz7WJJoeh8NBEUyKfIkMRKhYyq8az/1RypNiIXzNTtiS6KwHz0erxYRQ=="], - "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.13", "", { "os": "darwin", "cpu": "arm64" }, "sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA=="], + "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.14", "", { "os": "darwin", "cpu": "arm64" }, "sha512-lTQOzHuBIooh3jIr5XINQkjPGEuGy+Dsy0meXDr6Sjty0b99kYgGh4uBC/8mJX1T0kC8d6S0aPP1Y+bHkh6aBw=="], - "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw=="], + "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.14", "", { "os": "darwin", "cpu": "x64" }, "sha512-hyMKEGatjmBYCs/Q4sbIcL/GqpFEqsX3wc+HYVQ/85A4rxc1o7rPm4DUI4GV4k/h0ITddwFSGpqQunI14GXjTA=="], - "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.13", "", { "os": "freebsd", "cpu": "x64" }, "sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ=="], + "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.14", "", { "os": "freebsd", "cpu": "x64" }, "sha512-u371GbXoVXrEgP20PwzoGNOdAOqAMhzo19JzzY+V4YmmnC+DTOoqdbMu+O+54emM59Mik/UdrtWgcuEDKWRPKA=="], - "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.13", "", { "os": "linux", "cpu": "arm" }, "sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg=="], + "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.14", "", { "os": "linux", "cpu": "arm" }, "sha512-BqwKsdZQf6EqVWr8fv2MrDYzAvOZ7+NYFSJESRGs87fkseEhs0TU9TXgRJTkZoRRkxTizyEg1LKUXfU3/78uqg=="], - "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ=="], + "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-SD9kY8M009x/7s57Z1dgUVlP5+uYBgKQK0Tkr1WIWngrtUJmRCW1RJFMY7QDla2khXhmg2i5Io7MUjcmZNZ/KQ=="], - "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow=="], + "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.14", "", { "os": "linux", "cpu": "arm64" }, "sha512-BJ2CL19M6uuWesMgnqJzgxoI+N+eV7b0A9O9vLV42y+gitC41fNa8KElau1tHVzuLWX5GzEuxMPhAO0tQXQMkg=="], - "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.13", "", { "os": "linux", "cpu": "ppc64" }, "sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig=="], + "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.14", "", { "os": "linux", "cpu": "ppc64" }, "sha512-4+Kl8daPV8NDHaD7mfCcc1pRM+Qg7ab8DyMm5FG5WoZgv4h2i3KFN1CybYBNbQqmuYm7ftJLvmMI1eHYJ22S/Q=="], - "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.13", "", { "os": "linux", "cpu": "s390x" }, "sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw=="], + "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.14", "", { "os": "linux", "cpu": "s390x" }, "sha512-V/h8ePq1fKDrmtFMz6xcCN3DKvuvMRrwwD1q0PkBeeo4DpK64biaKvqWGVxqCeYKqeRk7gE7/iKPxLCn08O97A=="], - "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.13", "", { "os": "linux", "cpu": "x64" }, "sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ=="], + "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.14", "", { "os": "linux", "cpu": "x64" }, "sha512-WxalXzgrLVpKC93xfpaJ3gCXUWzeCr+FRCbDVD2mUAy4L6Vo3lNVz0epUEUpxPWJkLNYUwM4OSIikv36OJ9mLg=="], - "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.13", "", { "os": "linux", "cpu": "x64" }, "sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw=="], + "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.14", "", { "os": "linux", "cpu": "x64" }, "sha512-3G3tnAmTpdk9jO3GQtyHXqeFD2SlecfTws/Y3M2mmj9nMBwwuLT4kur8sZKeu7ENUHSpVO3cIsm5A52LEWWwlg=="], - "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.13", "", { "os": "none", "cpu": "arm64" }, "sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw=="], + "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.14", "", { "os": "none", "cpu": "arm64" }, "sha512-qyr5XiNGxm2ytx17vvtcJ9nXn6v1gENETi503bJx3OGwZ1tSonj7BosxbMa/xeAfSl5iS9X6KjEWYXLu6v1L7Q=="], - "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.13", "", { "os": "win32", "cpu": "arm64" }, "sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ=="], + "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.14", "", { "os": "win32", "cpu": "arm64" }, "sha512-oA4o5o0S2yB199YyYXDzKUv1Z56Rc+mgOjwm7Z/vJ9Z8igiDPYvoOuDyo6g7AK/ZaF09nPhDKVnGBcYHO11GXA=="], - "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.13", "", { "os": "win32", "cpu": "x64" }, "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg=="], + "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.14", "", { "os": "win32", "cpu": "x64" }, "sha512-9mE94bf2GZUaR/fUSXCMpBoWkctu421Mi0ORpm4zqfbkjKep7RxzPFa5etcGs5h+2KApoWBOA/hAJa/7saGgEQ=="], "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="], - "@swc/core": ["@swc/core@1.16.13", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.28" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.16.13", "@swc/core-darwin-x64": "1.16.13", "@swc/core-linux-arm-gnueabihf": "1.16.13", "@swc/core-linux-arm64-gnu": "1.16.13", "@swc/core-linux-arm64-musl": "1.16.13", "@swc/core-linux-ppc64-gnu": "1.16.13", "@swc/core-linux-s390x-gnu": "1.16.13", "@swc/core-linux-x64-gnu": "1.16.13", "@swc/core-linux-x64-musl": "1.16.13", "@swc/core-win32-arm64-msvc": "1.16.13", "@swc/core-win32-ia32-msvc": "1.16.13", "@swc/core-win32-x64-msvc": "1.16.13" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-k4uUsIMS0IwOKVsrQs48IZK75O4roV3FnuJEdL7ES+DFESftdgvz73QBqN3VUAbUmUr78We4tzG0kgYj36M22Q=="], + "@swc/core": ["@swc/core@1.16.18", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.28" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.16.18", "@swc/core-darwin-x64": "1.16.18", "@swc/core-linux-arm-gnueabihf": "1.16.18", "@swc/core-linux-arm64-gnu": "1.16.18", "@swc/core-linux-arm64-musl": "1.16.18", "@swc/core-linux-ppc64-gnu": "1.16.18", "@swc/core-linux-s390x-gnu": "1.16.18", "@swc/core-linux-x64-gnu": "1.16.18", "@swc/core-linux-x64-musl": "1.16.18", "@swc/core-win32-arm64-msvc": "1.16.18", "@swc/core-win32-ia32-msvc": "1.16.18", "@swc/core-win32-x64-msvc": "1.16.18" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-0cYQLkpcwUngg55TDwpwrrVOU+B6zh1NFbp+oS7dVFhmYkzaARelwugo/bzPJh1FrcnppmF+KTqioCGwyqbcEw=="], - "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.16.13", "", { "os": "darwin", "cpu": "arm64" }, "sha512-JrMH2h7ohd4mOIneNRx/diqTmCDSdWfp9uOdQ8VJ2V2CA7jOJ1jWb+qp8RoZLqgiVmwDDC7eySKB1kbvZ+jVXQ=="], + "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.16.18", "", { "os": "darwin", "cpu": "arm64" }, "sha512-ozgiCHyFDCwfXzTnaLR+i8WxEyt06GTudn9rPh08vj+u3Z8vMvt5Pi8T+BikyNXm7y++h6UMdqsnJuWrV+tk2A=="], - "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.16.13", "", { "os": "darwin", "cpu": "x64" }, "sha512-HauZMRxpOImRxgY6GXjw5gbD8ts2NcPZuLMM8htY8Mic7j1Izt/lxkXrKYUwqyU56YLwQZ4dHRT+6jFHkztcag=="], + "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.16.18", "", { "os": "darwin", "cpu": "x64" }, "sha512-tuwxXi+sjxxTAi7GP3NeQXQxOf4SXSiFxKAMYLBdoy7JqGYby6uSDXojcFoLOhSp7oiNGstnaFXxfbP0Hpro9w=="], - "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.16.13", "", { "os": "linux", "cpu": "arm" }, "sha512-tUSojGIythnHJKrElDM9OvuhBnK+FF39eM9iIBgj9kdfbAm6PhAM7dKbaSDcnX2gOLG2slkasjD0Z8m/YUlzOA=="], + "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.16.18", "", { "os": "linux", "cpu": "arm" }, "sha512-SMdhmY1P9Kveh0MRj6vqQF98bsjnDa0lBBvkd/lcpxmjj5QHJOQAU0N3g6h7GPWpBMs3h2g3lHu/QTDn+uMsXg=="], - "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.16.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-qS3bk/ezRrLXGn1b764S/EG3/oKj6uRhnTNRAALpnuu8d9I0YwSiUkQghnX7lOH9X/yRr+qrFI3R0wAruO47Tg=="], + "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.16.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-ep/mQyhblQYZ6tkfq0IJspcVSFl5jdywks3kejanrbB31uuujRD/QWOoGNp2L3lLRdAdQvgl/M3pA7g3hSuQug=="], - "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.16.13", "", { "os": "linux", "cpu": "arm64" }, "sha512-aeoYoG6fQsOS3mFOuTKvnJo1aaaxYNI0aRRlhdHaGP4q1YQx4XOc5Hkd35IFduWCBG3eZl3fPTjRuYvxpl7eTA=="], + "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.16.18", "", { "os": "linux", "cpu": "arm64" }, "sha512-pkzGVxrAQu5+febW1a/Aiph3YJk0UiJKXoWbxnDVEIOZWkk5aETHTuyVsOQ3kOgn2dzNMvJVeqcoEQdH+ntqWQ=="], - "@swc/core-linux-ppc64-gnu": ["@swc/core-linux-ppc64-gnu@1.16.13", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eEFoueZXWZ2S1lsqL8Ve2C8RjhzH9+Ktj8U4IGTUQL6CNG04+VhQiYQWJOf5xfVBU6I+PbH80yvsYegqZOOSZQ=="], + "@swc/core-linux-ppc64-gnu": ["@swc/core-linux-ppc64-gnu@1.16.18", "", { "os": "linux", "cpu": "ppc64" }, "sha512-v9kiu4as1pJyQ8ESFTtMNydZ99m86QXLfAtm+XiKPKS93pXL80BCaXokAs9ebioGkIXgmwfbzUCdUC62H3JWkw=="], - "@swc/core-linux-s390x-gnu": ["@swc/core-linux-s390x-gnu@1.16.13", "", { "os": "linux", "cpu": "s390x" }, "sha512-K0q1ReVXL3d5bzBgZxS+yJq5q2xRjg4k2XXGj9yiCEpE5ZqJGQ4Gtk1sRrk8W2lo3KY0DCJD3Myt6x2SMvGArQ=="], + "@swc/core-linux-s390x-gnu": ["@swc/core-linux-s390x-gnu@1.16.18", "", { "os": "linux", "cpu": "s390x" }, "sha512-vU7TKRJ26i86YQr4QY/5bdcH72KzkBbSSUfPlErW6d6KOR47BcVGlYZFTcMMYlmd3CVSXFHW18tBSila66YfoA=="], - "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.16.13", "", { "os": "linux", "cpu": "x64" }, "sha512-Qvpihw30irhIjy2f91BR1pamcJBCgf8hmr9XWenztAX1YLkneRkkTB/PFGWQubhaBqQhY2uZKViMj/xV61uMBQ=="], + "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.16.18", "", { "os": "linux", "cpu": "x64" }, "sha512-Ml6kbe0BoVJkSgmYPAEUudGcu84jaQeqDN8xeMumbwNpT0vlmm7241Ddp9XKCjQABvjomnXF0OiNOAfjBhNDNw=="], - "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.16.13", "", { "os": "linux", "cpu": "x64" }, "sha512-iCGxHbh3Cq5vqRvCPlw3XkkDz4RlkPSyQwfFKbOKTMj5tiEuojY/rLmf4BMfI9Z8yPJTf9VB07t3NbKInoC97g=="], + "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.16.18", "", { "os": "linux", "cpu": "x64" }, "sha512-TGU24+QmmS8y/hg0BLKgOU3W5TCcQC9bgGl8AB0R61gTNQdWdcmCehRLAJwlZfxtAml66xMJ6PWrX8NKrABOsA=="], - "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.16.13", "", { "os": "win32", "cpu": "arm64" }, "sha512-iOabn6cd+hg3cnoKlAC8j3Yufv8nQHBVU5OIDX8dCPA95PjAZ0B0TlDn9sWivk8ezo/cLJux7p9n0B9vRej+1Q=="], + "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.16.18", "", { "os": "win32", "cpu": "arm64" }, "sha512-S53hm7Amc3YV8t2BUT6R7J+zSnwiGarG+GnxMca4W0uMkxBZ3Gl6jBwEgb6YqrYjf2DzOuRfauztqptCO76a/w=="], - "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.16.13", "", { "os": "win32", "cpu": "ia32" }, "sha512-+1b/3xBNuVbpnJIZUCAaSdscOPYRWq85eohKx44y/3qbPp56UMiCJWBiWtyr7K5F1nf1JENXm2IBSEJaLgWq6Q=="], + "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.16.18", "", { "os": "win32", "cpu": "ia32" }, "sha512-+6/10+OJmU12zWkrPVG0QeQEr8VsWeF8gyXrOfHZMIfMOfz8/ULXVZPhV9GhGMKSWake1xEJj2IYCiFRS/xMpQ=="], - "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.16.13", "", { "os": "win32", "cpu": "x64" }, "sha512-6kEJhYshk7OVoVIWryiHqjCNuwZeOlPTS6et+bKV/WhtHs8fLA01wyTLrQGi+4ultgRe/o0M4b25K/KKdvl0dQ=="], + "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.16.18", "", { "os": "win32", "cpu": "x64" }, "sha512-7LsVrIICAZWSajXT6DwO7PYSTnW9maamOCyQylaOh13Viptrgi/7hl9fP75SiHe+kscaJahGXcorgt4MOOh/1w=="], "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], @@ -274,7 +274,7 @@ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/node": ["@types/node@26.6.4", "", { "dependencies": { "undici-types": "~8.9.0" } }, "sha512-ldVPDCzj7fsaGZrLB0NuHuTvJcsNasysBAqMolr/cgxrLd1xbqxIr3XJiPnHHJUCxj5sNF1vnRj9aWnrVh5Jcg=="], + "@types/node": ["@types/node@26.6.5", "", { "dependencies": { "undici-types": "~8.9.0" } }, "sha512-uMzsv9stDdofIZBx4UGh4Z9ZgXnGC9seRDscilBcTHAeOFk67MZg/k9bWVfO+bk4qZmG+l52hRnLwUiH2LnJTg=="], "@types/web-bluetooth": ["@types/web-bluetooth@0.0.21", "", {}, "sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA=="], @@ -282,15 +282,15 @@ "@types/ws": ["@types/ws@8.18.2", "", { "dependencies": { "@types/node": "*" } }, "sha512-67MQl+fpWKVTT1NYdnmo3U4sc/xPo/zQBncVnI74qmQa0z/b+1g6iYqNmGCPbxO+zz2aklb08a0oHfegiVd0/w=="], - "@unhead/bundler": ["@unhead/bundler@3.4.2", "", { "dependencies": { "magic-string": "^1.3.1", "oxc-walker": "^1.1.1", "unplugin": "^3.3.0" }, "peerDependencies": { "@unhead/cli": "^3.4.2", "@vitejs/devtools-kit": "^0.4.1", "esbuild": ">=0.17.0", "lightningcss": ">=1.20.0", "oxc-parser": ">=0.98.0", "rolldown": ">=1.0.0", "unhead": "^3.4.2", "vite": ">=6.4.2", "webpack": ">=5.0.0" }, "optionalPeers": ["@unhead/cli", "@vitejs/devtools-kit", "esbuild", "lightningcss", "oxc-parser", "rolldown", "vite", "webpack"] }, "sha512-rTMyDAjirL+fY9MzvlgY91+irU6p6VY/rklJtIfyVVaE4/VI0R2E2R1lQdatVz5gnGWZxQVeleBMqQwL2gTEwQ=="], + "@unhead/bundler": ["@unhead/bundler@3.4.3", "", { "dependencies": { "magic-string": "^1.3.1", "oxc-walker": "^1.1.1", "unplugin": "^3.3.0" }, "peerDependencies": { "@unhead/cli": "^3.4.3", "@vitejs/devtools-kit": "^0.7.6", "esbuild": ">=0.17.0", "lightningcss": ">=1.20.0", "oxc-parser": ">=0.98.0", "rolldown": ">=1.0.0", "unhead": "^3.4.3", "vite": ">=6.4.2", "webpack": ">=5.0.0" }, "optionalPeers": ["@unhead/cli", "@vitejs/devtools-kit", "esbuild", "lightningcss", "oxc-parser", "rolldown", "vite", "webpack"] }, "sha512-noUTzazRB4fMgO/nluoirrZJXngNbNb3sQzIslA805tKkwakRv2fib4Xe4EdiTuNB7V5XmpUFvfQkKRdBQ9qAA=="], - "@unhead/vue": ["@unhead/vue@3.4.2", "", { "dependencies": { "@unhead/bundler": "3.4.2", "hookable": "^6.1.1", "unhead": "3.4.2", "unplugin": "^3.3.0" }, "peerDependencies": { "vite": ">=6.4.2", "vue": ">=3.5.18", "webpack": ">=5.0.0" }, "optionalPeers": ["vite", "webpack"] }, "sha512-kIe9HaBEUvueM8HIyGw7Eu1c/1pcGy0gnCwC80rLhNJvxNwxXKywvnGSn1rKv9rAVxQTmbEL6Xec3UFXPoIwWA=="], + "@unhead/vue": ["@unhead/vue@3.4.3", "", { "dependencies": { "@unhead/bundler": "3.4.3", "hookable": "^6.1.1", "unhead": "3.4.3", "unplugin": "^3.3.0" }, "peerDependencies": { "vite": ">=6.4.2", "vue": ">=3.5.18", "webpack": ">=5.0.0" }, "optionalPeers": ["vite", "webpack"] }, "sha512-Wrmk62oC/V1EcBSKRDuy77kVaBtBXXsj6b+vEEWvmfo9AQfpLlc2b6vvvSj9WnXr8VY1ksKHj49Ejo8J/wLSOA=="], - "@vitejs/plugin-vue": ["@vitejs/plugin-vue@6.0.9", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.1" }, "peerDependencies": { "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "vue": "^3.2.25" } }, "sha512-rD/MORlhaZMlXWW0rEn4FB4wMinWC0z/D7Ye160S5+Rs1mC8ZDAdcDp4SjKfUhG5t8q1ktcPVw4xuTkPRlzrSA=="], + "@vitejs/plugin-vue": ["@vitejs/plugin-vue@6.0.10", "", { "dependencies": { "@rolldown/pluginutils": "^1.0.1" }, "peerDependencies": { "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", "vue": "^3.2.25 || ^3.6.0-rc.10" } }, "sha512-b80aUQh3n+qEzzZm5oQp3rT2QImeCx58K6eFl/RkJ3d65KW0kTuv5lNsLRVAjbW9YRUpo/wzmvzMgV34bTAItA=="], - "@vitest/mocker": ["@vitest/mocker@5.0.3", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.31", "@vitest/spy": "5.0.3", "estree-walker": "^3.0.3", "magic-string": "^1.2.3" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-T8sWAIbkSyAjkwTcaEc3Iu0o9A27X1/kdXrizhZkGuSKScRQtRzclfAMpOTcGdXCsqxeWlpGy3XjqaW8CpLORg=="], + "@vitest/mocker": ["@vitest/mocker@5.0.5", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.31", "@vitest/spy": "5.0.5", "estree-walker": "^3.0.3", "magic-string": "^1.4.3" }, "peerDependencies": { "msw": "^2.4.9 || ^3.0.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg=="], - "@vitest/spy": ["@vitest/spy@5.0.3", "", {}, "sha512-XhFysQTB8AZ+P4gMi+Lpo99vg2AZi0qKpaB9yXQl37+CaMEAPO3iH/wGVnSyL5MPERiLezpqTVtrR6UZH5GCXg=="], + "@vitest/spy": ["@vitest/spy@5.0.5", "", {}, "sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw=="], "@volar/language-core": ["@volar/language-core@2.4.28", "", { "dependencies": { "@volar/source-map": "2.4.28" } }, "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ=="], @@ -300,13 +300,13 @@ "@vue-macros/common": ["@vue-macros/common@3.1.4", "", { "dependencies": { "@vue/compiler-sfc": "^3.5.22", "ast-kit": "^2.1.2", "local-pkg": "^1.1.2", "magic-string-ast": "^1.0.2", "unplugin-utils": "^0.3.0" }, "peerDependencies": { "vue": "^2.7.0 || ^3.2.25" }, "optionalPeers": ["vue"] }, "sha512-/5Fv+6DgIcM9ajY05ZmKBv+LMX1M9A0X+IUwDRVdt67ciw8OV9bvG2r34p3RiEadlsQybjhKPRKNXDC8Bp23cw=="], - "@vue/compiler-core": ["@vue/compiler-core@3.5.43", "", { "dependencies": { "@babel/parser": "^7.29.8", "@vue/shared": "3.5.43", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg=="], + "@vue/compiler-core": ["@vue/compiler-core@3.5.44", "", { "dependencies": { "@babel/parser": "^7.29.9", "@vue/shared": "3.5.44", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.2" } }, "sha512-k34nCytbK8PQ1gR2mGROYOw6Pnv/mumqIdrZ3x2tbyXZDWm7ViKGLTfdB+DRrWqEQsLgGJvn0WN9jBif5zCTLQ=="], - "@vue/compiler-dom": ["@vue/compiler-dom@3.5.43", "", { "dependencies": { "@vue/compiler-core": "3.5.43", "@vue/shared": "3.5.43" } }, "sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ=="], + "@vue/compiler-dom": ["@vue/compiler-dom@3.5.44", "", { "dependencies": { "@vue/compiler-core": "3.5.44", "@vue/shared": "3.5.44" } }, "sha512-W5AoBFWdw1lQAKiHowkfgFKFab82oSRT6sGsPfw/q1GRjsy/ZJFLHGhJyBRIFN9APLTUduDH9U2JAiPOIyKuYg=="], - "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.43", "", { "dependencies": { "@babel/parser": "^7.29.8", "@vue/compiler-core": "3.5.43", "@vue/compiler-dom": "3.5.43", "@vue/compiler-ssr": "3.5.43", "@vue/shared": "3.5.43", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.28", "source-map-js": "^1.2.1" } }, "sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ=="], + "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.44", "", { "dependencies": { "@babel/parser": "^7.29.9", "@vue/compiler-core": "3.5.44", "@vue/compiler-dom": "3.5.44", "@vue/compiler-ssr": "3.5.44", "@vue/shared": "3.5.44", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", "postcss": "^8.5.29", "source-map-js": "^1.2.2" } }, "sha512-dzHmQ4jXTpdr5FjIQUeykVakN/uzqFbUo9/C5ikBFg3a3PeM6uRxeczx1ZbXBML0/zJstEh3ygYipzR5Z7b2Pw=="], - "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.43", "", { "dependencies": { "@vue/compiler-dom": "3.5.43", "@vue/shared": "3.5.43" } }, "sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg=="], + "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.44", "", { "dependencies": { "@vue/compiler-dom": "3.5.44", "@vue/shared": "3.5.44" } }, "sha512-xr5gb1JVHlfXJwSlRz1FeP6uxoazdzHuMTVLE7up+4Vrqxk219CvxLPxD9NXBt47yvZW7+p4DXfyp4O1fkByIA=="], "@vue/devtools-api": ["@vue/devtools-api@8.2.1", "", { "dependencies": { "@vue/devtools-kit": "^8.2.1" } }, "sha512-6u4vXBlIBAC1wMplIZgpyPn7uh/s4Bf6F5bMzvLv+EdJ0aHs/+4B7Ygv864EStQSjRbsRzTko/kUG1A1IejQ3A=="], @@ -314,21 +314,21 @@ "@vue/devtools-shared": ["@vue/devtools-shared@8.2.1", "", {}, "sha512-Fkac7lUdGReh6pVOi3AYPRGe82LQqRmAfThW7RRligOAP0ZA/Z1z9XLHDM9dv34pV2HRc79DK8uKPeG2fLnA/g=="], - "@vue/language-core": ["@vue/language-core@3.3.12", "", { "dependencies": { "@volar/language-core": "2.4.28", "@vue/compiler-dom": "^3.5.0", "@vue/shared": "^3.5.0", "alien-signals": "^3.2.1", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1", "picomatch": "^4.0.4" } }, "sha512-k7uIKR0n4CBidk233y7cac9osnDQ5WRidTl6nsrNvpZ3nf8cx9iJxRVsRzVsoPRHbowT/iKgGMTS9RGov3jeIA=="], + "@vue/language-core": ["@vue/language-core@3.3.13", "", { "dependencies": { "@volar/language-core": "2.4.28", "@vue/compiler-dom": "^3.5.0", "@vue/shared": "^3.5.0", "alien-signals": "^3.2.1", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1", "picomatch": "^4.0.4" } }, "sha512-axA0Xemn5LuUKuKWob0/kVq7xQ2mJJM6VqA9Exvt35nM9yRC31goWVve/G/Zb2ZCLsXC8FHYjjfXlnshknSCew=="], - "@vue/reactivity": ["@vue/reactivity@3.5.43", "", { "dependencies": { "@vue/shared": "3.5.43" } }, "sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA=="], + "@vue/reactivity": ["@vue/reactivity@3.5.44", "", { "dependencies": { "@vue/shared": "3.5.44" } }, "sha512-u+QJdKeBBEADkPdevsL+6E12QlYVfBD8Zcw5qjDQKtamI6l14KyqazJMobhCKelhWN5zpyKUiEDoTyHE93cqWw=="], - "@vue/runtime-core": ["@vue/runtime-core@3.5.43", "", { "dependencies": { "@vue/reactivity": "3.5.43", "@vue/shared": "3.5.43" } }, "sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw=="], + "@vue/runtime-core": ["@vue/runtime-core@3.5.44", "", { "dependencies": { "@vue/reactivity": "3.5.44", "@vue/shared": "3.5.44" } }, "sha512-uEa/ndwjhrrhnOfb2p+sZy6zeoamJOISqaLSJGk/8R6nABT1ZldpzcJoPzKj+zHVomVBPcmQYyC2r4LtvDV6CQ=="], - "@vue/runtime-dom": ["@vue/runtime-dom@3.5.43", "", { "dependencies": { "@vue/reactivity": "3.5.43", "@vue/runtime-core": "3.5.43", "@vue/shared": "3.5.43", "csstype": "^3.2.3" } }, "sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw=="], + "@vue/runtime-dom": ["@vue/runtime-dom@3.5.44", "", { "dependencies": { "@vue/reactivity": "3.5.44", "@vue/runtime-core": "3.5.44", "@vue/shared": "3.5.44", "csstype": "^3.2.3" } }, "sha512-3fc4ARcXVhVBaJ3ujWiNZJARD6pkyRcwG+ZYhMzjKtKUp7MAY0HLwr7r3Smep3Li6ZaWT6ewdmx8XqdaD5oNZg=="], - "@vue/server-renderer": ["@vue/server-renderer@3.5.43", "", { "dependencies": { "@vue/compiler-ssr": "3.5.43", "@vue/runtime-dom": "3.5.43", "@vue/shared": "3.5.43" } }, "sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ=="], + "@vue/server-renderer": ["@vue/server-renderer@3.5.44", "", { "dependencies": { "@vue/compiler-ssr": "3.5.44", "@vue/runtime-dom": "3.5.44", "@vue/shared": "3.5.44" } }, "sha512-R4S1UoH4h5Frrauv8Z5XE5TxV9oBiUSgWIC4TyVK1FK+RocRnOLwFA5Xcmo2011RlgJp+AbZCnw6afrhlgRuUQ=="], - "@vue/shared": ["@vue/shared@3.5.43", "", {}, "sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q=="], + "@vue/shared": ["@vue/shared@3.5.44", "", {}, "sha512-H82XLH0DjmSOdbEwO15x3QTo1f5PWEtv237eLpYKc0mqLu+B8hnq16lFWmuBmNurkeiG3wr+oM1FhOll/YVFRg=="], "@vue/test-utils": ["@vue/test-utils@2.5.1", "", { "dependencies": { "js-beautify": "^2.0.0", "vue-component-type-helpers": "^3.0.0" }, "peerDependencies": { "@vue/compiler-dom": "3.x", "@vue/server-renderer": "3.x", "vue": "3.x" }, "optionalPeers": ["@vue/server-renderer"] }, "sha512-V/4a99odJ7hapr0bRt35XxljGk8hefq31gSOnlKTcEq2fUeoj2qb+FcpJYfQu4qfYhW9Ug+O2+CZ3QmZ7gXDzA=="], - "@vue/typescript-plugin": ["@vue/typescript-plugin@3.3.12", "", { "dependencies": { "@volar/typescript": "2.4.28", "@vue/language-core": "3.3.12", "@vue/shared": "^3.5.0", "path-browserify": "^1.0.1", "vue-component-meta": "3.3.12" } }, "sha512-svxFiW1e+qV3giEJiRej4UpGyjN2LjMxfd8JpQLboCITX8cjCs70PCg5nt2b3RWdJsJ8t8OI45S6ch8MAJgTwg=="], + "@vue/typescript-plugin": ["@vue/typescript-plugin@3.3.13", "", { "dependencies": { "@volar/typescript": "2.4.28", "@vue/language-core": "3.3.13", "@vue/shared": "^3.5.0", "path-browserify": "^1.0.1", "vue-component-meta": "3.3.13" } }, "sha512-L/ht0WIIB5GOPYx0ooWoVQztsI/v1h7lW2/ND0YBuoBYHTteGPfRFzM5j0/uD1nf/rYezqWHhNDDmww2Co53KA=="], "@vuetify/loader-shared": ["@vuetify/loader-shared@2.1.2", "", { "dependencies": { "upath": "^2.0.1" }, "peerDependencies": { "vue": "^3.0.0", "vuetify": ">=3" } }, "sha512-X+1jBLmXHkpQEnC0vyOb4rtX2QSkBiFhaFXz8yhQqN2A4vQ6k2nChxN4Ol7VAY5KoqMdFoRMnmNdp/1qYXDQig=="], @@ -430,7 +430,7 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@10.12.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.7.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "11.1.5 || >11.1.6 <12", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-npHjrHb2o4ehH3mE+YuxABR+0gyb0aVWCIolgJDArwCiHEIsonBm3ZKjel5b0U5+a+MbEvIyRCGCzD3eKKK2NA=="], + "eslint": ["eslint@10.13.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", "@eslint/config-array": "^0.23.5", "@eslint/config-helpers": "^0.7.0", "@eslint/core": "^1.2.1", "@eslint/plugin-kit": "^0.7.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^9.1.2", "eslint-visitor-keys": "^5.0.1", "espree": "^11.2.0", "esquery": "^1.7.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "11.1.5 || >11.1.6 <12", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "minimatch": "^10.2.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-UohDjD4zSzEwhf58M3O7vc/ycc8O1I7dNlhtD0WxE8Px8EHNJKtUwzBqrzeGhisRuv2ag4sAYswszCJRgKXYUg=="], "eslint-import-resolver-oxc": ["eslint-import-resolver-oxc@0.15.0", "", { "dependencies": { "stable-hash-x": "^0.1.1" }, "peerDependencies": { "@rspack/cli": "*", "@rspack/core": "*", "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*", "oxc-resolver": "*", "vite": "*", "webpack": "*", "webpack-cli": "*", "webpack-merge": "*" }, "optionalPeers": ["@rspack/cli", "@rspack/core", "eslint-plugin-import", "eslint-plugin-import-x", "vite", "webpack", "webpack-cli", "webpack-merge"] }, "sha512-qod5T3t3PbJdMZX3GYb8rdhD/UBK9rJCSE2b2+ttXtVdBm39CHgyCht1pMXj/1Z0ko1wNme+az4Z5chowgXD5Q=="], @@ -482,7 +482,7 @@ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], - "happy-dom": ["happy-dom@20.14.5", "", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "buffer-image-size": "^0.6.4", "entities": "^7.0.1", "whatwg-mimetype": "^3.0.0", "ws": "^8.21.0" } }, "sha512-x/RzkpWO40bTjIoT30iQtt64FLLmH/iRcUCN2X//bLx7H3ifkdfPXyqsro/OYtqzIAhiLMMA7mmiOR9C3NOKjQ=="], + "happy-dom": ["happy-dom@21.0.3", "", { "dependencies": { "@types/node": ">=20.0.0", "@types/whatwg-mimetype": "^3.0.2", "@types/ws": "^8.18.1", "buffer-image-size": "^0.6.4", "entities": "^7.0.1", "whatwg-mimetype": "^3.0.0", "ws": "^8.21.0" } }, "sha512-PesNgu5BnIEmAwzKGewB3K1ORFeznFZJ4JrRz89ea1wkHnxskdpzX9sN/+zb4KO6k8oSMhyJSj/cwXAFrYBBNA=="], "hashery": ["hashery@1.5.1", "", { "dependencies": { "hookified": "^1.15.0" } }, "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ=="], @@ -588,7 +588,7 @@ "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], - "obug": ["obug@2.2.1", "", {}, "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q=="], + "obug": ["obug@3.0.0", "", {}, "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw=="], "open": ["open@11.0.4", "", { "dependencies": { "default-browser": "^5.5.1", "define-lazy-prop": "^3.0.0", "is-in-ssh": "^1.0.0", "is-inside-container": "^1.0.0", "powershell-utils": "^0.2.1", "wsl-utils": "^1.0.0" } }, "sha512-++Zlftm0kVLPmzC06t6epuWmcRMDbI4z5P3NNX979WA/k23+NtSOynEGzsVfZwguKw2mi5umVgnBlJQMwRz4Pg=="], @@ -620,11 +620,11 @@ "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], - "pinia": ["pinia@4.0.3", "", { "dependencies": { "nostics": "^1.1.4" }, "peerDependencies": { "@vue/devtools-api": "^8.1.5", "typescript": ">=5.6.0", "vue": "^3.5.11" }, "optionalPeers": ["typescript"] }, "sha512-XMQqpvjgG7LMqVhhFUzKLT4KEbsYbfZZ0CZU9PgdFm1O2VKBmIkykL8+SfNhOaT7sR0wT6BEgKT0YNDYWgmVRA=="], + "pinia": ["pinia@4.1.0", "", { "dependencies": { "nostics": "^1.2.0" }, "peerDependencies": { "@vue/devtools-api": "^8.2.1", "typescript": ">=5.6.0", "vue": "^3.5.11" }, "optionalPeers": ["typescript"] }, "sha512-+5/HMuVjYQfKlCD5xQ7zfXn1xUzYFEa7pd0DQK5SaMfZCaFRTHlaH/c02N1FoGOdlzSiwf5EOPgJx//1QDw6gw=="], "pkg-types": ["pkg-types@2.3.3", "", { "dependencies": { "confbox": "^0.3.1", "exsolve": "^1.1.1", "pathe": "^2.0.3" } }, "sha512-j/lCFdcppV0JxWpCEITdbDltBxPP6cHT+yNJ6Go2OgoSA9518X847X9z0p6LtA4Nc16+eQzCZjRrWanTGvHJ5w=="], - "postcss": ["postcss@8.5.29", "", { "dependencies": { "nanoid": "^3.3.19", "picocolors": "^1.1.1", "source-map-js": "^1.2.2" } }, "sha512-49cGhUbXj8Qenv0iTMxA1cFBzxXoctpC9Ujd77t1WcbJIr6nF/eI7g/8MgxrYldFRuAXvja7xQRwavoW7kgrxQ=="], + "postcss": ["postcss@8.5.31", "", { "dependencies": { "nanoid": "^3.3.20", "picocolors": "^1.1.1", "source-map-js": "^1.2.2" } }, "sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg=="], "powershell-utils": ["powershell-utils@0.2.1", "", {}, "sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A=="], @@ -646,13 +646,13 @@ "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], - "rolldown": ["rolldown@1.2.13", "", { "dependencies": { "@oxc-project/types": "=0.153.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.13", "@rolldown/binding-android-arm64": "1.2.13", "@rolldown/binding-darwin-arm64": "1.2.13", "@rolldown/binding-darwin-x64": "1.2.13", "@rolldown/binding-freebsd-x64": "1.2.13", "@rolldown/binding-linux-arm-gnueabihf": "1.2.13", "@rolldown/binding-linux-arm64-gnu": "1.2.13", "@rolldown/binding-linux-arm64-musl": "1.2.13", "@rolldown/binding-linux-ppc64-gnu": "1.2.13", "@rolldown/binding-linux-s390x-gnu": "1.2.13", "@rolldown/binding-linux-x64-gnu": "1.2.13", "@rolldown/binding-linux-x64-musl": "1.2.13", "@rolldown/binding-openharmony-arm64": "1.2.13", "@rolldown/binding-win32-arm64-msvc": "1.2.13", "@rolldown/binding-win32-x64-msvc": "1.2.13" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-/5apOkwWxtACcQtZ5WlrAsKS4JwXVThQPJZ3RqIruRY9UG9M8e0VlXN068xum/JRKA4aIUoJ13ghe/kGCvidiQ=="], + "rolldown": ["rolldown@1.2.14", "", { "dependencies": { "@oxc-project/types": "=0.154.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm-eabi": "1.2.14", "@rolldown/binding-android-arm64": "1.2.14", "@rolldown/binding-darwin-arm64": "1.2.14", "@rolldown/binding-darwin-x64": "1.2.14", "@rolldown/binding-freebsd-x64": "1.2.14", "@rolldown/binding-linux-arm-gnueabihf": "1.2.14", "@rolldown/binding-linux-arm64-gnu": "1.2.14", "@rolldown/binding-linux-arm64-musl": "1.2.14", "@rolldown/binding-linux-ppc64-gnu": "1.2.14", "@rolldown/binding-linux-s390x-gnu": "1.2.14", "@rolldown/binding-linux-x64-gnu": "1.2.14", "@rolldown/binding-linux-x64-musl": "1.2.14", "@rolldown/binding-openharmony-arm64": "1.2.14", "@rolldown/binding-win32-arm64-msvc": "1.2.14", "@rolldown/binding-win32-x64-msvc": "1.2.14" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-eTBTTqMR6uHKLgcUqpJP8ntzDI6V4LYA8negAMBEI7gkgVvOdrx6VsvS2Ym+83KhOPdLCHWJu0w7UQFJZhHKNw=="], "rollup-plugin-visualizer": ["rollup-plugin-visualizer@7.1.1", "", { "dependencies": { "open": "^11.0.0", "picomatch": "^4.0.5", "source-map": "^0.8.0", "yargs": "^18.1.0" }, "peerDependencies": { "rolldown": "1.x || ^1.0.0-beta || ^1.0.0-rc", "rollup": "2.x || 3.x || 4.x" }, "optionalPeers": ["rolldown", "rollup"], "bin": { "rollup-plugin-visualizer": "dist/bin/cli.js" } }, "sha512-ThaGiHTU8XW02OkK80TrTHATraJmM9OAduU4otal+7gyXLpYEtmGBLfx5kW+EHvvLwn03YGW2NnwKUIqsYlJAA=="], "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], - "sass": ["sass@1.105.1", "", { "dependencies": { "chokidar": "^5.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-1CnAWPyrrnVQzXGB/DUep1vYCKCm1CIBr+YxjjiW6wk9qtzemnGP4qicH56T2F9S4Hjtv/Ne3jDz8JqfdDU4oA=="], + "sass": ["sass@1.105.2", "", { "dependencies": { "chokidar": "^5.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-KxW6ZKZiBKWK3ziQ4YZ3cpqo8/1TlHXE8t9nBNvGDZFoBFbk2MD7RacxYFs8zy8hzeFwpFYkVyAhboi47uYPEQ=="], "sass-loader": ["sass-loader@17.0.1", "", { "peerDependencies": { "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "optionalPeers": ["@rspack/core", "sass", "sass-embedded", "webpack"] }, "sha512-pgJMwCuLjVTSIWsv/2luVRXKlCeaViUGcgSe8dx95zMG4hUwqIMFmjbhq29ypFLflJU0GyiJZeLM9iI1n3KYAA=="], @@ -724,13 +724,13 @@ "tiny-lru": ["tiny-lru@11.4.7", "", {}, "sha512-w/Te7uMUVeH0CR8vZIjr+XiN41V+30lkDdK+NRIDCUYKKuL9VcmaUEmaPISuwGhLlrTGh5yu18lENtR9axSxYw=="], - "tinybench": ["tinybench@6.2.1", "", {}, "sha512-IAbQaPJIIdhVxi0mqy9lez1wEwje0UQf9F1vwtbelEG5Nbgn0nPOxCvU+mNeNS9gyJTAhrHp74CbUaSynQpZcQ=="], + "tinybench": ["tinybench@6.2.2", "", {}, "sha512-nIZ2N2dFpjBsg2hgitKu7mA+FvsIJuGJOwysRngmVRRmWgR/UyPjwJj8c/fT/dhm8EkHnF5EOogRf+0Z2qrimA=="], "tinyexec": ["tinyexec@1.3.1", "", {}, "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA=="], "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], - "toml": ["toml@5.0.0", "", {}, "sha512-bsqEd+g7fzlrw7LEynQ6W6aOK/lTOlepz5x1sJyIV9fTZVJS2Q76nuju6FK+gZhW5bUpvB7mCEqdR0u4WziMFw=="], + "toml": ["toml@5.0.1", "", {}, "sha512-EqYNA/YvUNndrA2B3O2ojzLQoTQrBxeZ9UIjQwk8t10oe6n7dwclBwd9IdZQTOKwe6vWX+AXtl6IntXRbepdxQ=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -740,7 +740,7 @@ "undici-types": ["undici-types@8.9.0", "", {}, "sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg=="], - "unhead": ["unhead@3.4.2", "", { "dependencies": { "hookable": "^6.1.1", "unplugin": "^3.3.0" }, "peerDependencies": { "vite": ">=6.4.2" }, "optionalPeers": ["vite"] }, "sha512-LmD1cV1QFIru0AyJi404no2p0ivXUli+lOLs2/fxP56ATJzTF2wSTJNh45YSYGtFD5QmQTWNHmhnXHkVAET1dA=="], + "unhead": ["unhead@3.4.3", "", { "dependencies": { "hookable": "^6.1.1", "unplugin": "^3.3.0" }, "peerDependencies": { "vite": ">=6.4.2" }, "optionalPeers": ["vite"] }, "sha512-0FZI/qCCyIey14CKlGMFpiQumWSatlthJy7Xvro7H3nmi/V2owkcCXG03k0GXDc2/TV1K6bvrbAwhzTRe5Nhdw=="], "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], @@ -752,7 +752,7 @@ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], - "vite": ["vite@8.3.3", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", "postcss": "^8.5.28", "rolldown": "~1.2.11", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-cTAldKPImjg6c+gk48U19POPn3GCBzZwpdsN8ZMEEcbpes+6/wvfqUd0C2y3qYY4wsj8PwgFwrZ/1jBPVttMSg=="], + "vite": ["vite@8.3.4", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.7", "postcss": "^8.5.29", "rolldown": "~1.2.12", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ=="], "vite-plugin-checker": ["vite-plugin-checker@0.14.5", "", { "dependencies": { "@babel/code-frame": "^7.29.0", "chokidar": "^5.0.0", "npm-run-path": "^6.0.0", "picocolors": "^1.1.1", "picomatch": "^4.0.4", "proper-lockfile": "^4.1.2", "tiny-invariant": "^1.3.3" }, "peerDependencies": { "@biomejs/biome": ">=2.4.12", "eslint": ">=9.39.4", "meow": "^13.2.0 || ^14.0.0", "optionator": "^0.9.4", "oxlint": ">=1", "stylelint": ">=16.26.1", "typescript": "*", "vite": ">=5.4.21", "vue-tsc": "~2.2.10 || ^3.0.0" }, "optionalPeers": ["@biomejs/biome", "eslint", "meow", "optionator", "oxlint", "stylelint", "typescript", "vue-tsc"] }, "sha512-c9lQ92eisUO+F7Fd93aelojmiOS+NQpPgQ1XR2LTQHox1/laZf4yAoQj+L3RA9Vgh10e2nFd9b8r2LLyYZsbpA=="], @@ -762,23 +762,23 @@ "vite-plugin-vuetify": ["vite-plugin-vuetify@2.1.3", "", { "dependencies": { "@vuetify/loader-shared": "^2.1.2", "debug": "^4.3.3", "upath": "^2.0.1" }, "peerDependencies": { "vite": ">=5", "vue": "^3.0.0", "vuetify": ">=3" } }, "sha512-Q4SC/4TqbNvaZIFb9YsfBqkGlYHbJJJ6uU3CnRBZqLUF3s5eCMVZAaV4GkTbehIH/bhSj42lMXztOwc71u6rVw=="], - "vitest": ["vitest@5.0.3", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/mocker": "5.0.3", "chai": "^6.2.2", "es-module-lexer": "^2.3.2", "expect-type": "^1.4.0", "magic-string": "^1.2.3", "obug": "^2.1.4", "picomatch": "^4.0.7", "std-env": "^4.2.0", "tinybench": "^6.1.4", "tinyexec": "^1.3.0", "tinyglobby": "^0.2.17", "why-is-node-running": "3.2.1" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "5.0.3", "@vitest/browser-preview": "5.0.3", "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", "@vitest/coverage-istanbul": "5.0.3", "@vitest/coverage-v8": "5.0.3", "@vitest/ui": "5.0.3", "happy-dom": "*", "jsdom": "*", "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "./vitest.mjs" } }, "sha512-xMw97S3rjdtj5dkVat7jCsqWBpvchs3RlpQctUqwJD0KkERk40vz2fJ77lDwW/Vzh/pk18eItYAzkodhSes3jQ=="], + "vitest": ["vitest@5.0.5", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/mocker": "5.0.5", "chai": "^6.3.0", "es-module-lexer": "^2.3.2", "expect-type": "^1.4.0", "magic-string": "^1.4.3", "obug": "^3.0.0", "picomatch": "^4.0.7", "std-env": "^4.3.0", "tinybench": "^6.2.2", "tinyexec": "^1.3.1", "tinyglobby": "^0.2.17", "why-is-node-running": "3.2.1" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "5.0.5", "@vitest/browser-preview": "5.0.5", "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", "@vitest/coverage-istanbul": "5.0.5", "@vitest/coverage-v8": "5.0.5", "@vitest/ui": "5.0.5", "happy-dom": "*", "jsdom": "*", "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "./vitest.mjs" } }, "sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg=="], "vscode-uri": ["vscode-uri@3.2.0", "", {}, "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg=="], - "vue": ["vue@3.5.43", "", { "dependencies": { "@vue/compiler-dom": "3.5.43", "@vue/compiler-sfc": "3.5.43", "@vue/runtime-dom": "3.5.43", "@vue/server-renderer": "3.5.43", "@vue/shared": "3.5.43" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng=="], + "vue": ["vue@3.5.44", "", { "dependencies": { "@vue/compiler-dom": "3.5.44", "@vue/compiler-sfc": "3.5.44", "@vue/runtime-dom": "3.5.44", "@vue/server-renderer": "3.5.44", "@vue/shared": "3.5.44" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-dvvmaOCG7lAMkJTPqPwWeGMsPS6DIsFsfZDUgBp9V6mHf9b3+/wyVwYR4Es+WV6uJC0FKRxp81Obcq0ZwUcGFQ=="], - "vue-component-meta": ["vue-component-meta@3.3.12", "", { "dependencies": { "@volar/typescript": "2.4.28", "@vue/language-core": "3.3.12", "path-browserify": "^1.0.1" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-UT2ax02yye/xT/eiVBaXjuLDS92spt2V6Aj9C3gJpKKBZg/etrDIGCTLG34M4zGN5qWJEkcpnRjDt3wXBoxOjw=="], + "vue-component-meta": ["vue-component-meta@3.3.13", "", { "dependencies": { "@volar/typescript": "2.4.28", "@vue/language-core": "3.3.13", "path-browserify": "^1.0.1" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-VnqcGTxB4n56qWfsuroOL+cEvjkV8uEffGy57bqlzePAQKQMLBXAjIKIntyngunmMnxWHMLzkYgRxdx9I1H/hg=="], - "vue-component-type-helpers": ["vue-component-type-helpers@3.3.12", "", {}, "sha512-HwCqmgTfLFskQc4P5TRnbduCMyPat2Ezu0elLWOGn0dD/6BKHP15B5bxce6aDi+E4kblPtru8amIBQzu0Di3qQ=="], + "vue-component-type-helpers": ["vue-component-type-helpers@3.3.13", "", {}, "sha512-02KCxSmKDhIITjKyJ4QT5csP6L0WoRborLqY/34a40+S9uvMvdNgMV0yVjO3p2Gkz3ZoPmFz/0JsGHacwJYTxw=="], "vue-eslint-parser": ["vue-eslint-parser@10.4.1", "", { "dependencies": { "debug": "^4.4.0", "eslint-scope": "^8.2.0 || ^9.0.0", "eslint-visitor-keys": "^4.2.0 || ^5.0.0", "espree": "^10.3.0 || ^11.0.0", "esquery": "^1.6.0", "semver": "^7.6.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0" } }, "sha512-Gk6gRDj0n/fkRa3C3l0bBheoBckUq/Rs0F/TvMWIS6nzzx67amAViMe9CkNgsP2tXyQONvGiHQESHwFtZ3aYDA=="], - "vue-pdf-embed": ["vue-pdf-embed@2.1.6", "", { "dependencies": { "pdfjs-dist": "^6.2.108" }, "peerDependencies": { "vue": "^3.3.0" } }, "sha512-cNmclL9jGuRIqgm13fx/3ZZd1nW/Nn0zXfQUo/yd8AQU9GTFLLYRgFc5HM41v1+bMoj1wW59mZoB/cNQx8Y2Rw=="], + "vue-pdf-embed": ["vue-pdf-embed@2.1.7", "", { "dependencies": { "pdfjs-dist": "^6.4.299" }, "peerDependencies": { "vue": "^3.3.0" } }, "sha512-hBtlTsqkAg93s8erZUCeVSFAqqfBtsLzpmS9NAiWOGQ5ZZa0FksGNgzSI79cvGJBkYqGPpNqIlazbImZnb/2wA=="], "vue-router": ["vue-router@5.4.0", "", { "dependencies": { "@vue-macros/common": "^3.1.3", "@vue/devtools-api": "^8.1.5", "ast-walker-scope": "^0.10.0", "chokidar": "^5.0.0", "confbox": "^0.3.1", "local-pkg": "^1.2.1", "magic-string": "^1.4.3", "mlly": "^1.8.2", "muggle-string": "^0.4.1", "nostics": "^1.3.0", "pathe": "^2.0.3", "picomatch": "^4.0.7", "scule": "^1.3.0", "tinyglobby": "^0.2.17", "unplugin": "^3.4.0", "unplugin-utils": "^0.3.2" }, "peerDependencies": { "@pinia/colada": ">=0.21.2", "@vue/compiler-sfc": "^3.5.34 || ^4.0.0", "pinia": "^3.0.4 || ^4.0.2", "vite": "^7.3.0 || ^8.0.0", "vue": "^3.5.34 || ^4.0.0" }, "optionalPeers": ["@pinia/colada", "@vue/compiler-sfc", "pinia", "vite"] }, "sha512-pFvcYcxinDHjZUlf7AzFBrT8r8Xqvv4uMHoJnjc+EqPawXQvHTkF8S4tfSmQLpriVHUGfkaKlI7Et0KRjTMTdw=="], - "vuetify": ["vuetify@4.2.4", "", { "dependencies": { "@vuetify/v0": "^1.2.1" }, "peerDependencies": { "typescript": ">=4.7", "vite-plugin-vuetify": ">=2.1.0", "vue": "^3.5.0 || ^3.6.0-0", "webpack-plugin-vuetify": ">=3.1.0" }, "optionalPeers": ["typescript", "vite-plugin-vuetify", "webpack-plugin-vuetify"] }, "sha512-zLYtVGJcg2hK3DHoeiBXSImpzg4E0N19p3zCgGnNhMp/YwaVQZXP4cPkIKeL/evVnUeLP/CjSnFsFBThWSl2Ew=="], + "vuetify": ["vuetify@4.2.6", "", { "dependencies": { "@vuetify/v0": "^1.2.1" }, "peerDependencies": { "typescript": ">=4.7", "vite-plugin-vuetify": ">=2.1.0", "vue": "^3.5.0 || ^3.6.0-0", "webpack-plugin-vuetify": ">=3.1.0" }, "optionalPeers": ["typescript", "vite-plugin-vuetify", "webpack-plugin-vuetify"] }, "sha512-W91vPxyJT7Br2wc3Iu2fUzC1YRZCTGxtrvywxnf7vGZF6Cfz2QvTvKvXmwMreie8oCHW6kA9yw7auCgQuwBUjQ=="], "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], diff --git a/frontend/cfg/common.mk b/frontend/cfg/common.mk index 489d7a603..dd347a8fc 100644 --- a/frontend/cfg/common.mk +++ b/frontend/cfg/common.mk @@ -1,6 +1,5 @@ SHELL := /usr/bin/env bash DEVENV_SRC ?= ../devenv -# export DEVENV_SRC DEVENV_COMMON := 1 export DEVENV_COMMON @@ -8,13 +7,16 @@ export DEVENV_COMMON ## Clean caches ## @category Clean clean:: - rm -rf .*cache + rm -rf .*cache +## Flags for update-devenv, such as --no-update-deps +## @category Update +UPDATE_DEVENV_FLAGS := .PHONY: update-devenv ## Update development environment ## @category Update update-devenv: - uv run $(DEVENV_SRC)/scripts/update_devenv.py + uv run $(DEVENV_SRC)/scripts/update_devenv.py $(UPDATE_DEVENV_FLAGS) .PHONY: fix ## Fix lint errors @@ -26,7 +28,7 @@ fix:: ## Fix shell script formatting ## @category Fix fix-sh: - ./bin/fix-sh.sh + ./bin/sh-tools.sh --fix .PHONY: lint ## Lint @@ -38,7 +40,11 @@ lint:: ## Lint shell scripts ## @category Lint lint-sh: - ./bin/lint-sh.sh + ./bin/sh-tools.sh --lint + +## Version to set. Leave empty to show the version +## @category Update +V := .PHONY: news ## Show recent NEWS diff --git a/frontend/cfg/help.mk b/frontend/cfg/help.mk index 3420a6334..30629252b 100644 --- a/frontend/cfg/help.mk +++ b/frontend/cfg/help.mk @@ -3,13 +3,12 @@ # and https://gist.github.com/klmr/575726c7e05d8780505a # fancy colors -cyan := "$$(tput setaf 6)" -green := "$$(tput setaf 2)" -red := "$$(tput setaf 1)" -yel := "$$(tput setaf 3)" -gray := "$$(tput setaf 8)" -grayb := "$$(printf "\033[1m"; tput setaf 8)" -end := "$$(tput sgr0)" +# tput errors without a TERM, as in CI; plain output is fine there. +cyan := "$$(tput setaf 6 2>/dev/null)" +green := "$$(tput setaf 2 2>/dev/null)" +red := "$$(tput setaf 1 2>/dev/null)" +grayb := "$$(printf "\033[1m"; tput setaf 8 2>/dev/null)" +end := "$$(tput sgr0 2>/dev/null)" TARGET_STYLED_HELP_NAME = "$(cyan)TARGET$(end)" ARGUMENTS_HELP_NAME = "$(green)ARGUMENT$(end)=$(red)VALUE$(end)" @@ -53,7 +52,7 @@ DEFAULT_CATEGORY = General .PHONY: help help: @echo "Usage: make [$(TARGET_STYLED_HELP_NAME) [$(TARGET_STYLED_HELP_NAME) ...]] [$(ARGUMENTS_HELP_NAME) [$(ARGUMENTS_HELP_NAME) ...]]" - @cat ${MAKEFILE_LIST} \ + @awk 1 ${MAKEFILE_LIST} \ | tr '\t' ' ' \ | sed -n -e "/^## / { \ h; \ diff --git a/frontend/cfg/node.mk b/frontend/cfg/node.mk index b2941aca7..62c318fff 100644 --- a/frontend/cfg/node.mk +++ b/frontend/cfg/node.mk @@ -29,9 +29,6 @@ update:: update-node kill-eslint_d: bin/kill-eslint_d.sh -## Show version. Use V variable to set version -## @category Update -V := .PHONY: version ## Show or set project version for node ## @category Update diff --git a/frontend/package.json b/frontend/package.json index caec0bd80..192b667df 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "codex", - "version": "2.5.4", + "version": "2.5.5", "private": true, "description": "ui for codex api", "type": "module", @@ -12,42 +12,43 @@ "devBuild": "vite build --mode development", "fix": "eslint_d --cache --fix . && prettier --write .", "lint": "eslint_d --cache . && prettier --check .", - "test": "vitest --reporter verbose --update", - "test:ci": "vitest run --reporter verbose --update" + "test": "vitest --reporter verbose", + "test:ci": "vitest run --reporter verbose", + "test:update": "vitest run --update" }, "dependencies": { - "@unhead/vue": "^3.4.2", + "@unhead/vue": "^3.4.3", "@vueuse/core": "^15.0.0", "dequal": "^2.0.3", "eslint-import-resolver-oxc": "^0.15.0", - "pinia": "^4.0.3", + "pinia": "^4.1.0", "pretty-bytes": "^7.2.0", "text-case": "^1.2.11", - "vue": "^3.5.43", - "vue-pdf-embed": "^2.1.6", + "vue": "^3.5.44", + "vue-pdf-embed": "^2.1.7", "vue-router": "^5.4.0", - "vuetify": "^4.2.4", + "vuetify": "^4.2.6", "xior": "^0.8.5" }, "devDependencies": { "@mdi/js": "^7.4.47", - "@pinia/testing": "^2.0.1", - "@types/node": "^26.6.4", - "@unhead/bundler": "^3.4.2", - "@vitejs/plugin-vue": "^6.0.9", + "@pinia/testing": "^2.0.2", + "@types/node": "^26.6.5", + "@unhead/bundler": "^3.4.3", + "@vitejs/plugin-vue": "^6.0.10", "@vue/test-utils": "^2.5.1", - "@vue/typescript-plugin": "^3.3.12", - "happy-dom": "^20.14.5", + "@vue/typescript-plugin": "^3.3.13", + "happy-dom": "^21.0.3", "rollup-plugin-visualizer": "^7.1.1", - "sass": "^1.105.1", + "sass": "^1.105.2", "sass-loader": "^17.0.1", - "toml": "^5.0.0", - "vite": "^8.3.3", + "toml": "^5.0.1", + "vite": "^8.3.4", "vite-plugin-checker": "^0.14.5", "vite-plugin-dynamic-base": "^1.4.1", "vite-plugin-run": "^0.9.1", "vite-plugin-vuetify": "^2.1.3", - "vitest": "^5.0.3", + "vitest": "^5.0.5", "vue-eslint-parser": "^10.4.1" } } diff --git a/frontend/src/api/v4/abortable.js b/frontend/src/api/v4/abortable.js index addc1b542..fbb2f8fc6 100644 --- a/frontend/src/api/v4/abortable.js +++ b/frontend/src/api/v4/abortable.js @@ -23,9 +23,10 @@ export function dedupedFetch(key, fetcher) { } export function isAbortError(error) { - return error - ? error.name === "AbortError" || error.name === "CanceledError" - : false; + return ( + Boolean(error) && + (error.name === "AbortError" || error.name === "CanceledError") + ); } export function useAbortable(key) { diff --git a/frontend/src/api/v4/browser.js b/frontend/src/api/v4/browser.js index ad36f07aa..96995b5af 100644 --- a/frontend/src/api/v4/browser.js +++ b/frontend/src/api/v4/browser.js @@ -55,13 +55,12 @@ export const getBrowserHref = ({ collection, pks, query }) => { export const getCoverSrc = ({ coverPk, coverCustomPk }, ts) => { const query = ts ? `?ts=${ts}` : ""; - if (coverCustomPk) { - return `${V4_BASE}covers/custom/${coverCustomPk}${query}`; - } // ``coverPk`` is the representative comic pk pre-annotated by the // browser response. v4 keeps the per-comic source so the URL is // cacheable across cards that share a representative. - return `${V4_BASE}covers/comic/${coverPk}${query}`; + return coverCustomPk + ? `${V4_BASE}covers/custom/${coverCustomPk}${query}` + : `${V4_BASE}covers/comic/${coverPk}${query}`; }; const PLACEHOLDER_BY_GROUP = Object.freeze({ diff --git a/frontend/src/api/v4/reader.js b/frontend/src/api/v4/reader.js index 3415cdb5e..ffd30c05e 100644 --- a/frontend/src/api/v4/reader.js +++ b/frontend/src/api/v4/reader.js @@ -7,20 +7,22 @@ export const getSettings = (pk, scopes, storyArcPk) => { queryParams.story_arc_pk = storyArcPk; } const params = serializeParams(queryParams); - return pk - ? HTTP.get(`/comics/${pk}/reader-settings`, { params }) - : HTTP.get("/reader/settings", { params }); + return HTTP.get(pk ? `/comics/${pk}/reader-settings` : "/reader/settings", { + params, + }); }; export const updateSettings = (data) => - data?.pk - ? HTTP.patch(`/comics/${data.pk}/reader-settings`, data) - : HTTP.patch("/reader/settings", data); + HTTP.patch( + data?.pk ? `/comics/${data.pk}/reader-settings` : "/reader/settings", + data, + ); export const resetSettings = (data) => - data?.pk - ? HTTP.delete(`/comics/${data.pk}/reader-settings`, { data }) - : HTTP.delete("/reader/settings", { data }); + HTTP.delete( + data?.pk ? `/comics/${data.pk}/reader-settings` : "/reader/settings", + { data }, + ); export const getReaderInfo = (pk, data, ts, options = {}) => { const params = serializeParams(data, ts); diff --git a/frontend/src/comic-name.js b/frontend/src/comic-name.js index 0706f0c5f..d82c206a9 100644 --- a/frontend/src/comic-name.js +++ b/frontend/src/comic-name.js @@ -1,14 +1,14 @@ // Create comic names export const formattedVolumeName = function (name, numberTo) { let fmtName; - if (name != null && !Number.isNaN(name)) { + if (name == null || Number.isNaN(name)) { + fmtName = ""; + } else { let compoundName = name; if (numberTo != null && !Number.isNaN(numberTo)) { compoundName += "-" + numberTo; } fmtName = name.length === 4 ? `(${compoundName})` : `v${compoundName}`; - } else { - fmtName = ""; } return fmtName; }; diff --git a/frontend/src/components/admin/tabs/stats-tab.vue b/frontend/src/components/admin/tabs/stats-tab.vue index 665b468f1..90473a2a1 100644 --- a/frontend/src/components/admin/tabs/stats-tab.vue +++ b/frontend/src/components/admin/tabs/stats-tab.vue @@ -35,9 +35,7 @@ const UNSET_LABELS = Object.freeze({ fitTo: "Unset (Fit to Width)", readingDirection: "Unset (Left to Right)", orderBy: "Unset (Name)", - finishOnLastPage: "Unset (On)", twoPages: "Unset (Off)", - readRtlInReverse: "Unset (Off)", pageTransition: "Unset (On)", cacheBook: "Unset (Off)", }); diff --git a/frontend/src/components/browser/drawer/browser-settings-covers.vue b/frontend/src/components/browser/drawer/browser-settings-covers.vue deleted file mode 100644 index 8e5fb7468..000000000 --- a/frontend/src/components/browser/drawer/browser-settings-covers.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - - diff --git a/frontend/src/components/reader/drawer/reader-settings-scope.vue b/frontend/src/components/reader/drawer/reader-settings-scope.vue index c69b0fddf..d3f478306 100644 --- a/frontend/src/components/reader/drawer/reader-settings-scope.vue +++ b/frontend/src/components/reader/drawer/reader-settings-scope.vue @@ -67,14 +67,6 @@ import GLOBAL_DEFAULTS from "@/choices/reader-defaults.json"; import ReaderSettingsControls from "./reader-settings-controls.vue"; import SettingsIndicatorDot from "./settings-indicator-dot.vue"; -/* - * PENDING SCHEMA REMOVAL - * - * ``readRtlInReverse`` and ``finishOnLastPage`` are gone from here because - * they no longer have controls to override. Their columns and serializer - * fields are deliberately kept -- see the notes in ``stores/reader.js``. Put - * them back in this list if the checkboxes come back. - */ const ATTRS = Object.freeze([ "fitTo", "readingDirection", diff --git a/frontend/src/stores/admin.js b/frontend/src/stores/admin.js index f790ba68e..5f98ce15f 100644 --- a/frontend/src/stores/admin.js +++ b/frontend/src/stores/admin.js @@ -170,7 +170,6 @@ export const useAdminStore = defineStore("admin", { } }, async loadTables(tables, options) { - if (this._requireAdmin()) return false; /* * ``Promise.all`` so every fetch runs concurrently and the * returned promise resolves only once they've all settled. @@ -179,9 +178,11 @@ export const useAdminStore = defineStore("admin", { * could observe an admin tab's state mid-load (some tables * populated, some still empty), which presented as flicker. */ - return await Promise.all( - tables.map((table) => this.loadTable(table, options)), - ); + return this._requireAdmin() + ? false + : await Promise.all( + tables.map((table) => this.loadTable(table, options)), + ); }, async loadFolders(path, showHidden) { if (this._requireAdmin()) return false; diff --git a/frontend/src/stores/browser.js b/frontend/src/stores/browser.js index 912110a06..3f5b1bda0 100644 --- a/frontend/src/stores/browser.js +++ b/frontend/src/stores/browser.js @@ -58,13 +58,6 @@ const SEARCH_ROOT_COLLECTIONS = Object.freeze( ); const NON_BROWSE_COLLECTIONS = Object.freeze(new Set(["arcs", "folders"])); const SEARCH_HIDE_TIMEOUT = 5000; -const COVER_KEYS = Object.freeze(["customCovers", "dynamicCovers", "show"]); -const DYNAMIC_COVER_KEYS = Object.freeze([ - "filters", - "orderBy", - "orderReverse", - "q", -]); const FILTER_ONLY_KEYS = Object.freeze(["filters", "q"]); const METADATA_LOAD_KEYS = Object.freeze(["filters", "q", "mtime"]); @@ -276,8 +269,6 @@ export const useBrowserStore = defineStore("browser", { }, settings: { breadcrumbs: [], - customCovers: BROWSER_DEFAULTS.customCovers, - dynamicCovers: BROWSER_DEFAULTS.dynamicCovers, filters: BROWSER_DEFAULTS.filters, orderBy: BROWSER_DEFAULTS.orderBy, orderReverse: BROWSER_DEFAULTS.orderReverse, @@ -438,25 +429,6 @@ export const useBrowserStore = defineStore("browser", { ? toBrowseRoute({ name: "browser", params }) : { name: "home" }; }, - /* - * PENDING SCHEMA REMOVAL - * - * Dynamic covers are pinned on, so the dynamic keys always ride along and - * the ``parentRoute`` fallback the sort-name cover match needed is - * unreachable. ``customCovers`` and ``dynamicCovers`` are still sent in - * COVER_KEYS and still stored per user; the server ignores them. Drop them - * from COVER_KEYS, from the state below and from the schema together. - */ - coverSettings(state) { - const { collection } = liveBrowseParams(); - if (collection == "comics") { - return {}; - } - return this._filterSettings(state, [ - ...COVER_KEYS, - ...DYNAMIC_COVER_KEYS, - ]); - }, filterOnlySettings(state) { return this._filterSettings(state, FILTER_ONLY_KEYS); }, diff --git a/frontend/src/stores/reader.js b/frontend/src/stores/reader.js index 272242ba3..d86be86e5 100644 --- a/frontend/src/stores/reader.js +++ b/frontend/src/stores/reader.js @@ -120,8 +120,6 @@ export const useReaderStore = defineStore("reader", { fitTo: READER_DEFAULTS.fitTo, twoPages: READER_DEFAULTS.twoPages, readingDirection: READER_DEFAULTS.readingDirection, - readRtlInReverse: READER_DEFAULTS.readRtlInReverse, - finishOnLastPage: READER_DEFAULTS.finishOnLastPage, pageTransition: READER_DEFAULTS.pageTransition, cacheBook: READER_DEFAULTS.cacheBook, }, @@ -243,21 +241,6 @@ export const useReaderStore = defineStore("reader", { /* * GETTER Algorithms */ - /* - * PENDING SCHEMA REMOVAL - * - * "Read RTL Comics LTR" is no longer a user option, and it is pinned OFF - * — its default — so a right-to-left book is read right to left. The - * checkbox is gone from the reader settings drawer. - * ``SettingsReader.read_rtl_in_reverse`` and its serializer field are - * deliberately still there, so every user's stored preference survives - * and putting the toggle back is a revert rather than a data migration. - * Drop the column, its serializer and ``READER_DEFAULTS`` entries, and - * this pass-through, when we commit to this. - */ - setReadRTLInReverse(bookSettings) { - return bookSettings; - }, getBookSettings(book) { if (!book) { return {}; @@ -277,8 +260,7 @@ export const useReaderStore = defineStore("reader", { * shape confusion. */ const resultSettings = {}; - let bookSettings = book?.settings || {}; - bookSettings = this.setReadRTLInReverse(bookSettings); + const bookSettings = book?.settings || {}; const allSettings = [ this.globalSettings, this.intermediateSettings, @@ -371,8 +353,7 @@ export const useReaderStore = defineStore("reader", { }, fitToClass(bookSettings) { const classes = {}; - let fitTo; - fitTo = + const fitTo = this.clientSettings.scale > SCALE_DEFAULT ? FIT_TO_CLASSES.O : FIT_TO_CLASSES[bookSettings.fitTo]; @@ -697,17 +678,6 @@ export const useReaderStore = defineStore("reader", { }; page = Math.max(Math.min(book.maxPage, page), 0); const updates = { page }; - /* - * PENDING SCHEMA REMOVAL - * - * Finishing a book on its last page is no longer a user option; the - * checkbox is gone from the reader settings drawer. - * ``SettingsReader.finish_on_last_page`` and its serializer field are - * deliberately still there, so every user's stored preference survives - * and putting the toggle back is a revert rather than a data migration. - * Drop the column, its serializer and ``READER_DEFAULTS`` entries when - * we commit to this. - */ if (page >= book.maxPage) { updates["finished"] = true; } diff --git a/frontend/tests/unit/reader-nav-button.test.js b/frontend/tests/unit/reader-nav-button.test.js index c65fe8423..9268ffe2b 100644 --- a/frontend/tests/unit/reader-nav-button.test.js +++ b/frontend/tests/unit/reader-nav-button.test.js @@ -40,7 +40,12 @@ test("reader-nav-button", async () => { const readerStore = useReaderStore(); // test initial state - expect(wrapper.html()).toMatchSnapshot(); + expect(wrapper.element.tagName).toBe("A"); + expect(wrapper.attributes("href")).toBe("/read/0?page=0"); + expect(wrapper.attributes("title")).toBe("Page 0"); + expect(wrapper.attributes("aria-disabled")).toBe("true"); + expect(wrapper.classes()).toContain("readerNavButton"); + expect(wrapper.classes()).toContain("readerNavButtonLeft"); expect(wrapper.text()).toContain("0"); // push new route diff --git a/frontend/tests/unit/stats-tab.test.js b/frontend/tests/unit/stats-tab.test.js index e95de1a41..cb07e0bb8 100644 --- a/frontend/tests/unit/stats-tab.test.js +++ b/frontend/tests/unit/stats-tab.test.js @@ -48,13 +48,10 @@ const STATS = { topCollection: { publishers: 2 }, // camelCase, like the API renders it and like the choices maps are keyed. orderBy: { sortName: 2 }, - dynamicCovers: { true: 2 }, - finishOnLastPage: { true: 1 }, fitTo: { W: 1 }, readingDirection: { ltr: 1 }, viewMode: { cover: 2, table: 1 }, tableCoverSize: { sm: 1 }, - customCovers: { true: 2 }, multiSortCount: 0, }, collections: { @@ -87,6 +84,7 @@ const STATS = { browserOrderByUsers: { sortName: 1, "": 1 }, browserChosenOrderByUsers: { sortName: 1 }, readerGlobalFitToUsers: { W: 1, "": 1 }, + readerGlobalTwoPagesUsers: { true: 1, "": 1 }, }, usage: { bookmarkCount: 1, diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 8a5eb95fb..9743dea60 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -207,12 +207,14 @@ const config = defineConfig(({ mode }) => { plugins: [ vue(), vuetify({ autoImport: true }), - checker({ - eslint: { - lintCommand: "eslint_d --cache .", // "./src/**/*.{js,vue}"', - useFlatConfig: true, - }, - }), + // Lint runs ESLint over the frontend; vitest needn't run it again. + !IS_TEST_ENV && + checker({ + eslint: { + lintCommand: "eslint_d --cache .", // "./src/**/*.{js,vue}"', + useFlatConfig: true, + }, + }), dynamicBase({ publicPath: PUBLIC_PATH, }), diff --git a/package.json b/package.json index 0ae91603f..ea567fdbb 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,8 @@ "description": "linting for top level codex project & django backend", "type": "module", "scripts": { - "fix": "eslint_d --cache --fix . && prettier --write . && bin/prettier-nginx.sh --write", - "lint": "eslint_d --cache . && prettier --check ." + "fix": "eslint_d --cache --ignore-pattern frontend/ --fix . && prettier --write . && bin/prettier-nginx.sh --write", + "lint": "eslint_d --cache --ignore-pattern frontend/ . && prettier --check ." }, "browserslist": [ "> 1%", @@ -59,11 +59,11 @@ "@prettier/plugin-xml": "^3.4.2", "@stylistic/eslint-plugin": "^5.10.0", "@vitest/eslint-plugin": "^1.6.27", - "eslint": "^10.12.0", + "eslint": "^10.13.0", "eslint_d": "^15.0.3", "eslint-config-prettier": "^10.1.8", "eslint-plugin-compat": "^7.0.2", - "eslint-plugin-de-morgan": "^2.2.0", + "eslint-plugin-de-morgan": "^2.2.1", "eslint-plugin-depend": "^1.5.0", "eslint-plugin-html": "^8.2.1", "eslint-plugin-import-x": "^4.17.1", @@ -72,7 +72,7 @@ "eslint-plugin-no-unsanitized": "^4.1.5", "eslint-plugin-no-use-extend-native": "^0.7.3", "eslint-plugin-perfectionist": "^5.12.1", - "eslint-plugin-prettier": "^5.5.6", + "eslint-plugin-prettier": "^5.5.7", "eslint-plugin-promise": "^7.3.0", "eslint-plugin-regexp": "^3.3.1", "eslint-plugin-security": "^4.2.0", @@ -81,12 +81,12 @@ "eslint-plugin-unicorn": ">=74.0.0", "eslint-plugin-vue": "^10.11.1", "eslint-plugin-vue-scoped-css": "^3.1.3", - "eslint-plugin-yml": "^3.8.1", + "eslint-plugin-yml": "^3.9.0", "postcss-scss": "^4.0.9", - "prettier": "^3.9.9", + "prettier": "^3.9.10", "prettier-plugin-nginx": "^2.0.0", "prettier-plugin-packagejson": "^3.0.2", - "prettier-plugin-toml": "^3.0.2", + "prettier-plugin-toml": "^4.0.0", "svgo": "^4.1.0" } } diff --git a/pyproject.toml b/pyproject.toml index 82c128e71..459602177 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,7 @@ classifiers = [ "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", + "Programming Language :: Python :: 3.15", "Topic :: Internet :: WWW/HTTP", "Topic :: Multimedia :: Graphics :: Viewers", ] @@ -19,7 +20,7 @@ dependencies = [ "asgiref~=3.12", "bidict~=0.23", "channels~=4.2", - "comicbox[pdf]~=5.3.1", + "comicbox[pdf]~=5.3.2", "cryptography>=48.0.0", "dateparser~=1.2", "django-allauth[socialaccount]~=65.13", @@ -38,7 +39,7 @@ dependencies = [ "loguru~=0.7.3", "nh3~=0.2", "packaging>=24.0", - "Pillow~=12.0", + "Pillow~=13.0", "psutil~=7.1", "requests-cache~=1.2", "servestatic[brotli]~=4.1", @@ -54,7 +55,7 @@ readme = "README.md" requires-python = ">=3.12" license = "GPL-3.0-only" name = "codex" -version = "2.5.4" +version = "2.5.5" [[project.authors]] name = "AJ Slater" @@ -86,16 +87,15 @@ build = ["resvg-py~=0.5.0"] lint = [ "basedpyright~=1.38", "codespell~=2.4", - "complexipy~=8.0.1", + "complexipy~=8.1.0", "django-schema-graph~=3.1", "django-types~=0.22", "djangorestframework-types~=0.9", "djlint~=1.39", "icecream~=2.1", - "mbake~=1.4.5", "pathspec~=1.1.0", "radon~=6.0", - "ruff~=0.16", + "ruff~=0.17", "ty~=0.0.18", "vulture~=2.3", "types-python-dateutil~=2.9", @@ -108,15 +108,21 @@ test = [ "pytest-asyncio~=1.0", "pytest-cov~=7.0", "pytest-django~=4.1", + "pytest-xdist~=3.8", "rnc2rng~=2.7", ] docs = ["mkdocs-minify-plugin~=0.8", "mkdocs~=1.6"] ci = [] [build-system] -requires = ["uv_build~=0.12.0"] +requires = ["uv_build~=0.13"] build-backend = "uv_build" +[tool.uv] +# TODO: Remove once deepdiff releases with cachebox>=6 (its <6 pin has no +# cp315 wheels). +override-dependencies = ["cachebox~=6.0"] + [tool.uv.build-backend] module-root = "" source-include = [ @@ -153,8 +159,12 @@ source-include = [ "tests/**", "uv.lock", "vulture_ignorelist.py", + "docs/**", ] source-exclude = [ + # Symlinks to directories, which the sdist builder reads as files. + "docs/NEWS/codex", + "docs/img", "**/*\\~", "**/.DS_Store", "codex/static_build", @@ -234,10 +244,21 @@ omit = [ [tool.pytest] minversion = "9.0" addopts = [ + "-p", + "tests.pytest_config_dir", + "--numprocesses=auto", + "--dist=loadscope", + # Keep pytest-django's order, TestCase before TransactionTestCase, on every + # worker. loadscope otherwise sorts scopes by size, and a + # TransactionTestCase's flush then strips the migration-seeded rows from + # the TestCases that follow it on that worker. + "--no-loadscope-reorder", "--cov", "--cov-append", "--cov-report=html", "--cov-report=term", + "--durations=25", + "--durations-min=1.0", "--junit-xml=test-results/pytest/results.xml", "--strict-config", "--strict-markers", @@ -387,6 +408,19 @@ exclude = [ "vulture_ignorelist.py", ] +# ty >= 0.0.86 rejects the `class Meta(.Meta)` idiom of Django models and +# DRF serializers as an invalid override, though the nested class subclasses the +# one it replaces (https://github.com/astral-sh/ty/issues/4711). Scoped to the +# models and serializers so the check still guards every other module; drop this +# once that issue is fixed, and then mark the two deliberate overrides it also +# hides, Volume.name and CustomCover.library, with +# `# ty: ignore[invalid-attribute-override]`. +[[tool.ty.overrides]] +include = ["codex/models/**", "codex/serializers/**"] + +[tool.ty.overrides.rules] +invalid-attribute-override = "ignore" + [tool.vulture] exclude = [ "*/.venv/*", diff --git a/tests/importer/test_basic.py b/tests/importer/test_basic.py index 15d3b1723..acbafd697 100644 --- a/tests/importer/test_basic.py +++ b/tests/importer/test_basic.py @@ -16,7 +16,6 @@ from deepdiff import DeepDiff from django.core.cache import cache from django.test import TestCase -from django.test.testcases import SerializeMixin from loguru import logger from codex.librarian.mp_queue import LIBRARIAN_QUEUE @@ -946,9 +945,7 @@ def run_full_import(importer) -> None: importer.full_text_search() -class BaseTestImporter(SerializeMixin, TestCase, ABC): - lockfile = __file__ - +class BaseTestImporter(TestCase, ABC): @override @classmethod def setUpTestData(cls): diff --git a/tests/importer/test_delete_backstop.py b/tests/importer/test_delete_backstop.py index b789f646e..0ec0aaddc 100644 --- a/tests/importer/test_delete_backstop.py +++ b/tests/importer/test_delete_backstop.py @@ -23,7 +23,6 @@ import os import shutil -import threading from pathlib import Path from threading import Event, Lock from typing import Final, override @@ -68,10 +67,14 @@ class _DeleteTestBase(BaseTestImporter): @override def setUp(self) -> None: super().setUp() - # Every delete-bearing batch waits between its two probes. Patch - # the wait rather than shortening it, so the tests assert *that* - # it waited without any of them paying for it. - wait_patcher = patch.object(threading.Event, "wait") + # Every delete-bearing batch waits between its two probes, on the + # importer's abort event. Patch that event's wait rather than + # shortening it, so the tests assert *that* it waited without any + # of them paying for it. Not ``Event.wait`` for every event: + # ``Thread.start()`` waits on one too, and the first queue ``put`` + # in a process starts the queue's feeder thread. + self.abort_event = Event() + wait_patcher = patch.object(self.abort_event, "wait") self.wait_mock = wait_patcher.start() self.addCleanup(wait_patcher.stop) self.library = Library.objects.get(pk=self.task.library_id) @@ -116,17 +119,21 @@ def _make_subdir_folder(self) -> Folder: library=self.library, path=str(_SUBDIR), name=_SUBDIR.name ) + def _new_importer(self, task: ImportTask) -> ComicImporter: + """Build an importer that waits on the test's patched abort event.""" + return ComicImporter(task, logger, LIBRARIAN_QUEUE, Lock(), self.abort_event) + def _delete(self, **task_kwargs) -> ComicImporter: """Run the delete phase with a fresh importer, as a scan would.""" task = ImportTask(library_id=self.library.pk, **task_kwargs) - importer = ComicImporter(task, logger, LIBRARIAN_QUEUE, Lock(), Event()) + importer = self._new_importer(task) importer.delete() return importer def _revive(self, **task_kwargs) -> ComicImporter: """Run the revival pre-phase with a fresh importer.""" task = ImportTask(library_id=self.library.pk, **task_kwargs) - importer = ComicImporter(task, logger, LIBRARIAN_QUEUE, Lock(), Event()) + importer = self._new_importer(task) importer.unstamp_revived() return importer @@ -198,7 +205,7 @@ class TestMassDeleteWarning(_DeleteTestBase): def _importer(self) -> tuple[ComicImporter, MagicMock]: """Build an importer whose log is captured for assertions.""" task = ImportTask(library_id=self.library.pk) - importer = ComicImporter(task, logger, LIBRARIAN_QUEUE, Lock(), Event()) + importer = self._new_importer(task) mock_log = MagicMock() importer.log = mock_log return importer, mock_log @@ -303,7 +310,7 @@ def test_unreadable_paths_are_reported(self) -> None: task = ImportTask( library_id=self.library.pk, files_deleted=frozenset({_EXTANT}) ) - importer = ComicImporter(task, logger, LIBRARIAN_QUEUE, Lock(), Event()) + importer = self._new_importer(task) mock_log = MagicMock() importer.log = mock_log @@ -392,7 +399,7 @@ def test_cascade_is_announced(self) -> None: task = ImportTask( library_id=self.library.pk, dirs_deleted=frozenset({str(_SUBDIR)}) ) - importer = ComicImporter(task, logger, LIBRARIAN_QUEUE, Lock(), Event()) + importer = self._new_importer(task) mock_log = MagicMock() importer.log = mock_log @@ -418,7 +425,7 @@ def _poll_and_delete(self) -> None: # Nothing under the unreadable directory may even be proposed. assert not [path for path in task.files_deleted if str(_SUBDIR) in path] assert not [path for path in task.dirs_deleted if str(_SUBDIR) in path] - importer = ComicImporter(task, logger, LIBRARIAN_QUEUE, Lock(), Event()) + importer = self._new_importer(task) importer.delete() def test_bookmarks_survive_an_unreadable_publisher_directory(self) -> None: @@ -536,7 +543,7 @@ def test_revival_is_reported(self) -> None: task = ImportTask( library_id=self.library.pk, files_deleted=frozenset({_EXTANT}) ) - importer = ComicImporter(task, logger, LIBRARIAN_QUEUE, Lock(), Event()) + importer = self._new_importer(task) mock_log = MagicMock() importer.log = mock_log diff --git a/tests/pytest_config_dir.py b/tests/pytest_config_dir.py new file mode 100644 index 000000000..a89374921 --- /dev/null +++ b/tests/pytest_config_dir.py @@ -0,0 +1,25 @@ +"""Give every pytest process its own CODEX_CONFIG_DIR before Django loads.""" + +import os + +from tests.tmp_dirs import tmp_dir + +# Registered with ``-p`` in ``addopts`` because pytest-django imports the +# settings in ``pytest_load_initial_conftests``, before ``conftest.py`` loads; +# ``-p`` modules import earlier, during option pre-parsing. +# +# Without this every run shares ``./config``: the developer's real config, +# and above all its file-based Django caches. Under xdist, cachalot then +# serves one worker's cached queries to the others, each of which has its +# own in-memory test database, and test-DB setup fails with ``UNIQUE +# constraint failed: django_content_type...``. ``cache.clear()`` in one +# worker would also wipe the others' entries. +# +# xdist workers inherit the controller's environment, so a worker always +# replaces the inherited value. A serial run keeps an explicit +# CODEX_CONFIG_DIR. +if "PYTEST_XDIST_WORKER" in os.environ or "CODEX_CONFIG_DIR" not in os.environ: + _config_dir = tmp_dir("config") + # Settings write the secret key files straight into it at import. + _config_dir.mkdir(exist_ok=True) + os.environ["CODEX_CONFIG_DIR"] = str(_config_dir) diff --git a/tests/test_credential_validator.py b/tests/test_credential_validator.py index 4b8aef846..823ec7cae 100644 --- a/tests/test_credential_validator.py +++ b/tests/test_credential_validator.py @@ -113,7 +113,7 @@ def test_metron_legacy_login_still_validates(self) -> None: ) def test_metron_key_wins_over_legacy_login(self) -> None: - """Both stored: the token reaches mokkari, which prefers it.""" + """Both stored: all three reach comicbox, which sends only the token.""" creds = OnlineCredentials( metron_key="token", metron_user="user", diff --git a/tests/test_csrf_trusted_origins.py b/tests/test_csrf_trusted_origins.py new file mode 100644 index 000000000..23bc84bf4 --- /dev/null +++ b/tests/test_csrf_trusted_origins.py @@ -0,0 +1,159 @@ +""" +CSRF trusted origins. + +A reverse proxy that serves Codex under another scheme or host makes the +browser's ``Origin`` header differ from the origin Django sees, so every +unsafe API request fails the CSRF check with a 403. DRF's +``SessionAuthentication`` enforces CSRF itself, so removing +``CsrfViewMiddleware`` does not help. ``server.csrf_trusted_origins`` (or +``CODEX_CSRF_TRUSTED_ORIGINS``) is read by :func:`get_str_list` and cleaned by +:func:`normalize_csrf_trusted_origins` into Django's ``CSRF_TRUSTED_ORIGINS``. +""" + +from __future__ import annotations + +from contextlib import contextmanager +from http import HTTPStatus +from typing import TYPE_CHECKING, Final, override + +import pytest +from django.contrib.auth.models import User +from django.test import Client, TestCase, override_settings +from loguru import logger + +from codex.settings.config import ( + _apply_env_overrides, + get_str_list, + normalize_csrf_trusted_origins, +) +from codex.startup import init_admin_flags + +if TYPE_CHECKING: + from collections.abc import Generator, Mapping + + from django.http import HttpResponse + +_TEST_PASSWORD: Final = "test-pw-hush-S106" # noqa: S105 +_ENV_NAME: Final = "CODEX_CSRF_TRUSTED_ORIGINS" +_KEYPATH: Final = "server.csrf_trusted_origins" +_ORIGIN_A: Final = "https://a.example.com" +_ORIGIN_B: Final = "https://b.example.com" +_PUBLIC_ORIGIN: Final = "https://comics.example.com" + + +@contextmanager +def _capture_logs() -> Generator[list[str]]: + """Collect loguru WARNING+ messages emitted inside the ``with`` block.""" + records: list[str] = [] + sink_id = logger.add(records.append, level="WARNING", format="{message}") + try: + yield records + finally: + logger.remove(sink_id) + + +def _server(value) -> dict: + return {"server": {"csrf_trusted_origins": value}} + + +@pytest.mark.parametrize( + ("config", "expected"), + [ + (_server([_ORIGIN_A, _ORIGIN_B]), (_ORIGIN_A, _ORIGIN_B)), + (_server(f"{_ORIGIN_A},{_ORIGIN_B}"), (_ORIGIN_A, _ORIGIN_B)), + (_server(f" {_ORIGIN_A} , {_ORIGIN_B} ,"), (_ORIGIN_A, _ORIGIN_B)), + (_server(""), ()), + (_server([]), ()), + (_server(None), ()), + ({"server": {}}, ()), + ], +) +def test_get_str_list(config: Mapping, expected: tuple[str, ...]) -> None: + """A TOML array or a comma string becomes a tuple of stripped items.""" + assert get_str_list(config, _KEYPATH) == expected + + +@pytest.mark.parametrize( + ("raw", "expected"), + [ + ((f"{_ORIGIN_A}/",), (_ORIGIN_A,)), + (("https://*.example.com",), ("https://*.example.com",)), + ((_ORIGIN_B, _ORIGIN_A, f"{_ORIGIN_B}/"), (_ORIGIN_B, _ORIGIN_A)), + ], +) +def test_normalize_csrf_trusted_origins( + raw: tuple[str, ...], expected: tuple[str, ...] +) -> None: + """Trailing slashes go, wildcards stay, duplicates collapse in order.""" + assert normalize_csrf_trusted_origins(raw) == expected + + +def test_normalize_drops_schemeless_origin_with_warning() -> None: + """An entry without a scheme can never match, so it is dropped loudly.""" + with _capture_logs() as records: + result = normalize_csrf_trusted_origins(("comics.example.com", _ORIGIN_A)) + assert result == (_ORIGIN_A,) + assert len(records) == 1 + assert "'comics.example.com'" in records[0] + assert "scheme://host[:port]" in records[0] + + +def test_env_override_reaches_config(monkeypatch: pytest.MonkeyPatch) -> None: + """The env var lands as the raw string and splits into origins.""" + monkeypatch.setenv(_ENV_NAME, f"{_ORIGIN_A}, {_ORIGIN_B}") + config: dict = {} + _apply_env_overrides(config) + assert config["server"]["csrf_trusted_origins"] == f"{_ORIGIN_A}, {_ORIGIN_B}" + assert get_str_list(config, _KEYPATH) == (_ORIGIN_A, _ORIGIN_B) + + +def test_env_override_beats_toml(monkeypatch: pytest.MonkeyPatch) -> None: + """The env var replaces a TOML array, even when empty.""" + config = _server([_PUBLIC_ORIGIN]) + monkeypatch.setenv(_ENV_NAME, _ORIGIN_A) + _apply_env_overrides(config) + assert get_str_list(config, _KEYPATH) == (_ORIGIN_A,) + + monkeypatch.setenv(_ENV_NAME, "") + _apply_env_overrides(config) + assert get_str_list(config, _KEYPATH) == () + + +class CsrfTrustedOriginsTestCase(TestCase): + """A proxied browser passes the API's CSRF check only for a trusted origin.""" + + @override + def setUp(self) -> None: + """Log in a CSRF-enforcing client and fetch its token.""" + init_admin_flags() + User.objects.create_user(username="reader", password=_TEST_PASSWORD) + self.client = Client(enforce_csrf_checks=True) + self.client.login(username="reader", password=_TEST_PASSWORD) + response = self.client.get("/api/v4/auth/csrf") + self.token = response.json()["data"]["csrfToken"] # pyright: ignore[reportUninitializedInstanceVariable] + + def _put_timezone(self) -> HttpResponse: + # Django sees the internal http host; the browser saw the public + # https origin, as behind a proxy that forwards neither header. + return self.client.put( + "/api/v4/auth/timezone", + data={"timezone": "America/New_York"}, + content_type="application/json", + HTTP_HOST="codex.internal", + HTTP_ORIGIN=_PUBLIC_ORIGIN, + HTTP_X_CSRFTOKEN=self.token, + ) + + def test_untrusted_origin_is_rejected(self) -> None: + """Without the setting the mismatched origin fails CSRF.""" + response = self._put_timezone() + assert response.status_code == HTTPStatus.FORBIDDEN + body = response.content.decode() + assert "CSRF Failed" in body + assert "Origin checking failed" in body + + def test_trusted_origin_is_accepted(self) -> None: + """The same request passes once its origin is trusted.""" + with override_settings(CSRF_TRUSTED_ORIGINS=[_PUBLIC_ORIGIN]): + response = self._put_timezone() + assert response.status_code == HTTPStatus.NO_CONTENT diff --git a/tests/test_janitor_cleanup_custom_covers.py b/tests/test_janitor_cleanup_custom_covers.py index ace1d0439..f8857c907 100644 --- a/tests/test_janitor_cleanup_custom_covers.py +++ b/tests/test_janitor_cleanup_custom_covers.py @@ -108,8 +108,11 @@ def setUp(self) -> None: path.write_bytes(b"not really a png") self.covers.append(CustomCover.objects.create(path=str(path))) # Patch the second look's wait so the tests assert *that* it - # waited without any of them paying for it. - wait_patcher = patch.object(Event, "wait") + # waited without any of them paying for it. Only the janitor's own + # abort event: ``Thread.start()`` waits on an ``Event`` too, and + # would satisfy ``assert_called()`` on its own. + self.abort_event = Event() # pyright: ignore[reportUninitializedInstanceVariable] + wait_patcher = patch.object(self.abort_event, "wait") self.wait_mock = wait_patcher.start() # pyright: ignore[reportUninitializedInstanceVariable] self.addCleanup(wait_patcher.stop) @@ -118,9 +121,10 @@ def tearDown(self) -> None: """Remove the temp cover tree.""" shutil.rmtree(TMP_DIR, ignore_errors=True) - @staticmethod - def _cleanup() -> None: - Janitor(logger, LIBRARIAN_QUEUE, Lock(), Event()).cleanup_custom_covers() + def _cleanup(self) -> None: + Janitor( + logger, LIBRARIAN_QUEUE, Lock(), self.abort_event + ).cleanup_custom_covers() def _surviving_pks(self) -> set[int]: return set(CustomCover.objects.values_list("pk", flat=True)) diff --git a/tests/test_models.py b/tests/test_models.py index d2f47b763..d2f7019dd 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -1,6 +1,6 @@ """Test models.""" -import datetime +import datetime as dt import shutil from typing import override @@ -40,7 +40,7 @@ class ComicTestCase(TestCase): YEAR = 1975 MONTH = 4 DAY = 9 - DATE = datetime.date(YEAR, MONTH, DAY) + DATE = dt.date(YEAR, MONTH, DAY) @override def setUp(self): diff --git a/tests/test_onlinetag_serialize_candidate.py b/tests/test_onlinetag_serialize_candidate.py index 8cf496bfc..5759964c4 100644 --- a/tests/test_onlinetag_serialize_candidate.py +++ b/tests/test_onlinetag_serialize_candidate.py @@ -49,6 +49,7 @@ def _summary( def _candidate( summary: CandidateSummary, *, + score: float = 0.92, metadata_score: float = 0.0, cover_score: float | None = None, cover_hash_attempted: bool = False, @@ -57,7 +58,7 @@ def _candidate( source="metron", issue_id=7, summary=summary, - score=0.92, + score=score, url="https://metron.cloud/issue/7", metadata_score=metadata_score, cover_score=cover_score, @@ -97,6 +98,29 @@ def test_an_uncompared_cover_is_distinguishable(self) -> None: assert data["cover_score"] is None assert data["cover_hash_attempted"] is False + def test_scores_are_stored_as_plain_floats(self) -> None: + """ + A library's float subclass must not ride into the tagging cache. + + comicbox 5.2 scored covers as ``numpy.float64``; prompts pickled + with those could not be read back once numpy was dropped. + """ + + class _LibraryFloat(float): + pass + + candidate = _candidate( + _summary(), + score=_LibraryFloat(0.92), + metadata_score=_LibraryFloat(_METADATA_SCORE), + cover_score=_LibraryFloat(_COVER_SCORE), + ) + + data = serialize_candidate(candidate) + + for key in ("score", "metadata_score", "cover_score"): + assert type(data[key]) is float, key + def test_the_volume_ordinal_is_carried(self) -> None: """Metron's issue rows carry one; Comic Vine's search rows do not.""" with_volume = serialize_candidate(_candidate(_summary(volume=_VOLUME))) diff --git a/tests/test_resilient_cache.py b/tests/test_resilient_cache.py new file mode 100644 index 000000000..0d2ebf5bb --- /dev/null +++ b/tests/test_resilient_cache.py @@ -0,0 +1,109 @@ +""" +A cache entry pickled against code that is gone reads as a miss, not a 500. + +Codex 2.5.3 pickled comicbox's ``numpy.float64`` cover scores into +pending online-tag prompts. 2.5.4 ships without numpy, so every read of +the prompts (the daemon's startup prune, the review list, the session +snapshot) raised ``ModuleNotFoundError``. These tests store a value whose +class lives in a throwaway module, then take the module, or just the +class, away. +""" + +import sys +from types import ModuleType +from typing import Final, override + +from django.test import SimpleTestCase +from loguru import logger + +from codex.cache import tagging_cache +from codex.librarian.onlinetag.session_cache import ( + PROMPT_VERSION, + clear_all, + get_pending_prompts, + prune_stale_prompts, + set_pending_prompts, +) + +_MODULE_NAME: Final = "codex_tests_vanishing_dependency" +_CLASS_NAME: Final = "LibraryFloat" +_KEY: Final = "tests:stale_pickle" +_MISS: Final = "miss" + + +class StalePickleTestCase(SimpleTestCase): + """Entries naming a missing module or class are discarded.""" + + @override + def setUp(self) -> None: + """Install a module defining a float subclass, like numpy.float64.""" + super().setUp() + self.module = ModuleType(_MODULE_NAME) # pyright: ignore[reportUninitializedInstanceVariable] + library_float = type(_CLASS_NAME, (float,), {"__module__": _MODULE_NAME}) + setattr(self.module, _CLASS_NAME, library_float) + sys.modules[_MODULE_NAME] = self.module + self.addCleanup(sys.modules.pop, _MODULE_NAME, None) + clear_all() + self.addCleanup(clear_all) + self.addCleanup(tagging_cache.delete, _KEY) + + def _library_float(self, value: float) -> float: + return getattr(self.module, _CLASS_NAME)(value) + + def _uninstall_module(self) -> None: + del sys.modules[_MODULE_NAME] + + def test_a_missing_module_is_a_miss(self) -> None: + """The dependency was dropped: ``ModuleNotFoundError`` on load.""" + tagging_cache.set(_KEY, {"cover_score": self._library_float(0.6)}) + self._uninstall_module() + + assert tagging_cache.get(_KEY, _MISS) == _MISS + assert not tagging_cache.has_key(_KEY) + + def test_a_missing_class_is_a_miss(self) -> None: + """The class was removed or renamed: ``AttributeError`` on load.""" + tagging_cache.set(_KEY, {"cover_score": self._library_float(0.6)}) + delattr(self.module, _CLASS_NAME) + + assert tagging_cache.get(_KEY, _MISS) == _MISS + assert not tagging_cache.has_key(_KEY) + + def test_the_discard_is_logged_with_its_cause(self) -> None: + """ + The file is gone afterwards, so the log is the only evidence. + + It must name the key and carry the traceback, in case this ever + catches an error it should not. + """ + tagging_cache.set(_KEY, {"cover_score": self._library_float(0.6)}) + self._uninstall_module() + records: list[str] = [] + sink_id = logger.add(records.append, level="WARNING", format="{message}") + try: + tagging_cache.get(_KEY) + finally: + logger.remove(sink_id) + + assert len(records) == 1 + assert _KEY in records[0] + assert "ModuleNotFoundError" in records[0] + assert "Traceback" in records[0] + + def test_touch_discards_it_too(self) -> None: + """``touch`` unpickles the value to rewrite it with a new expiry.""" + tagging_cache.set(_KEY, {"cover_score": self._library_float(0.6)}) + self._uninstall_module() + + assert tagging_cache.touch(_KEY) is False + assert not tagging_cache.has_key(_KEY) + + def test_stale_prompts_do_not_break_the_startup_prune(self) -> None: + """The reported failure: the daemon reads every prompt at startup.""" + candidate = {"score": self._library_float(0.9)} + prompt = {"prompt_version": PROMPT_VERSION, "candidates": [candidate]} + set_pending_prompts({"fp": prompt}) + self._uninstall_module() + + assert prune_stale_prompts() == 0 + assert get_pending_prompts() == {} diff --git a/tests/test_settings_defaults.py b/tests/test_settings_defaults.py index a9908dc67..af6e6cb9b 100644 --- a/tests/test_settings_defaults.py +++ b/tests/test_settings_defaults.py @@ -93,13 +93,7 @@ def test_browser_field_defaults_match_the_settings_models(self) -> None: assert _field_default(SettingsDefaults, "table_columns") == {} def test_reader_field_defaults_match_reader_defaults(self) -> None: - for key in ( - "fit_to", - "reading_direction", - "two_pages", - "page_transition", - "cache_book", - ): + for key in READER_DEFAULTS: assert _field_default(SettingsDefaults, key) == READER_DEFAULTS[key], key def test_fresh_get_equals_factory(self) -> None: diff --git a/tests/test_telemeter_privacy.py b/tests/test_telemeter_privacy.py index c0b64f4ce..b7e1e8bb5 100644 --- a/tests/test_telemeter_privacy.py +++ b/tests/test_telemeter_privacy.py @@ -55,11 +55,8 @@ "stats.tagging.default_sources", "stats.sessions.top_collection", "stats.sessions.order_by", - "stats.sessions.dynamic_covers", "stats.sessions.view_mode", "stats.sessions.table_cover_size", - "stats.sessions.custom_covers", - "stats.sessions.finish_on_last_page", "stats.sessions.fit_to", "stats.sessions.reading_direction", # per_user draws on the same closed vocabularies as sessions, counted @@ -74,20 +71,12 @@ "stats.per_user.browser_chosen_view_mode_users", "stats.per_user.browser_table_cover_size_users", "stats.per_user.browser_chosen_table_cover_size_users", - "stats.per_user.browser_dynamic_covers_users", - "stats.per_user.browser_chosen_dynamic_covers_users", - "stats.per_user.browser_custom_covers_users", - "stats.per_user.browser_chosen_custom_covers_users", "stats.per_user.reader_global_fit_to_users", "stats.per_user.reader_chosen_fit_to_users", "stats.per_user.reader_global_two_pages_users", "stats.per_user.reader_chosen_two_pages_users", "stats.per_user.reader_global_reading_direction_users", "stats.per_user.reader_chosen_reading_direction_users", - "stats.per_user.reader_global_read_rtl_in_reverse_users", - "stats.per_user.reader_chosen_read_rtl_in_reverse_users", - "stats.per_user.reader_global_finish_on_last_page_users", - "stats.per_user.reader_chosen_finish_on_last_page_users", "stats.per_user.reader_global_page_transition_users", "stats.per_user.reader_chosen_page_transition_users", "stats.per_user.reader_global_cache_book_users", diff --git a/tests/test_user_data_restore.py b/tests/test_user_data_restore.py index 63286ba03..4953a24c7 100644 --- a/tests/test_user_data_restore.py +++ b/tests/test_user_data_restore.py @@ -465,6 +465,7 @@ def _browser_row(**overrides) -> dict: "order_reverse": 1, "order_extra_keys": "[]", "search": "", + # Retired sidecar columns; restore must ignore them. "custom_covers": 1, "dynamic_covers": 1, "twenty_four_hour_time": 0, diff --git a/uv.lock b/uv.lock index 90e6d889d..dab5b0e74 100644 --- a/uv.lock +++ b/uv.lock @@ -6,6 +6,9 @@ resolution-markers = [ "python_full_version < '3.13'", ] +[manifest] +overrides = [{ name = "cachebox", specifier = "~=6.0" }] + [[package]] name = "adrf" version = "0.1.14" @@ -84,11 +87,11 @@ wheels = [ [[package]] name = "astroid" -version = "4.3.3" +version = "4.3.4" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8d/7e/7c85d2b8549730e089bd984678a7efb64c510a5f09b4f0d9987a8354a80c/astroid-4.3.3.tar.gz", hash = "sha256:d03854b09d92c08e18d8e7d9185d393961186ed0747136d8fcb2d1c008a504ec", size = 441522, upload-time = "2026-09-30T06:03:04.601Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/87/5732fa68bf100a095cfcbd108f919220d995db99e1a7502b8119a869fd62/astroid-4.3.4.tar.gz", hash = "sha256:d515a105722b72098bbe82d430d65e635f742b6cbac3bdfaf8b7c188b87c5e39", size = 444627, upload-time = "2026-10-08T09:36:44.122Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/23/be/54ffbdd679e2ea9f36f1923edd867c39fc1190b3810f111c8282a3f0b608/astroid-4.3.3-py3-none-any.whl", hash = "sha256:366c99c2907b6407869b1bbfd8abb10f3aea5818309e9c93c9b9c93ecf14bc4f", size = 287404, upload-time = "2026-09-30T06:03:02.038Z" }, + { url = "https://files.pythonhosted.org/packages/16/d4/f23c0ac6e6de33ba5686cb21c672c95e0c2d3d4c9351f16d3b5fed818652/astroid-4.3.4-py3-none-any.whl", hash = "sha256:2bcd0d02648a443a4b818c952c3550091989daefac3c12d3b83b2289482e0818", size = 288310, upload-time = "2026-10-08T09:36:42.284Z" }, ] [[package]] @@ -133,49 +136,55 @@ wheels = [ [[package]] name = "backports-zstd" -version = "1.7.0" +version = "1.8.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/75/f0/9ba1b05811aa5f5434f69768253129460a5744e1814f359efba39a01ce20/backports_zstd-1.7.0.tar.gz", hash = "sha256:1a967189c1822b6e85a2e550fdfc88a3272c17633ea0a4732dac5911a8034f2b", size = 1003722, upload-time = "2026-08-15T17:26:43.96Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/df/23/240495dec973dcfb34816248956ca8d05b32fb75936c226c1cf497b83b83/backports_zstd-1.7.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b5548a857bb0fcc5449cc3687353547396c6b1ecd4bd882f1cd34fa8d29e70ca", size = 439047, upload-time = "2026-08-15T17:25:38.084Z" }, - { url = "https://files.pythonhosted.org/packages/6d/24/5556959c7d03bfee5ff14d7f07dd9bf8de737c69f81d823a32784ab39c34/backports_zstd-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bab192b934fdf5a03df4752556d9c8af2d058163fdfbafd4a253cdfe25449a6f", size = 367666, upload-time = "2026-08-15T17:25:39.233Z" }, - { url = "https://files.pythonhosted.org/packages/b2/cb/557db98001c4a7202beed19e8bd42603a2315b80fd5def7e21a0b048ec3b/backports_zstd-1.7.0-cp312-cp312-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:8344260bed9842c415a93d9bfe23ea834e5f27758827d56933d8c0d06db507a2", size = 508475, upload-time = "2026-08-15T17:25:40.367Z" }, - { url = "https://files.pythonhosted.org/packages/40/4b/820acbc2c1d1d945aedca0c0d22546a948630ffb186df523098fbd669a95/backports_zstd-1.7.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c55e55e1e9dee312bc5e186386e6aa5207482a6d2242bd7c14709ded254f87f", size = 478240, upload-time = "2026-08-15T17:25:41.806Z" }, - { url = "https://files.pythonhosted.org/packages/f9/76/77fa9b385e79d4c106ce15d66681978f39a844b0eb5db02682687246b716/backports_zstd-1.7.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cf609af3735c7e697ccd13f6b0c88da57c201b6ea63c6afbfe81d6f9b50e298c", size = 583611, upload-time = "2026-08-15T17:25:43.104Z" }, - { url = "https://files.pythonhosted.org/packages/95/a4/fbb7c73336f3279dad36da94382a59755100b656301ea836ebaa42736581/backports_zstd-1.7.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:676a37971f676830d4f90cee8fdf4e438781596fb2f2d1984ac76c9b3eb39a69", size = 642496, upload-time = "2026-08-15T17:25:44.322Z" }, - { url = "https://files.pythonhosted.org/packages/1e/40/121917bd2671bc3f1507c25503c0554f0b52483edcca4e6210e6d22228df/backports_zstd-1.7.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:470895d0bcddc850766e593d1b26764fb138c2feed149f515a2627ef9587d54c", size = 496195, upload-time = "2026-08-15T17:25:45.503Z" }, - { url = "https://files.pythonhosted.org/packages/de/c7/c6379a0d734bea1c7f14d07c23258108cc92b994654e25cfe3a3e88cd785/backports_zstd-1.7.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:02f2f6649a342d0901ddb35596ddadb7c3bb1cf6bb54d691e5e0285f1fa0674f", size = 570964, upload-time = "2026-08-15T17:25:46.648Z" }, - { url = "https://files.pythonhosted.org/packages/7a/a4/372c3dd3017c3f93cda0acbc282f8073b70efdc1b56d1fdeebe023660725/backports_zstd-1.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:132ba81fad59d44958b7d10da31545e7128c469cfbc2e268d0eaab96daa64175", size = 484276, upload-time = "2026-08-15T17:25:48.129Z" }, - { url = "https://files.pythonhosted.org/packages/f5/50/83fa7bdd5e1d808203b9143848fdf7e15de399b8119a0d4378b2aea9be78/backports_zstd-1.7.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a3e1c6ce0b232ee6703ed24ee126e8186107f5a4e56edbd21cd1aa5a8c6bfd12", size = 511963, upload-time = "2026-08-15T17:25:49.666Z" }, - { url = "https://files.pythonhosted.org/packages/56/d2/d4ed32c353148acc18f3b665ab24a677b9c49d3640244424c5d6046400c5/backports_zstd-1.7.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d7a7cb964eb8d1bb5d039970b16fe54802ea47dc935ae96d9874844a126bf8ff", size = 588025, upload-time = "2026-08-15T17:25:51.288Z" }, - { url = "https://files.pythonhosted.org/packages/ae/5a/df8b5b848e8dfdec6edca55f22067ffbafa081d81aec1313e28155c3fea3/backports_zstd-1.7.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:12a9842a2ec2854cbec7f252ab29d44c2b772788a9bbafded743ca4bf73b115f", size = 568223, upload-time = "2026-08-15T17:25:52.633Z" }, - { url = "https://files.pythonhosted.org/packages/43/8c/f970f15e7fdbf8a251f121c91364fa68bbc2dfab4d5eca058427dec63397/backports_zstd-1.7.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:138154eea8ced84394991bf0e819dba6b690306a178dd528c28eee724b7d4aec", size = 632937, upload-time = "2026-08-15T17:25:54.511Z" }, - { url = "https://files.pythonhosted.org/packages/6a/d0/e36c18c87a74421954502d123ff7027e0a63a7624dffa99ec0f7474deff9/backports_zstd-1.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:468b636ed365627b364c94be1c35a52858e13b5bc1fa3f068bbc71b1af65f3d7", size = 500735, upload-time = "2026-08-15T17:25:56.064Z" }, - { url = "https://files.pythonhosted.org/packages/1c/57/fc72280334d2aa94238c5882052263bd7796c1fa924044353c30d058e0c3/backports_zstd-1.7.0-cp312-cp312-win32.whl", hash = "sha256:f026fe2e89b7ff01ba6ebec6abaff34c6063919151a32afb68714cf139e17c50", size = 292394, upload-time = "2026-08-15T17:25:57.469Z" }, - { url = "https://files.pythonhosted.org/packages/71/89/6cea747bdeef34cd12482b17e604b832fdb0962987132b99496f1a6c3f82/backports_zstd-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:2ea62ba2f1a6e6c9e6dc108921f9ae881969ca72e073162fa488d0de3eb2713f", size = 329876, upload-time = "2026-08-15T17:25:58.798Z" }, - { url = "https://files.pythonhosted.org/packages/64/28/b4a17c07d5a50a45cb04592960d1593cdf3b3728968371f332aa3643b804/backports_zstd-1.7.0-cp312-cp312-win_arm64.whl", hash = "sha256:cefb983345c55ccaa20423a4eb96434730e6d640ffa2db9b60e5bedb0fbef94e", size = 292461, upload-time = "2026-08-15T17:25:59.928Z" }, - { url = "https://files.pythonhosted.org/packages/6f/24/32b3358ae3a4df0ebad85ebbce721818c6d76a836119bee76089d103e951/backports_zstd-1.7.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:a3fbcbf819bee2b06b8666b13742098d0f40663ee34e64a12bc360ec0f5e3d89", size = 400913, upload-time = "2026-08-15T17:26:01.089Z" }, - { url = "https://files.pythonhosted.org/packages/af/f3/39ef7dd75eb1e699e25a19212737a73d3c030a0c9fd1d0ed1572b5f8e493/backports_zstd-1.7.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:efee02f18e04c2e9e6d694c5cf9b7457c4bda3ea96f48b1ee69769e06bb9d89f", size = 454915, upload-time = "2026-08-15T17:26:02.294Z" }, - { url = "https://files.pythonhosted.org/packages/76/e8/8209081e094aa98b2f28bac388619c85b1a44aed813d6b3c54d1da79d19a/backports_zstd-1.7.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:ecc95fa0e91d92951d74468e7789afdf91d9e702f40af2d0fcbf0ded4d0f650a", size = 357992, upload-time = "2026-08-15T17:26:03.552Z" }, - { url = "https://files.pythonhosted.org/packages/b3/65/64025302bae4ba924d613e404c6120bf194b5636786960ece274622a4a3e/backports_zstd-1.7.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:34154d82fc0246738159084d146401073f9ac9cfd755b66bb8853ca06037810c", size = 366686, upload-time = "2026-08-15T17:26:04.812Z" }, - { url = "https://files.pythonhosted.org/packages/4a/b9/c4d24d113d28b774662152c462d38d28109741d6d45c1aea7834371741dc/backports_zstd-1.7.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:44b687b1c0be5cb279693d2682f91ff84c559d679b2ef2fbe501fe4b2db2c4bb", size = 447221, upload-time = "2026-08-15T17:26:05.979Z" }, - { url = "https://files.pythonhosted.org/packages/cb/9f/8db55c7f77aec60879844a879ac026065d8f03aab74080701acc060c4168/backports_zstd-1.7.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dcdbd368659f46b570114eeea36b75347716523870d71f6bc5d7801862aefd6e", size = 438571, upload-time = "2026-08-15T17:26:07.421Z" }, - { url = "https://files.pythonhosted.org/packages/cd/f8/72930ae4bb7bf6b9d6c7c31bce7b3e5751c062269a4ee718066e25f1973b/backports_zstd-1.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eda97fa535d4651a4ccdeed4ee7dde3978369046abc8a7456a7117d4271f9333", size = 367041, upload-time = "2026-08-15T17:26:08.537Z" }, - { url = "https://files.pythonhosted.org/packages/17/9b/7289dc191b34279d8f176bf5b181c3b26f8e049d14a2c0a2637650f034e5/backports_zstd-1.7.0-cp313-cp313-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:7e3999b5141d7f85171822d06112f70f7f317d162f0120530dd2c7a28dbf8add", size = 507676, upload-time = "2026-08-15T17:26:09.909Z" }, - { url = "https://files.pythonhosted.org/packages/7c/4d/6dd730b79ab96532e23fe851003545b4cc79e50c5b4c79ffcbe1b724eec4/backports_zstd-1.7.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69367726f4075c2574746f5883b0dc045805c5b02a81fdf8c829c26d33969de3", size = 477744, upload-time = "2026-08-15T17:26:11.038Z" }, - { url = "https://files.pythonhosted.org/packages/e1/53/11687e5019d56ea47893cf2ba59a6b4884a4e2d1496d0e653aed373b973f/backports_zstd-1.7.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:15e97edfd173ade365c01bac7d9d297fa906686015cdbcb5f32a0d410887826b", size = 583215, upload-time = "2026-08-15T17:26:12.379Z" }, - { url = "https://files.pythonhosted.org/packages/aa/c7/5a8c58542469ab31680c403b844770c119a976fd4cf1000fd7d53e7d0f77/backports_zstd-1.7.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:32a94cdcf16b44395cd55086ea38877395ca6bf3362cb507b0eb86db2a45a6a4", size = 644125, upload-time = "2026-08-15T17:26:13.651Z" }, - { url = "https://files.pythonhosted.org/packages/11/35/be5485e65df95b86c4981ad4a577b505cfeec6b700a46a86e2e3175ac718/backports_zstd-1.7.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3f4887a8a1fd1290017fe5a1d29a7d1dc5c57f9477fbd64f119316a7e3ae769", size = 492714, upload-time = "2026-08-15T17:26:14.838Z" }, - { url = "https://files.pythonhosted.org/packages/96/8b/a0603458ca08e4a56f09ae58588ce3c0453425e753df704d9aeaabb66ae5/backports_zstd-1.7.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e590313ce156f1d8986dff3107e8ed1651d6d106a56b3a95f965ff8d845ba979", size = 567953, upload-time = "2026-08-15T17:26:16.276Z" }, - { url = "https://files.pythonhosted.org/packages/02/87/2296db4c3c578947c35ccd8dcdf7992316d7e1f5f43cc829c062b3ed9319/backports_zstd-1.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:565270b0d6497970fa97a0df59593ae0d225e4176678bbce851d39e5f8aa422b", size = 483564, upload-time = "2026-08-15T17:26:17.493Z" }, - { url = "https://files.pythonhosted.org/packages/c0/d8/f53a79e6bf3cdb7ae08f95220c80bd0d606f3d6c3482995deaf21d024fb9/backports_zstd-1.7.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:37ef23c6c522fe935726c8fba6344350973c4a23b06d10194d90d0868b09ff7a", size = 511193, upload-time = "2026-08-15T17:26:18.7Z" }, - { url = "https://files.pythonhosted.org/packages/31/ea/d4e2eb159cd5813debd5a34d0644caff5fe7cf2e569bf5b02a82934aeee7/backports_zstd-1.7.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b3975330159f1efdd1fba76afe1c7b84f66f26e2bf209b32630fb148d647e0d5", size = 587748, upload-time = "2026-08-15T17:26:20.148Z" }, - { url = "https://files.pythonhosted.org/packages/81/d2/b5ec9709660fb1c193508215d9c30e781fac406183faac7c3c36b1c583a9/backports_zstd-1.7.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b40bc8cd0a86cbbe8263a9c3a2bf2e34897483516c6d799725412a19524c32e3", size = 565808, upload-time = "2026-08-15T17:26:21.349Z" }, - { url = "https://files.pythonhosted.org/packages/bd/13/004735cc4536483cbd973a60346a9dbc7bb977b13c28b55a11da14bb0a1e/backports_zstd-1.7.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:f37e12ef10747f76901b1f20ef70d33221e861de177dba5ba08552242c6fd4bd", size = 634520, upload-time = "2026-08-15T17:26:22.944Z" }, - { url = "https://files.pythonhosted.org/packages/a3/28/05b11f7084d1100491cf7c60962aafd900c3dd01b1fc1ce85914476cdae0/backports_zstd-1.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5992143b2a8b71b4d17afed20cce2df50f8718228e31d6e716493b1fe9201712", size = 497098, upload-time = "2026-08-15T17:26:24.181Z" }, - { url = "https://files.pythonhosted.org/packages/f5/a5/bdc98d039ddbd5815fc1dd71912bbfb9f820a46ec12004ead51c8d60ea50/backports_zstd-1.7.0-cp313-cp313-win32.whl", hash = "sha256:31ae30d216ffae9243dfa607bcb995f94a70de5765bb8fae1e35ea1ad6497959", size = 291974, upload-time = "2026-08-15T17:26:25.512Z" }, - { url = "https://files.pythonhosted.org/packages/13/7d/fb0da7351e8b152d5149127594972922829281c316618df37a7e724f2eb9/backports_zstd-1.7.0-cp313-cp313-win_amd64.whl", hash = "sha256:8086b4a7443bb2863f7ef8edb317b715d5f3ccec6c5512619bd23d57661ba1b7", size = 329550, upload-time = "2026-08-15T17:26:26.683Z" }, - { url = "https://files.pythonhosted.org/packages/37/f9/109ac272d650483fbdfa611c0040253a405f640604fbc90acc8076c6d37f/backports_zstd-1.7.0-cp313-cp313-win_arm64.whl", hash = "sha256:7eaceeec75e1dbdce40b81fb0ed1ffdb7ce492d970db7f8aabd6a95ccd6c3dd3", size = 292174, upload-time = "2026-08-15T17:26:27.819Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/ff/9c/13569626440e88f09d16f43ec1c2aa0d10a523be2811414580d1cfb7c9f3/backports_zstd-1.8.0.tar.gz", hash = "sha256:9dae4f4c481716e3db473d667457b4f508ff7459c0931b567a5c9677fb3db316", size = 1006566, upload-time = "2026-10-10T16:36:40.642Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/03/3c303d6f3066f84f2c52acfc38852546a836596dd9a2bc7add83bd96b527/backports_zstd-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6e024aee6bfd04094fce60133b0e6bd0f8027cdb2823157880bc87f1ffdfee21", size = 439718, upload-time = "2026-10-10T16:34:56.573Z" }, + { url = "https://files.pythonhosted.org/packages/92/31/1e73b2835c78a9067ecba390b0eea032f827fc0b2f8bf2c8656992c30dc8/backports_zstd-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d810d83c8a703f424ed2a49aa271078c91b530da2d8c104bd88207e68d116de8", size = 368337, upload-time = "2026-10-10T16:34:58.287Z" }, + { url = "https://files.pythonhosted.org/packages/85/43/b0cc88c7d13a544f6d38f288fd96e1595395dad31f49fad2619f06b96d95/backports_zstd-1.8.0-cp312-cp312-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:d057948e8cffa19f0cc8668e06fd502ad8a69f398e91a426b39dcc5eeb197c2f", size = 509148, upload-time = "2026-10-10T16:34:59.951Z" }, + { url = "https://files.pythonhosted.org/packages/ed/29/81cc731a0408c3cba05a44ece00476305dbe1a52e27a4c323c98685f7015/backports_zstd-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6aa762cf369d9bfca1e013eaad562f8e129d71b7a82f0c459870d6d21651bcb3", size = 478911, upload-time = "2026-10-10T16:35:01.791Z" }, + { url = "https://files.pythonhosted.org/packages/df/63/dc62779cabb725a8974a2d303bfe0d7cd5b8987fab79ab445c48efcfb2e4/backports_zstd-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0b9d6c4ca7d927fd094badcf9174ee5c82ddb4855fe14658806c8c8a07d4a165", size = 584283, upload-time = "2026-10-10T16:35:03.666Z" }, + { url = "https://files.pythonhosted.org/packages/e5/12/5e8ce29119d78845cd3351bcd79baa16a30aa8c19f8c359a1719a15d97b3/backports_zstd-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:74d85b8ce50aea247289be183f853e67c106959c4048ce286b26c4663b06bb6d", size = 643167, upload-time = "2026-10-10T16:35:05.342Z" }, + { url = "https://files.pythonhosted.org/packages/3f/08/a9d59fb9e20215ede0c8ea4d729373dc0592aee45776cdd86c92c3c6242c/backports_zstd-1.8.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f9e9aa28a44db1897fb637f037175566f3b75890d4bae6cae7ba34f1df1e0804", size = 496867, upload-time = "2026-10-10T16:35:07.118Z" }, + { url = "https://files.pythonhosted.org/packages/e8/b8/abcd2be476a47dd236500c405df32aa81902c54750b26c626f190bbef6b9/backports_zstd-1.8.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2c431f3cdc7eb663a42574e27a8604a18181ea4e193504f222d8e61c6f5f8b78", size = 571623, upload-time = "2026-10-10T16:35:09.014Z" }, + { url = "https://files.pythonhosted.org/packages/03/ce/31e668dcdfe017b3240f49c3ef67b108224d3f66d90e9f26caecafc3c29c/backports_zstd-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e0431230a67e8f07210efe654abda9844a55c3bf57d74e60425d9d65770b1de4", size = 484948, upload-time = "2026-10-10T16:35:10.974Z" }, + { url = "https://files.pythonhosted.org/packages/5a/98/d9122b7531830ceb0f62adb88694bb8cc414a27d1d03539c44dd96fa7a63/backports_zstd-1.8.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9b62b6c8c5a43b294d4358c2016bfbc507cc574315ffa75346ccf0b621746461", size = 512635, upload-time = "2026-10-10T16:35:12.658Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f0/168c6d0c93a3ad6568d0b0ac2f732efc9132b2839d4e6759e61f5239107d/backports_zstd-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:869ab7e5421873dfbdbf646d52b4e8d711093972819c06c6daf3249a1ec6e0e7", size = 588696, upload-time = "2026-10-10T16:35:14.595Z" }, + { url = "https://files.pythonhosted.org/packages/22/32/b8eacce542dae88df98f923e81c079a01b66b7fbdf103e319f6fb1df2dfa/backports_zstd-1.8.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ec1a796429674ebc0e2d48feb3b6658bf49d3ae840b0c0e14ad50c4d6b7341fe", size = 568895, upload-time = "2026-10-10T16:35:16.287Z" }, + { url = "https://files.pythonhosted.org/packages/dd/16/8abede9513ec8fd584e36159b1dce82042a97214e69f53f08605b245999f/backports_zstd-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:775b701a576769df053cfb7d9456b06223b40e329c010be6cc178fe9e404a3d2", size = 633610, upload-time = "2026-10-10T16:35:18.014Z" }, + { url = "https://files.pythonhosted.org/packages/6d/74/4e82ed15ae212b0fc0cd8f82c5bbf6a9dd584b6b37df0c3485663c6ad105/backports_zstd-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab77a2e6e21c57e8341bb7656c71d1a1653151ebe787b3f092ce86a02543eb52", size = 501407, upload-time = "2026-10-10T16:35:19.688Z" }, + { url = "https://files.pythonhosted.org/packages/bd/02/7e86774e0a3c2457d23939acbb32bdb019e6bdec48892986255faa262c3d/backports_zstd-1.8.0-cp312-cp312-win32.whl", hash = "sha256:f99b44c2c13fc60f65ad568bf7401d9540370f996b1040793a34988324e3b712", size = 293065, upload-time = "2026-10-10T16:35:21.309Z" }, + { url = "https://files.pythonhosted.org/packages/a5/78/2f497fd2bbf46099e46650f75467967d21f25bb921c894d28d493bbfb7e4/backports_zstd-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:1eddf59fedaf19dd3a8e9c597add7eb6f0d51d4467a0924b2dcd2c118ed18ff5", size = 330563, upload-time = "2026-10-10T16:35:22.968Z" }, + { url = "https://files.pythonhosted.org/packages/ba/2c/3a1a91cea5b98e24cb54ecf142a72246d2e1efa5efe41504388188598951/backports_zstd-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:2b3247a7a916b90f155b4133eedaceadd0c37b4149ee32e4d74fe512a14be89b", size = 322189, upload-time = "2026-10-10T16:35:24.494Z" }, + { url = "https://files.pythonhosted.org/packages/66/a8/7a04f1daaa42936ec3d98f213b4698b18053d1154f2aee1d067c4121fe3a/backports_zstd-1.8.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:4e92ff4ce96b3c61d25900875b6cf1ee249349b8e419abd80893ec9b8026444e", size = 401586, upload-time = "2026-10-10T16:35:26.263Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c2/d26216501b3e13583084e11106ade1779b280f3304c75d84d2dfb9e5d609/backports_zstd-1.8.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:0c2e652b4fbc2e6b7bd05a09b6eab3a51bfaed9e7fca1bc81d763dc47361e2ff", size = 455589, upload-time = "2026-10-10T16:35:28.174Z" }, + { url = "https://files.pythonhosted.org/packages/df/66/372b138fa7e7be4d6aff343a55dd77e492867cb5de701899b5aa01722836/backports_zstd-1.8.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:915d3e7e57194b5cee33f10cf2d9f5c4f7658c8a167236f9ba5501520cf133e8", size = 358662, upload-time = "2026-10-10T16:35:29.819Z" }, + { url = "https://files.pythonhosted.org/packages/7a/26/0b89de2f83088f89e10ea3f4a5badef9bc95098bdd39a3031362da48dc60/backports_zstd-1.8.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e6f8483b795a09c0e0fbacca4fa844242bc6d5fc64b8a6ee99f88ad8af27b08", size = 367357, upload-time = "2026-10-10T16:35:31.649Z" }, + { url = "https://files.pythonhosted.org/packages/74/01/5239b39d3f65ba80e2129b9273bf736245e4a1c03b8a317ed399c4fe10dd/backports_zstd-1.8.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1fe4b06a019aa4cdf87af320eef56a4bdbdb924ead36a7a918645d72edece966", size = 447892, upload-time = "2026-10-10T16:35:33.534Z" }, + { url = "https://files.pythonhosted.org/packages/b5/13/e4eceee62d144f68944addb0179368d626f96d3644d965620774f1f5e463/backports_zstd-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:49c4006cdf41c15ffcc74f10d9a6485be841106cd4d5aa7ea7bf1075cc37fb83", size = 439240, upload-time = "2026-10-10T16:35:35.351Z" }, + { url = "https://files.pythonhosted.org/packages/1f/5f/996aceebbbc4eebc05d99fe1714b1b0930260eac5171e8ebc3a952390c0d/backports_zstd-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4fa862d24b7fb392279a95bc9acc1f0ede8a25de9efbed03fb305ceac2f6abb0", size = 367710, upload-time = "2026-10-10T16:35:37.004Z" }, + { url = "https://files.pythonhosted.org/packages/93/0b/c373a7f92df9df1f9e0657ea0dd86c45444b8414db616b3d38b62f90075c/backports_zstd-1.8.0-cp313-cp313-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:9af83a6d7dc67896fd91bcd4c2cd182ba97d7cca2b09a94373a5fef154001d98", size = 508347, upload-time = "2026-10-10T16:35:38.683Z" }, + { url = "https://files.pythonhosted.org/packages/b4/36/07dca77032300047efd09808d49ab9d1fff8657553adbc8e0e6405aba864/backports_zstd-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1a808ba1371231c00a2b71f03840a727088e287d0ee1dfb3230958950f21f421", size = 478416, upload-time = "2026-10-10T16:35:40.504Z" }, + { url = "https://files.pythonhosted.org/packages/ee/a9/bb96724619a1dcc3a9e3138d15a6f7a2fc40b581926db4ac00e424af79c1/backports_zstd-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6cc15051c282ac2585a2425d22f416ae2deb5afb441b22831b349b02fd58a782", size = 583888, upload-time = "2026-10-10T16:35:42.159Z" }, + { url = "https://files.pythonhosted.org/packages/cd/6d/65e6e437eb54b5be2ce7248ac236d82a771a672457c950e7f96849699274/backports_zstd-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a23d38d7b9ca93403acd3c2c306af6e547a24d150c25ac2d7a8acd751fbd968", size = 644796, upload-time = "2026-10-10T16:35:43.882Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6d/3c422b33d40aaca6e9d9fdd47f1a047ac499de749c887ab3dab62f731fb2/backports_zstd-1.8.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44a9004f9e809ea56910d326d21946650369db59eb86edc0c76840f21530704c", size = 493385, upload-time = "2026-10-10T16:35:45.576Z" }, + { url = "https://files.pythonhosted.org/packages/ba/b9/ea08e2c2b8a7bfabff359852e4d7a9cbc2cde09715907250c0e53432fbe9/backports_zstd-1.8.0-cp313-cp313-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5ff307f3f0ef3b7f40ccfce42c0704fddc99cd30bca451330f42466db1981be9", size = 568613, upload-time = "2026-10-10T16:35:47.394Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6e/775cb7317f1f693c7f3e96fa5cf5426b461616b52730a72f978f31b334b0/backports_zstd-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6c8572e27c5f0b9d11020d3f597bf3c35fe0f5ae6f99156dc52b0bd937ba8908", size = 484237, upload-time = "2026-10-10T16:35:49.496Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f8/c31798a8911390fb0d4f058f65cba2e54141d6394c35430b1d495d121667/backports_zstd-1.8.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cc1d9d3660c40abe4095de80f43ce4c955d08f7d9803d3da97176aa61b76d923", size = 511865, upload-time = "2026-10-10T16:35:51.223Z" }, + { url = "https://files.pythonhosted.org/packages/68/df/0ff79b6a2d7f5c10d3ebc7e23b5281f51130feb4db8afadac98ba5131c18/backports_zstd-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:83cea5cdd70e1d74382be6deeeda1db79aedd1a06af4f8a8fbafba9eedae5230", size = 588422, upload-time = "2026-10-10T16:35:53.371Z" }, + { url = "https://files.pythonhosted.org/packages/19/a7/d5dbad63911fc3040253dc209a7aac8921e928fe64f3fcde051066aa5a75/backports_zstd-1.8.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e74eb204b9d7798fc57393202c443fc2ec84283d82387168baeb763f8beb224d", size = 566480, upload-time = "2026-10-10T16:35:55.459Z" }, + { url = "https://files.pythonhosted.org/packages/d8/b9/621e734eb144d56c7632b763c0ce3fa196839fc0f82830244206a9d37d8d/backports_zstd-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:515497b3d49dd6d7a84fb16a0a0007bc460b4a7e1f55e70f33315c66d3844e8e", size = 635191, upload-time = "2026-10-10T16:35:57.307Z" }, + { url = "https://files.pythonhosted.org/packages/af/72/1b6709f13f2a22a1d72e15f114ab62e852db33ba0f8840c7d102523bcdb6/backports_zstd-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6283c90997038abf46c8a0bb75afb4dc6cbf061421802fda0afc382fe4b348b3", size = 497769, upload-time = "2026-10-10T16:35:59.395Z" }, + { url = "https://files.pythonhosted.org/packages/de/52/cd0a82fd52ae159a0316d2257156968c356cab81062d6050af48a4e8a3d6/backports_zstd-1.8.0-cp313-cp313-win32.whl", hash = "sha256:9d76a3193a3a4a6b1249021e7ecf72e4cabc1dca611c6fb41db1c0b5d2faf741", size = 292645, upload-time = "2026-10-10T16:36:01.439Z" }, + { url = "https://files.pythonhosted.org/packages/12/0e/5c5a916cea73b455850083ccf76078de655face3dfe4126848570c57a6dd/backports_zstd-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:b583990d554cc6f6141c5c43b6db3c7da87a214253e08339d917ee3baa3021b6", size = 330247, upload-time = "2026-10-10T16:36:03.058Z" }, + { url = "https://files.pythonhosted.org/packages/86/3c/7297d87eed9254f6b4823c05b37aa07ec2a99bc5f195760dc574e925eecf/backports_zstd-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:0600e166cb00739a26de74ee1696221a53a4d5dc1f96a0bdeb6b307c1626c15c", size = 322066, upload-time = "2026-10-10T16:36:04.932Z" }, + { url = "https://files.pythonhosted.org/packages/1f/c8/dba9e5905e83ac955c1c19b797f59f5335a351664a7b25a709929d63dfbc/backports_zstd-1.8.0-pp312-pypy312_pp80-macosx_10_15_x86_64.whl", hash = "sha256:f710d03f84d74f11737735f846b44ef1545cadb73ef47bcd3d0e124f253dd763", size = 413972, upload-time = "2026-10-10T16:36:28.92Z" }, + { url = "https://files.pythonhosted.org/packages/93/11/8ee691bfd2c8292a573a0378a616372aa01ed9e6001d5778ae666a239265/backports_zstd-1.8.0-pp312-pypy312_pp80-macosx_11_0_arm64.whl", hash = "sha256:2b11fb8b9c798657c97ad3165893f146c300e2f7f800e9c54c0d2143052c1486", size = 344652, upload-time = "2026-10-10T16:36:30.853Z" }, + { url = "https://files.pythonhosted.org/packages/19/33/86bb2cd5c6e827adba98fb091ccecb29dae3bb33e0406f8e08be7bdbe70b/backports_zstd-1.8.0-pp312-pypy312_pp80-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:ec7351d3e6ea92338dc4e0e53c876d2e2092e07ad3a2083088e0160200efdd15", size = 422892, upload-time = "2026-10-10T16:36:32.708Z" }, + { url = "https://files.pythonhosted.org/packages/42/a2/629f5e9c3edd2a31f7dd65b8097241b5036f98105efac251a12c1a8f7cb5/backports_zstd-1.8.0-pp312-pypy312_pp80-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:63ae348b629121eeb967244fecd254f41b4b3a63d074c252f4d7777f5d17c71c", size = 396431, upload-time = "2026-10-10T16:36:34.842Z" }, + { url = "https://files.pythonhosted.org/packages/9e/f6/9c223e9cccc5a797c17475fde1a8a78ada0dcdd39be2302f4605e565c0ce/backports_zstd-1.8.0-pp312-pypy312_pp80-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:163b5c36321bf5652b6e4aeb04d3644ddbf9c1881a82322e376e5be3532af26b", size = 416398, upload-time = "2026-10-10T16:36:36.706Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e3/2eb6f517c9a6746a735b49ba4ab3ed3df6c4ec9072169805547ae590e296/backports_zstd-1.8.0-pp312-pypy312_pp80-win_amd64.whl", hash = "sha256:3f0288db18a64f4f4146f4526456ff62b2edb625b2d43956e764885edd3f1da2", size = 404272, upload-time = "2026-10-10T16:36:38.766Z" }, ] [[package]] @@ -278,80 +287,112 @@ wheels = [ [[package]] name = "cachebox" -version = "5.2.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/36/f6/85f176d2518cf1d1be5f981fc2dadf6b131e33fefd721f36b330e3434d6c/cachebox-5.2.3.tar.gz", hash = "sha256:b1f68246685aa739bbbd2734befb1465363a1e1042407c154feadb065f17a099", size = 63686, upload-time = "2026-04-10T12:21:35.028Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/e7/6fa6abfc9c4c07b88f09a88466fa93c7081fd679d8e06f8f558bb4ac845c/cachebox-5.2.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:09c0340e9daa7b4530801e5a570cb0c1a1ad941a85d245d360020d3986d0e787", size = 377791, upload-time = "2026-04-10T12:20:23.87Z" }, - { url = "https://files.pythonhosted.org/packages/3a/79/89e4423352d0ca33bbf80fc1b4b665e654a93de8b16cf41e96fcac81801a/cachebox-5.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3162758792626685ec34950eedd565d015b115d0ff0d751d2716031fc32d51b", size = 359562, upload-time = "2026-04-10T12:20:10.626Z" }, - { url = "https://files.pythonhosted.org/packages/d2/ab/e533c2751e6a3411ebe369277aaed03199b9e4586a48f0a3712a1f4b418b/cachebox-5.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a189a780c3ccd7b9d157074ba6bf3e191e522b39abbdb590075111851f02d50d", size = 397910, upload-time = "2026-04-10T12:18:53.336Z" }, - { url = "https://files.pythonhosted.org/packages/7a/0d/b8492d6ca53278499a37c9f9d51afd4ad77bfbe813d6281944d45b97a1e7/cachebox-5.2.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:410b67baa99d433644199b11289627f7ebba4ee5786f95ca9858f238afcee157", size = 353699, upload-time = "2026-04-10T12:19:06.248Z" }, - { url = "https://files.pythonhosted.org/packages/78/d4/fd20b3a5362651303fa12d3ee62f56af2bd396e4a7303d7014a1a1e5b392/cachebox-5.2.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f81474dc19d3865fa5e57263f834bc6bbc00e471a594fb9d934ed552732c02fd", size = 372510, upload-time = "2026-04-10T12:19:18.997Z" }, - { url = "https://files.pythonhosted.org/packages/71/94/3ec55c946d300cc4eaed3a0f79740051ac6e11ef4032421332c6ca15f5d5/cachebox-5.2.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:85ccd827193b3e3e887a88a16b88ef7ed174e7e65be515b5253322aa75e665c3", size = 392802, upload-time = "2026-04-10T12:19:31.196Z" }, - { url = "https://files.pythonhosted.org/packages/01/b1/1a3c4e436ad8a4c4ba3e70f4c62e1f927cbbb3c943a9bba5813b8b815bde/cachebox-5.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a1e7d3cb8a5e7e68996a8619e3ef8771a124d14568c251f9e586eba88d759c1", size = 398223, upload-time = "2026-04-10T12:19:57.583Z" }, - { url = "https://files.pythonhosted.org/packages/0a/ea/d36ad3976c4396b350b96a1582411b7a00e56c144eec0bb5ba5f36ce7d86/cachebox-5.2.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:adcedfcfcb933b21e7fdcfe560c79887bc8287abceab0586aa3730417dd0277d", size = 427696, upload-time = "2026-04-10T12:19:44.361Z" }, - { url = "https://files.pythonhosted.org/packages/a8/36/71845b5c7a9ffbd85e6fdb470c11a174f499bd5238fa37b1214157c2454d/cachebox-5.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c7f0c72c51a3a9e7049ea6ff2a43cd3877ab7fee966eb65771a59621563b75e3", size = 567854, upload-time = "2026-04-10T12:20:38.357Z" }, - { url = "https://files.pythonhosted.org/packages/e8/a2/baf0e5a8392e64e352b137ccd7356b3d98068c842fd19f510a7790c05d34/cachebox-5.2.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c48c10e498d573511aafbd545570e7f43b40a7428dc282183bf5adc334d9e1a8", size = 670306, upload-time = "2026-04-10T12:20:52.903Z" }, - { url = "https://files.pythonhosted.org/packages/a5/22/cd4e4c1d624b8ef9fb4b8bebf0bf5d2d74a399cf1ac46b667bb79d15359a/cachebox-5.2.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2f1e086ab5ffd082a68bb63699d517655a59b06414927bfc84e01df91b81e34d", size = 645943, upload-time = "2026-04-10T12:21:08.238Z" }, - { url = "https://files.pythonhosted.org/packages/0a/d6/55859981f5ec6a9e412baaa4db6aa5973a00008750b3f054cdefcb6491fc/cachebox-5.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:649d18399f13735bb82daa33800196f815529c49e967767c40ca221723e68afa", size = 612309, upload-time = "2026-04-10T12:21:23.404Z" }, - { url = "https://files.pythonhosted.org/packages/d7/1e/313f650467ac85824c4199188f8f1ee3386cd12eb665dbf7c88d372e4956/cachebox-5.2.3-cp312-cp312-win32.whl", hash = "sha256:0a17aeb4e5b1c6ef1c3db8fc5186f9986e215ba5ea5a5d08baa45bcf55f261b2", size = 279789, upload-time = "2026-04-10T12:21:53.215Z" }, - { url = "https://files.pythonhosted.org/packages/c5/50/3b334f887accfa811cf5c7533b8ce22c523eb009363a86401198899dadd2/cachebox-5.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:cfd69114141ab362acaa2099e425a1b965cf7b021a539a4e953143d593930b74", size = 290917, upload-time = "2026-04-10T12:21:39.696Z" }, - { url = "https://files.pythonhosted.org/packages/31/3b/16d5c295f6ec2913ef595b39986dc7b7cc179fdd2e73f5ebd1814c38fd51/cachebox-5.2.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:9527c5c70f8735f2d696331d8bcf77254f03b4dc8542046807823bd36ed4e8ba", size = 377408, upload-time = "2026-04-10T12:20:25.444Z" }, - { url = "https://files.pythonhosted.org/packages/cd/87/45f834154f79721e5b64a80ffab4f9710834c4f9c01fa977f94a9116c32a/cachebox-5.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:40ac878af00d5969862c1f6bc076de1e34ca248662fce6aecca1761f52e33e32", size = 359274, upload-time = "2026-04-10T12:20:12.127Z" }, - { url = "https://files.pythonhosted.org/packages/46/17/794e5f93e0a172aa14ecd692f6d89bdf094f71eb35fa923d0a0af25cef1c/cachebox-5.2.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5ff26bfd8f7e95b3becf6d5f65c25edaca50fa68078868648b70d79bcccc260", size = 397520, upload-time = "2026-04-10T12:18:54.807Z" }, - { url = "https://files.pythonhosted.org/packages/23/19/9470b1a96de6e480192b1a92b2fafa72aa052efc2509a5418a5652205b33/cachebox-5.2.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:82e7002dd343afeeba2fcf0e483131b342a27ec3bc34b2214dc617691bda40d6", size = 353183, upload-time = "2026-04-10T12:19:07.797Z" }, - { url = "https://files.pythonhosted.org/packages/6c/2b/72813f80397ed4640e337cbd1a14ab7eaafe33e479291d3623b6a6a55fec/cachebox-5.2.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ccbdc54a6c4b5758408c1083bdfa217bd382894a8331c7d0a54b84ba0cf51e5b", size = 372239, upload-time = "2026-04-10T12:19:20.44Z" }, - { url = "https://files.pythonhosted.org/packages/05/17/47dc9687288fa55486573627089ecd9aae124de5924a4bce008af96d80b6/cachebox-5.2.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df5135a168f143d186b1cc3be0ca16b66446897ab5cedc03bd80bcc926fcd403", size = 392568, upload-time = "2026-04-10T12:19:32.73Z" }, - { url = "https://files.pythonhosted.org/packages/13/95/450765b971a3bed9d7cf003c3833c1976482eb83b0241b6dbb840a25b43b/cachebox-5.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10bedf96db8f9766cc956f9adcc623e604264e5d6fa2e255432f8c2ed7519143", size = 397920, upload-time = "2026-04-10T12:19:59.314Z" }, - { url = "https://files.pythonhosted.org/packages/5f/3e/dd8f4c1f92e58d479913ce9cbaa3227c911128e6046c82f4fd44309f685a/cachebox-5.2.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f22732d0d69bb84ad2dca7480bffdfd0430c647152d488936e152ecbbfee52fb", size = 427332, upload-time = "2026-04-10T12:19:45.888Z" }, - { url = "https://files.pythonhosted.org/packages/7e/20/80d8c26ce63e78da3874a5bb07a3a78de53a2b0356ba80583a4927f0a074/cachebox-5.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:26ae0b68979204d360327f4c0725cfdc95cfc34ab73ab1a8f528e3bd2f6d023c", size = 567494, upload-time = "2026-04-10T12:20:40.373Z" }, - { url = "https://files.pythonhosted.org/packages/10/35/7249885dfed3602b3b48c1e67781197dcdc536c50f72caeabe3944348af8/cachebox-5.2.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:f3d628b816e28a6e7661d460e02dd5b421247cc2cd275814f80ea79621245fc4", size = 669968, upload-time = "2026-04-10T12:20:55.155Z" }, - { url = "https://files.pythonhosted.org/packages/2d/8a/e5b58f0bbd6fef74da5d8e5ab49e67898ce7e6df28c16280a0f2b78461f7/cachebox-5.2.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:64057caa6b741320655cd3c5997fe642dae5dbff571eb530e6f53e58272bb43b", size = 645547, upload-time = "2026-04-10T12:21:09.948Z" }, - { url = "https://files.pythonhosted.org/packages/d8/25/51783a4c6f25ca87ef1b4b762ff0364bd98053a02d597b30d26ff4cf13c5/cachebox-5.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa325306084aa2dc0b21e07723d7700f4d43dece3732c7fdaf7a269dc5e35aa7", size = 611844, upload-time = "2026-04-10T12:21:25.286Z" }, - { url = "https://files.pythonhosted.org/packages/c5/c5/b26c4b046e296d0e249448fe297626b3caca2e851837712f03c358662cb7/cachebox-5.2.3-cp313-cp313-win32.whl", hash = "sha256:55003089d21c2f5515089c307be063b45558e884a4a1cc9593944374c89975c4", size = 279421, upload-time = "2026-04-10T12:21:54.921Z" }, - { url = "https://files.pythonhosted.org/packages/e0/7f/a49420670393bfea618de7a893d45cae9294cf3293d7b158e7af20e8f39e/cachebox-5.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:dcc5edb6ecf2b516e90b773d232360c5e4ed8fdcda038b19441da2ed9cf208ab", size = 290702, upload-time = "2026-04-10T12:21:41.458Z" }, - { url = "https://files.pythonhosted.org/packages/c9/0b/bf83bda13ef6fc490d208a1d4dd712034624526a88f61713cca0edc9884f/cachebox-5.2.3-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:a4b7559fa4994c4032dd07466c2041d57e055feb814762e1f73f4e8beef188d0", size = 371704, upload-time = "2026-04-10T12:20:27.253Z" }, - { url = "https://files.pythonhosted.org/packages/8e/ea/aa5162273238e84f9e41b33600c69299572dc1c8f0f768d07660b71be07d/cachebox-5.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f57afada3d9327adf87f3b5cf0094348c6fd49354ab2e9bd20b044648eb094ae", size = 353385, upload-time = "2026-04-10T12:20:13.668Z" }, - { url = "https://files.pythonhosted.org/packages/47/96/3ca013e2e48df5c1d7855669b208f4bf8014ccb842ccf7a3a0eaac07bee0/cachebox-5.2.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8342ff350ce86f062492752d612e9f056ac5dc56375713d75c3bf6e83b4d18db", size = 392181, upload-time = "2026-04-10T12:18:56.385Z" }, - { url = "https://files.pythonhosted.org/packages/63/ca/1bacb4efa0b0ce8065d1fb7c8dc7c382ec4e1cc3f007eb08417732be2725/cachebox-5.2.3-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:405f9cc8492fc9d953b5a6b9e2b661e99583755c6639ab8d09a287fdf336503c", size = 349494, upload-time = "2026-04-10T12:19:09.505Z" }, - { url = "https://files.pythonhosted.org/packages/d7/2e/75db4bda3768658f5baa5a54f6a4f643bc2de1a16788e40581a080e803c7/cachebox-5.2.3-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:94aae393ec1d9b26565d346445bb6afa3963d2a0d3eb5e4188d0e510fab871a0", size = 369216, upload-time = "2026-04-10T12:19:22.224Z" }, - { url = "https://files.pythonhosted.org/packages/f5/82/e1f833be0d57e29a8c5eb0a0275cd34b962f3c7f5b9e0517ec4bf75e7cc3/cachebox-5.2.3-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8b0b575066fc09f6fae0d4bd30d6ff56584a6870cbe7d202916c5e0d725cfd4", size = 385922, upload-time = "2026-04-10T12:19:34.198Z" }, - { url = "https://files.pythonhosted.org/packages/53/d6/615a3c16c1d63839f2c67644eb414c4dc9769ab2e169d935110fd8e268d5/cachebox-5.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41e99c1240106d39b63ce7868a6cd8c9da9243fef08848b85d428164e0769fd2", size = 393276, upload-time = "2026-04-10T12:20:00.925Z" }, - { url = "https://files.pythonhosted.org/packages/2f/a6/7844c9c84b170dae1005b22da174639968e64c8055d66a209a1598663771/cachebox-5.2.3-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:432ca62b99f7eafc21af669d76c88c1b7377db179b89fb6fca3ea93b8f9fff19", size = 421355, upload-time = "2026-04-10T12:19:47.691Z" }, - { url = "https://files.pythonhosted.org/packages/c9/0f/43f62355846cae3dc41cb4daccac0a4bb2b7b8b3c7d77d1b6a220bae6d54/cachebox-5.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e51d9c59006b53447f806145406eb37a7fc3c25553d4fd24c3887f3b268d214e", size = 561656, upload-time = "2026-04-10T12:20:42.161Z" }, - { url = "https://files.pythonhosted.org/packages/9b/fc/a453813c6d000d69a41a06c6a3143a6c4d0d0e41f23c155db2f82ea0edfa/cachebox-5.2.3-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:5e48a405f699fb001b8af120a6e0b4a981277f84eb5dd66a1faa21e4b6fe9485", size = 665791, upload-time = "2026-04-10T12:20:56.842Z" }, - { url = "https://files.pythonhosted.org/packages/aa/a3/f6a9e75f1e602b67b6d67088a9a766adfc4e0a740a9c4b68e4e6207c1006/cachebox-5.2.3-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8cbfc007ea78af61d75d7d26e5854df53dc5da6877d074afd4b4696c074f4ee7", size = 640975, upload-time = "2026-04-10T12:21:11.641Z" }, - { url = "https://files.pythonhosted.org/packages/a3/15/4ac98277f7fd9d855c8ed337e8e2a3386d17997cce2dd3eadb23dedc08e3/cachebox-5.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6a94d0da8133b3a0707ae11c9ea321f8fc37e3b5a14517019a05d632218b0f56", size = 607242, upload-time = "2026-04-10T12:21:27.27Z" }, - { url = "https://files.pythonhosted.org/packages/9c/0b/ce61907a803f75854e0cc91b84c16e14dce0e4e939efbda26293eb4c8784/cachebox-5.2.3-cp313-cp313t-win32.whl", hash = "sha256:5fee33549877c03c2494ec5359a57a7667f872fe8e296a7f39d3dfe08dd3914c", size = 271619, upload-time = "2026-04-10T12:21:56.768Z" }, - { url = "https://files.pythonhosted.org/packages/b0/06/fece190ad5173d06b2779494aaad5528907f2e55c809618e5b67c2e3dbb5/cachebox-5.2.3-cp313-cp313t-win_amd64.whl", hash = "sha256:67548a05cd41fcc4f7af80a2f97f742fef3d436537ac2e1a1dce0fcba5d41190", size = 283133, upload-time = "2026-04-10T12:21:43.037Z" }, - { url = "https://files.pythonhosted.org/packages/b8/8b/72c0e80aad08e09867ce14a621bce689a733552f20cdf2ef96d4b052da10/cachebox-5.2.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:37fa0891f0defee053c09f5f43f802f731e36e6e6ca055d7d174af07f77232ca", size = 380523, upload-time = "2026-04-10T12:20:29.345Z" }, - { url = "https://files.pythonhosted.org/packages/fc/62/33aaade81b181d5191cc39c867c297aa7c65f3191aa9749bf99b77496b88/cachebox-5.2.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:dc6315902f2ef4afbf10bc8e08c54ff34de5ce124546b8e0016c9b0d327be21e", size = 362424, upload-time = "2026-04-10T12:20:15.215Z" }, - { url = "https://files.pythonhosted.org/packages/9e/0b/3eedaf9ea4b41c931f4340bfa42056efe2bb5fe3a79649d6c8a1dce585a5/cachebox-5.2.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7df1735ca778480d51b8232fed397ffe3935158f20d34fb1c5ed171b53d5a6e2", size = 399572, upload-time = "2026-04-10T12:18:58.331Z" }, - { url = "https://files.pythonhosted.org/packages/be/69/c79b8a6a5b889ac4a60800bacea3553cb3b86f6fd13b2262bade1cb962c6/cachebox-5.2.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e22451cde8f884051e941b21870e4fc91fcf58d0d8c285bb8964107e1f02445c", size = 353803, upload-time = "2026-04-10T12:19:11.21Z" }, - { url = "https://files.pythonhosted.org/packages/d4/c3/bc7838de51039f8c50506d8dc82f22ff9a652794339a223b12af595e1d2f/cachebox-5.2.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dcbccf3015d9a42bcf41260fa5cc048a5bdb75aa10997d514d6c976117f30ee2", size = 374474, upload-time = "2026-04-10T12:19:23.658Z" }, - { url = "https://files.pythonhosted.org/packages/65/61/e5231ad2ae952ca482f9b9df55df4b96add1a80de28de537c5f574605987/cachebox-5.2.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:311eae5079e256cbbfafdc3dcff1714b6598a767f9c1ef8c3709e74ea0cc12b0", size = 393045, upload-time = "2026-04-10T12:19:35.651Z" }, - { url = "https://files.pythonhosted.org/packages/78/c4/c9b3fa764ac5420a9e079ad53fa8840d4a26b74c4ccda56acbef49cf76ff/cachebox-5.2.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f4d2a80a5cd3380739c67f7d89e596634f5897b8d5a4a3dc1598312cb077535", size = 398700, upload-time = "2026-04-10T12:20:02.513Z" }, - { url = "https://files.pythonhosted.org/packages/9b/3e/c4e3acd4cb04e01c5fb7cc7a4de16059b9594d90672fff85af8670275267/cachebox-5.2.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3977515b727a5203f494c44c4566fb936c4b940351c01d3d8e7b5d104dff4f53", size = 426725, upload-time = "2026-04-10T12:19:49.385Z" }, - { url = "https://files.pythonhosted.org/packages/25/5d/610b79479719951581109d985244d34c97f86a308c3d7c83443e2b1dac46/cachebox-5.2.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c5be17dd5c4fabcfecd5bcf6d54f9c6fb719daed3ef01ac1c03a14af0e2b26c1", size = 570042, upload-time = "2026-04-10T12:20:43.793Z" }, - { url = "https://files.pythonhosted.org/packages/8c/63/cad8a05db4d0c0f5ba6bccb32e57d15c472276de9476f56004445b40711f/cachebox-5.2.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:6d37334fc218fdaee31db8a4f938938716e7c3b1b4059e25de27c8447fc95fde", size = 670974, upload-time = "2026-04-10T12:20:58.528Z" }, - { url = "https://files.pythonhosted.org/packages/54/d1/9cff7c2b9048d1c38b7ad8199ce856596d09720b3bea74043f3bad71970b/cachebox-5.2.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:1e5f1b7e23411b748d919348c3b65db1f9f8927ab8f6f3acae19bd617543df2d", size = 646213, upload-time = "2026-04-10T12:21:13.619Z" }, - { url = "https://files.pythonhosted.org/packages/27/ae/2e1ad162ec13903e84469c8a753baf385f1bc324279d6c7cb6365e7099df/cachebox-5.2.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e7b06a75a898b31fd73c4d8bf727a9b9f8b5b7738cccd0ab5e6fd2a9cf659d3c", size = 612787, upload-time = "2026-04-10T12:21:29.271Z" }, - { url = "https://files.pythonhosted.org/packages/c8/8a/07b5ffd841e1ff534bb6e8721c39fdfe0d7cdaac1398e1783b2a0c37bd22/cachebox-5.2.3-cp314-cp314-win32.whl", hash = "sha256:3b798052719f09a2ce7bf9fa9452dc0a7d4dc53b50a2d3aba6ce6ebc12d39df7", size = 278559, upload-time = "2026-04-10T12:21:58.482Z" }, - { url = "https://files.pythonhosted.org/packages/c4/f8/b88a82ce9ec7a2fa0f09ed1cdd031692c8664c41f9ab71831e177c7ce2df/cachebox-5.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:4afc8b8575e3228a42ad8d819de5fbbecc6bd0b521295966b00244be37ae3b9b", size = 291928, upload-time = "2026-04-10T12:21:44.621Z" }, - { url = "https://files.pythonhosted.org/packages/4a/01/8c79c07c8c6517fb2fe7d479dd87044e38aac5b9af0245b33fcd695eae37/cachebox-5.2.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:0e8a34b82be30d3d9fb7dfaf9a86ec2b3ab9bc264715909ef27fc3d3587324d2", size = 374325, upload-time = "2026-04-10T12:20:30.923Z" }, - { url = "https://files.pythonhosted.org/packages/7f/51/0fc26b923e80ab857ac99d5f7f3784dc941e7b4de361c204835233176ddf/cachebox-5.2.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4d4e336aebf866463878ccd28a4d0ef4003ea216708cf4a02a7f198481b3af81", size = 355444, upload-time = "2026-04-10T12:20:16.879Z" }, - { url = "https://files.pythonhosted.org/packages/c1/6d/a6b399221f8dc4b3e01b37d3240ef5b8a7eb78cd9bfbb99b0e655dd01649/cachebox-5.2.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b102fcdd97b0602bf5d6ba1a571bba3e3d6fa912b89fd768b0da5427408eab8", size = 393978, upload-time = "2026-04-10T12:18:59.753Z" }, - { url = "https://files.pythonhosted.org/packages/bd/f1/4c8f998c117c1941a82bd824d6687280c50167f21fea6392e41531d641e2/cachebox-5.2.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:245a79fb2c5d3bff252f4263f76210ef3ad7c2ff9b0234859b26974830a80491", size = 349298, upload-time = "2026-04-10T12:19:12.843Z" }, - { url = "https://files.pythonhosted.org/packages/d1/dd/683bc5a32a0da660d02fa248b880b71a2b834e9b54b8d272b5801282f402/cachebox-5.2.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd0e8dbd8fd4cf664c645c08f9e10508e133353756705c4a738e90a5406224b5", size = 370619, upload-time = "2026-04-10T12:19:25.298Z" }, - { url = "https://files.pythonhosted.org/packages/81/49/d6c47c78a7769b355076c5b635c2b538c8b88e8ceeb408e104d0f269b515/cachebox-5.2.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdb74294bdc33e39e26606919a9b2229038d5fac0edb80c9056683c08584d4a9", size = 385988, upload-time = "2026-04-10T12:19:37.638Z" }, - { url = "https://files.pythonhosted.org/packages/70/e2/b669555ada7fa1392e4cdb8a19f3367db5c6abef0fde8ab034a9747760df/cachebox-5.2.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bba3e9a7f52fa196b434522f39675f3b32a076976ef2373ded6f1065e99f4d20", size = 394090, upload-time = "2026-04-10T12:20:03.978Z" }, - { url = "https://files.pythonhosted.org/packages/8f/01/42916249e53fe4fcbdf0419fb55dbc09b9f377475376e1d7f4ae9c9bd6cd/cachebox-5.2.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:abb21f0f937fb66528f1b9f1a04874d6aa503e78bbb26f4cf33bf67faddbdd68", size = 421632, upload-time = "2026-04-10T12:19:51.048Z" }, - { url = "https://files.pythonhosted.org/packages/a1/54/34eebe18c6ed8ba27b1331b5e3d08bd8bb62f03ba81fbf47a2db0fa646f7/cachebox-5.2.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:dab6fd3189b0c746fb03e1915fd947aaca9112cedf26ef3a0c39383acf87d2e5", size = 563871, upload-time = "2026-04-10T12:20:45.417Z" }, - { url = "https://files.pythonhosted.org/packages/ba/b2/f92da0d54e4f18609588709090de8c81dd7c8b20ed6ac30f9b91bedbedf5/cachebox-5.2.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b4e7d2935b9df11d3717f99c7237b6780f1f8c70e6a99b69b8430d89929ec825", size = 665677, upload-time = "2026-04-10T12:21:00.512Z" }, - { url = "https://files.pythonhosted.org/packages/43/9d/bf2d3dc949afe4d21fc7eb15b7524255e834b9252df6bba111e6686d1c6f/cachebox-5.2.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:611aa260fe1b2506330ff72f415e2cb4053c9c4e3776ac68fe2eedee0e1b91b1", size = 642067, upload-time = "2026-04-10T12:21:15.727Z" }, - { url = "https://files.pythonhosted.org/packages/6e/4f/a789eda189550d239fbaf165b9810f148e733e97a2a4eda7c4192295c7f8/cachebox-5.2.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a424ffb8514a9cb49bacff7995b7c767625cb2239692bd6524245e8579e375cc", size = 608048, upload-time = "2026-04-10T12:21:31.156Z" }, - { url = "https://files.pythonhosted.org/packages/41/c3/590e161c04ffbd36e33933e6dcca5ffa40b5548e3121a21d77aad42af138/cachebox-5.2.3-cp314-cp314t-win32.whl", hash = "sha256:83988dd8e9075ee837e8407e26db49a9944ae74924d5db57b477444d7d98622c", size = 271694, upload-time = "2026-04-10T12:22:00.589Z" }, - { url = "https://files.pythonhosted.org/packages/66/f4/f60b8506df467261178afe918801df37c02c46ec2b8ce019760a14e2abe7/cachebox-5.2.3-cp314-cp314t-win_amd64.whl", hash = "sha256:dbda6390fa5070a19157ae35ab8066d3fe468634e0e9e21452c68ce7999c7d0c", size = 284212, upload-time = "2026-04-10T12:21:46.241Z" }, +version = "6.2.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/8a/38b6c48b858f018f3d7e6a1ebbdeff8b1c907217f26b0c146a91600dc874/cachebox-6.2.8.tar.gz", hash = "sha256:2e8e5ed9a0b9cf96eb736cdf4718764e7f49e82e015bc0e45ca3ce065db86d95", size = 261556, upload-time = "2026-10-08T14:53:43.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/7c/22093cd7b40129976acf9dcbd37b443289a9cf62345cc20b31b583926471/cachebox-6.2.8-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5e413d8a5c541f2aae7f031aca58f118eb969b9dc4ddf70383856b2e32d3ff18", size = 477418, upload-time = "2026-10-08T14:42:11.673Z" }, + { url = "https://files.pythonhosted.org/packages/db/1b/a812aef71788506646df280a45e2ba8544d4b1a83d951871f313b5e44ce3/cachebox-6.2.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9341f5f9e89a042e0f67711f83ce6f9b34ad12bd9a0a6fd1a009d3a2784b2d02", size = 438786, upload-time = "2026-10-08T14:42:13.154Z" }, + { url = "https://files.pythonhosted.org/packages/0b/a6/6bb7cb22ea2218c1d5ca22bf00bda0d9f58fc7ed2a0fec4574183513775f/cachebox-6.2.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b222b7146fda6b46e6850773665a90ee02924e9f3445bc59a8b80bd73a0b054", size = 472158, upload-time = "2026-10-08T14:42:14.848Z" }, + { url = "https://files.pythonhosted.org/packages/01/da/a77e618fda951290a1ebab437370a39b1053d36c638df8a9bd5213772d99/cachebox-6.2.8-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:676183028bea970c1857b28e906d7f5357044982d60f251488fddb6a8b5e20e3", size = 493066, upload-time = "2026-10-08T14:42:16.245Z" }, + { url = "https://files.pythonhosted.org/packages/76/21/306aa093836216887d589e707f570c7035c555c0796d70d491d014e59b87/cachebox-6.2.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44fca5484d8d1f59d97c5d56f68311de1ef3b5b36a0016bf962ae9584215bada", size = 520949, upload-time = "2026-10-08T14:42:17.704Z" }, + { url = "https://files.pythonhosted.org/packages/a7/3d/900d3f86fa23495e3e22fc9509407fe060bcd7954cfda58b7efe2f27f945/cachebox-6.2.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88f868eb439d3f2cb5e9fba546c0a8ad19397dc02c4bb8c3976a21418f898580", size = 537406, upload-time = "2026-10-08T14:42:19.255Z" }, + { url = "https://files.pythonhosted.org/packages/68/b7/c6a3fec4d6950fdbb7baf27fb334e01c7c98ab1be5b1848118dae9f01f22/cachebox-6.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9f7ebe76efa029d31c03665f084e27528c90852d47aeb1e77b8470d1d49c1d7", size = 493914, upload-time = "2026-10-08T14:42:20.993Z" }, + { url = "https://files.pythonhosted.org/packages/7a/36/6cb71def8e4750f9eccded9350c2ec8ee27ca2f8ac4d904df31ad9b94e07/cachebox-6.2.8-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:92375d8989a532ae19f17742b567a4dc66ac443f194a716584738344f71dbf24", size = 500768, upload-time = "2026-10-08T14:42:22.549Z" }, + { url = "https://files.pythonhosted.org/packages/4d/0a/e3dce4a033c4fc5978c6f8c063c45cc8294d683ef0fd34afb8119c801831/cachebox-6.2.8-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2f6e1e64f2e396de6c8c22ae6e4551cec605703f6a9b1ca68b392eab3a75260b", size = 522318, upload-time = "2026-10-08T14:42:24.024Z" }, + { url = "https://files.pythonhosted.org/packages/c9/6d/f28bf4bf37eb9aa54b4a2f13705a69be79587ca6fde94d2f780c559db106/cachebox-6.2.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:744add18d9eb56f6710aad6c464759a78ec9fcfa8374ffa26acce39b1ad9ac1f", size = 650957, upload-time = "2026-10-08T14:42:25.51Z" }, + { url = "https://files.pythonhosted.org/packages/7c/79/50d525ce50d677044d98aa277652ea9f7cf09ebea9fe3e38d2703d83ceb9/cachebox-6.2.8-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d3937f637cf4eae7ce424e90a3ba52491b69ea790c1726817b23dcbe86ab5701", size = 770179, upload-time = "2026-10-08T14:42:27.24Z" }, + { url = "https://files.pythonhosted.org/packages/46/d3/de7da73a823abcd8f6148cca5881121962716aa1d01a19e43304254e7aff/cachebox-6.2.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:dcee00c451ca36d20f6b2fbd850026847239be408da89a3f111c0e7d894658af", size = 737928, upload-time = "2026-10-08T14:42:29.035Z" }, + { url = "https://files.pythonhosted.org/packages/02/c3/e88e113a9e2128945dbcfe4c350eb25dde396ede30b7f29ecd71f447b456/cachebox-6.2.8-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2daaed9292f851b5e0de110c11ec52f6d3edf2f4cbc011ce706ef099aa86eb4b", size = 675272, upload-time = "2026-10-08T14:42:30.613Z" }, + { url = "https://files.pythonhosted.org/packages/50/a9/bdc7840211d00848684c54c3b62bdf917707aff1631658b59fc42376ab4a/cachebox-6.2.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd4a460e051e0eb5f43c791fea2c7127d11e32ae3a70b9da348a40777f2f3265", size = 707713, upload-time = "2026-10-08T14:42:32.411Z" }, + { url = "https://files.pythonhosted.org/packages/55/aa/4f36fc3c63daca6cbf62b6a793a614569d025ba1864ffbed984b2b93b438/cachebox-6.2.8-cp312-cp312-win32.whl", hash = "sha256:cc197b2925a3ea5829d29d8227dbcd04ce0a5a575ecb461cbc0c6147220dd685", size = 363254, upload-time = "2026-10-08T14:42:33.971Z" }, + { url = "https://files.pythonhosted.org/packages/d3/8d/867e2ff958078aad0775b3f6aa2a0887c2a29eb04aeb1b37492f80029ceb/cachebox-6.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:f8771be3e836dfde8259f56c61c8bb88ec91338354ddaa35bf4e977fda658f00", size = 377221, upload-time = "2026-10-08T14:42:36.024Z" }, + { url = "https://files.pythonhosted.org/packages/f6/4a/0aae539c4330aa5de051fb44f660aa1643079f8012eac200fccce3ff9859/cachebox-6.2.8-cp312-cp312-win_arm64.whl", hash = "sha256:00cefa3ac0bea65711c8ed242af43f08d2390621694da8828e6ad2d3103ad888", size = 356402, upload-time = "2026-10-08T14:42:37.565Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7a/2788b67eb91eb110abeced8a0c40e3ce00240e0511a78174a87cd543120b/cachebox-6.2.8-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1146b15035a988d220fd6538168b5b33c7f9ad2a3c2dc80936858fa32115f8a7", size = 476788, upload-time = "2026-10-08T14:42:39.342Z" }, + { url = "https://files.pythonhosted.org/packages/77/f7/2c4037c759ab2870218552e37a6b847baa7657abfcef62f64e5ebbb7c79e/cachebox-6.2.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:adee30814f22358ad5e48237b1bcee59d50feb0f9e7a3c60c46a558f9699118d", size = 438142, upload-time = "2026-10-08T14:42:40.87Z" }, + { url = "https://files.pythonhosted.org/packages/42/e2/261b3134a43f8a0632a3b28db46d9249fb299198405a0db41fb944625474/cachebox-6.2.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a5ade134d12724ca3b38d6c552b5e57d6bc73afdda9f2ee4cd2b4e958c1dac4", size = 472413, upload-time = "2026-10-08T14:42:42.395Z" }, + { url = "https://files.pythonhosted.org/packages/b9/55/305c6d1636b187169eb81562c68b6619609fb3d7602901a72b6a5997ee84/cachebox-6.2.8-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f194e11a328988b4b8c9501ffa50473acf2eebe9ae016d36cbb139ff278c57", size = 492183, upload-time = "2026-10-08T14:42:43.994Z" }, + { url = "https://files.pythonhosted.org/packages/ab/f8/0450c9c1188faec8df02af5f5d25f0d5dbfda95a2880e6b864a5e9cf35b0/cachebox-6.2.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0d80d734ecf30cbf8f539a83d67e2623517d51daa05be698b10b1baac57aed47", size = 520472, upload-time = "2026-10-08T14:42:45.494Z" }, + { url = "https://files.pythonhosted.org/packages/29/87/d88a4c4bbdaba2296e002cba31f7587eb411eb708ce9adc092ed0b48aa3c/cachebox-6.2.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97a8a88dd648565d6f93d3e41dfb57f82792432bec257ec10ceef570b48eec99", size = 537100, upload-time = "2026-10-08T14:42:47.028Z" }, + { url = "https://files.pythonhosted.org/packages/ce/24/dd5e38cbe0a25efc886d096223261de1bf8bd4a132a3c3ac865c57c5ecce/cachebox-6.2.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:899b8fc4fbe762631a1c543be96ae77d79dddf1bc4e12ca38e2494faeabe52a4", size = 493750, upload-time = "2026-10-08T14:42:48.639Z" }, + { url = "https://files.pythonhosted.org/packages/d3/40/053c9cb37cd217d52758b98e85d939644b4de37853dfd4ac555bb6dc078c/cachebox-6.2.8-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:38fafc680b399926bb9f97e8e7c1b967bca26fef7c1b31f97402a9103fd9909f", size = 500458, upload-time = "2026-10-08T14:42:50.246Z" }, + { url = "https://files.pythonhosted.org/packages/36/2e/70c28b0bbfec930669498dde7795c6db7b23b77b2a17bd6286f68ec4f29f/cachebox-6.2.8-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d79d567d1952a4a366aac79e7e35b36ce217dae6bfc5fdab43d5741c065e7519", size = 522301, upload-time = "2026-10-08T14:42:52.031Z" }, + { url = "https://files.pythonhosted.org/packages/25/d7/ea8dbf5e19516ac2226708aa082a06385eebddd8c26c8d87b638aaf740aa/cachebox-6.2.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5dc12894483ea8ca28c9cf5b5b9ae29a73ff0658772cef04d586d243cbac9f8d", size = 650957, upload-time = "2026-10-08T14:42:53.541Z" }, + { url = "https://files.pythonhosted.org/packages/71/2d/0c8b3a788747920001eaf08094981c0d46c223b7fa2f0bb507edad7d5e0f/cachebox-6.2.8-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:5b3d39d3a915213a32ce4e4869dc63a6814d4229ce825d78f3921a550820286e", size = 769128, upload-time = "2026-10-08T14:42:55.128Z" }, + { url = "https://files.pythonhosted.org/packages/5c/50/eb50fc11156e6ca1149ce8862e2cf18e7c192535dd131ee266ac8dd2d3dc/cachebox-6.2.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bd68711b46a3af3efd0c463337fa6ce74c830faf0cad15e1719ac790da44825e", size = 737374, upload-time = "2026-10-08T14:42:56.615Z" }, + { url = "https://files.pythonhosted.org/packages/c8/de/2237158d9b3a04e0a9ecab9da8e4a13ee95cf1ae1cf48667737efdbaf376/cachebox-6.2.8-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f9cdcc6e94ba7842e4a4b53850f4ffbffc7c3864a4b8a2b51899bc66482989cc", size = 674857, upload-time = "2026-10-08T14:42:58.179Z" }, + { url = "https://files.pythonhosted.org/packages/dc/4c/fdf61d82b829446c4d168b6a281aa0012ff556e589836c2911b72776dd00/cachebox-6.2.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eb65da6b2c5d0268a8d539997b9348b5fa3f907b6f4870662ea9a071b3cfdeb9", size = 707651, upload-time = "2026-10-08T14:43:00.1Z" }, + { url = "https://files.pythonhosted.org/packages/0a/3f/7733f73ff62a98eca064ec6d81fd62167e4855c310a5f75f5a289bdd8b06/cachebox-6.2.8-cp313-cp313-win32.whl", hash = "sha256:709f09bf72f700e69d183312d1cdc68242f98fed5cd1c75c78476a8a3f8b5597", size = 362228, upload-time = "2026-10-08T14:43:01.769Z" }, + { url = "https://files.pythonhosted.org/packages/e5/76/9d0c6201bfc30c8c0d87588d3b0efa519da80a27ce40dcd66cf3cc29f42c/cachebox-6.2.8-cp313-cp313-win_amd64.whl", hash = "sha256:2d557ee496fc12671f5ec1fbc24371b66d4e081ea67c123a1cefeff8e9a334ec", size = 376908, upload-time = "2026-10-08T14:43:03.33Z" }, + { url = "https://files.pythonhosted.org/packages/60/6a/48a0bfcd37830bf32fe16c2705b0886d9a4a0f0b18cb680fab969a5010fd/cachebox-6.2.8-cp313-cp313-win_arm64.whl", hash = "sha256:4da70b39fb5d3c1968017cd6afb5ca1df3455fdbc6a71959aa4bf731c2af89e5", size = 356151, upload-time = "2026-10-08T14:43:04.797Z" }, + { url = "https://files.pythonhosted.org/packages/a0/f1/30ab8568fa9c18b2450df57b52b30507f13938c55c990803018d944e8bcf/cachebox-6.2.8-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:fce37f09b64f92f95bfda3698400d46165215554390b96d22fe094fa56b9ac73", size = 472774, upload-time = "2026-10-08T14:43:06.517Z" }, + { url = "https://files.pythonhosted.org/packages/d8/c9/79a46b78588025617fa29b3e1dfe60984b7a3e62612853e609633cb3279c/cachebox-6.2.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:f549007e7b6d37233b2555245653c37c7f639240badab8b89e2a897ce9546e10", size = 434715, upload-time = "2026-10-08T14:43:08.277Z" }, + { url = "https://files.pythonhosted.org/packages/71/d9/119dd41996653087262451d69c42bf815537671205b74c0d1751548e19ad/cachebox-6.2.8-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1de0694b84320afaebeca9adad2c25774c92d7d2b4b028132393f126567df81c", size = 472408, upload-time = "2026-10-08T14:43:09.92Z" }, + { url = "https://files.pythonhosted.org/packages/8d/26/0f8ab667526b871530b76985189941de00e2b8317af4acaa6b37dfa8fe39/cachebox-6.2.8-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ecddb6d22c803f57e1e400ce0a0c6516294bdf1440081fffe17a6b8090d024a0", size = 490885, upload-time = "2026-10-08T14:43:11.719Z" }, + { url = "https://files.pythonhosted.org/packages/b1/9f/a0db342297d04e3796e5a99deef03a34c02f30e946f43a0cf618c69e11a6/cachebox-6.2.8-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6ba4ac77dd05188b0cb698a168f5395dc74c29c99aab116a38c0468be46fb76", size = 520023, upload-time = "2026-10-08T14:43:13.501Z" }, + { url = "https://files.pythonhosted.org/packages/3b/eb/762b187734a3329d001d03bfce013c2bd3839a597b1bba1442f07201eca0/cachebox-6.2.8-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f228e78c0452a90647bb4e54f25fa3282ac165ba19f9c8a1df2d2d565d1bb675", size = 538603, upload-time = "2026-10-08T14:43:15.083Z" }, + { url = "https://files.pythonhosted.org/packages/2b/07/910d6a1075f1898626fae589dc60675c661789c8d7eda68c81037dbfd629/cachebox-6.2.8-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de9be77c4b683bc8b51e911a4ce5e5dc2dbe6da4f6ef4ad24e55b66a00a4ea7e", size = 494305, upload-time = "2026-10-08T14:43:16.765Z" }, + { url = "https://files.pythonhosted.org/packages/50/32/b7478b8ef9d95dfd8b5c059baac3faf98307987ba703f8ed4da9d64d8da6/cachebox-6.2.8-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:a5e4d6422b2fccb2044e3af3039cd945d6a8b68238c7351f2ede94ebfccccb78", size = 502789, upload-time = "2026-10-08T14:43:18.443Z" }, + { url = "https://files.pythonhosted.org/packages/a6/6d/64364e13c4e510c7cd189e393baaac4cbb887aa7abfcb726134d3a740cb8/cachebox-6.2.8-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:708b11d9566fa84027c9886d5607e21ed8ab0e905c7c241e87269e95ce5e331d", size = 523366, upload-time = "2026-10-08T14:43:20.078Z" }, + { url = "https://files.pythonhosted.org/packages/25/9f/ddedec2f9ceb6db5794cf9002ec761bb93b153156d903b3582598cfaff65/cachebox-6.2.8-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:3886a87754e8c8e44228ea244f6c403d694e75e6d4106181291ae054449e8dce", size = 651097, upload-time = "2026-10-08T14:43:21.773Z" }, + { url = "https://files.pythonhosted.org/packages/17/4c/9404be73d0c61263b928196b340eb8516a4d3414184849197dd77ce2a46a/cachebox-6.2.8-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:171083b3c2ab43eef2bce6b37c87241c391517281e901d9f2124ab1c71869b87", size = 768180, upload-time = "2026-10-08T14:43:23.645Z" }, + { url = "https://files.pythonhosted.org/packages/a8/0f/da7766f663ed912c9692e0e59081384844dc34f49c6cbd43216ee4823317/cachebox-6.2.8-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:5727c5e447e26b255a56ee7944ca57c0cdc82d8a27058ac61b5b3874c3211acc", size = 738119, upload-time = "2026-10-08T14:43:25.746Z" }, + { url = "https://files.pythonhosted.org/packages/88/6b/a542349c69bbae7b52342d8123987c72c3db7384c9a716adb369ce549ba6/cachebox-6.2.8-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0dc4db9245d2c486ecc86b4d1d31babd498963570650910b540931ec296f7e34", size = 677598, upload-time = "2026-10-08T14:43:27.988Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1c/60d27a10d5960dc2154424ddcf0d0a334d9bb5a466625bec9cdde3a8892b/cachebox-6.2.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:0a2f58dbb99272828e8840e2f6dc1dfc89c98df588bec11d64651cd66c14a115", size = 708396, upload-time = "2026-10-08T14:43:30.244Z" }, + { url = "https://files.pythonhosted.org/packages/36/e6/23525c46e122b856e86e5b598ef6fd35e82bf90cf6bc8b87e73ab78377c7/cachebox-6.2.8-cp314-cp314-win32.whl", hash = "sha256:15bd26b9611e9aeefb6a100cfbc59b5025131966678a262b40ea7c296503c5d4", size = 355610, upload-time = "2026-10-08T14:43:32.013Z" }, + { url = "https://files.pythonhosted.org/packages/e7/80/f724161ea6638d41a654477c23b5e18f817c6cd5282ca41e2a6265c32c7b/cachebox-6.2.8-cp314-cp314-win_amd64.whl", hash = "sha256:f496ed837804f49dcdf92a3f3d0b8a368dcc5d00178fe836b56aee6766f1b67a", size = 367613, upload-time = "2026-10-08T14:43:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/02/bb/4b626e1553b3263276505aea7342fe53a5eac0ed5d87594c732b00a1585b/cachebox-6.2.8-cp314-cp314-win_arm64.whl", hash = "sha256:54e7fcf1b5a4b22fde4b6ecc003d61a462e740b977c13b4ea038e30d49e73109", size = 347444, upload-time = "2026-10-08T14:43:35.264Z" }, + { url = "https://files.pythonhosted.org/packages/58/77/a1ba8bf4d4fc133e20d96ce75ce072137aebfba1499dc993490266c1baec/cachebox-6.2.8-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:f8d4f9c28f67a9d6c28b297ea9915f3c4773a8925dbefb44a273452702590505", size = 459187, upload-time = "2026-10-08T14:43:37.165Z" }, + { url = "https://files.pythonhosted.org/packages/ca/9d/726ad082639e7f2ef670d52cc2a301ed0a3f90e6ad78956740fc42671801/cachebox-6.2.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ae4aafa728e7084a86f18463480889387d76dac94621b3e5049861a707b96038", size = 424210, upload-time = "2026-10-08T14:43:39.719Z" }, + { url = "https://files.pythonhosted.org/packages/16/37/3edb3062e09f38beead6b37d874fa04280373ef0b0b9dc5758e6eb1ca022/cachebox-6.2.8-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:941a3b14b269236da25938667e4bc590d52c26819029e5459d81125ba0ac7441", size = 459463, upload-time = "2026-10-08T14:43:41.401Z" }, + { url = "https://files.pythonhosted.org/packages/9f/89/72059617b059fdc76e4666f4943ef5cdf3d7a9791f55a045c86f10178783/cachebox-6.2.8-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1723cf5592e14c4059d44c5cdcc9fd993afbd2892edcfcd8e776c5d4422377d0", size = 481955, upload-time = "2026-10-08T14:43:43.054Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5c/47278513097231fabfcbcdc700dc4c5f883533b6e0983f8ca51430480aea/cachebox-6.2.8-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9f83a03c2ea4fdb93495ea54a7e7ee66ab89bd957c0669097280dca75b73762c", size = 512231, upload-time = "2026-10-08T14:43:44.767Z" }, + { url = "https://files.pythonhosted.org/packages/69/b1/13cf0d5ceb1a03d5a4b54435c821887640ac24e52481b06aeed8183f1fe8/cachebox-6.2.8-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a73a3e78cd3a3753c01b4718c5a7d2f81aafb1ad4e73518844acb680957df501", size = 527050, upload-time = "2026-10-08T14:43:46.696Z" }, + { url = "https://files.pythonhosted.org/packages/9e/ed/0931d10dfef8fee8e271d0e469dfb888c439cada44b31653118c8ae3eb93/cachebox-6.2.8-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:264a75eafe16a030013b54f80f7ce4893748e224763eb251442995fb299f48a4", size = 482972, upload-time = "2026-10-08T14:43:48.315Z" }, + { url = "https://files.pythonhosted.org/packages/0a/52/4cfe453ed67d68f662ed7b4b9afc233db3258f172cf051afe676ddb772c9/cachebox-6.2.8-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:0780b8c04d1debe12da8c2b3ff2266e982ea5564e605c7fd81c6ca550c4f09f2", size = 490176, upload-time = "2026-10-08T14:43:50.216Z" }, + { url = "https://files.pythonhosted.org/packages/d4/15/b01f452093f3970ce4ccbaeaefd708ef0112aa3305b7533ac5f9fd0f8fe5/cachebox-6.2.8-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c45b9a1dad4c3d6a0a1aa90d1b087be035c433b1b33ce07e245f2b4d8ce88a18", size = 510412, upload-time = "2026-10-08T14:43:52.487Z" }, + { url = "https://files.pythonhosted.org/packages/9d/61/d854b668d3c489959bbec57623d7725bbf95f12948da27b8879cd72147b3/cachebox-6.2.8-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0c70f05e3489be9ab910fb523b23a98ed6df72eade47fb0997cbd2a72d5ddc36", size = 638708, upload-time = "2026-10-08T14:43:54.342Z" }, + { url = "https://files.pythonhosted.org/packages/88/ba/a5fc89ca05dac5f18aad2defc26524a94bbf6a508006511fdfb2bc729379/cachebox-6.2.8-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:85bc0b21163619d7fff669a7391f4722cc45af200eed90699ef1659093391c56", size = 758220, upload-time = "2026-10-08T14:43:56.025Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c5/6e450ec2a14b99c443718cd1b5dbe430ab8c98e934d08302cf65ed6faac8/cachebox-6.2.8-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a60cd3f6444b10230fec79dd27588b5ae7f814d385ff9979667eb71a80e4d814", size = 724422, upload-time = "2026-10-08T14:43:57.957Z" }, + { url = "https://files.pythonhosted.org/packages/9c/72/172c08087c9edb809e5395d21d2a9784739a46cab7c1e3f2285d2a4b49ce/cachebox-6.2.8-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8861bc01a56f8d88075276f1246f44f7bf99b7fa030c6e5bbee514b6be677d1c", size = 665409, upload-time = "2026-10-08T14:43:59.701Z" }, + { url = "https://files.pythonhosted.org/packages/62/8a/a19b5ec387ac6dbc0794e9ae994b55657cdbb6d8d40878daf85748f01d4a/cachebox-6.2.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:77a8c884c4758fb7cc23b8d48fd031ee45c80cb1d672e9aaf7c9bda5306d92b1", size = 697475, upload-time = "2026-10-08T14:44:01.681Z" }, + { url = "https://files.pythonhosted.org/packages/05/65/bdab643adae4b490a3ac950990714f667b1517b5bb9e353a55cff44d31d1/cachebox-6.2.8-cp314-cp314t-win32.whl", hash = "sha256:e7da909732abaa602a2e21653b79c6da15330cc102a744505d5e3d5a46a83136", size = 343674, upload-time = "2026-10-08T14:44:03.556Z" }, + { url = "https://files.pythonhosted.org/packages/30/f0/b0c030cc9fa957652c8c10ce675f9cd943e0405269e51e02490de806d0fe/cachebox-6.2.8-cp314-cp314t-win_amd64.whl", hash = "sha256:bf449a53e108084fbf1286c7d8169184ff5fa1510226b562b9b1a9f0db93598c", size = 357145, upload-time = "2026-10-08T14:44:05.371Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/82c70c345dea5322857b51012a042bea380f3893744ad168700af4224e77/cachebox-6.2.8-cp314-cp314t-win_arm64.whl", hash = "sha256:8539212301d3abdab899bd029066813672d46d36ac98155d9f8e93c12da45a5b", size = 337691, upload-time = "2026-10-08T14:44:07.069Z" }, + { url = "https://files.pythonhosted.org/packages/51/20/82f0f5a98b309ab667bc9a6d2427370c37d59b9ba24b2f80a6205c9a2773/cachebox-6.2.8-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:cadbc57fc4fd3ba055d3f1ec40d287f23d4bf17e768add65d27e75b7fff019e3", size = 472631, upload-time = "2026-10-08T14:44:08.76Z" }, + { url = "https://files.pythonhosted.org/packages/31/e4/69afc9ea1cad017d2b3a7ce527127577c6834190649b1c1beaed0e358e4c/cachebox-6.2.8-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:cca85bb336e767bc334a394819b8de5ad244ec4e3c4bf7cb0c514e4d6b95b4d5", size = 434673, upload-time = "2026-10-08T14:44:10.616Z" }, + { url = "https://files.pythonhosted.org/packages/fd/31/89dde42f71c2d7fc9149e4ed1300fe1e7aaf80622049dcead56c27c20b92/cachebox-6.2.8-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ecebf6d7c40d14d94e0a5728be81183c4acfc19351110921709e15ceb328e30", size = 472344, upload-time = "2026-10-08T14:44:12.575Z" }, + { url = "https://files.pythonhosted.org/packages/24/33/a85fb13c578723081f56f3d905a31262346f4d9f75249de6fbd42366a797/cachebox-6.2.8-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:365a09994226222d2d5fdb0f24ff8bfc09f6ae0f5ae6f2e152cc079efced50b5", size = 490980, upload-time = "2026-10-08T14:44:14.333Z" }, + { url = "https://files.pythonhosted.org/packages/2c/94/44ee3a764ffb7e0235cb7d213f0503b22b594f154799be904236adc21e69/cachebox-6.2.8-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60bac0dd1952b1b1a87edad85f426ba0aad9f7039794e2dc01006b717b89f8b5", size = 519719, upload-time = "2026-10-08T14:44:16.237Z" }, + { url = "https://files.pythonhosted.org/packages/03/94/14ad8fcd95b689c9c525f2b0b3dcf0588df45d33d4d8e410124cf8720a42/cachebox-6.2.8-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc1d3e75d87f333bc50d75254289095811f56d3a35f835acdf25bbcdbe1db6ae", size = 538220, upload-time = "2026-10-08T14:44:18.031Z" }, + { url = "https://files.pythonhosted.org/packages/8d/bc/296b3051405bd33551a3ea53d3003c6f10fdc606961503cac010cf8cfa39/cachebox-6.2.8-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565be3fe11b293d690202996ff37c3174b9c8cf9e2320ad0d2fb14929eecc2a1", size = 494061, upload-time = "2026-10-08T14:44:19.909Z" }, + { url = "https://files.pythonhosted.org/packages/85/5e/6368e51183a7443515990090daaca622ba5419602fddaac91c301281b60f/cachebox-6.2.8-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:f9b6c197736c29a311f80c95e44f55387e1b6d976a85bfbcb85396ae4dfc9d44", size = 502568, upload-time = "2026-10-08T14:44:21.992Z" }, + { url = "https://files.pythonhosted.org/packages/4c/d2/cf6c9887033c6f958473a815e467abdc916183ea777f9611ce6b2bcdb930/cachebox-6.2.8-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:601270f2725b0953c1e341f32dd0169fb4c3de64f278b116c645c88171e7614c", size = 523517, upload-time = "2026-10-08T14:44:23.791Z" }, + { url = "https://files.pythonhosted.org/packages/d8/22/dea0a1491f023835cfaee98905ffc8c21b8d2a1577b061f1071ac64d4b4b/cachebox-6.2.8-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:73cfcee3a4571370d69743b955a63fa2259795068ba9e39216604750454bde3b", size = 650771, upload-time = "2026-10-08T14:44:25.896Z" }, + { url = "https://files.pythonhosted.org/packages/b3/e7/3a3ff496fdb265170f4e57306b1ae7fe818634c5761bb857ab42c6ff144c/cachebox-6.2.8-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:91a3963658da235484deda24f103f13874dc1a5c501a49cc481b877274105f67", size = 768301, upload-time = "2026-10-08T14:44:27.65Z" }, + { url = "https://files.pythonhosted.org/packages/2e/38/533f8e085a8baf2d9419e7c176089fed5fa2a78f3ef9aa81bff856230060/cachebox-6.2.8-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:41ef099fb645bd11a9045e6bbe45d93addf3dcb5ebb659a6445b5923a63fd0df", size = 738310, upload-time = "2026-10-08T14:44:29.501Z" }, + { url = "https://files.pythonhosted.org/packages/85/77/9f70d348a711d3dfaf7f92ab20084454832b0a4fe8b3595a481c6512acf8/cachebox-6.2.8-cp315-cp315-musllinux_1_2_riscv64.whl", hash = "sha256:00515ab7f1e1c8f9df8567854293bc910b9e76320017299a5f20140d9ef32c3d", size = 677420, upload-time = "2026-10-08T14:44:31.58Z" }, + { url = "https://files.pythonhosted.org/packages/42/d3/d2b999345af2a58b1070eccb82d40c206d305792654e152a95d02b37c257/cachebox-6.2.8-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:ecd0e418e0b8115e928a13cbf728f4838cd81a855052b8c05649bb06e9eb1770", size = 708332, upload-time = "2026-10-08T14:44:33.618Z" }, + { url = "https://files.pythonhosted.org/packages/eb/f1/fad9ef84324d1f5b3db241e07aa931fffd759cc45c2d4531d6048613db8e/cachebox-6.2.8-cp315-cp315-win32.whl", hash = "sha256:24d05dcdfc3ec6bb921d3fd602e4d28550e873f35c4f4884ad95fe7f02f57bb2", size = 355773, upload-time = "2026-10-08T14:44:35.434Z" }, + { url = "https://files.pythonhosted.org/packages/0c/e6/9a5655bbe33c684d5714372ddbd6b848a8c861aba37e3e088021591f5fd4/cachebox-6.2.8-cp315-cp315-win_amd64.whl", hash = "sha256:4fc769805491e40b4fded39e56578b688df2ada5c686077207dace94185fbe31", size = 367694, upload-time = "2026-10-08T14:44:37.365Z" }, + { url = "https://files.pythonhosted.org/packages/c4/19/d3bd91b9312de738c2d3b6d3512b1215f1a1ae5741ae048fae29f5f32d9e/cachebox-6.2.8-cp315-cp315-win_arm64.whl", hash = "sha256:b3e06a858feff41947989ae51bdba450d640700bb89771130e1a28c1fd26b4c5", size = 347604, upload-time = "2026-10-08T14:44:39.37Z" }, + { url = "https://files.pythonhosted.org/packages/30/d8/92971e69ac6d3e3451bdfd461db38f5b4b70996f90d8e596c8c55d5613bf/cachebox-6.2.8-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:c3165e75531d4dcadd4dcdc3370124b4d24ed17efd013b6d4c2f2c5d0edef8af", size = 459060, upload-time = "2026-10-08T14:44:41.131Z" }, + { url = "https://files.pythonhosted.org/packages/1c/be/de938934bee87bbb5f6f8afe5914179581b6d42c6bb0ccfa674dddaae7c1/cachebox-6.2.8-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:2f6fdb8ee351d1492624c8519eeee7a672e0683e512a7e4f145937cf939031e2", size = 423961, upload-time = "2026-10-08T14:44:43.296Z" }, + { url = "https://files.pythonhosted.org/packages/60/7d/0e92a0fd2b4e0416a71b6b39b27443adf6743fd3025edf4961481ad27310/cachebox-6.2.8-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8309ff6af4db9ebbaabe77ef0a273423e2576ce3a910b2aa2917c46006b22e15", size = 459429, upload-time = "2026-10-08T14:44:45.137Z" }, + { url = "https://files.pythonhosted.org/packages/d8/91/a92f136d9cc654cecda61f897d61e10f77631d4ca42d3481b62099446a28/cachebox-6.2.8-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:265bdf2cc600898df42071f320ed11868cc92a23b3d215324e60d2dbc3b01515", size = 482014, upload-time = "2026-10-08T14:44:47.096Z" }, + { url = "https://files.pythonhosted.org/packages/61/4b/f03b3e09280fc547eab1db58734fe4bde0d419d009bce1d5b46b98a7cbbc/cachebox-6.2.8-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02296c53a41afa3b23e66ffcf7c8e2672193d94d1f535b39cf6d4f747048af0c", size = 512045, upload-time = "2026-10-08T14:44:49.083Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e1/080e00bf92bf9767429720f050a2d735a8949f94356a89dbd9329ec05ccf/cachebox-6.2.8-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a0ff52a4e26b8846bbbda91f9384f0e3b05f625c680c2391bb22b344228e403", size = 526955, upload-time = "2026-10-08T14:44:50.913Z" }, + { url = "https://files.pythonhosted.org/packages/40/2a/0ac5650c175ed924686f0a7cbbb81281106fd58e9ef0b3ba850ede9ead6e/cachebox-6.2.8-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d868cf89628d5f061e8720b5319fe6b91035a388cd07d8f2fbd39607fe88a2cf", size = 482739, upload-time = "2026-10-08T14:44:52.691Z" }, + { url = "https://files.pythonhosted.org/packages/e4/7f/51eea7fc4fca144ce933fb3091a3a0bf10226630490f1e08ca2a3824367d/cachebox-6.2.8-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:e27ece992f7ad4e6e8dd0550585bbbdd83414e13e46e71a8a48abdca05b35939", size = 490072, upload-time = "2026-10-08T14:44:54.749Z" }, + { url = "https://files.pythonhosted.org/packages/5f/b3/ce83df961d76a88e828ede11d5d9675a0b4513e06c9e16b9d39e2f01496a/cachebox-6.2.8-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b2a95bbeb1167434af0be573ef5f5d78b1e52eb1be8f338f19e39c91ffdec6b8", size = 510506, upload-time = "2026-10-08T14:44:56.563Z" }, + { url = "https://files.pythonhosted.org/packages/f9/65/38344471635b35794d499d6233c2302e859d69989a861017e5baac9697f8/cachebox-6.2.8-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:1f9782ba9530b891c4bd46f4141fbc0ed95e605921cb981184a5f63adf9eeea2", size = 638505, upload-time = "2026-10-08T14:44:58.404Z" }, + { url = "https://files.pythonhosted.org/packages/c7/fe/e6bd2a874ea108fad32ac5d4f418fd6273fd2cc930623fb8b657fa451398/cachebox-6.2.8-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:4f43541b3f3ec545b6615f6eff6dd957aa4025de7cf3558a865712dac062453b", size = 758323, upload-time = "2026-10-08T14:53:02.033Z" }, + { url = "https://files.pythonhosted.org/packages/f3/89/1f8a524b427ee3103fa4c64aa3f41910049a19aeee28ac791eca7ae1b39d/cachebox-6.2.8-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:e27af8f59f6d3e2e93ef6051a79be110c85a0291a68b50804395e50e2c8ca94d", size = 724635, upload-time = "2026-10-08T14:53:04.555Z" }, + { url = "https://files.pythonhosted.org/packages/fe/48/762598d52a4a088d96ca03a52c4f24d8d1fc8a479a325734610afd660d09/cachebox-6.2.8-cp315-cp315t-musllinux_1_2_riscv64.whl", hash = "sha256:3ba82b2ca30e1285f85e887b01a877402ec0a911cd86dc3a95013e70e58714a4", size = 665313, upload-time = "2026-10-08T14:53:06.409Z" }, + { url = "https://files.pythonhosted.org/packages/d5/82/73ae1ba84fa2771a8ef68453b162476970984fab526d7cf2f6294b5570f7/cachebox-6.2.8-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:c6938e95311ee17606e650ae35d00e9ade8197ecd26af0424fe3ff89b58c2100", size = 697124, upload-time = "2026-10-08T14:53:08.015Z" }, + { url = "https://files.pythonhosted.org/packages/2b/7f/0da3cf45f0f18dbfec7a175784bfa0a861b615ade3ec7f96e3acbf82aca8/cachebox-6.2.8-cp315-cp315t-win32.whl", hash = "sha256:53e51e31362ea3dca2699ab5525a73faba3fc7a61b383deac3cd4258205bae4b", size = 343773, upload-time = "2026-10-08T14:53:09.729Z" }, + { url = "https://files.pythonhosted.org/packages/79/e9/db9c00524b3cb19ca4abef1a35abd262c4414d094dd7235dd7914089d877/cachebox-6.2.8-cp315-cp315t-win_amd64.whl", hash = "sha256:0ada69afb72e0de3e58d1d6bf180365fa354086b5f4c8e8be64ce7efc515b803", size = 357255, upload-time = "2026-10-08T14:53:11.924Z" }, + { url = "https://files.pythonhosted.org/packages/ec/33/1a8966b038e15b86a5baa30b7956e1465f0b6f053501e3cc6463a255e128/cachebox-6.2.8-cp315-cp315t-win_arm64.whl", hash = "sha256:679197044d65ee365c5720552f728ba3552d1e5c8b62fa1d82247048f54c530f", size = 337794, upload-time = "2026-10-08T14:53:13.876Z" }, ] [[package]] @@ -378,11 +419,11 @@ wheels = [ [[package]] name = "certifi" -version = "2026.7.22" +version = "2026.10.18" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a3/c2/24167ea9858356b47a87a50d39908bfdb72ceeefe0041586e704e5376b3a/certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55", size = 138112, upload-time = "2026-07-22T03:35:12.644Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/eb/a2aa1ac3ea30dd3f30ca57f40232138b6b0040719316ecb85daf61167771/certifi-2026.10.18.tar.gz", hash = "sha256:b9995d97b64d0431a5af837d8ca8cd6238104d1f319f04bd93ea43124d6c861e", size = 135227, upload-time = "2026-10-18T16:21:07.655Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/a7/71ac2cff56fec219ed242bb11b8efb69fcc4bec75db06fb7bfe35de520e6/certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775", size = 136983, upload-time = "2026-07-22T03:35:11.276Z" }, + { url = "https://files.pythonhosted.org/packages/08/ba/95dd616042484f7c83a06974388b37b837732740ee70bc5dc715b5fcd55a/certifi-2026.10.18-py3-none-any.whl", hash = "sha256:73191c47aaa79da394e8fee2dbc2ec827432cab56311122c9e47abf79e390f62", size = 134093, upload-time = "2026-10-18T16:21:06.276Z" }, ] [[package]] @@ -634,7 +675,7 @@ wheels = [ [[package]] name = "codex" -version = "2.5.4" +version = "2.5.5" source = { editable = "." } dependencies = [ { name = "adrf" }, @@ -698,7 +739,6 @@ lint = [ { name = "djangorestframework-types" }, { name = "djlint" }, { name = "icecream" }, - { name = "mbake" }, { name = "pathspec" }, { name = "radon" }, { name = "ruff" }, @@ -714,6 +754,7 @@ test = [ { name = "pytest-asyncio" }, { name = "pytest-cov" }, { name = "pytest-django" }, + { name = "pytest-xdist" }, { name = "rnc2rng" }, ] @@ -723,7 +764,7 @@ requires-dist = [ { name = "asgiref", specifier = "~=3.12" }, { name = "bidict", specifier = "~=0.23" }, { name = "channels", specifier = "~=4.2" }, - { name = "comicbox", extras = ["pdf"], specifier = "~=5.3.1" }, + { name = "comicbox", extras = ["pdf"], specifier = "~=5.3.2" }, { name = "cryptography", specifier = ">=48.0.0" }, { name = "dateparser", specifier = "~=1.2" }, { name = "django", specifier = "~=6.0" }, @@ -742,7 +783,7 @@ requires-dist = [ { name = "loguru", specifier = "~=0.7.3" }, { name = "nh3", specifier = "~=0.2" }, { name = "packaging", specifier = ">=24.0" }, - { name = "pillow", specifier = "~=12.0" }, + { name = "pillow", specifier = "~=13.0" }, { name = "psutil", specifier = "~=7.1" }, { name = "requests-cache", specifier = "~=1.2" }, { name = "servestatic", extras = ["brotli"], specifier = "~=4.1" }, @@ -773,16 +814,15 @@ docs = [ lint = [ { name = "basedpyright", specifier = "~=1.38" }, { name = "codespell", specifier = "~=2.4" }, - { name = "complexipy", specifier = "~=8.0.1" }, + { name = "complexipy", specifier = "~=8.1.0" }, { name = "django-schema-graph", specifier = "~=3.1" }, { name = "django-types", specifier = "~=0.22" }, { name = "djangorestframework-types", specifier = "~=0.9" }, { name = "djlint", specifier = "~=1.39" }, { name = "icecream", specifier = "~=2.1" }, - { name = "mbake", specifier = "~=1.4.5" }, { name = "pathspec", specifier = "~=1.1.0" }, { name = "radon", specifier = "~=6.0" }, - { name = "ruff", specifier = "~=0.16" }, + { name = "ruff", specifier = "~=0.17" }, { name = "ty", specifier = "~=0.0.18" }, { name = "types-python-dateutil", specifier = "~=2.9" }, { name = "vulture", specifier = "~=2.3" }, @@ -795,6 +835,7 @@ test = [ { name = "pytest-asyncio", specifier = "~=1.0" }, { name = "pytest-cov", specifier = "~=7.0" }, { name = "pytest-django", specifier = "~=4.1" }, + { name = "pytest-xdist", specifier = "~=3.8" }, { name = "rnc2rng", specifier = "~=2.7" }, ] @@ -809,7 +850,7 @@ wheels = [ [[package]] name = "comicbox" -version = "5.3.1" +version = "5.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bidict" }, @@ -844,9 +885,9 @@ dependencies = [ { name = "xmltodict" }, { name = "zipremove" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c7/06/ca3834b40102d4c366951cb249d86a04363532acb767d67bfb9d5d432767/comicbox-5.3.1.tar.gz", hash = "sha256:7991b868c69325e90b35b5a76658a953c9c290178e2d10d6f995be67a70ec54e", size = 1292543, upload-time = "2026-10-07T04:18:05.074Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/ed/29b03680e8f12c27b32fcf89df46b81038374a2ecf594451c9e513647d57/comicbox-5.3.2.tar.gz", hash = "sha256:c88f1863dde9cc4539dc680eaa4d0cb00dc8906d6b9456112e20518654adb0a4", size = 1348264, upload-time = "2026-10-19T02:15:46.142Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/d5/a25d912358f6b2899e35216716d31dcfce539d25a2045f5aa28c33751fdb/comicbox-5.3.1-py3-none-any.whl", hash = "sha256:871950bf0baa664778cce0a119f7b074c007f800910e4ed229969dac4f1d15e3", size = 484073, upload-time = "2026-10-07T04:18:03.367Z" }, + { url = "https://files.pythonhosted.org/packages/ad/83/90567e7463a3203de0e21bfc0c9266c297212ab4d97fc39c025ae0a151da/comicbox-5.3.2-py3-none-any.whl", hash = "sha256:681cc802606fd7365928c276a7b657027c74bc1380a0e02b311eb53812e5b210", size = 484612, upload-time = "2026-10-19T02:15:44.569Z" }, ] [package.optional-dependencies] @@ -882,58 +923,68 @@ wheels = [ [[package]] name = "complexipy" -version = "8.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/80/4b257f04a98dd74c7a40c39ae83a156f498d5a12dedea7f6609ef019d1c7/complexipy-8.0.1.tar.gz", hash = "sha256:1739c0781a50ae590eaa74d6362c505b8a6b3a5a87e1a3599f4790a84f6d3331", size = 106091, upload-time = "2026-09-07T02:29:01.455Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/f4/ab2176ae2fdff0c1ddc72403bceec496c024627f086034140cc644f7c3bb/complexipy-8.0.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:2cbbbf19cf30f39f448a7b02c6282bc04c51b34395471b63f021df9f52ee5717", size = 3542301, upload-time = "2026-09-07T02:27:05.319Z" }, - { url = "https://files.pythonhosted.org/packages/7b/8a/4203456eaf03df0841e58a32d0570c4249f44d66970eaacf344716b1de3c/complexipy-8.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fbc3459637960f6ca31fc322a6d4b07698056a8334dc35cbfec6406d4b74aa59", size = 3460161, upload-time = "2026-09-07T02:27:06.745Z" }, - { url = "https://files.pythonhosted.org/packages/29/ce/da6d07738a4c8e46a00f484ded83657cb075b6d7e609714e23733a2df340/complexipy-8.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddb75b0694e0a8b34997c4ecd5e4936801ca1c1b6d1f18f71ba3148dcfd78152", size = 3760449, upload-time = "2026-09-07T02:27:08.149Z" }, - { url = "https://files.pythonhosted.org/packages/bd/29/11d9fe6f4e1800f0a4825390e77e4a5249e01c755e9a646aef4bb200ab17/complexipy-8.0.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a0af73d6be68ee7d28cc6b24c2db690007ec32b72b446a7979eaffd5c043a6a9", size = 3669265, upload-time = "2026-09-07T02:27:09.466Z" }, - { url = "https://files.pythonhosted.org/packages/48/99/04af6de3abadbaccc010eec23569bd2f825f8a2fc12cfa07ba88cae20e06/complexipy-8.0.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee53158bcb54e28b0b6cab75bc15b11154c8709c2a1886021dd4a7fed15a4e55", size = 4023208, upload-time = "2026-09-07T02:27:10.656Z" }, - { url = "https://files.pythonhosted.org/packages/29/60/f49d80e2a662a8551ec36cd5b75b0ad73fa39dcd37686a18595564cdde35/complexipy-8.0.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8c36e1b97052146eb8a153761d75363d07f5d70a530f8dca0a3eb7874e387c2f", size = 4263573, upload-time = "2026-09-07T02:27:12.217Z" }, - { url = "https://files.pythonhosted.org/packages/e0/ce/1ccffc9e51e518e12f1ea5b644cc1c24f90d55bea2398dc1124e9da4fd04/complexipy-8.0.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57caa8d5990e9c44a67bfe516dc69b10593c06c242cc06262ee77ede1212a2ad", size = 3860031, upload-time = "2026-09-07T02:27:13.732Z" }, - { url = "https://files.pythonhosted.org/packages/29/34/a6e9811a4fd11c839af9efc39441e8482919603fe220884c809ec9bd2263/complexipy-8.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74ec44cb9989289af04ae73d2c9fe64e8f78b2ca2129cd17cae10f9196a35b01", size = 3777806, upload-time = "2026-09-07T02:27:15.213Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f1/015962ea8b8b1eb065a362ebf95ce86654560d63135aff494c3babd9c9a8/complexipy-8.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:60abf030e2266fdc2b14d39c50216ed4630f39377e9cbc52c674eb651c74a4e6", size = 3934256, upload-time = "2026-09-07T02:27:16.537Z" }, - { url = "https://files.pythonhosted.org/packages/78/be/066bd2c89ab3432a58a4d986d794edf528ed05e3da19f2eee3e7f2ff83e6/complexipy-8.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cff521c205e408a4e54f72f8764a95ac1c88b23528aef65f0d6fd7aa5d1054e8", size = 4068899, upload-time = "2026-09-07T02:27:17.785Z" }, - { url = "https://files.pythonhosted.org/packages/35/d0/4a6d61221fce1f3786ca95c5af219fb209485cc914e3216bbcfecc250ff4/complexipy-8.0.1-cp312-cp312-win32.whl", hash = "sha256:0a7cfb37b22d74984f6367d2f44a15f8d7b861c64bbb42b9950b857c81ae1231", size = 3141893, upload-time = "2026-09-07T02:27:19.539Z" }, - { url = "https://files.pythonhosted.org/packages/aa/fa/3c1de090597af553c5440ced966b6b9fe9e17fe2272e25b1b8369c74b0da/complexipy-8.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:f4554f67546a37cd106039148bd33293b72a62f1251d438260eb62a4f23d0184", size = 3357977, upload-time = "2026-09-07T02:27:20.893Z" }, - { url = "https://files.pythonhosted.org/packages/91/09/84181353a987ea115912f00c509dd6558c951f15755b0d8d4e432953b59d/complexipy-8.0.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:78ee1ba8963cc694ea678cfe43542e5419fd5d2bf89c025ba4e0033bad388b4e", size = 3541656, upload-time = "2026-09-07T02:27:22.148Z" }, - { url = "https://files.pythonhosted.org/packages/92/c5/01944f21f821c2a0237c1d88932427beb7ed913ab9be9f0dabae112a692e/complexipy-8.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e2f12e833fbdc58c4a2d1b651252cd899c8534ab732bd3c142f8387565642b33", size = 3458762, upload-time = "2026-09-07T02:27:23.645Z" }, - { url = "https://files.pythonhosted.org/packages/b6/c3/656737c700e7e36b1a73d8a83f2bcea6445476d6f13be336b164a716ba23/complexipy-8.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc2a8bd0b11c567924c563e884bffdd4d0181c06e2a2710c592296c09ac727b6", size = 3760587, upload-time = "2026-09-07T02:27:25.096Z" }, - { url = "https://files.pythonhosted.org/packages/68/9d/a8cb78a02980a4774a283f53f2feb5c914d66a2431c51d3cf72d1266fb57/complexipy-8.0.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d117f0e255a540e0033cce065f78d77e7e49042e07934b3244e0afd6e314a6ce", size = 3669726, upload-time = "2026-09-07T02:27:26.356Z" }, - { url = "https://files.pythonhosted.org/packages/10/0e/f48a6f8c59852618f217b84c59fe2be17e0339f14b74544d66497a76db61/complexipy-8.0.1-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:63e5f1042f5f01f0333dc4b6a7075fae5818c1fcdcff7f16507024ba780dd594", size = 4020258, upload-time = "2026-09-07T02:27:27.871Z" }, - { url = "https://files.pythonhosted.org/packages/ea/d6/a88977e6f0d9d6f1ae258a6dbcfc3ba82a3aa7d24308dfdb9264e9debbf3/complexipy-8.0.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0671bc6f9e4b0570f84d00e3a946cd5c20e8e363c8559948fa7bb6abfa764f7e", size = 4265975, upload-time = "2026-09-07T02:27:29.182Z" }, - { url = "https://files.pythonhosted.org/packages/8e/09/14062c03942ab9d1d3bcc0d2a004df82075f8dc1eb0586e104a30bccae06/complexipy-8.0.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ec7f01971b6fe12fadc6f2521bd589778fe6b39d5d94521826b0702c45f5183", size = 3860775, upload-time = "2026-09-07T02:27:30.604Z" }, - { url = "https://files.pythonhosted.org/packages/46/7b/299e994137e373c95d0bf83b6f7448617d2b9c6fa97f09a629872922e4e1/complexipy-8.0.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15c15ecb3975586cdacc34f22e79fdc76c5abbaa584a5ce1463253c0ae268429", size = 3777720, upload-time = "2026-09-07T02:27:32.384Z" }, - { url = "https://files.pythonhosted.org/packages/e8/65/bee744993587654c475c45a8764e5fe0dd6971a73ee3b5a2dcc9fb5f4234/complexipy-8.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d42268139220b1001d69f9e23a107c34c3123c68903f1a1c04a3210a327c4f18", size = 3935194, upload-time = "2026-09-07T02:27:33.749Z" }, - { url = "https://files.pythonhosted.org/packages/61/b0/10bc694fb55701fde9a9ab1d01b626985caceb13eb3dc644c04e05fda34c/complexipy-8.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c2a40e9a16b74811fa1aa36ced1ee06dfc9ae266b2864a4838f5d260001bbb35", size = 4068518, upload-time = "2026-09-07T02:27:35.327Z" }, - { url = "https://files.pythonhosted.org/packages/a2/3b/27aa8236795ae96c8a3a8cff58091ced45f2b349969d76226160d097af39/complexipy-8.0.1-cp313-cp313-win32.whl", hash = "sha256:2e04ff05e0cc351e5713632de8c73ea6e388349b1ae7c194b103e4c21e36013a", size = 3142527, upload-time = "2026-09-07T02:27:36.803Z" }, - { url = "https://files.pythonhosted.org/packages/02/de/0c1357282f8bcbd91d8b2e61151525e8d58f385c82f4bdbb3083ece8460b/complexipy-8.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:36e523eb978a5d1e709157de6e774835f3fc5a356426fba359176ba62ae43c24", size = 3358073, upload-time = "2026-09-07T02:27:38.309Z" }, - { url = "https://files.pythonhosted.org/packages/7c/37/7fbe7f421f317fab067f625c78eec621897b98fa8fbf94df0a0bc97ce34d/complexipy-8.0.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:272d577cd63d78e79e65831a24abfcfbf0fde3e8d5117166a431ced8d46cf74d", size = 3544180, upload-time = "2026-09-07T02:27:39.592Z" }, - { url = "https://files.pythonhosted.org/packages/88/1c/1c2ae1b4984e9c0c51bd0eb7c1434abf77c6e5b77c023bbf41bc6546da31/complexipy-8.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c7768b49df0d9c182783d2f6291139fa152ed7b12f4ad6dc6e2c04ed6e278d8", size = 3463407, upload-time = "2026-09-07T02:27:41.125Z" }, - { url = "https://files.pythonhosted.org/packages/3e/27/dac5e35ca9a898d93166115bc0d02688e75ef3d95994584ca50f67f228e6/complexipy-8.0.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:129d67f05e68c3ff8a0c91ff5b3e3de2613e353917062a32c4af4c801db85c22", size = 3761593, upload-time = "2026-09-07T02:27:42.436Z" }, - { url = "https://files.pythonhosted.org/packages/dd/78/96dd713fb3ad1fc82c62cc3c07d86a70f7cca71310413f05b0d79722cf8c/complexipy-8.0.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:da098d19417eb5a0187ad578f21ec72470ed0cb42e04981aaf5e30f9f6947c2f", size = 3673020, upload-time = "2026-09-07T02:27:43.74Z" }, - { url = "https://files.pythonhosted.org/packages/72/1c/acaa17d3bd82a9d1419bae5b8465b2ea1faccb014203b4faf8d421fd6338/complexipy-8.0.1-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2845f6b009c45a8605b04eb9cf953a9deea2f8108befd0157ca328fdbeb1bfa", size = 4022134, upload-time = "2026-09-07T02:27:45.112Z" }, - { url = "https://files.pythonhosted.org/packages/1f/d4/005c6b4295ab76e4653f96cd34328a92887f8dfbb1e1f26e2652fb7fe7fb/complexipy-8.0.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:341a245462ae12437b9ccfc38c84cc6614a13ed66f240b17e0361e3e5e3136c9", size = 4266776, upload-time = "2026-09-07T02:27:46.618Z" }, - { url = "https://files.pythonhosted.org/packages/00/02/38565a24bac55336a068d3e35ce627b38a265f90e4a927b502682037c431/complexipy-8.0.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:41a1eb51401c58292aebc5f882eda005c60c515e7ed0fb54bf52450b300fca08", size = 3860517, upload-time = "2026-09-07T02:27:48.022Z" }, - { url = "https://files.pythonhosted.org/packages/0d/fb/03e028bbcfe318d6ffa9bf9e62db6ae1d2cac020bf62c0ba4e90bdf5b454/complexipy-8.0.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d8f4cc1c7851815b7c0e62e64998230e9683e85801005cdc24ed804bd3e0669", size = 3778659, upload-time = "2026-09-07T02:27:49.587Z" }, - { url = "https://files.pythonhosted.org/packages/06/74/d336ae3cb2a7158a5614bcf36502c8891fa09f4ab26fcf0dac4396877c8d/complexipy-8.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:54299c8c4cb30543406fd1d71c2be7931a138a0ea2e6c9c6cb6174a718415752", size = 3935493, upload-time = "2026-09-07T02:27:51.014Z" }, - { url = "https://files.pythonhosted.org/packages/76/43/3e131de306672acb51d55a00ad3b998e661145f37c8fec5c5e21101b5610/complexipy-8.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:164573531756f23a7b18483f382583a7a0ed7846f768c24ea58d0676edc5c0a0", size = 4068631, upload-time = "2026-09-07T02:27:52.337Z" }, - { url = "https://files.pythonhosted.org/packages/db/09/cbed0adbea910264573521c4ae89105e1e274528c136ee23191fc148c2c2/complexipy-8.0.1-cp314-cp314-win32.whl", hash = "sha256:186194bd2222de285cbc50db31d8d656e3e695f1082371287f22de8fb62f8834", size = 3142992, upload-time = "2026-09-07T02:27:53.829Z" }, - { url = "https://files.pythonhosted.org/packages/16/5a/3f7384cae0304427805a9803ee6484c0789ddaf99edadad477b4649f18c8/complexipy-8.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:438944ee6f25eac4f343175fe6c0386b7c978bf040b52aa2f0ad098bf1606092", size = 3358884, upload-time = "2026-09-07T02:27:55.262Z" }, - { url = "https://files.pythonhosted.org/packages/01/8b/d9cdf0fc8620b2b4b14184eca5e4d509ec271fb020921c71924fba515889/complexipy-8.0.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c34bbe2a0600e539bcde5d7f7df42d61f57a0b390d62c2c7b360d05b4423a56a", size = 3760134, upload-time = "2026-09-07T02:27:56.57Z" }, - { url = "https://files.pythonhosted.org/packages/12/07/5f200127cd9824ab98438262e71eabde5b4a76cce78039eaa6bd334ec5f9/complexipy-8.0.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4dd9fd018860ab94da600d05bcb8853b76883be1d06b062c51bb6fd3bdb5697b", size = 3670662, upload-time = "2026-09-07T02:27:58.397Z" }, - { url = "https://files.pythonhosted.org/packages/b8/03/4770786add33b063991fc61c4c1cfdf586d74aef4b110d4f95098d720334/complexipy-8.0.1-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253a050ac6e5d11f82bc3cd43e2b90dc12ff8e5c6cfe71182fed1539ef0021a2", size = 4019056, upload-time = "2026-09-07T02:27:59.86Z" }, - { url = "https://files.pythonhosted.org/packages/ba/53/9238527697a9180268ba92c168d6335c6a55db35dd5ef73a600c255214e4/complexipy-8.0.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cbabfdc1a695b52181b6f81684f5e235cf33775782698e7c0af685fc3f3334f2", size = 4267547, upload-time = "2026-09-07T02:28:01.14Z" }, - { url = "https://files.pythonhosted.org/packages/4b/a6/ca3629219c390c7a746df87182631519c6ab8edca068e12bd6ce4a06b7a3/complexipy-8.0.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a41c2e46b91679f48749e8540ef94aa678f3888dcde1ebe13f04f79971dfff86", size = 3856857, upload-time = "2026-09-07T02:28:02.498Z" }, - { url = "https://files.pythonhosted.org/packages/11/04/112eb689e054f81289aff7694d25de5b5e38264e57aa81c1a9520ebaeac1/complexipy-8.0.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d4e44305283507dddc5f70d549a1739a5c7bd66c61641759279afa3eb550356", size = 3779706, upload-time = "2026-09-07T02:28:04.066Z" }, - { url = "https://files.pythonhosted.org/packages/e1/4d/0c776560fdeb37aa2e454f79b66d49bac283661677e2e311bb664bfb5d86/complexipy-8.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:91e534311df19e112527bfb43bf5a04c7f215bcf34fd2147dd7b007672b92d32", size = 3935858, upload-time = "2026-09-07T02:28:05.709Z" }, - { url = "https://files.pythonhosted.org/packages/fc/3c/301e7e172bcc7475ca7b7e537a6d9b4eec0f1963d356d35b9cbbe1232b37/complexipy-8.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba618bc81a5992556264a28d7a7646130ce3aa88f5f4ba4b99c68c01fa3b124c", size = 4068941, upload-time = "2026-09-07T02:28:07.11Z" }, - { url = "https://files.pythonhosted.org/packages/60/18/7925b7c1c57727a775aaa5c53d114b0b999afe3cfdd2672f0c6c7906f580/complexipy-8.0.1-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fad5aa4e63cbefb8c6de40cd02fbf7eeef39b8ccc07766bc66da4064ca119d3c", size = 4023365, upload-time = "2026-09-07T02:28:08.534Z" }, - { url = "https://files.pythonhosted.org/packages/52/a2/e6f7a5442d6571adc8adeff946b91ab92d605e1face7e7cbbb5015e18101/complexipy-8.0.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2cef6e40764553b7daa192068e9fd24311046c0f6758f11e462717c4de6a572", size = 3778554, upload-time = "2026-09-07T02:28:09.874Z" }, - { url = "https://files.pythonhosted.org/packages/ac/57/1bed68de8b8451d03ad87cdeb6c40a2db41124409bbfdb728e98090df69c/complexipy-8.0.1-cp315-cp315t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e3521f282c554fbd3a24aec6dad4ba80044e935b4e42417db6c4cf96615ff9f0", size = 4019065, upload-time = "2026-09-07T02:28:11.21Z" }, - { url = "https://files.pythonhosted.org/packages/c5/01/6f24448bd5ad4f8f094deaacb365a01a5270d0703c40f651060d450de662/complexipy-8.0.1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae988ed8f8a4ab2d410ef7fad74b87cb21a60c8fd73c25e8be7536fccc66405", size = 3779893, upload-time = "2026-09-07T02:28:12.761Z" }, +version = "8.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/14/30/b1d5ca6b5a3470d94e6f39ce0c6a865e03142f8493e453eee27231c5b596/complexipy-8.1.0.tar.gz", hash = "sha256:0e52ec185e93ed3e246be71a9dfc5bf67837bca2877639945acc8403d6f8880a", size = 157524, upload-time = "2026-10-19T02:43:14.273Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/80/61/7ebf385f7d8a4ba301133d679a6984ec9587b3e24edaefcc14d4fa53915c/complexipy-8.1.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:4d58f797fdd0f03847cb188ddbc39f7fe5b71749a215e42fdbe02c4ca75a4cee", size = 4024466, upload-time = "2026-10-19T02:40:40.268Z" }, + { url = "https://files.pythonhosted.org/packages/65/a3/5d02198d3a4ce00f3212cee73924a2a22a3f7ba24bbe565908bfad71af76/complexipy-8.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9f83407567e1b9f7925d5177cff1d09155e9c7ea72a870c3754459f8acff1a96", size = 3948059, upload-time = "2026-10-19T02:40:42.087Z" }, + { url = "https://files.pythonhosted.org/packages/df/7a/2c6a38d5159bb80752d4e4ac705aef26da62d560fa3a4ab7cd65834d4acc/complexipy-8.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6afbd490be51bd547b0b0bca3bb1271e0303c44265ddfc221183fffe2669d0e", size = 4317147, upload-time = "2026-10-19T02:40:43.668Z" }, + { url = "https://files.pythonhosted.org/packages/f6/84/b9d4405881c7bcf63fab33ad9fb461407729994cd2addb5f86ec67564154/complexipy-8.1.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c17864c695b091bbc2d87f3abcd0c2bea55ee22e1491402c43d69125d0b04c81", size = 4218382, upload-time = "2026-10-19T02:40:45.474Z" }, + { url = "https://files.pythonhosted.org/packages/c6/08/1671d45b7569a6421ec79e82c2b22ec0baf3a5c9c806d371eed772403d50/complexipy-8.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d46527ef615192c80ba1bd0e5092a071c51c15286667e10bd208548a79f2a78", size = 4618326, upload-time = "2026-10-19T02:40:47.593Z" }, + { url = "https://files.pythonhosted.org/packages/15/f0/4ee20b0696c5bc8861737862dbae453cd4d77c9bb07c25c3a9bfcb7376a2/complexipy-8.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57429b5d9992d2e855fcc9f881692c484c66ea3845ac4ffc184224a468dd4783", size = 4893740, upload-time = "2026-10-19T02:40:49.369Z" }, + { url = "https://files.pythonhosted.org/packages/5d/3c/4f76b36b0f90e6dd6a13b8cc10ea5ffd8849f4f7ef472d0db2284d29d30a/complexipy-8.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:40c6e74f36a874c05ccd5be114eddb1965ea4ec1a2ed90e04f31ddfc4f993fd8", size = 4413504, upload-time = "2026-10-19T02:40:51.765Z" }, + { url = "https://files.pythonhosted.org/packages/e6/c3/3470589d6cc61dfd18f3625c01db8670b678f7f1db10aca58aaf411f17d8/complexipy-8.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd34eb7234da572a6cf21e1bc078f3670de4ad8b0a4904dcdd82bed6fd4f243e", size = 4296198, upload-time = "2026-10-19T02:40:53.341Z" }, + { url = "https://files.pythonhosted.org/packages/1b/9f/a27c902a85359bccd921e5060ac2f8649a3ffd1b4861befc4a061ef96190/complexipy-8.1.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:34812e69db1e22eba114883a9dc168827e7430f0f902a010d977c6e2b6709297", size = 4302413, upload-time = "2026-10-19T02:40:55.025Z" }, + { url = "https://files.pythonhosted.org/packages/63/45/a05f7a091dd5936b9dcb42d5f2123fcff4d88b381a7a5cca208436e07e57/complexipy-8.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ebe3be0ecf3556067dd60d62f25b38471c31483d0962b3bf3ee6214de3914bf0", size = 4492126, upload-time = "2026-10-19T02:40:56.75Z" }, + { url = "https://files.pythonhosted.org/packages/cd/53/0d4a0e779ab00fbaba4a709a1d035d866ac34aeaca77d7c383a3d1cbbfd6/complexipy-8.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2e95fab8e5ba3886af9e94c0d5f452f78840e15286b175a209602e4618307dcf", size = 4635797, upload-time = "2026-10-19T02:40:58.262Z" }, + { url = "https://files.pythonhosted.org/packages/79/da/2a7e057bde6c0b2f02a86e5f6610b76111e656a5c6667ef096ce4f12dc5f/complexipy-8.1.0-cp312-cp312-win32.whl", hash = "sha256:18401f8938ad8473b8435c7cca632ba781dda1c6cc4bdd0478202626c2399333", size = 3557432, upload-time = "2026-10-19T02:40:59.718Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b6/70c40b3d8882d01da14c45b551654af39b738a0b68f9476cd7352cba1af2/complexipy-8.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:2633bcf44bc681368e00c66d1363d0622d5e63c057b077e827ee4d32d1fa3e91", size = 3824911, upload-time = "2026-10-19T02:41:01.318Z" }, + { url = "https://files.pythonhosted.org/packages/13/c8/fe286ebdd50a568b12b0cb00a18b37df8d55d2ee3b695b59f8f71a58351d/complexipy-8.1.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:dfb01459ed7a94affd11f3eb8bc8a8d328bd4762e4ff8020f5f19d4ea4b7f9eb", size = 4024009, upload-time = "2026-10-19T02:41:02.74Z" }, + { url = "https://files.pythonhosted.org/packages/94/3b/23bbfc0f2c655899b4b72bde8fa5f478167729c0650ad8286d84c15a0e2b/complexipy-8.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bc93d45c1206107a323d52d7612c5fb601655cd512b6669486c81bd048e5fdcf", size = 3947521, upload-time = "2026-10-19T02:41:04.427Z" }, + { url = "https://files.pythonhosted.org/packages/6f/3e/735acedd07ca5c88438981d589ab668f2d9a40d813cda963cde01bc06006/complexipy-8.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a81497b13e3c8d7af8968a4fe6ad14747ceae6434daf4024894643348f2d831", size = 4317414, upload-time = "2026-10-19T02:41:06.206Z" }, + { url = "https://files.pythonhosted.org/packages/d4/9d/169cf01f6d09b6b7c6352bee6b450a721634fa632be2e7e1d1858e01d0bb/complexipy-8.1.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d92af11a682d414cdf8186c64d6c18eec0e908fb6f34f2b79f6effa9dbaae260", size = 4218775, upload-time = "2026-10-19T02:41:07.743Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0c/5c253ad773df417b31c44729ae985298f7146b94e3d2f4b264428366a864/complexipy-8.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b4844a7833621438700b93b608dd99ef072e2b4b1cfc5420bbc290bfbdebc15e", size = 4619228, upload-time = "2026-10-19T02:41:09.656Z" }, + { url = "https://files.pythonhosted.org/packages/e1/42/97845e5704c6092c22aa298917710ba37535a40e64497ea4225d14cc4723/complexipy-8.1.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e4c5464b7c3a88f243b6260deddf6bbde44aa978cf9bc3e94a1d6b2803dfbda", size = 4892875, upload-time = "2026-10-19T02:41:11.33Z" }, + { url = "https://files.pythonhosted.org/packages/09/34/36cf753df9d1c1e9648f79b481cc7cd45acc6d580c81f2c8ad6d564a18aa/complexipy-8.1.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dffda82aa7da5abd7d30178b70832ff588908c2be99d5fbd70cdfa790f790223", size = 4413662, upload-time = "2026-10-19T02:41:13.025Z" }, + { url = "https://files.pythonhosted.org/packages/54/b6/6df04a7ee415d8b6a6084c2d75f36b1a789fd32f2598af259d651decec52/complexipy-8.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4effa9c21b0a99319675a95caf11d201ae71074e6b50715f552b6f972fbc2c9d", size = 4295838, upload-time = "2026-10-19T02:41:14.494Z" }, + { url = "https://files.pythonhosted.org/packages/51/88/0094597b3c25716baa6bc1c011d1869ab158a00d6c43cfd34bb099f54f08/complexipy-8.1.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:d8b8b2654cb5efa1e548a91c2d24fb9efe0ad21365723e07a6ae0f835bf13b9c", size = 4301722, upload-time = "2026-10-19T02:41:16.533Z" }, + { url = "https://files.pythonhosted.org/packages/ca/1d/feb43ab76a60e819781d54d17bffb9785f45a50709b0a188c329810f617a/complexipy-8.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9d2cf68b1447c554304ed25ac9bf60db3a7d117fa9cf59af26760507e4badf1f", size = 4492536, upload-time = "2026-10-19T02:41:18.055Z" }, + { url = "https://files.pythonhosted.org/packages/19/49/033007da542b6d92c1b58b849cb5556227076d04ffe3766ad3f1cd5cfece/complexipy-8.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:827eabbd17ae748c666b90121794d15396285509d084d4218166e7d49a0eccbc", size = 4634940, upload-time = "2026-10-19T02:41:20.128Z" }, + { url = "https://files.pythonhosted.org/packages/e5/6f/6a65889f1dd606c25e03ab70f974fa8f4d0b6c1173094e59a588b9935832/complexipy-8.1.0-cp313-cp313-win32.whl", hash = "sha256:63d520ac869f7501ae61f4ab32ec8d4d40fd95b1cd329e54879e0c8e28e06a5e", size = 3557327, upload-time = "2026-10-19T02:41:22.474Z" }, + { url = "https://files.pythonhosted.org/packages/a9/6e/e1570ae015feff42b409aaae67a3972d69196ac1e4d664f8c0ac563db217/complexipy-8.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:87de8f373356dabdf729a6044ced079f73dc75eabaa6c4738d0a9692658ddc42", size = 3824405, upload-time = "2026-10-19T02:41:24.017Z" }, + { url = "https://files.pythonhosted.org/packages/fe/58/914894fbe15416506f97b3f33242f9eb59e40334643f128b8e49954d4e30/complexipy-8.1.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:b73e8f137deff095197161b2559579679d5855dd3376c3034a88ac0f3d7804b6", size = 4024554, upload-time = "2026-10-19T02:41:25.545Z" }, + { url = "https://files.pythonhosted.org/packages/d7/49/f87ba88f60e46314233d8db21512bcea9f8f114bdb2541fc7fafe854da6b/complexipy-8.1.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:76a710cea20b0c5359361b50347e9b8891c0c1dcae24ca4c4e64fe0aac2371e2", size = 3948691, upload-time = "2026-10-19T02:41:27.115Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e6/fd29e9f8a95a57777bafc8f38b751535665aa0d08d07b66cfd16bb6813c2/complexipy-8.1.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3aa90b56069bcc8d2f32e3f94ab388cfd5f0bc1e6ef56a633b6c4a0c1a1f2ae", size = 4318852, upload-time = "2026-10-19T02:41:28.986Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f2/f3001118607c989dcfb174abcbce330676c68302d66804e6fa14f7c54bce/complexipy-8.1.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76fc47a9340bf4437674021999af347cc72a2807dbea8f342a18da9bcf2debc4", size = 4219841, upload-time = "2026-10-19T02:41:30.595Z" }, + { url = "https://files.pythonhosted.org/packages/15/7d/93d2f55f710e381dc268ae5d2ffb8cb38c5967cce59c83848e0adde23003/complexipy-8.1.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff48a5652c6cefcf4db0a74d31fa935899a41a18e51b9b5ee7289185745e5ae9", size = 4620611, upload-time = "2026-10-19T02:41:32.16Z" }, + { url = "https://files.pythonhosted.org/packages/30/0e/33e1fb7878f301665d853725a1e92d60c188300af050cf831d5a4c47f3f6/complexipy-8.1.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ec4122b9dc4325763bd508e8c927cea58a1fbf2280a809fefeacf7352c5ec36a", size = 4897315, upload-time = "2026-10-19T02:41:33.949Z" }, + { url = "https://files.pythonhosted.org/packages/70/6c/696173f9e1362f2755dd07889ebd82b638eebab95830311278a6f4737079/complexipy-8.1.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e7ec586b461e105d2d62e9df48a71393252bf4c527fb12605c3ca44ed46d2fee", size = 4419929, upload-time = "2026-10-19T02:41:35.684Z" }, + { url = "https://files.pythonhosted.org/packages/e8/23/42e1466823b1bff1018394c33dc6df59a6b5f3c163b4be8a593c7a3ac845/complexipy-8.1.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa8399685ac49a7eb5ed87493cd9f50e799bf63fc632b883b05029839bcf2598", size = 4296149, upload-time = "2026-10-19T02:41:37.816Z" }, + { url = "https://files.pythonhosted.org/packages/db/3d/08a51bd1fa4e8bca4f5bf076ecf2f9dc653ba107f7c2dd943ad422e79583/complexipy-8.1.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:212732434f3f1d39c82f3c411ab123e52eaa97af000bffa93e1dee47ce3fce8f", size = 4304092, upload-time = "2026-10-19T02:41:40.166Z" }, + { url = "https://files.pythonhosted.org/packages/ba/38/e7b031640eed8aa34ad2078341f352017cadf3cdf772c82fa94703fd7237/complexipy-8.1.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:da4f3820ac9988dc6f13a8e304f8bdee7c4937db9242f76d1f6a5ed185e0f7ff", size = 4493945, upload-time = "2026-10-19T02:41:41.956Z" }, + { url = "https://files.pythonhosted.org/packages/eb/cb/b493cdcbf6e258d1f9d54f3b250392a704a196f5132a7cbb767664931de7/complexipy-8.1.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f11c91a1c9ed347fd03f1cde948c5f72098a1e97d244b759af2b2331efffd11e", size = 4636841, upload-time = "2026-10-19T02:41:44.399Z" }, + { url = "https://files.pythonhosted.org/packages/56/3a/15df7e0fc3d53e09410a0526e735733cc3bbe38840ab036b9d5b5cad2d55/complexipy-8.1.0-cp314-cp314-win32.whl", hash = "sha256:3b8944d9ac0da5c636efaac82b65fd3bdb71544aaa93d4d7765864cb11263e44", size = 3557153, upload-time = "2026-10-19T02:41:45.91Z" }, + { url = "https://files.pythonhosted.org/packages/ed/5c/2ed9b7c900437002331628504a5d67524e2c8214d4172ed295199aff86f2/complexipy-8.1.0-cp314-cp314-win_amd64.whl", hash = "sha256:f4ee2952b8116220e4b9aac2a236f1d10a05a0dffb07e6393ed1e428dd3d00af", size = 3825309, upload-time = "2026-10-19T02:41:47.41Z" }, + { url = "https://files.pythonhosted.org/packages/76/0a/815685b2d9ae053ea99717aaba9b8c8bfad72b0b63f6709449f4da7aa830/complexipy-8.1.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:295b378329915e6cf60f4f2abba7bef0ba0a6a8ecf38d405f58e9e73407f3dc4", size = 4316273, upload-time = "2026-10-19T02:41:48.898Z" }, + { url = "https://files.pythonhosted.org/packages/0a/53/9e9100c96e4acfe1ce7c7fd32401ab806c34d216308194c3e4506e59024a/complexipy-8.1.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9d38180b9c94a21d5836ed7bfb720e2ebb9981eae0da8d68580293463a373df5", size = 4218262, upload-time = "2026-10-19T02:41:50.412Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/57da1aa0ed5e97cb90c1bdc2d598b469b15942bb336f85bce79b1540fe11/complexipy-8.1.0-cp314-cp314t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7afac2d6449acab72b0024868e5aea82fa4373c462a37d35d8e0ee2a86533ab", size = 4616867, upload-time = "2026-10-19T02:41:51.942Z" }, + { url = "https://files.pythonhosted.org/packages/b0/40/c410a2abb73a7fe639553ee5688c8cc93b7ff4e94f12e7eebe43f332f037/complexipy-8.1.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a25036c34cca0c353d9fe4f6a6ce3ed67164010bbe40173cf4ac024eb14526fa", size = 4893531, upload-time = "2026-10-19T02:41:53.82Z" }, + { url = "https://files.pythonhosted.org/packages/b8/49/8c7f59ef67934e77d883437c006e224fef7d7b4ac49b8e925469b311072a/complexipy-8.1.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dec4d2c9e17e475eb7f7641b4851888bdcbfbcc447846c4f0b2b9c22c5c895b", size = 4412252, upload-time = "2026-10-19T02:41:55.548Z" }, + { url = "https://files.pythonhosted.org/packages/56/84/d4ba1d2983a7f9f0395876d41873e3b32cc97b7a4186b8fcc8f062aaab90/complexipy-8.1.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6d370d310a3e92552ce794c733dbae41b55c25c0f48426edf6b44b9ef4861dc", size = 4296538, upload-time = "2026-10-19T02:41:57.121Z" }, + { url = "https://files.pythonhosted.org/packages/a1/e8/d817ec2affd150c470ef161517706ca861487e881000504abba3f3946a1c/complexipy-8.1.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:8648f59b53a118c90bd976b521c4e5cf9ace74b67cf46faafd860d35b897797f", size = 4298882, upload-time = "2026-10-19T02:41:59.077Z" }, + { url = "https://files.pythonhosted.org/packages/0e/a1/839f7e33e904bb3f30bbb560ee30789d07e6d2fb4b160e20044c5faa2271/complexipy-8.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c5fe10434171154f2228b9f2006180b5618a6dab6228f4997ca0d816ba085122", size = 4491659, upload-time = "2026-10-19T02:42:00.723Z" }, + { url = "https://files.pythonhosted.org/packages/66/cc/6d0590fc6c52c011b654f25d8378f9d0ae8b5023cdbb8e5d6b9093797e87/complexipy-8.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:060874bcc360dffa9048cbfe7c7bdeb44b733c56fdf932f276a307d483b3b0be", size = 4633952, upload-time = "2026-10-19T02:42:02.322Z" }, + { url = "https://files.pythonhosted.org/packages/22/6f/f708aa2e905b30ab3516d851e946d4b0d0994c258b0d23c9093c340e0272/complexipy-8.1.0-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:b7b48e35226d5241002662c80e70f7bae230e1f3132ad549bc492553b741859a", size = 4025085, upload-time = "2026-10-19T02:42:04.062Z" }, + { url = "https://files.pythonhosted.org/packages/30/83/58f63a5dab055fc30b913a4c9abe73a45e6d2a4a387334112f01392f5db0/complexipy-8.1.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:bba617732069efbdc798a8571ba72a96c7114f2478df180b30070da849b69174", size = 3948906, upload-time = "2026-10-19T02:42:05.665Z" }, + { url = "https://files.pythonhosted.org/packages/5d/93/96ac1f67f4f9aa94f3e0e9a4367bcdaa8df54bd568ba85c587e2a9afb7c9/complexipy-8.1.0-cp315-cp315-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:409c671dba09a267e52fbf9d83ba6d641067ac696af478a063788936194d28c7", size = 4621518, upload-time = "2026-10-19T02:42:07.448Z" }, + { url = "https://files.pythonhosted.org/packages/99/e1/40bab1de0c6eeeb59ff7e2db8c3521165bd439411c433bd2d9272178b186/complexipy-8.1.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86b87558d2c2187cd32e33331d17cbcba87c17570972092940f1766ed7e24ea4", size = 4296984, upload-time = "2026-10-19T02:42:08.909Z" }, + { url = "https://files.pythonhosted.org/packages/70/9b/9aa01aa73b5ae7b8108e152ead620f5ec09cd9dd8c11e43737ba3ef8bf3b/complexipy-8.1.0-cp315-cp315-win32.whl", hash = "sha256:a4cdd8f28a60b0a3359a92aa2505a5fffcfe24ec35ad58e6ffff04238e97d3c7", size = 3557775, upload-time = "2026-10-19T02:42:10.428Z" }, + { url = "https://files.pythonhosted.org/packages/48/c7/adaf53ebcdda436671cb6dde804f10302c6439c0400acfec535e598a8738/complexipy-8.1.0-cp315-cp315-win_amd64.whl", hash = "sha256:323ed6fa40b64588bb51b9f99fc0a71efcca0126b50d35f69f453d2638a0170c", size = 3825594, upload-time = "2026-10-19T02:42:11.99Z" }, + { url = "https://files.pythonhosted.org/packages/ec/8a/9300efe31e8a25d0fbfdd6c16ca59091cb8c87ebd0024dd7d1e23a8c9d73/complexipy-8.1.0-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:0921d48964f331eb6e3a481c4df19811c3d9f8fa9a09829dd2fe1b82018a6a9c", size = 4023789, upload-time = "2026-10-19T02:42:13.46Z" }, + { url = "https://files.pythonhosted.org/packages/9d/27/4696482fa801b81e8e098e78b327713f6710d4f0524a55f52eb78bbf2e3f/complexipy-8.1.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:6b52466806109a60504033cfb35543fb94412b3dd610f40b365acee443f9cbfe", size = 3946035, upload-time = "2026-10-19T02:42:15.068Z" }, + { url = "https://files.pythonhosted.org/packages/bd/df/a484fdd7632843a0359eb42fc6cd42e390de3150972105dec18c455a7b56/complexipy-8.1.0-cp315-cp315t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:416da710dbc528ac28afcf5f3dce056bd6e0b39c1999a6528932daaa921403e8", size = 4617510, upload-time = "2026-10-19T02:42:16.523Z" }, + { url = "https://files.pythonhosted.org/packages/10/8e/20b38bdf5652c2ad2060581c3c3d9a2a6c211365be82b76c669c07f9d1cc/complexipy-8.1.0-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d53ad9592da97ac8e59f8df590e0a3eb68f4d9ca0cea501f88df614d0fa96e7d", size = 4296519, upload-time = "2026-10-19T02:42:18.214Z" }, ] [[package]] @@ -1183,15 +1234,15 @@ wheels = [ [[package]] name = "django-allauth" -version = "65.19.7" +version = "65.20.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "asgiref" }, { name = "django" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c4/33/7c8f8fc85f4ee644ee3acb20c1fe4d04516298ab5903f812e1556b65f947/django_allauth-65.19.7.tar.gz", hash = "sha256:c7749551b659ca954e483f6f634cd0c262d65dd8144f5219b3a31cba0426e981", size = 2296178, upload-time = "2026-10-01T12:35:24.152Z" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/5f/b69a68c09c41a0c2f235996fa47aba3eb88c0810bcfc823d22459c3e235f/django_allauth-65.20.0.tar.gz", hash = "sha256:54019cd2860eef707eaaef241a6598149d2d3b6bd7e78d175089b27d57cd8d83", size = 2301827, upload-time = "2026-10-16T11:23:48.232Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/30/c4/a42cc4439b18b8d2767f8c54999e011b9f620a478806ed265baed7c3dc01/django_allauth-65.19.7-py3-none-any.whl", hash = "sha256:8899377f38afabf10445c9ee2f808a730304ca8aecc540657d51a8b3928283d6", size = 2076429, upload-time = "2026-10-01T12:35:20.844Z" }, + { url = "https://files.pythonhosted.org/packages/1e/86/7aa7601e64ba7bda498466ab1a8af9aa568d0f51fa106d9eb46d8a4c5a30/django_allauth-65.20.0-py3-none-any.whl", hash = "sha256:83e22cb65b742d28c49e22a2dbfb475d5ceabc844f16b7a8a5c6a2676e612e9e", size = 2077399, upload-time = "2026-10-16T11:23:44.684Z" }, ] [package.optional-dependencies] @@ -1333,7 +1384,7 @@ wheels = [ [[package]] name = "djlint" -version = "1.46.4" +version = "1.46.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -1345,63 +1396,87 @@ dependencies = [ { name = "regex" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/97/89/802575614cda0554b57e112c025a79729b50a0bcc32daaf4f8a989850d68/djlint-1.46.4.tar.gz", hash = "sha256:5e05f356bf14a7ecd3d885867b5110e778dafba19640ef88e701c060f3a98a20", size = 127997, upload-time = "2026-10-01T00:39:14.984Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6f/ba/659d9a0e0a4e1730e29c2a413c0a47e70c5cf6120efec46264447ff2d4eb/djlint-1.46.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5586292916d0dd463861dac77645ca4eb74e0cc9d08480e4629c5abfc3a98821", size = 1356800, upload-time = "2026-10-01T00:37:54.239Z" }, - { url = "https://files.pythonhosted.org/packages/66/0e/3324fde6bffeaa224aefdda113cc3eb64145c148105d69ea00150d106443/djlint-1.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9bd20ece54086daf67c1feabd54e3d1aa5cf4ce67bc71659cf2f5b8e14df0215", size = 1276743, upload-time = "2026-10-01T00:37:55.473Z" }, - { url = "https://files.pythonhosted.org/packages/76/ee/a53e35f2b3252de9f75e0fe2f650bc14ee075658d983d85cc423b94159c9/djlint-1.46.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cc5a0cc500407eed7cc097615f419246a0bb89d984f703fa481cf93f87ae336", size = 1330054, upload-time = "2026-10-01T00:37:56.637Z" }, - { url = "https://files.pythonhosted.org/packages/46/7d/1419172ea270c1895edf5c0b6b0feb8842756e1f231ddfca0c2ca22e8817/djlint-1.46.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20208ecab8001087bc1d9ac5712eeb110b358ed8e2232f9980952408148aad1c", size = 1393325, upload-time = "2026-10-01T00:37:57.974Z" }, - { url = "https://files.pythonhosted.org/packages/0b/c5/b4af515ca8045d41f50d259eb1cbe316b8b3af1b6f549815925a14f0d1f2/djlint-1.46.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:917bf5e7db062cb896a7bdfb7605b9fccd00bdaa7457d2fdbdee2443f9e6f079", size = 1348056, upload-time = "2026-10-01T00:37:59.351Z" }, - { url = "https://files.pythonhosted.org/packages/11/03/fd6eac7e85c94642f9796b9bec432884f0eefed7387851ab3f19b5067e10/djlint-1.46.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f247c5c175a2a0104035d721e8e48f67882455f5751d6ddad59697574de06726", size = 1417014, upload-time = "2026-10-01T00:38:00.917Z" }, - { url = "https://files.pythonhosted.org/packages/6e/22/752eff78f1a7b96fbe8a5cd7d9b8bba7403e735298cf3a8e9d60ba00b5cf/djlint-1.46.4-cp312-cp312-win32.whl", hash = "sha256:518b64eab387524f1b9f62de0c0368d82f7205d187364ae412503d727272d43c", size = 1029727, upload-time = "2026-10-01T00:38:02.432Z" }, - { url = "https://files.pythonhosted.org/packages/f3/78/0412c6bcb0d7d41599e76b2e69f334d811fa5e87e74e4059036d2abc47dc/djlint-1.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:8a77decb12c5c4ea1c9bc1c9064ceb73471df6abc3639ed3686f8fec295d3ff3", size = 1166119, upload-time = "2026-10-01T00:38:04.031Z" }, - { url = "https://files.pythonhosted.org/packages/d8/b8/0447742824f596fd3561b3ee074d6ea5da08a673d4d53645eb93f5d7204c/djlint-1.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:ccc44d483ed181f176ce248e7da327552748515eacfc5935bb71d2a52c845347", size = 1090756, upload-time = "2026-10-01T00:38:05.403Z" }, - { url = "https://files.pythonhosted.org/packages/e6/d3/afadd8ddef5913509ef2f207a903db1dd454200616e001dad9102145b596/djlint-1.46.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:53d8b5700a3ba5751131c49632d860cedc5f87ddec6d888e493fc98bc79581ab", size = 1347137, upload-time = "2026-10-01T00:38:06.812Z" }, - { url = "https://files.pythonhosted.org/packages/df/0d/779e71a06635ee85ae13060186d661fc91405ce3328cc426c3472e1520ea/djlint-1.46.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e253aec5594cf524cf5649459fb0082003921c43e31d9d167a0f8efa322cf841", size = 1266651, upload-time = "2026-10-01T00:38:08.166Z" }, - { url = "https://files.pythonhosted.org/packages/4f/c5/fd373519f3070eae6a6e944ad661e0d4cde7fed6714c60d5f1a5037f0cfc/djlint-1.46.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94667ff4fdcdb246d3fa67bb90b4e266c80422cf5be7571b93760c3b38161abb", size = 1324540, upload-time = "2026-10-01T00:38:09.444Z" }, - { url = "https://files.pythonhosted.org/packages/ba/7a/b3f620619581af9364ae0cba67c8b0bd91d60344a643251bee4f424df206/djlint-1.46.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a2d64b11855b6dab741d34fcc8ed2fb0e874126de4f35a4c2452b615f69ebd50", size = 1388686, upload-time = "2026-10-01T00:38:11.063Z" }, - { url = "https://files.pythonhosted.org/packages/b9/cf/1e2d1b46afb4a9c657f844e0e6c0cbbf654e83dbfc60d5ee3cc51921e81c/djlint-1.46.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eef281be8017f6653e7aa44701ba4e07c489ee772393258fafd7e0c3286081a1", size = 1342025, upload-time = "2026-10-01T00:38:12.561Z" }, - { url = "https://files.pythonhosted.org/packages/77/56/ac9e428753b697b8a589fb74551e9c3a6032522b33827cbc40dc880fc5fe/djlint-1.46.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6f72af8ab027ec120269a093d214343471a6d24cf59a4b19762d6c5c26b176ab", size = 1413234, upload-time = "2026-10-01T00:38:13.831Z" }, - { url = "https://files.pythonhosted.org/packages/23/c8/19aa911044246376b2518e19135bb03c8a39ff3ef65505a01f5a3eef4325/djlint-1.46.4-cp313-cp313-win32.whl", hash = "sha256:e0d168fb99b9530c63b7142703f57089e065ad24220c95081bb420f88ef80459", size = 1031927, upload-time = "2026-10-01T00:38:15.231Z" }, - { url = "https://files.pythonhosted.org/packages/02/1a/67e93261d370f920f191f08c8a5519504b1a607edd8e4a5ddf29cb10fcc0/djlint-1.46.4-cp313-cp313-win_amd64.whl", hash = "sha256:a3dd566790c602c24b0303348742741b18102ce7db5f3fabc04129b1646b5214", size = 1169643, upload-time = "2026-10-01T00:38:16.602Z" }, - { url = "https://files.pythonhosted.org/packages/1e/61/1ef225f171463f6e7fd160b14a4cc44dd85b37a7f98a283629891febc868/djlint-1.46.4-cp313-cp313-win_arm64.whl", hash = "sha256:810593339f55fbc6cc13de0710aec3e30798c20568b403be88281f20efa18340", size = 1092012, upload-time = "2026-10-01T00:38:18.158Z" }, - { url = "https://files.pythonhosted.org/packages/88/11/4676b4eb1063131276fc0779495b126a5c0199bc04081210e9b3a5575713/djlint-1.46.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:513793eca770a321fd3ee7bbc129f503d86e1205b1c43c593232e19f84791d1d", size = 1343284, upload-time = "2026-10-01T00:38:19.629Z" }, - { url = "https://files.pythonhosted.org/packages/1a/88/f35ef8cca6bd4189ab730443746980d8f9359957fb76113a2f7c77dcf765/djlint-1.46.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:870cea4c99e2046b31f1ff97b01699e2e7704548de3d28f56390e5eae8af8600", size = 1267111, upload-time = "2026-10-01T00:38:21.807Z" }, - { url = "https://files.pythonhosted.org/packages/60/85/c81ab9bb5a7af8a74298f053c832305d3314a7fb7ce91e3693e095f53892/djlint-1.46.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d2bbddbee156d4db50f345d4323f3cf342a3134ae649c5bd6db1ad78ae675b28", size = 1338477, upload-time = "2026-10-01T00:38:23.292Z" }, - { url = "https://files.pythonhosted.org/packages/54/33/7507026a9cc35dbe3745a33e7056da50f7cb1109a44edc30d14c60433c8f/djlint-1.46.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9155aff5ddaaed5349ceb0ea6181fbe5015ee9e2b91386af5e820d74e8488858", size = 1393026, upload-time = "2026-10-01T00:38:24.948Z" }, - { url = "https://files.pythonhosted.org/packages/ca/d1/be31f853d649b4d490d4ce488eebcdaab36c9e329d82fcb533ee2f11d3c7/djlint-1.46.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1264ec664413e94814ffd0bdd4da57f1336b8455444ca28be80fdfe03695a0f0", size = 1360654, upload-time = "2026-10-01T00:38:26.466Z" }, - { url = "https://files.pythonhosted.org/packages/d8/54/37f5c7e083fe04c16d317c4389bc915f3b11451303aca2a2bfdebdfd601c/djlint-1.46.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b098201876332a330b122807beb5373f9dd05429699b72abbb0a1bf2cc6e0792", size = 1415457, upload-time = "2026-10-01T00:38:28.078Z" }, - { url = "https://files.pythonhosted.org/packages/15/b4/547698046de9f87af8532ffcff168a18319b1f4fa55bc0559024653d5791/djlint-1.46.4-cp314-cp314-win32.whl", hash = "sha256:a006942b5fe416445c25beed326b687d7dce98a46f52020873ac409b1361e7c7", size = 1043705, upload-time = "2026-10-01T00:38:29.682Z" }, - { url = "https://files.pythonhosted.org/packages/3c/72/3b42dcae63ea312587010dcc113422f18aaff40dbd5d6c1194b660beb0a5/djlint-1.46.4-cp314-cp314-win_amd64.whl", hash = "sha256:f798c378b272308dcb7a5438235b40a8ca7b8854ecc37eaa8eec74eb6e12f80c", size = 1186794, upload-time = "2026-10-01T00:38:31.172Z" }, - { url = "https://files.pythonhosted.org/packages/67/ce/f5bb10fe2ceb8e708422ee12a52a4f9ce1e73480705475188b3fa367c4fc/djlint-1.46.4-cp314-cp314-win_arm64.whl", hash = "sha256:50b99356d7e651afe9740133b9402fea6798843fe12a496727a0532cf83a40ac", size = 1115905, upload-time = "2026-10-01T00:38:33.167Z" }, - { url = "https://files.pythonhosted.org/packages/8c/74/756ff5ce0b61b8c3bb0d8d2f57acfdc1ffdf25f32e2f85e9f577d369ab1f/djlint-1.46.4-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:ef2797712edfb66b1b8e74bb7712c8d5c95216f1736fef473108e3f44459697c", size = 1443533, upload-time = "2026-10-01T00:38:34.789Z" }, - { url = "https://files.pythonhosted.org/packages/77/61/8c89125861671f845ea62141bd4276335f60d07ec93768b4ff1a21ed76cd/djlint-1.46.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d6885080da5cca2a9537c4c331ecf53820d6aff1d9558fdfccfd6c74430d3139", size = 1360700, upload-time = "2026-10-01T00:38:36.608Z" }, - { url = "https://files.pythonhosted.org/packages/90/11/00ca2b4b3e86983fa0b168922f878bb3353b2fbce8487f6b45a6979ce42a/djlint-1.46.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eec665942a0e86ebc15c8142dd59678fdd9a59e2e2099a56919b91c507ea1a33", size = 1399136, upload-time = "2026-10-01T00:38:38.274Z" }, - { url = "https://files.pythonhosted.org/packages/93/b4/2b8b7013b2acdb1a09fd7fb9472a864a8dfe63306a2329316962c2a34969/djlint-1.46.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d77e4fd05a5b3f8ae114c495f71be6f1328adf7339f82ee752edfe8b0e6a27a1", size = 1449460, upload-time = "2026-10-01T00:38:39.871Z" }, - { url = "https://files.pythonhosted.org/packages/de/d4/7bcab4b34b8544450c7efce93fb38c2e4a758ffca6cc433a90156ffaf817/djlint-1.46.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:594ec91f8e5346597731ab5e7ef396546116b0ed6dd2267222cd223d5975ceab", size = 1418360, upload-time = "2026-10-01T00:38:41.918Z" }, - { url = "https://files.pythonhosted.org/packages/44/06/9a4663b3ec2c9eef53a53e26cf7442078d342343eac3d1847e234a8e8010/djlint-1.46.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3f0822e7ee23c9c65316dddeedb440604a21266b4135cd33393984177de06570", size = 1474741, upload-time = "2026-10-01T00:38:43.563Z" }, - { url = "https://files.pythonhosted.org/packages/32/3e/5551f03b736ca1a70d45d6499de0cd425b9556782651d9e3f28387f31807/djlint-1.46.4-cp314-cp314t-win32.whl", hash = "sha256:ba2565be7d35061df1a9fbd342fd84b0feeefe2318def7ef88ea4e7509c930a2", size = 1105596, upload-time = "2026-10-01T00:38:44.908Z" }, - { url = "https://files.pythonhosted.org/packages/0f/64/1cf6a61e811dbc1222684d8a6174d07c914274ef8cd48c24ab572736ccd1/djlint-1.46.4-cp314-cp314t-win_amd64.whl", hash = "sha256:ef9c1ab43f24ebe7a8ab2a3e09bd5781af3d9e0842a7e59e059d2d813cf87fee", size = 1246241, upload-time = "2026-10-01T00:38:46.259Z" }, - { url = "https://files.pythonhosted.org/packages/90/2c/a0bf62341e182c20d860bca0b974a1e0486486deeeb486771dad50296abf/djlint-1.46.4-cp314-cp314t-win_arm64.whl", hash = "sha256:8c193c0df13a6671746d277a2725dce6add5398cdfc94de24a40121a5f663b80", size = 1172531, upload-time = "2026-10-01T00:38:47.5Z" }, - { url = "https://files.pythonhosted.org/packages/34/9b/f01378bb9abc6c9a2f6481c4b42152d81a617adf3d3d7edc5f44682cdaba/djlint-1.46.4-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:23e56cd584c5b7f018db5db3339680c1364a1763b6e45e0e1b7d688b28727bb7", size = 1343242, upload-time = "2026-10-01T00:38:48.75Z" }, - { url = "https://files.pythonhosted.org/packages/73/67/d39b98d6e86a7061ed73a44bf6c03f7126ae6956bf6ff71febe969c89f78/djlint-1.46.4-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:f85d073011d1d882a7ed28ca27ea59cca5bd2cac786f1f3fd2dbbb503430e5bf", size = 1268802, upload-time = "2026-10-01T00:38:50.184Z" }, - { url = "https://files.pythonhosted.org/packages/0e/53/63263dd5b30beb75a70010df374125f4a9be7ca4bf0c38b51a152c281f79/djlint-1.46.4-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d648647d6d23a61dd389c9993837e65d4a805a70045b2d7ad360a309bd994e4", size = 1340725, upload-time = "2026-10-01T00:38:51.62Z" }, - { url = "https://files.pythonhosted.org/packages/af/99/1d8c38df6be2e7ab3fc7bf66bb19f8d910183f673a9516fe8f73492d1b00/djlint-1.46.4-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:afa255416917668e4e646b2b60f09152900d570f357280d00a15a439866df241", size = 1400935, upload-time = "2026-10-01T00:38:53.052Z" }, - { url = "https://files.pythonhosted.org/packages/90/79/3d99a4982b85a5d7d57ac019e07688e5e98dc9722a36e4c206a412b9f744/djlint-1.46.4-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:9239b9841948795d681761fe93a16c3c2cad5a74f77d272dcfd9e3b04a982ea2", size = 1361979, upload-time = "2026-10-01T00:38:54.33Z" }, - { url = "https://files.pythonhosted.org/packages/a5/2e/7a03eacdc2d587ea1586e4a6dc1092f99ac63e92d236f311b3312e257874/djlint-1.46.4-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:01431f8a04bd1d3f8143c12d32983b429137a39abf61b2146b4040ec5a67c844", size = 1425651, upload-time = "2026-10-01T00:38:55.64Z" }, - { url = "https://files.pythonhosted.org/packages/89/9d/ee120b7a017f4045fba812cc0fae927f7251c57782b9eb676e91bb32bd07/djlint-1.46.4-cp315-cp315-win32.whl", hash = "sha256:529c83fb5fef5dd3c6fde050bc5fb4f872bf2798cc79b9c4afbe635855cafcb6", size = 1043561, upload-time = "2026-10-01T00:38:56.954Z" }, - { url = "https://files.pythonhosted.org/packages/00/fb/87a8f08c0205ef37956bfa4b086e59f524c79dedb68f2276aca1b64df753/djlint-1.46.4-cp315-cp315-win_amd64.whl", hash = "sha256:f92fcd0d8ca467fdea8fcc04cb7db4e8c2573048bc12c8dfb2c6ad8ec009dbf4", size = 1186958, upload-time = "2026-10-01T00:38:58.203Z" }, - { url = "https://files.pythonhosted.org/packages/7f/65/2ea3151118c551155ca7a46e6cabf3fb8a60388f3c64c81422651ed7a8dd/djlint-1.46.4-cp315-cp315-win_arm64.whl", hash = "sha256:9a2c0819beea3534e67c17a39dce262571793b03981ef03bee5057a4747b17a3", size = 1115762, upload-time = "2026-10-01T00:38:59.714Z" }, - { url = "https://files.pythonhosted.org/packages/e5/b1/e52e7b77fa759b1cc54936e909fcb34febe4a5f536fb197a7f279b49d75b/djlint-1.46.4-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:3d62da64d0349a490eae80ce9c777bf9d8ebc87a9b55f17e3ed5c5be57d3dc4a", size = 1443385, upload-time = "2026-10-01T00:39:01.266Z" }, - { url = "https://files.pythonhosted.org/packages/5f/d4/d428efd2dfa0f51d1a6e15f3010356be5bb391005ac19e7c18eb41284952/djlint-1.46.4-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:bd34de9cbe40abd48c7968b7b2596a125c7e168f35f3d6785a5f35c38e7b5c9b", size = 1365147, upload-time = "2026-10-01T00:39:02.8Z" }, - { url = "https://files.pythonhosted.org/packages/b5/36/09a4df0f1aef0555401fd4ee7ada45579a3de7ed72aba5247d8c38f9927e/djlint-1.46.4-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15fe1f7ccca1277d47c9c31f47b83cb704d3044d8c5e977e35de4570c118294b", size = 1394773, upload-time = "2026-10-01T00:39:04.316Z" }, - { url = "https://files.pythonhosted.org/packages/80/53/bb553baef1c0d16eaef70116d12c17c28a3014bd27d283b1c4ed6a7a13bf/djlint-1.46.4-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1aa8ab5b5b7fb9bf3f983912edcae7e2b47697a80755017910c11af98639b735", size = 1448927, upload-time = "2026-10-01T00:39:05.659Z" }, - { url = "https://files.pythonhosted.org/packages/d4/a9/529338be7212fafaf75e6f10aa9174db8c9460dcef3b95da3af1ed9b9e47/djlint-1.46.4-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:f5ba74e08fe9c04e1e67f3aae46e0d6fc694d7cd89ada882049b43024fa2f820", size = 1409220, upload-time = "2026-10-01T00:39:07.02Z" }, - { url = "https://files.pythonhosted.org/packages/73/51/788df2808787fd9b412e7c67f9778c87e672d93f36a6c7b8d67bc2896a1e/djlint-1.46.4-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:1858b93e392561b8439c53f0eda24ccfcbc71add0a199e4d9145b0d62caf10a9", size = 1471574, upload-time = "2026-10-01T00:39:08.447Z" }, - { url = "https://files.pythonhosted.org/packages/e2/64/e21624cc4b64a92adc4b2d10616a1a5a35d00233b2b3c90dfe45a77aae17/djlint-1.46.4-cp315-cp315t-win32.whl", hash = "sha256:15bbd782e55122932e71d31ad8602c8208d0ceef67d4ac773a5cf77e1c3e53db", size = 1103739, upload-time = "2026-10-01T00:39:09.775Z" }, - { url = "https://files.pythonhosted.org/packages/6e/73/68f5896dd454145a002db05a9331700f2c9807b4bf28bdf732fe7d89cdef/djlint-1.46.4-cp315-cp315t-win_amd64.whl", hash = "sha256:35acbd7d0331b3bf160105c36b5697b3b9ee82b5ff1ec2de941921944fbffa50", size = 1245346, upload-time = "2026-10-01T00:39:11.063Z" }, - { url = "https://files.pythonhosted.org/packages/ac/97/bfa137f8cba7d2918f8b1b824a2d81d08fa2541d7fe747c9c564bfcea215/djlint-1.46.4-cp315-cp315t-win_arm64.whl", hash = "sha256:b703059f8678821abab4b7d7d2be5d9c6701955e70e9acc486c280645dfb1bff", size = 1170890, upload-time = "2026-10-01T00:39:12.424Z" }, - { url = "https://files.pythonhosted.org/packages/b7/b2/052fae10a96f7a9099de7e4172c46b5f44fa87f059f06437140faf25b493/djlint-1.46.4-py3-none-any.whl", hash = "sha256:a22c3952f4f8178519bd46747a1eeeb5f3468ddb09763968ac09c56788d206a5", size = 161859, upload-time = "2026-10-01T00:39:13.798Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/da/df/4140783b3e4043b1eed65b118657d1a7cd2d6ce7bd2818e23bfec17759a7/djlint-1.46.6.tar.gz", hash = "sha256:22902d741035cc101d83f7c759ed01426c34bf203a0e3211fc8c2ffb4bb35480", size = 131612, upload-time = "2026-10-15T03:27:08.647Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/09/ad/e6044825c5e2a8eda20ce079f23563992a09f57fd514bc58842f84ec2b1d/djlint-1.46.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1a3f88020f0919bae10d0cf2e0b9135d2db7583558ef6c6a44566ca4c7475fcd", size = 1360312, upload-time = "2026-10-15T02:58:25.811Z" }, + { url = "https://files.pythonhosted.org/packages/94/bc/fa27b6e9ffdf513263452e15a9b0b4a22cd8e6f61caeb2e0d53d58e46c1f/djlint-1.46.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:06ecf69b786eadee2eb0d132274b54d7d5a8cf68c395c7bf51bd611e663f4d64", size = 1285790, upload-time = "2026-10-15T02:58:27.406Z" }, + { url = "https://files.pythonhosted.org/packages/c1/cb/b4aff4d8d5570bd7396cc7448f7d6d94c0250b3b153da6c6e2c5da546416/djlint-1.46.6-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d42ff8f21d79478cdb6f44c1672effa4e20594c3c0a7989e1a694ba506ada2a5", size = 1419142, upload-time = "2026-10-15T02:58:29.429Z" }, + { url = "https://files.pythonhosted.org/packages/32/23/534220a703940a92c082be95e93771d01ea8b887a2580f2e58b884dfc011/djlint-1.46.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a311d2ae9ce307df56686cb7b8f96ee8feb69c1e7bd551bd91442984b055e363", size = 1326483, upload-time = "2026-10-15T02:58:31.081Z" }, + { url = "https://files.pythonhosted.org/packages/eb/74/75197ec20b5ddeae30e0bf06bfde7e6d783e620f62a5dcd141d83961b9aa/djlint-1.46.6-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:08a12b918920fe9e5ae1581af552d43b8ef9c45980dca3051e2e58e4d7657f63", size = 1362942, upload-time = "2026-10-15T02:58:33.145Z" }, + { url = "https://files.pythonhosted.org/packages/39/b1/e9961721ca403c15cbfadf9d33e6909bee2a2d77c12d6b3e53a17ea4851e/djlint-1.46.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1b0d4101823b6feda34928edfda3d750b44a1849714db9261a19ce112b958db1", size = 1385305, upload-time = "2026-10-15T02:58:35.119Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ee/2d06a89e44435c69eac22c076f5ebac956f1bacc4e403eddc1b19ad84981/djlint-1.46.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4832d4190ecbbe51f66fea6213cee5c378cee9f889d9d2df4501b8d2a5ef56e8", size = 1345934, upload-time = "2026-10-15T02:58:36.787Z" }, + { url = "https://files.pythonhosted.org/packages/15/1f/23c3a042a9f73c45dad73d5b71884abc7d6387bb699efff6f0b5d15e7266/djlint-1.46.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:2a23f0482949fc1afe95c27be6d3cba85dbc53e259f4743ed8dd155c7c3f7a76", size = 1385351, upload-time = "2026-10-15T02:58:38.702Z" }, + { url = "https://files.pythonhosted.org/packages/68/13/cfc2415e35fa7440ab4b65d9385461cbf6c0c5cfcb905b027315ee736d2b/djlint-1.46.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6987076f3edd8ca6d33d4956754288bfbe30dbf2c6c3fc02724b3290f0c2b6f9", size = 1448476, upload-time = "2026-10-15T02:58:40.732Z" }, + { url = "https://files.pythonhosted.org/packages/70/42/932008cd6e09aee49e0317eb9fd81713bca0d319018800db6a6e2de99910/djlint-1.46.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2a8efd6aa5e535e7fd4e62e19f158067dc052d468750a0dc08ad72d76e4c4f47", size = 1409483, upload-time = "2026-10-15T02:58:42.467Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a7/1da3908d1b4335f22576a2723bbad7cd12e99b52d3c0bf9a4e0942e85455/djlint-1.46.6-cp312-cp312-win32.whl", hash = "sha256:1a776f96fbabff6c142b82fd02a2aefe1e31c064e7a32e6db27aa90b1d1b711f", size = 1022600, upload-time = "2026-10-15T02:58:44.034Z" }, + { url = "https://files.pythonhosted.org/packages/26/0a/01d36070351227e6b740be8e5ef69efbab3cc6bc9d6488fb519dd3d1c2de/djlint-1.46.6-cp312-cp312-win_amd64.whl", hash = "sha256:957db8fbd98d98e46e7afbe3a719cbc63371885b8ca5a57a5ddd92e078de8046", size = 1154015, upload-time = "2026-10-15T02:58:46.115Z" }, + { url = "https://files.pythonhosted.org/packages/51/fd/28994db2231dd6ccf7276d8760daea5445aa9462b677a454055be837dc05/djlint-1.46.6-cp312-cp312-win_arm64.whl", hash = "sha256:91d4f401e1c410c5379b9d5340017a7dce13ebcc421ebf778fe527cfce28b2a8", size = 1085897, upload-time = "2026-10-15T02:58:47.762Z" }, + { url = "https://files.pythonhosted.org/packages/5e/a8/6af0e08cfe15a9462d5ea02aace363a477b2576b21184a02e8c4a171c3bd/djlint-1.46.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:051e24f4049cb356c33a9ea55a28bfbf25048f8f246c1bd5ffb721b571402c61", size = 1342249, upload-time = "2026-10-15T02:58:49.584Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a8/390ceadbd70e5322bbf029b1df78679a041c18ed747d8cd56f9886a48b07/djlint-1.46.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b9d0698a8f1b72ebd1186db8b2e164955910d9f29edaff1fc11f75d296bcb14d", size = 1263166, upload-time = "2026-10-15T02:58:51.25Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4c/5fd71bf0d6a183e8c58575c120abcc9cafaff0b0771eea5ceaa983a42760/djlint-1.46.6-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:fb2528808764dd9ae8f7892a08d846e48a59910ecc182c2b56e4969498fd8333", size = 1416148, upload-time = "2026-10-15T02:58:52.999Z" }, + { url = "https://files.pythonhosted.org/packages/64/05/1883861f846cc52bfd911a081632aa97c71d91c0512f8770aeea62e9bc92/djlint-1.46.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d3798c8d574b936726ea169918885fb0f2ff604d48197eac69441f1032abc6cf", size = 1322342, upload-time = "2026-10-15T02:58:55.001Z" }, + { url = "https://files.pythonhosted.org/packages/47/1d/8124ae6cac97e15e158b1a1e0ea7547d6098ea5cec89da9dc186eb2fc0dc/djlint-1.46.6-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bddba1c9b332e62bc46ed7a6f37c4d7da246569ee9aace96711dec0b541bd71a", size = 1363571, upload-time = "2026-10-15T02:58:56.96Z" }, + { url = "https://files.pythonhosted.org/packages/ba/42/15d8762878ed202094702750cff4009f593d062167ea8d5b2eea4f8558df/djlint-1.46.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b3c5e56f18cd7e7fcbc659966130ce2b79566adcbbdd5940bdfcc69fa242fd1", size = 1382765, upload-time = "2026-10-15T02:58:59.043Z" }, + { url = "https://files.pythonhosted.org/packages/d7/58/d464ae0a6eb8d0d6b79a44949a3034215785090c015d30dcb99fab4628ac/djlint-1.46.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e8c3c8dbcb12a75b546de4c7841c75295dfcc48faf81589bd4e2ada997518e39", size = 1343185, upload-time = "2026-10-15T02:59:00.793Z" }, + { url = "https://files.pythonhosted.org/packages/60/a2/1a1d09c105a4cfcc0929ecb512e0770943cd92276ea197f3dcf7b8cd0b3c/djlint-1.46.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:5c03394b482fc67ce7e2d4d7a39a791467ff52a28d3496f0fba36791192cdb7d", size = 1383551, upload-time = "2026-10-15T02:59:02.709Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a2/0d5f5cec8845c3f43ae337f134fbd1adab4d17f105e3a22d902cb6a6f17b/djlint-1.46.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c55b0e991b36a8cd1c8fbb778a52200ad376c73a3de0979dba1880dbeea4895e", size = 1444660, upload-time = "2026-10-15T02:59:04.978Z" }, + { url = "https://files.pythonhosted.org/packages/e7/49/ee87c87b2f4285514d2233647facbe70f22e78f14e7cfc8ce370d024037a/djlint-1.46.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3e27f594f53e5617aabe7f0a7d45929f26cd2c97474c629b69548e74c4a7d5f6", size = 1407102, upload-time = "2026-10-15T02:59:07.035Z" }, + { url = "https://files.pythonhosted.org/packages/54/72/b1d2f2ff0559f67f9ce3758c6e26547e78bada856f84353f29042fc21324/djlint-1.46.6-cp313-cp313-win32.whl", hash = "sha256:7da09288e7dd09236266454ea4f8107c3ba14295c4331f0da2eda6cfc8f4f9ab", size = 1024220, upload-time = "2026-10-15T02:59:08.784Z" }, + { url = "https://files.pythonhosted.org/packages/77/ca/b4af13441744b10d792c80431b342853e805f4300b31b34ebfbf4a013c02/djlint-1.46.6-cp313-cp313-win_amd64.whl", hash = "sha256:d0849dd25fb8b2b3211aeb0f23ce10f8d8c62b6f29a8e7bd504d9cdffc16eac5", size = 1158186, upload-time = "2026-10-15T02:59:10.685Z" }, + { url = "https://files.pythonhosted.org/packages/b1/eb/dbc9c21ef273629fd56e914dc0d5c1d832c5bd6a84464b8c9ca9512a34cc/djlint-1.46.6-cp313-cp313-win_arm64.whl", hash = "sha256:e1b66e2c352c8c6d0e9ebf351e89b588f912ee022c94b0735e26830623c2bc31", size = 1083917, upload-time = "2026-10-15T02:59:12.699Z" }, + { url = "https://files.pythonhosted.org/packages/ab/28/00f947f7b30268c2c621e1d58778e5e0e14d0ca194d6096625d49e34e57d/djlint-1.46.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:4f1f15a96c2f39361b19c296a47d98d169da5ed67bcfea636f1fe06c51bd099f", size = 1337363, upload-time = "2026-10-15T02:59:14.41Z" }, + { url = "https://files.pythonhosted.org/packages/45/41/19c4bbed20cf927909a89c4b03dc995d0cceb794b8368026b6a3185e2895/djlint-1.46.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:269e6d099e4c82cbeaefdbb1eba349f9df6e78d381a0212c1f771cecb53103b0", size = 1262518, upload-time = "2026-10-15T02:59:16.301Z" }, + { url = "https://files.pythonhosted.org/packages/fa/e5/b7ebaeb53472853d06d2505dd6e4346ba800617fbd5fc648934d87f6e79a/djlint-1.46.6-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3455d90163bfca2caa47d3500e351fb6aed303ab6ad9f96210eac2222d274293", size = 1413409, upload-time = "2026-10-15T02:59:18.532Z" }, + { url = "https://files.pythonhosted.org/packages/bc/1c/89c82d91e98107c90045b97736c17b537d34149660a615456e9cf8c9030c/djlint-1.46.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:465cb40b32e7c74cedbedad76ce43e55279c8d9b7f4e3467cf3295c5e31ec00c", size = 1336115, upload-time = "2026-10-15T02:59:20.567Z" }, + { url = "https://files.pythonhosted.org/packages/a9/9b/5b222ce71426a9f176148c63d7983e564d737949932e723a8b104750b09b/djlint-1.46.6-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3160ef7bc8ba4812f70f9f19eb42f667e309c2c0f54e2adecfe8cd8162d8a1c", size = 1352240, upload-time = "2026-10-15T02:59:22.885Z" }, + { url = "https://files.pythonhosted.org/packages/77/0f/b33d03f1c1903444fa1c547b0bacd1cfe161f4f64b4aecad07eea66045b4/djlint-1.46.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1cf61a936f4cd60cf8cc670a07fc29c283ffe35be26c4151e575c39974e29646", size = 1382333, upload-time = "2026-10-15T02:59:24.797Z" }, + { url = "https://files.pythonhosted.org/packages/e8/c7/f068ddd174b9b66e9105d9c4036086170cb08acef1eadd6d0938262fb392/djlint-1.46.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6743f54c053ef65f294e4520be3bb6bb8ff27221058f208ff0059f4e694feb4d", size = 1358291, upload-time = "2026-10-15T02:59:26.853Z" }, + { url = "https://files.pythonhosted.org/packages/b2/80/c0b1bbd2e0680ba12c842f5bf87ce095f23beeb33668b5bf733e342d2e86/djlint-1.46.6-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:3fdb21413c4bfe968aee8a0da3fda5fce1fcbb7feeff36dc31c9a7391f5f70a0", size = 1367848, upload-time = "2026-10-15T02:59:29.051Z" }, + { url = "https://files.pythonhosted.org/packages/aa/fa/1d91f514cdc3c0340593a550fc0766729ece9cfb66012f388348938e2627/djlint-1.46.6-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:87019693cc55fe47332c3c5109bd62270b1186933ea1deecc12d699a1e42de33", size = 1440700, upload-time = "2026-10-15T02:59:31.186Z" }, + { url = "https://files.pythonhosted.org/packages/86/8e/4fc875b219c276f563e89d51cb07a11fc972f30085394f6c927d1de54517/djlint-1.46.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f779c01332521cc7f74286a5b1b215d8122ada38784d1037fbd5a71aabe068ba", size = 1407801, upload-time = "2026-10-15T02:59:33.074Z" }, + { url = "https://files.pythonhosted.org/packages/34/30/b41fb027954b653e9d7a1ba827b7b6ce18a717cd2817167ebf9815fad86b/djlint-1.46.6-cp314-cp314-win32.whl", hash = "sha256:d312bfd586340ee108d20dc1de14c0645ac3e42816dc105b1fbcfd004ac3ca61", size = 1035766, upload-time = "2026-10-15T02:59:34.826Z" }, + { url = "https://files.pythonhosted.org/packages/77/9c/a006f10cdae9838afcc908b3a1e2898cede2adf06ca7104dd0236295c9ae/djlint-1.46.6-cp314-cp314-win_amd64.whl", hash = "sha256:a418d355c2c5952cd67beeb76a41e92d52b28dd9de75ac6e454ed32d9c386a0d", size = 1178600, upload-time = "2026-10-15T02:59:37.042Z" }, + { url = "https://files.pythonhosted.org/packages/8f/06/8506d1cff8d5e6fbbc7bc2de2473f45b34ef2be3b91312b304b0b8b4d3b0/djlint-1.46.6-cp314-cp314-win_arm64.whl", hash = "sha256:e894def910e4cf3235b8b904943fe7d5c55f4fd8d73760e08aafd3894fcfa29b", size = 1107041, upload-time = "2026-10-15T02:59:39.888Z" }, + { url = "https://files.pythonhosted.org/packages/29/d1/b9e2c90a1baa9abf92895e843dbe690d23b3a31cce34c1026eb105e4ebb6/djlint-1.46.6-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1a8593773d7258964c09f7032e281d5b094b9360b32436756270b81d639b970e", size = 1455443, upload-time = "2026-10-15T02:59:41.624Z" }, + { url = "https://files.pythonhosted.org/packages/b4/09/6259e7aa2f16477fc75c242e40be5f15d8c0ccbc3e1e55b43594e08f7efc/djlint-1.46.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:756264d2d0de66ef9442cfaf0b8380accd6534b4fc880ce6ce4fb42d84a184a1", size = 1381106, upload-time = "2026-10-15T02:59:43.324Z" }, + { url = "https://files.pythonhosted.org/packages/55/8d/572c12d8afac6cd08d9c133c4dd4ee897c1762c5fc69226fd4d30a996555/djlint-1.46.6-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5865104f80153f3ff39fe3f343e58a16edb650eb8f466eb6769372e8ccb28fc8", size = 1469328, upload-time = "2026-10-15T02:59:45.432Z" }, + { url = "https://files.pythonhosted.org/packages/d4/3b/0ce0f99c901b8a4da33b3981411e928f847d2a2ba832077b87e444fa3eb0/djlint-1.46.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:815da3a8aa82a6d546b7c45d1a8a7217107d21df4eaedf6cc1810c6511f73bc0", size = 1393705, upload-time = "2026-10-15T02:59:47.166Z" }, + { url = "https://files.pythonhosted.org/packages/0c/9d/79f31161f356bea68d16b31b6252ef83db2556abc36d8f21bdc4cbea8e7d/djlint-1.46.6-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:55a143dab8fb3211ac42434db8f6b44d1ae4a27813c2d1ab1cfb7954d7cd91ec", size = 1395119, upload-time = "2026-10-15T02:59:49.256Z" }, + { url = "https://files.pythonhosted.org/packages/0c/4a/171ff2d36af4adefd35b5eeada57c2b9ac26d3863f098edc3962c804027a/djlint-1.46.6-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:58be11a4a956544d8efa55bf7846f9941eb73ea9e577eae36f803c28b6d9a6ca", size = 1449658, upload-time = "2026-10-15T02:59:50.969Z" }, + { url = "https://files.pythonhosted.org/packages/99/65/2430cb34bc7e733872f6546c9ae729b26bc5d05271c991787f1e324578b8/djlint-1.46.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:11b2d4f18eb169c2930dbda50660542acfe15968163a3fab7167c30b8c7db2d1", size = 1410932, upload-time = "2026-10-15T02:59:53.223Z" }, + { url = "https://files.pythonhosted.org/packages/b2/36/1ffea3cb47c9e5cf97ebdd3e1cddf081b9b102d23dd15db52952a3375a70/djlint-1.46.6-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b4fa30c2e3cb68c399ca7d780315f5451a28bebb2c6d5e4bd885eb02ee11a61e", size = 1433889, upload-time = "2026-10-15T02:59:55.032Z" }, + { url = "https://files.pythonhosted.org/packages/bf/9c/0addbf259e49b704e56b5e15969bf68433c677b21d84692f965239968c6b/djlint-1.46.6-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:5ed1a3f5dd78ea61f632c0d3ad5496d7852dd905b247b0138c9c47ebb20e7346", size = 1499571, upload-time = "2026-10-15T02:59:56.844Z" }, + { url = "https://files.pythonhosted.org/packages/22/67/a32b812aec9ec70678c284b6a730d91f2f4117977154f15e976318c43b9f/djlint-1.46.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:147e6ef0f7032cb4b0f489bb2ccbc67074948c76e65978ec706c039d4ba08f62", size = 1473024, upload-time = "2026-10-15T02:59:58.596Z" }, + { url = "https://files.pythonhosted.org/packages/20/58/bd6a08ea217f7ff435cd07168b7b7159278c7d8a7b6aeeca4cdc5c42403d/djlint-1.46.6-cp314-cp314t-win32.whl", hash = "sha256:057caf7a2296546e5152ae9c53667aa83adda9376b9f8140038bdf9fef0599ad", size = 1095069, upload-time = "2026-10-15T03:26:06.752Z" }, + { url = "https://files.pythonhosted.org/packages/60/9e/83e83c883013a58b797cb4de1b274b94eb9b02201c27854c7fccef427c15/djlint-1.46.6-cp314-cp314t-win_amd64.whl", hash = "sha256:8a62099ac8049a552e3e18a972718c343936faf94dc5b3b1095129c5a07ed729", size = 1232589, upload-time = "2026-10-15T03:26:09.334Z" }, + { url = "https://files.pythonhosted.org/packages/46/6e/3de71066dcd81a2ab96b1bf0bd17fcf61fcc6a1ba28d7e04abb3201a6ea3/djlint-1.46.6-cp314-cp314t-win_arm64.whl", hash = "sha256:4c80acda65b612536a0f9a4e07fd3af5452dfa6769bd35b3a8162ba1c0609116", size = 1158471, upload-time = "2026-10-15T03:26:11.14Z" }, + { url = "https://files.pythonhosted.org/packages/26/16/ac4b835d829ab1f1bfe1f5d4d340eaac17e90e8a13f6cd1a236a28c66902/djlint-1.46.6-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:dfafec38cf6508079a51c58c56e9981a4d26a1cefc60607a18a975e6af66b04a", size = 1337515, upload-time = "2026-10-15T03:26:13.392Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8c/c4e1a8b0ee1e3711c1368d299d09a56c38419df81102de84861ddc9219ad/djlint-1.46.6-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:e4519418dfc23017fccabace85df372511558acddb3d98d073c6263db7d9b3be", size = 1263652, upload-time = "2026-10-15T03:26:15.291Z" }, + { url = "https://files.pythonhosted.org/packages/89/01/269673b63943fead37a2ddabb8817960d055f04cdda31ca6a26588c2b262/djlint-1.46.6-cp315-cp315-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8ffc87d30067dbfad9588085df09ef5c9d96e86c2717a4df4d072070464d6d97", size = 1306630, upload-time = "2026-10-15T03:26:17.323Z" }, + { url = "https://files.pythonhosted.org/packages/71/33/da9f29ee991c824c429331831e3b0cde705fcd142c7c5fab7e18fb444219/djlint-1.46.6-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0114f0dc6a4e60f11640ae57ae145635e47177ff57a11d1803ed8cd3a4f99a20", size = 1337885, upload-time = "2026-10-15T03:26:19.352Z" }, + { url = "https://files.pythonhosted.org/packages/9e/b2/39903f37b31f1fe7bae5e3f0447bf8c31d63c37f6b036a77287727b330e5/djlint-1.46.6-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34ee7a6789819294de4a627cac46da0b3a666ae6ee51a3a28507e9dbdf23b406", size = 1399882, upload-time = "2026-10-15T03:26:21.759Z" }, + { url = "https://files.pythonhosted.org/packages/29/aa/8d58b10d91c2348aeadde59db6f23ffbf98e326b793ba12b945028021608/djlint-1.46.6-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ff9bab5083ded90725de124563559290033dcd7dd23a0563f2bc2464576d2621", size = 1392787, upload-time = "2026-10-15T03:26:23.98Z" }, + { url = "https://files.pythonhosted.org/packages/57/0b/7bf648cca92f0825710f582738b8db3ce555da4bc5d29926c87bb7fdfc30/djlint-1.46.6-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:61bd5eedfffe9a8844423039124d3503b05f960f10bc4e83546d5cf7673a3c27", size = 1359929, upload-time = "2026-10-15T03:26:25.973Z" }, + { url = "https://files.pythonhosted.org/packages/19/ed/a793b4eeee382e91cefdc9a618b8f68377c2da7b714d92b4477743391afd/djlint-1.46.6-cp315-cp315-musllinux_1_2_armv7l.whl", hash = "sha256:f0245da97c136236ccb10d79236c9a42303792ddc103e5f715abc5a354488f76", size = 1417524, upload-time = "2026-10-15T03:26:28.137Z" }, + { url = "https://files.pythonhosted.org/packages/75/d5/1512fb01385e1d76185c37377abc261c573ddca06e6ae60e47d213b6ea8f/djlint-1.46.6-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:d536254b3babb836c9c60595c88ddae7cd67727c69131bb6a82b8ea178565f6d", size = 1335306, upload-time = "2026-10-15T03:26:30.19Z" }, + { url = "https://files.pythonhosted.org/packages/ab/9b/47c0783c0889a777a68fae16d5c7e98ae2882edbc944e4d5008673a5a92c/djlint-1.46.6-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:92b397a08bd5c1659cd57f17efa5ec54646b9e5ccdc8a086c0781511aa18b163", size = 1415230, upload-time = "2026-10-15T03:26:32.322Z" }, + { url = "https://files.pythonhosted.org/packages/16/75/7b08cf526bbd33b3ea8c174e8ad75be681c4393e13008aab480e92e2a1b2/djlint-1.46.6-cp315-cp315-win32.whl", hash = "sha256:36170460e515a467e3faafb1764225e5d0af547ea81873983a939ae4f12fd2c7", size = 1035433, upload-time = "2026-10-15T03:26:34.88Z" }, + { url = "https://files.pythonhosted.org/packages/1b/2d/240295ee680a3f5e8612288514b8bc1e44896bb5948cbe18515f9d4ed1c3/djlint-1.46.6-cp315-cp315-win_amd64.whl", hash = "sha256:be6138b6dac7e525eac8b7666ab3fd2b4f601986338f702811580c12470fade6", size = 1178348, upload-time = "2026-10-15T03:26:37.002Z" }, + { url = "https://files.pythonhosted.org/packages/2e/7b/ce78acd198e70ee40519a4806910511c467f1d0e30373319c9ac9e743e96/djlint-1.46.6-cp315-cp315-win_arm64.whl", hash = "sha256:9a5b4001d5d9810dc69a5ae26e1b1715924780e1bc7fbd91521a511e944f5abc", size = 1106670, upload-time = "2026-10-15T03:26:38.89Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c3/954a750aa208dfec66df255efdcb5fba980666ef7607247e8773d5aa7814/djlint-1.46.6-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:73ed6f94eea95c5196e9b9d5e8765f6ac3526143e56df07a08005ec89fe9cf4c", size = 1452750, upload-time = "2026-10-15T03:26:41.044Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d9/65b68143c4ac371cd04eef7a4a0c198224de1ad868953e953742e3ac31e4/djlint-1.46.6-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:a1b07bf876fefca61eb7b88c31c33d87c91c3539e735420703f2892755895c17", size = 1381657, upload-time = "2026-10-15T03:26:42.974Z" }, + { url = "https://files.pythonhosted.org/packages/51/be/31494d64cc1a3742b4b9b886e0907311ca05e56e65e2059dae6496ff2a54/djlint-1.46.6-cp315-cp315t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5948e8be9414d39d1a4d6df37422a3e48f8f3f6915700a657d8eeb2ab2227cb5", size = 1356587, upload-time = "2026-10-15T03:26:44.938Z" }, + { url = "https://files.pythonhosted.org/packages/80/09/62c4e949013ccab9b2423d3c6e1f217ff8cc8f19acba371c52cbf77071b2/djlint-1.46.6-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72782d165534c3c27fad94e30addd408e65e44eee1d7f7a45d8e0ab2ae03f15a", size = 1389016, upload-time = "2026-10-15T03:26:46.764Z" }, + { url = "https://files.pythonhosted.org/packages/d8/70/b236324b1b29511544e0f7d4c4f2873b1a0b90cabdc184d7e722b99cdc12/djlint-1.46.6-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5bfbd46caada8407419d570e6b1bd8e0ed851f6a117fcf95068202e4a5802537", size = 1427126, upload-time = "2026-10-15T03:26:48.857Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c8/1ca102cd03e3a70081148aceeab6343a5320db579eb699aeb29cf9f8dc6c/djlint-1.46.6-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4a5c4b0f8fb86daecd1ea8c06a941fc596128836c134abca5b8e356154a656af", size = 1447302, upload-time = "2026-10-15T03:26:50.801Z" }, + { url = "https://files.pythonhosted.org/packages/c5/fc/9bf1b4d077dd120bbf052a863849168634f072b72da1c737e9d960391081/djlint-1.46.6-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:39d50b8558bd55ac4b96bae57704d19b4379e956565d7917bf6a153a82b77f2d", size = 1406487, upload-time = "2026-10-15T03:26:53.14Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a1/ca8b35ab6c859064d6d20a819712059c8e128f104f4f206752cfd1582df9/djlint-1.46.6-cp315-cp315t-musllinux_1_2_armv7l.whl", hash = "sha256:8222b312fdd4f39a2b8fddd5fe61083dd12f30b566cd6119da32e292b760df8a", size = 1472910, upload-time = "2026-10-15T03:26:55.126Z" }, + { url = "https://files.pythonhosted.org/packages/e0/27/4bcf8b9d957b11406225c8ccc10c67c3ad9ae0939d99415ea1fe437ce557/djlint-1.46.6-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:b21218c8cef5b0a279cc468d0dfb122788c528b2c6e6e52630c5feb974b2a110", size = 1384262, upload-time = "2026-10-15T03:26:57.386Z" }, + { url = "https://files.pythonhosted.org/packages/ab/6b/1703d5a6f23eb8175533b3db5e6ea40f1e901bfdccd3001c53784252bf8a/djlint-1.46.6-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:11092e3558bd0119775aa56c1c9e57bd017aac6625503a298a7aaf9fd16c88eb", size = 1472444, upload-time = "2026-10-15T03:26:59.627Z" }, + { url = "https://files.pythonhosted.org/packages/97/e4/77556c8debfb4b3e7082de8ffbdfb69dbdf1d30150421285af7814f33347/djlint-1.46.6-cp315-cp315t-win32.whl", hash = "sha256:06b7cfed6f07f917f98f26c2093d737f0ddd814f18ba675d7917d01a1d0046cb", size = 1093448, upload-time = "2026-10-15T03:27:01.7Z" }, + { url = "https://files.pythonhosted.org/packages/da/40/6f96a4cdc672adb4299d38a00919d93114c33941453acfba129a2d419b97/djlint-1.46.6-cp315-cp315t-win_amd64.whl", hash = "sha256:c79ac5b14436b399a3960587b61d4da4f7ca69b4eb79fba133ff7cc93f22613f", size = 1230876, upload-time = "2026-10-15T03:27:03.644Z" }, + { url = "https://files.pythonhosted.org/packages/63/b1/29de4d1ef6d27f086ded2a659a87cfbe12c209c783e89e02db2cb6fadf2f/djlint-1.46.6-cp315-cp315t-win_arm64.whl", hash = "sha256:ef4a6f4aff9988e81ab2b000eb5f76520ba8054a099274f465c95e1ff6f2819c", size = 1156082, upload-time = "2026-10-15T03:27:05.422Z" }, + { url = "https://files.pythonhosted.org/packages/07/6c/bf0e4fe1740b081997d116fa478970ba8f5ccfb0e850e28ad48941cb052c/djlint-1.46.6-py3-none-any.whl", hash = "sha256:b5f09b2817372484e3d9501f114599a9e01261c8e19fc25350b731ccd1071cf2", size = 165985, upload-time = "2026-10-15T03:27:07.016Z" }, ] [[package]] @@ -1439,13 +1514,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/42/b0/b709cc33ccb0288f41f2d92dfd754d2ccf925cb9277a66effbc132cd004c/elementpath-5.1.4-py3-none-any.whl", hash = "sha256:5ec8d7bb44b16c98414a6a95e20cb150f3cbfc3cac65edc14773288c7a937376", size = 261881, upload-time = "2026-08-08T20:29:20.649Z" }, ] +[[package]] +name = "execnet" +version = "2.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/89/780e11f9588d9e7128a3f87788354c7946a9cbb1401ad38a48c4db9a4f07/execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd", size = 166622, upload-time = "2025-11-12T09:56:37.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec", size = 40708, upload-time = "2025-11-12T09:56:36.333Z" }, +] + [[package]] name = "executing" -version = "2.2.1" +version = "2.3.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/92/8a611141e42930c0f194f7504063ab87dfe970cf1a5af28e7703df448734/executing-2.3.0.tar.gz", hash = "sha256:15919cb5d667e5cb4e099511971d00d659573fff2dd5c4e6cd8b71636c7858d2", size = 1338003, upload-time = "2026-10-10T14:06:04.64Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, + { url = "https://files.pythonhosted.org/packages/4d/dd/8bc67e7d5ffc1d88aa5af511189dfb76dc4e1e5b808fab186146ef2663e5/executing-2.3.0-py3-none-any.whl", hash = "sha256:736e859c9f8701f11fcf516856f26f562e04776387824b43a35a1dfe21c84122", size = 29393, upload-time = "2026-10-10T14:06:02.777Z" }, ] [[package]] @@ -1909,20 +1993,20 @@ sdist = { url = "https://files.pythonhosted.org/packages/5e/73/e01e4c5e11ad0494f [[package]] name = "json5" -version = "0.16.0" +version = "0.17.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/80/63/503651a3946bfacb6d6098985f2af6b3bf880d8eedc53035761c628d13bc/json5-0.16.0.tar.gz", hash = "sha256:8b135a77b231f22e3656c601fec7621c5354c64c4fb2773715ee0814e4dc6bf7", size = 55924, upload-time = "2026-10-08T03:08:26.732Z" } +sdist = { url = "https://files.pythonhosted.org/packages/16/1f/58a4d7ee466f81bc3c7337036380fc6d49de3afb7855d74f8121b1e89b32/json5-0.17.3.tar.gz", hash = "sha256:8d0278ad34ebaa9c3af76d9519274811830224a2d1cd5af156dbd067f461b8a4", size = 54234, upload-time = "2026-10-09T21:19:28.335Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/22/ea/6983226ffa91ff470b685e1673b7bd863e526eb208af1e7458fd71f02e31/json5-0.16.0-py3-none-any.whl", hash = "sha256:ab703e0d2e565ecff92b4d3525159108911db47e1becc3903a9433d4d504505a", size = 37394, upload-time = "2026-10-08T03:08:25.715Z" }, + { url = "https://files.pythonhosted.org/packages/ae/39/e689b616c4279a821d5842a8a85c1874540f8d58e35028df93f2182120c2/json5-0.17.3-py3-none-any.whl", hash = "sha256:2c8b22a893c35cd6a3c5ccbf1dd1c7d02c25dc1b5897fea658f9bf08c2e05f9a", size = 34809, upload-time = "2026-10-09T21:19:27.357Z" }, ] [[package]] name = "jsonpointer" -version = "3.2.0" +version = "3.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/30/76a208d3eb75a5e2bcfec4e132c207ea1e22253d10b52a06c8ff3839dfc9/jsonpointer-3.2.0.tar.gz", hash = "sha256:807db557622fbe07a0d49e19cf4795a269d55eee5ba345fb9959d148eba5ef94", size = 11062, upload-time = "2026-10-07T13:37:16.283Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/3a/8c1782388c28969ac464cfd643b4a318d427f49b42ce77bb5f110fb32934/jsonpointer-3.3.tar.gz", hash = "sha256:2d851da328132043289a03df1dbb1577b901ad9cd22911f515d17875fbc1773a", size = 12076, upload-time = "2026-10-18T21:14:40.19Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/b7/5b934a4fa2ea1e28177fb74a08de7aff8ee160fb6e5ddc6574c7af1a808d/jsonpointer-3.2.0-py3-none-any.whl", hash = "sha256:3e25c9bcadf5ae20c3420922234eaba1ae36ab9bef64cd72454aeaceb0b29aad", size = 8236, upload-time = "2026-10-07T13:37:15.167Z" }, + { url = "https://files.pythonhosted.org/packages/c3/52/f21d1a5ae39200fb2d7d1bd0396e4a5849d95ee0fc71c25d276645bf7e26/jsonpointer-3.3-py3-none-any.whl", hash = "sha256:1e9b099b883a4617561960f754879a1af62b6d2e0f4e4a8029e8326e923e6723", size = 8427, upload-time = "2026-10-18T21:14:38.922Z" }, ] [[package]] @@ -2127,11 +2211,11 @@ wheels = [ [[package]] name = "markdown" -version = "3.11" +version = "3.11.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/4f/700155c8c20d9e655dd0732b5fc3c7614f291b9148da271d7388e50bf774/markdown-3.11.tar.gz", hash = "sha256:180224db6aed87ba9ce1f2781ebcd5826253de8ff637112090e24b84502bbf9f", size = 485623, upload-time = "2026-09-25T13:46:23.473Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/d4/f3f4b6ed70b7c7608fa026ff3bbe59ace9b1ebca43d8ae4886c87c95e81d/markdown-3.11.1.tar.gz", hash = "sha256:496f4f80f9ebd3395a04c8ec9595c40bbe8ec19e9c67d21fe071a1643e876606", size = 492927, upload-time = "2026-10-13T19:29:13.343Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/1e/32971905a7ab47f8b66866ed949fa48b104ba1c4a6fa57794c4f2c4b2cb8/markdown-3.11-py3-none-any.whl", hash = "sha256:cd6c89e7eb308c8b332ed673215a52d208a43f8bacc030b1419376129408719e", size = 111296, upload-time = "2026-09-25T13:46:22.163Z" }, + { url = "https://files.pythonhosted.org/packages/75/e6/1c7b7a48aa3f2c2a5d3c71a6c9c90a6c8c2903e5c73663b5f5e38f87257f/markdown-3.11.1-py3-none-any.whl", hash = "sha256:f1fa378ba5d682900c9ecb55ccceacca936016dda7c3b27097e8ae03ff78feb5", size = 116774, upload-time = "2026-10-13T19:29:12.066Z" }, ] [[package]] @@ -2280,19 +2364,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6d/b7/1f3c4575b488435c91c7bf25598ea6d22ae09b55cf1724320f4bd451323d/marshmallow_union-0.1.15.post1-py2.py3-none-any.whl", hash = "sha256:1e21b759c76735305f99179c1a16759ebb9629733159628241b3f2117ff55e86", size = 4607, upload-time = "2020-06-24T13:47:22.955Z" }, ] -[[package]] -name = "mbake" -version = "1.4.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "rich" }, - { name = "typer" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/27/7a/71331f29bfe3fa4c312d05556759e9aacb7f9fa90f5f39aaaa9de46bd995/mbake-1.4.6.tar.gz", hash = "sha256:31b91955326150e7bd7a5abb4e9dc40acde7c2f892edeb4e1abb8b10b19f8113", size = 3081153, upload-time = "2026-03-31T08:03:41.69Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/83/0ecabd3c6afca46387adf212289867327b77afa973584c3dac9b913aac36/mbake-1.4.6-py3-none-any.whl", hash = "sha256:8c7055b0961769a53b0e401ea2dee9f9096e63d7f58149bb29d6757fd52dbbf0", size = 82321, upload-time = "2026-03-31T08:03:40.056Z" }, -] - [[package]] name = "mdurl" version = "0.1.2" @@ -2366,24 +2437,24 @@ wheels = [ [[package]] name = "mokkari" -version = "4.9.0" +version = "4.10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6c/bb/1ab6da55b62b36278a0d15b5bc9089dc179043e524a8ddd46454c14abb1b/mokkari-4.9.0.tar.gz", hash = "sha256:e601109e9810784546f81725922750a48f332b4a7513967d17cc3206e47f7431", size = 105847, upload-time = "2026-10-02T16:59:47.042Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b2/68/5868d8282371a07a48bbe8047453b2606d8ad2dbc08418096eca2db6b579/mokkari-4.10.0.tar.gz", hash = "sha256:5d7678316219b7505879ea5118e0c128e743b437b588f7d2b5fe417a65a54ac1", size = 109491, upload-time = "2026-10-11T18:37:00.676Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/53/91c0cc80b493e09ed8b2731890baf2f8cf1f8a00479b6c267e158198f626/mokkari-4.9.0-py3-none-any.whl", hash = "sha256:5ad3f1b5c8214276b765e359b616a02feb638aae7da6377659abed17daba5777", size = 76214, upload-time = "2026-10-02T16:59:45.987Z" }, + { url = "https://files.pythonhosted.org/packages/bc/01/b4040bf17f501d9fad4dd4fcec85a7c79c8c7dbbf5fbee4519f5464649c6/mokkari-4.10.0-py3-none-any.whl", hash = "sha256:75b42f99d1f59ad6c7e6036d66898d833d30874ae4be6b29aeb77746256a0b24", size = 78319, upload-time = "2026-10-11T18:36:59.309Z" }, ] [[package]] name = "more-itertools" -version = "11.1.0" +version = "11.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/de/1d/f4da6f02cdffe04d6362210b807146a26044c88d839208aec273bb0d9184/more_itertools-11.1.0.tar.gz", hash = "sha256:48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d", size = 145772, upload-time = "2026-05-22T14:14:29.909Z" } +sdist = { url = "https://files.pythonhosted.org/packages/52/b8/c63995bebbb9ac9c059350e0fb8c82c2420c85aeca7d34e40aecf3df9281/more_itertools-11.2.1.tar.gz", hash = "sha256:cbf08fd0af284dc69718b9b76a8e6203df624d70209ea511e4219d350c856f63", size = 154133, upload-time = "2026-10-14T18:50:30.407Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl", hash = "sha256:4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192", size = 72226, upload-time = "2026-05-22T14:14:28.824Z" }, + { url = "https://files.pythonhosted.org/packages/5d/57/3c4b1c6f2e0cc29ba023802458ea3d2a996f87085559e4a5f2192d549532/more_itertools-11.2.1-py3-none-any.whl", hash = "sha256:35a7377edd1dd6608dcb2cdf534ded55ea32d49448875ad042cd3f879fb1ded0", size = 74405, upload-time = "2026-10-14T18:50:29.116Z" }, ] [[package]] @@ -2691,121 +2762,126 @@ wheels = [ [[package]] name = "pikepdf" -version = "10.16.0" +version = "10.17.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "lxml" }, { name = "packaging" }, { name = "pillow" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/32/80/0fb229f1d4772f102af425975b302c9de1b177b3e191ed7f7ffe24a02e98/pikepdf-10.16.0.tar.gz", hash = "sha256:d9541429f079f7838f2856fea5c2ad165885693cdb36894e73d40d1b845d2e11", size = 9924107, upload-time = "2026-09-29T22:48:57.412Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/a5/abc29f7641afe3edb00a417ddff1447d8a8565d4cb03c4ad85975101c198/pikepdf-10.16.0-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:1e9309099b864820d28df1b1dc5e83afde27d9fb5d5c19f1a93f02070237a50b", size = 2073197, upload-time = "2026-09-29T22:47:56.145Z" }, - { url = "https://files.pythonhosted.org/packages/b5/b4/6a58576cfb10c9a8ec93a28cbb976a29836758c18b64be16d26478ed2738/pikepdf-10.16.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67314457c105ba4f2e2c27234dbfc5cffed5f7974067c260136765f9ac819def", size = 2424013, upload-time = "2026-09-29T22:47:57.79Z" }, - { url = "https://files.pythonhosted.org/packages/48/c8/43e0e5553b11b693721f83e6caff10bd2e8f906e823a3b8e02193e3d973f/pikepdf-10.16.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cd42de7d4f5d8dfda4da5d807a8407378dbd5a8f0e87b03c3e30e66d2228aadb", size = 2637184, upload-time = "2026-09-29T22:47:59.196Z" }, - { url = "https://files.pythonhosted.org/packages/c0/77/f9f30e991ddc43037330eb0515b6e20bd137d7b77f4f0ed1a75288b6cfdd/pikepdf-10.16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2e96252663831a7112669ef445fc8caf97ab7e0f1dc8e4b2cc57619f678c9d1d", size = 4064827, upload-time = "2026-09-29T22:48:00.664Z" }, - { url = "https://files.pythonhosted.org/packages/fb/ff/c5337b81080f3df4c36df5c43d64a5b719f096d21eae08d3ce1cab15b5ae/pikepdf-10.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9c925c0ef7a438ac347d061bc6fee780b769fb83b4e1f1552f570c5b44ace33f", size = 4281162, upload-time = "2026-09-29T22:48:02.202Z" }, - { url = "https://files.pythonhosted.org/packages/e3/98/ec12df6997fa969b40f92240f9828e2d9d48b98126fd34931f2fa02bb7b5/pikepdf-10.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:58ea87e6d674f93fb909219b695ed2f67f0896d35ff95867675dd0bf43f9b471", size = 3788486, upload-time = "2026-09-29T22:48:03.961Z" }, - { url = "https://files.pythonhosted.org/packages/6f/56/d8c618ed571c1a65dc526590bfdf436550ac93e3f55a6acfce4b5ce48214/pikepdf-10.16.0-cp312-cp312-win_arm64.whl", hash = "sha256:2d68e0f53a487f08d67e55cc3f456303d2343941ba5056cd43c597b80b563471", size = 4281253, upload-time = "2026-09-29T22:48:05.972Z" }, - { url = "https://files.pythonhosted.org/packages/a9/10/0e3d5d47f5b0abdf0586a38e45eae6045b10c712f4aba77f4320b42d494e/pikepdf-10.16.0-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:f0a64959cf5325bd5c4572b49526ba2b633f8641fe12ca94310d0feeec6f2186", size = 2073237, upload-time = "2026-09-29T22:48:07.719Z" }, - { url = "https://files.pythonhosted.org/packages/5f/af/d131d478ec84e9e50850b1bf40f0fe4ff81fcd9f6afe4dca6a42c1d75c13/pikepdf-10.16.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8eb1dedd51efb4465daf5c406e8f4e083a2d9eecc0b602968410bb0aa26fa0a6", size = 2424250, upload-time = "2026-09-29T22:48:09.45Z" }, - { url = "https://files.pythonhosted.org/packages/68/fa/cb8984373a9887ad331f586a58bc73949e854b13a0eead420554f971bd7d/pikepdf-10.16.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e716fa800b4213a385084923ca75001fd107eed8ad29ea60ce4a3ad7c9a960b1", size = 2637201, upload-time = "2026-09-29T22:48:11.197Z" }, - { url = "https://files.pythonhosted.org/packages/8f/b0/d7be9ee4cf30569eae0a5b9b6b70e472955b95f12f7ce2ff4ddee5023c2d/pikepdf-10.16.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1018567024ef5b6fffaf59bdf0a4babe9cba664e7381bbe104eefa279cff0212", size = 4064793, upload-time = "2026-09-29T22:48:12.735Z" }, - { url = "https://files.pythonhosted.org/packages/8c/0d/06b571cb1e5aa34ac52b2a166ec8b2ee5ef4519a5376f4ab65e46070c29e/pikepdf-10.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e9b32d6017481fdee497f4f4e12a80f7382cc8ba0422d9c31c4b7ed7f91a8542", size = 4281190, upload-time = "2026-09-29T22:48:14.836Z" }, - { url = "https://files.pythonhosted.org/packages/5f/f1/7a22968ffe094d3732f235fa4f7ccbe98ba202b2c6bf0b129729462d3701/pikepdf-10.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:138568b126f17e98ef50dee88a68f6e2bed538079d54d9592575b432b2b676d0", size = 3788455, upload-time = "2026-09-29T22:48:16.791Z" }, - { url = "https://files.pythonhosted.org/packages/ca/7c/e7656e9317ced0d327e26b68229ec5c9dc0370a0d4249ff9783df5ce2e46/pikepdf-10.16.0-cp313-cp313-win_arm64.whl", hash = "sha256:2bc550b64c14794e1dee5813445f68c9e85b3b84834ac2c83972b3f84d438aee", size = 4281253, upload-time = "2026-09-29T22:48:18.482Z" }, - { url = "https://files.pythonhosted.org/packages/45/97/97f689727e06202c2e9e9a61c6972c489c59fcc2b935545616dc154d4d76/pikepdf-10.16.0-cp314-abi3-macosx_15_0_arm64.whl", hash = "sha256:2363bf21060743a7c483284a0a5424ebb265318c9d7d7dd52c2b3607eeee22b5", size = 2073001, upload-time = "2026-09-29T22:48:20.084Z" }, - { url = "https://files.pythonhosted.org/packages/00/d3/7a31222bef7b50eca7c0eb8d62c876db71d66a50b8fceb40862c5c1d4742/pikepdf-10.16.0-cp314-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4aa7eb436151b1d60b732a4bde9e8277945a5a0871839a916b37545854a924fe", size = 2421395, upload-time = "2026-09-29T22:48:21.633Z" }, - { url = "https://files.pythonhosted.org/packages/79/28/488dbae5a620685cb6c801a96f1dc4cfb02b640bf8b0a2230d056e41d4cf/pikepdf-10.16.0-cp314-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:07d6af612828a0db8be8b76ffb6605adbac18ce43eb6a208bd102c7794447e30", size = 2634195, upload-time = "2026-09-29T22:48:23.289Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d6/dc6014627e6a585421e0c06d815738c405eff44ea8f747a0bb4579b560a8/pikepdf-10.16.0-cp314-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:953f2b1d7092f83d4b55091ed7c3024bd9adcff0907a847f9e4bf29e887491b4", size = 4062253, upload-time = "2026-09-29T22:48:25.01Z" }, - { url = "https://files.pythonhosted.org/packages/f3/cc/5b6f359124f9a13a14c4d39bbedc5aefa435db6f75b6edd47cfd4ef9f1f6/pikepdf-10.16.0-cp314-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:c7769ddd511e331c5236482557de14dde2aa97ce90c38529c19ba49831826a83", size = 4278365, upload-time = "2026-09-29T22:48:26.673Z" }, - { url = "https://files.pythonhosted.org/packages/fe/9b/7cc77ef2719a7d22fbe0d24791ed1ae1163e2aed6a329386eaa8d5130b12/pikepdf-10.16.0-cp314-abi3-win_amd64.whl", hash = "sha256:d4bb4016b140823b6f197b4583010d437f3413ac6157f71c4ed5c86d9bba6596", size = 3884431, upload-time = "2026-09-29T22:48:28.387Z" }, - { url = "https://files.pythonhosted.org/packages/aa/c3/5256165e7ae96545b94889d3785c0f91693fad4d0b9c3f4f21491f8cbbc1/pikepdf-10.16.0-cp314-abi3-win_arm64.whl", hash = "sha256:8d664f335f082aa52c8f5171afbcef8d87675efe801ab22ba8df5d2378f3230a", size = 4395886, upload-time = "2026-09-29T22:48:30.015Z" }, - { url = "https://files.pythonhosted.org/packages/45/68/606179005a160d84279f64d168ca3cf658b5d17fc3797a71fd8be2e8666b/pikepdf-10.16.0-cp314-cp314t-macosx_15_0_arm64.whl", hash = "sha256:816fc2315d5af9514bca08d2d1b8bdb407df71cb479fddce70325d6dedec1e11", size = 2080964, upload-time = "2026-09-29T22:48:31.765Z" }, - { url = "https://files.pythonhosted.org/packages/5d/62/1ddba63e668cf922158bafaef94c0982382b01d9b79845a943420d41ecdf/pikepdf-10.16.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44b61ee57a62987908da6d4c3ddf3f20f873bcbf65123404bb68ffca95397c1c", size = 2428971, upload-time = "2026-09-29T22:48:33.541Z" }, - { url = "https://files.pythonhosted.org/packages/2e/fd/4d8785acd72f64a1646c3e193766c4b8daf9eca0b7797993cab97e884c4d/pikepdf-10.16.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26fa76796762931020e83ee2bd61e0e618b87830a460b37f6bf5cfca9505dc5e", size = 2641228, upload-time = "2026-09-29T22:48:35.268Z" }, - { url = "https://files.pythonhosted.org/packages/08/b8/dbfc94348a1462be9950d9088562753aa1e90bc3d7dcc56625cb9bdd12e5/pikepdf-10.16.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ffc194feec9a53e1c90e0db3b31fbbb55fbdc700d6b84367bc1d919a2dd4f60f", size = 4070894, upload-time = "2026-09-29T22:48:37.233Z" }, - { url = "https://files.pythonhosted.org/packages/53/fc/c5fa05b45af932321878c2e883f2624c398d88288c5380665c20f89cc448/pikepdf-10.16.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d483b301af46d62fc0f40a308bc457cf6ebf8b774e6ac18c3fd705ba465d7c12", size = 4286604, upload-time = "2026-09-29T22:48:39.101Z" }, - { url = "https://files.pythonhosted.org/packages/07/b3/dc242bb31d5acb56a792e7f6b2004edffcd0af7b9a150f62ef0602618e27/pikepdf-10.16.0-cp314-cp314t-win_amd64.whl", hash = "sha256:fce92028c044d2573732e135893207435edd291b5ffd3a3e1ccaff0e0c2fc27b", size = 3922702, upload-time = "2026-09-29T22:48:40.917Z" }, - { url = "https://files.pythonhosted.org/packages/75/10/a48f631b0e7b27dc6137f52fdaa41ed2af8541f4ec89c4d2495032414857/pikepdf-10.16.0-cp314-cp314t-win_arm64.whl", hash = "sha256:39b0e491bc3c86e85a1489b9f2b68754a5f3cb5ffb2d015223588d60524c0dda", size = 4422999, upload-time = "2026-09-29T22:48:43.051Z" }, - { url = "https://files.pythonhosted.org/packages/55/d9/1b1ffaca74dd263fc4a2785068de82fb69a851796731ca1bb1ce45865032/pikepdf-10.16.0-cp315-cp315t-macosx_15_0_arm64.whl", hash = "sha256:9d184fdb6a6904ddf0857543b38c07623c9619e0bf2a2e1e83066a9dbeda600d", size = 2081158, upload-time = "2026-09-29T22:48:44.769Z" }, - { url = "https://files.pythonhosted.org/packages/a8/a2/306d9c3f7339e63e78ed7888980c380445b9f9dac9ddc17b7727c7e2e42b/pikepdf-10.16.0-cp315-cp315t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67e4bd5b85f0f592aaa578014705ed54b7319ed0cc8f4de30f7db5ee1641973c", size = 2428672, upload-time = "2026-09-29T22:48:46.465Z" }, - { url = "https://files.pythonhosted.org/packages/06/8d/a3728758c10fe17b043558b2a9d42294ada63db18b626bdf585ff1c185ca/pikepdf-10.16.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3f6bce6f37dfc62962e695a23c8137da202b2c3c70f65d8234d0acaa028d7dcf", size = 2640892, upload-time = "2026-09-29T22:48:48.14Z" }, - { url = "https://files.pythonhosted.org/packages/90/f6/9b3d8a5e5c8ae9c6fb8cc5fd2c13447082854ae12851375d55d8ebff858c/pikepdf-10.16.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:039d6c2b035e6adc112c30a40e70e8dd7b6db47e075c32fc1bbcebf4572e6a84", size = 4070411, upload-time = "2026-09-29T22:48:49.874Z" }, - { url = "https://files.pythonhosted.org/packages/31/24/eff324cde803009be27e85a0c93e09be05daf2d3569b8693eab378a5d8dd/pikepdf-10.16.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:b288e18bb3033ed7fc8d2d2e9f020170e753ed939d06dfaa54f87c9a9a2dc7ea", size = 4286491, upload-time = "2026-09-29T22:48:51.85Z" }, - { url = "https://files.pythonhosted.org/packages/c7/9f/6cf5fe42d344a80671243a40c4c3b189b21b46c72baac3e8c4ec6cbaa1cc/pikepdf-10.16.0-cp315-cp315t-win_amd64.whl", hash = "sha256:a97c48a1aa3f1dc753caa0fc042146e61374eb0257dbb3145a1d78fb0db5990d", size = 3922405, upload-time = "2026-09-29T22:48:53.624Z" }, - { url = "https://files.pythonhosted.org/packages/0c/f1/11e892cf4e8267a3fc58c41d41f0644f6dec448db87bb319483631c85ac8/pikepdf-10.16.0-cp315-cp315t-win_arm64.whl", hash = "sha256:5ac56ebb1ecfdf841ab50ff7692c64d6add8ae8b7f98286bf060bb884d406009", size = 4423228, upload-time = "2026-09-29T22:48:55.512Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/b8/c3/8fc5695947a711263e17786c1d913b0cea660a1b174a9e0e944ad037732c/pikepdf-10.17.0.tar.gz", hash = "sha256:de4ccaae83628e86c1fd473b384c09c6ff1dd35a583a8dacbf61d2aa4bea843b", size = 9973818, upload-time = "2026-10-11T23:11:19.91Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/59/e68fb9ed0bdb6365f5ccdf57e407d854d719af7a6ccc0dfece1453a60dec/pikepdf-10.17.0-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:ff192cda8d7e368547f382d10ecb48696049057c57a37365a7621b415fdd9ec3", size = 2098618, upload-time = "2026-10-11T23:10:04.554Z" }, + { url = "https://files.pythonhosted.org/packages/b0/15/0a9fdc16b4ede4473c7d4f0c819b4ffbe1ed89d15d72bb6ad7e537cf0e2a/pikepdf-10.17.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:69ed0bf3895ab82a7d3908c76c54afe8f3fd2a03091559877347f2273d5da268", size = 2450383, upload-time = "2026-10-11T23:10:06.47Z" }, + { url = "https://files.pythonhosted.org/packages/df/7e/6d1fd4f06e20a79736dcd7436100475a5ab2d569b478a1baec7d0461550b/pikepdf-10.17.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76e2ac6777b2d2a74a71eb73fa2438734ad453177c66f5a5a246b5e2660336b", size = 2665560, upload-time = "2026-10-11T23:10:08.235Z" }, + { url = "https://files.pythonhosted.org/packages/4c/9a/5dae0282d32f917957d833c3a316bc5458182cd32b328186d5c8e0068b0a/pikepdf-10.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f514e73e24450f35903e4f0b6427abdd3ddbabf03270b4372956322032861337", size = 4090633, upload-time = "2026-10-11T23:10:10.372Z" }, + { url = "https://files.pythonhosted.org/packages/25/d1/ce331ce240fe599af704a953514739417a39fd54e7d686bb32bea64bbe84/pikepdf-10.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bc8464257e9cf82bf2f82f1bb4ba64330da51ede0ecf0f9dfa6fbbe61aa23cc2", size = 4308336, upload-time = "2026-10-11T23:10:12.571Z" }, + { url = "https://files.pythonhosted.org/packages/8f/17/f255304189ec3e7818fd4415348a06bfdc964fc618ef805063559d875ab5/pikepdf-10.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:5598f0e69fb46e50c933518185160129d52d9140169af8eeb7f890c41a2ea691", size = 3817129, upload-time = "2026-10-11T23:10:14.857Z" }, + { url = "https://files.pythonhosted.org/packages/4e/17/e064de62dae0f726dbd5e2583ca52dff73a2010047b1d4f1e8a8d7063966/pikepdf-10.17.0-cp312-cp312-win_arm64.whl", hash = "sha256:9e0f2da8ca5c9551c8fbefd155f216fe5ac02c906d5327ee6d791a26287acc09", size = 4308458, upload-time = "2026-10-11T23:10:16.904Z" }, + { url = "https://files.pythonhosted.org/packages/e5/79/7b9a3e237f8bcc737f2a248a0b68f89357be51a27e53d6c4f5252d9a4b81/pikepdf-10.17.0-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:ebf78c8e0a4eae6fb68b587cba2b1d795146c10d9fbc159cc76e1d62292a032b", size = 2098719, upload-time = "2026-10-11T23:10:18.639Z" }, + { url = "https://files.pythonhosted.org/packages/64/c9/45cd525ac3596033b3f61c31f0ba971195fe2cb65b41fadd7e20498507e8/pikepdf-10.17.0-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb5c07d29a07283086d75c6ce7a834daaea77e64fc38df425dfd9ef51bc31301", size = 2450452, upload-time = "2026-10-11T23:10:20.851Z" }, + { url = "https://files.pythonhosted.org/packages/25/87/2b42abe9399cf5d526c17ca5c21fea45afec2c84c223cd37d22fd85d0728/pikepdf-10.17.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3df92d71de08569bea46e9b7e98c7b76dd69fbb0749b7f7acbedb373552983fe", size = 2665585, upload-time = "2026-10-11T23:10:23.924Z" }, + { url = "https://files.pythonhosted.org/packages/7a/bc/df6b19fadb1c901bde28bb435d040627b1159a83c587dbe381cd99eb5e85/pikepdf-10.17.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:40db4f5e8c52825ad587533e23d6290f2a3c6272ea90c56d22d149019282e9d1", size = 4090860, upload-time = "2026-10-11T23:10:25.788Z" }, + { url = "https://files.pythonhosted.org/packages/52/08/9ee6ff46af873ad6ecea5afe5cefc94597cf738d356b205f5fc1ee89af9b/pikepdf-10.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d981a8477f57e5eb277ffe494596ca24fb0b36adbeb128ff73bfd0b9a38d4963", size = 4308341, upload-time = "2026-10-11T23:10:27.969Z" }, + { url = "https://files.pythonhosted.org/packages/37/a2/c8b2f2f0296dd19d528101cd57808393bbb040b670d2041323c24ef55e0a/pikepdf-10.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:8fe0aca0174cec0dfd8e367e4b663db029cd13fbdb13faf087e4f2d4955ee16d", size = 3817159, upload-time = "2026-10-11T23:10:30.071Z" }, + { url = "https://files.pythonhosted.org/packages/ae/66/40601fa136af45aca3d1c87850ea615870dc28c53502a19f4df5678b8997/pikepdf-10.17.0-cp313-cp313-win_arm64.whl", hash = "sha256:b6f976b21b64f9856c1b106814de1cdfc24cafb99ff37910f603b03aa1ff7cb6", size = 4308440, upload-time = "2026-10-11T23:10:32.362Z" }, + { url = "https://files.pythonhosted.org/packages/ff/67/fddcca144ec7a6ae7c82901a9ceb892b9ad4b49b1c93992b40d79985265b/pikepdf-10.17.0-cp314-abi3-macosx_15_0_arm64.whl", hash = "sha256:f4c755c7fed444339e0d4c5fb77b05fad3f8f6d7954e34ce0894a07cf0870d9f", size = 2098111, upload-time = "2026-10-11T23:10:34.747Z" }, + { url = "https://files.pythonhosted.org/packages/79/81/4f394176a6856ebce23bbc3cc0820a3c5224b90dc09178f2c591c3825320/pikepdf-10.17.0-cp314-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e134a994cee18018e06ab7f14685c57903985f39e14c3f6afb760aab71602f2", size = 2447992, upload-time = "2026-10-11T23:10:36.686Z" }, + { url = "https://files.pythonhosted.org/packages/3a/32/6a3669fb79b7b82b9b8abdbc31eb2d32cbf2399eadb6b98b101f1eb24784/pikepdf-10.17.0-cp314-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e527aa20ca2e2cb97b5148847d1d394460f92de38d92b2ead4046cfb2c593f73", size = 2662993, upload-time = "2026-10-11T23:10:38.716Z" }, + { url = "https://files.pythonhosted.org/packages/1e/29/e07f3ea0ac0167b2b181b982f57e16736f87aeaa1d6537a02f0e6d675f5f/pikepdf-10.17.0-cp314-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1a6d7bb5923bd3c48f95af01b3dff064d6216f02f04426af85a5fe4f4b297758", size = 4088391, upload-time = "2026-10-11T23:10:40.549Z" }, + { url = "https://files.pythonhosted.org/packages/b5/41/f31ccd8837a935efa2de586661e412455192bd76cba4dddc62a74be6381a/pikepdf-10.17.0-cp314-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:c3a6e81f7979063e8f861df71fd18e701605d3b3b5fd8bd1c36ac0c61a4c5889", size = 4306039, upload-time = "2026-10-11T23:10:42.573Z" }, + { url = "https://files.pythonhosted.org/packages/c4/9f/f711c00110f5ed37d4937de55dbf6b1ae5747364b1a8306a9fd8fe9b5694/pikepdf-10.17.0-cp314-abi3-win_amd64.whl", hash = "sha256:c1778c3e9dcb0caae239910bb3d438d2d68b1d1b278b4322ddd1a91d267e1dcf", size = 3912795, upload-time = "2026-10-11T23:10:44.766Z" }, + { url = "https://files.pythonhosted.org/packages/c7/6c/7523b0fad4d38dedc544a632e9ab0fd943acb0e6e3b4070bf58ddad6dec2/pikepdf-10.17.0-cp314-abi3-win_arm64.whl", hash = "sha256:d9c1eb3f5333525b14c3e27cf083d388a8838e3c284d34c1376b0bd532eacb8d", size = 4422797, upload-time = "2026-10-11T23:10:47.077Z" }, + { url = "https://files.pythonhosted.org/packages/0a/24/82b0f0db4f4529ab5556a7c9734a2654e73803233d99e60446cbeba89a90/pikepdf-10.17.0-cp314-cp314t-macosx_15_0_arm64.whl", hash = "sha256:c8e2cc2d281896279cc8adcab602265301b5193abd878d2413f2137686115a52", size = 2105711, upload-time = "2026-10-11T23:10:49.148Z" }, + { url = "https://files.pythonhosted.org/packages/e5/c0/42432cc41623c02f8dbcd62e23e14d0b5d14250be760489f50a9629177bf/pikepdf-10.17.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929d8719f844d70070a547494aeebb2bc1f43958ffb3de901e65e9d8e20a1ccd", size = 2455633, upload-time = "2026-10-11T23:10:51.226Z" }, + { url = "https://files.pythonhosted.org/packages/02/96/3daaf280ba1604392c468ce1c09a0051febc5e4cfbc4b8617dbbd51f8635/pikepdf-10.17.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:16643238adad4f5d21f80d047c67bb011f274b9acb4310300f3346c8cc409816", size = 2668670, upload-time = "2026-10-11T23:10:53.214Z" }, + { url = "https://files.pythonhosted.org/packages/87/d1/87a6df243d140595a3475607ee4346cdedd8a38ba10cd6b9a8d2e8d526e5/pikepdf-10.17.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:53a3cd0e3cfbe1653395fa32ab6e75d14ad084dd03e9b4f8a3933ba5c9f12630", size = 4097669, upload-time = "2026-10-11T23:10:55.383Z" }, + { url = "https://files.pythonhosted.org/packages/9a/77/cd101347ea8ff64ddc1d2c5b900effcf723fc70268fb82b5f8d5b6e2fe91/pikepdf-10.17.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cff443b14f960549d3bd1d32293ac470f17f44cdc9bff18be5dbb347d3a6c6ec", size = 4314337, upload-time = "2026-10-11T23:10:57.424Z" }, + { url = "https://files.pythonhosted.org/packages/37/71/955af764bca7d21f112e84113f6e85181c82237dab7f46fa0d9b39fb9f71/pikepdf-10.17.0-cp314-cp314t-win_amd64.whl", hash = "sha256:88992160d429cc69c32a945776aee27ae2824328dbabf36d11df2ca69214eadf", size = 3952707, upload-time = "2026-10-11T23:10:59.678Z" }, + { url = "https://files.pythonhosted.org/packages/6a/22/ea951fd50f529303c6b870734550c5fab16470cc687dfb0c314a75239861/pikepdf-10.17.0-cp314-cp314t-win_arm64.whl", hash = "sha256:fc795b9190e236309d7ab59bcbea897af4a1a92344a22b2c5b87d50f56f11f81", size = 4450383, upload-time = "2026-10-11T23:11:01.822Z" }, + { url = "https://files.pythonhosted.org/packages/9d/81/e9ba317f76528a809d85567601008b5cdef8b3428a4b009e84a25cba8525/pikepdf-10.17.0-cp315-cp315t-macosx_15_0_arm64.whl", hash = "sha256:ac758c80e86db202bc89a74cc0499ca63e14ec798cef4f989e1168fe3e8a2f8f", size = 2105791, upload-time = "2026-10-11T23:11:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/3e/ef/3dca110705563e4ff008bc7e0c70f67bdb52181c4dd9f7ccff1446843337/pikepdf-10.17.0-cp315-cp315t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ab02f9e8b64e4069abc18b6c0e4012f6acfce77ab2d62780597c840865a481b", size = 2455099, upload-time = "2026-10-11T23:11:06.004Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2c/81bc53c96690d708fbf4b92527426ff7931ecdc80f1be6f119506d23226a/pikepdf-10.17.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b4b70398739447921c5a87ff2de22a28724733c3673e7d5f4015d28c9d4e71c5", size = 2668164, upload-time = "2026-10-11T23:11:08.182Z" }, + { url = "https://files.pythonhosted.org/packages/94/07/508c5c33dff5c498282c231e1097ca9bb74b75ccc58cfb10229134c1979b/pikepdf-10.17.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:31b4002a55705382fb619bec36d7883a0f825c08497d0c1ce64106e5d1d37247", size = 4097157, upload-time = "2026-10-11T23:11:10.263Z" }, + { url = "https://files.pythonhosted.org/packages/6c/9a/89175ec1c8dfcb7f1699e6a260ae8ef23871e3d45c3a59db3cd13718b105/pikepdf-10.17.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:3bd6440bf95319b4c19d304c8786ffe3e7a1db3a0dec3d2e30a75c5b6010cd4f", size = 4314132, upload-time = "2026-10-11T23:11:12.596Z" }, + { url = "https://files.pythonhosted.org/packages/98/dd/e45a3725d4f38a71b01bd4e0619a8507889c13c490cba3243a0e93383de5/pikepdf-10.17.0-cp315-cp315t-win_amd64.whl", hash = "sha256:7efbf32ab41981801f486ae969112b18ef5b7b7d5c78d255c113088ce7e7c014", size = 3952571, upload-time = "2026-10-11T23:11:14.638Z" }, + { url = "https://files.pythonhosted.org/packages/70/85/890445b0ab76efbc72088f928475aeb4e016d53e047f2f31dcab3b9f6727/pikepdf-10.17.0-cp315-cp315t-win_arm64.whl", hash = "sha256:69397dbbd45c5031d6229103cc12596677349fed79ceccceff10d77917547fcb", size = 4450453, upload-time = "2026-10-11T23:11:16.927Z" }, ] [[package]] name = "pillow" -version = "12.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, - { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, - { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, - { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, - { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, - { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, - { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, - { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, - { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, - { url = "https://files.pythonhosted.org/packages/9d/ac/31fb64e1e7efb5a4b50cd3d92049ba89ac6e4d8d3bb6a74e15048ca3353e/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89", size = 4161684, upload-time = "2026-07-01T11:54:25.934Z" }, - { url = "https://files.pythonhosted.org/packages/87/b4/9805e23d2b4d77842b468513841fda254ee42f0289d25088340e4ff46e2d/pillow-12.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace", size = 4255487, upload-time = "2026-07-01T11:54:27.935Z" }, - { url = "https://files.pythonhosted.org/packages/df/39/ecf519435a200c693fe053a6ee4d835b41cf963a4dfc2551c4e637cb2a71/pillow-12.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec", size = 3696433, upload-time = "2026-07-01T11:54:29.813Z" }, - { url = "https://files.pythonhosted.org/packages/42/92/2fc3ffad878ae8dd5469ec1bc8eb83b71f48e13efdf68f02709003982a32/pillow-12.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66", size = 5345889, upload-time = "2026-07-01T11:54:31.97Z" }, - { url = "https://files.pythonhosted.org/packages/10/76/8803c13605b763d33d156c4678fc77f8443389c0c51c8aef707bb02015f4/pillow-12.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35", size = 4780109, upload-time = "2026-07-01T11:54:34.026Z" }, - { url = "https://files.pythonhosted.org/packages/1f/01/e18aff37cb0b4aac47ac90f016d347a49aca667ef97f190b06ac2aabc928/pillow-12.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65", size = 6263736, upload-time = "2026-07-01T11:54:36.131Z" }, - { url = "https://files.pythonhosted.org/packages/f7/62/de5bdd77d935331f4f802edc11e4d82950f642caad6cb2f949837b8560e2/pillow-12.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3", size = 6937129, upload-time = "2026-07-01T11:54:38.216Z" }, - { url = "https://files.pythonhosted.org/packages/70/4d/105627a13300c5e0df1d174230b32fd1273062c96f7745fd552b945d1e1d/pillow-12.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a", size = 6339562, upload-time = "2026-07-01T11:54:40.354Z" }, - { url = "https://files.pythonhosted.org/packages/6b/1d/f13de01a553988ab895ba1c722e06cf3144d4f57656fd5b81b6d881f1179/pillow-12.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e", size = 7049439, upload-time = "2026-07-01T11:54:42.489Z" }, - { url = "https://files.pythonhosted.org/packages/c9/f9/066794cca041b969964f779ee5fa66a9498bbf34248ac39c5d7954e4198f/pillow-12.3.0-cp313-cp313-win32.whl", hash = "sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f", size = 6473287, upload-time = "2026-07-01T11:54:44.9Z" }, - { url = "https://files.pythonhosted.org/packages/a6/9b/7a58e61d62be561da3a356fe2384d4059a6345fc130e23ef1c36a5b81d24/pillow-12.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8", size = 7239691, upload-time = "2026-07-01T11:54:47.141Z" }, - { url = "https://files.pythonhosted.org/packages/aa/b0/c4ed4f0ef8f8fa5ee8351537db6650bb8189f7e118842978dd6589065692/pillow-12.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b", size = 2568185, upload-time = "2026-07-01T11:54:49.137Z" }, - { url = "https://files.pythonhosted.org/packages/dc/01/001f65b68192f0228cc1dbbc8d2530ab5d58b61037ba0587f946fea607cd/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330", size = 4161736, upload-time = "2026-07-01T11:54:51.156Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d2/0219746d0fd16fc8a84498e79452375be3797d3ce4044596ce565164b84f/pillow-12.3.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217", size = 4255435, upload-time = "2026-07-01T11:54:53.414Z" }, - { url = "https://files.pythonhosted.org/packages/c8/02/8d0bc62ef0302318c46ff2a512822d2610e81c7aa46c9b3abe6cbaca5ad0/pillow-12.3.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930", size = 3696262, upload-time = "2026-07-01T11:54:55.739Z" }, - { url = "https://files.pythonhosted.org/packages/85/e2/73c77d218410b14f5f2d565e8a998d5317b7b9c75368d29985139f7a46f0/pillow-12.3.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8", size = 5350344, upload-time = "2026-07-01T11:54:57.657Z" }, - { url = "https://files.pythonhosted.org/packages/c7/da/32c752228ae345f489e3a42499d817b6c3996da7e8a3bc7a04fc806b243b/pillow-12.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0", size = 4780131, upload-time = "2026-07-01T11:54:59.713Z" }, - { url = "https://files.pythonhosted.org/packages/b1/9d/8b2c807dbef61a5197c047afe99823787eb66f63daf9fb2432f91d6f0462/pillow-12.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321", size = 6263757, upload-time = "2026-07-01T11:55:01.778Z" }, - { url = "https://files.pythonhosted.org/packages/5c/44/c85361f65dbe00eea8576ee467c768d25129989efb76e94f205e9ca9bb46/pillow-12.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b", size = 6936962, upload-time = "2026-07-01T11:55:03.93Z" }, - { url = "https://files.pythonhosted.org/packages/18/7e/e483414b35800b86b6f08dbbc7803fb5cd52c4d6f897f47d53ea2c7e6f65/pillow-12.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198", size = 6339171, upload-time = "2026-07-01T11:55:05.989Z" }, - { url = "https://files.pythonhosted.org/packages/f0/f4/68c491844841ede6bed70189546b3ee9731cf9f2cbad396faff5e1ccba45/pillow-12.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130", size = 7048116, upload-time = "2026-07-01T11:55:08.131Z" }, - { url = "https://files.pythonhosted.org/packages/a3/34/77f3f793fed8efc7d243f21b33c5a3f0d1c97ee70346d3db855587e155ff/pillow-12.3.0-cp314-cp314-win32.whl", hash = "sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a", size = 6467209, upload-time = "2026-07-01T11:55:10.408Z" }, - { url = "https://files.pythonhosted.org/packages/f1/e0/492879f69d94f91f60fc8cd05ba03650e9520afebb2fb7aa12777d7c7f38/pillow-12.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d", size = 7237707, upload-time = "2026-07-01T11:55:12.745Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ac/6b11f2875f1c2ac040d84e1bbf9cf22a88038f901ca1037898b280b38365/pillow-12.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838", size = 2565995, upload-time = "2026-07-01T11:55:14.736Z" }, - { url = "https://files.pythonhosted.org/packages/52/69/c2208e56af9bfc1913afb24020297a691eb1d4ef688474c8a04913f65e04/pillow-12.3.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e", size = 5352503, upload-time = "2026-07-01T11:55:17.076Z" }, - { url = "https://files.pythonhosted.org/packages/07/70/e5686d753e898a45d778ff1718dba8516ead6ab6b95d85fc8c4b70650cf2/pillow-12.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17", size = 4782956, upload-time = "2026-07-01T11:55:19.448Z" }, - { url = "https://files.pythonhosted.org/packages/d5/37/25c6692f06927ee973ff18c8d9ee98ad0b4d84ee67a09610c2dd1447958e/pillow-12.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385", size = 6322855, upload-time = "2026-07-01T11:55:21.613Z" }, - { url = "https://files.pythonhosted.org/packages/cc/91/420637fcb8f1bc11029e403b4538e6694744428d8246118e45719f944556/pillow-12.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c", size = 6989642, upload-time = "2026-07-01T11:55:24.006Z" }, - { url = "https://files.pythonhosted.org/packages/10/08/b94d7811281ccf0d143a1cf768d1c49e1e54af63e7b708ab2ee3eb87face/pillow-12.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d", size = 6391281, upload-time = "2026-07-01T11:55:26.252Z" }, - { url = "https://files.pythonhosted.org/packages/d2/87/24233f785f55474dc02ce3e739c5528a77e3a862e9333d1dd7a25cc31f70/pillow-12.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931", size = 7096716, upload-time = "2026-07-01T11:55:28.318Z" }, - { url = "https://files.pythonhosted.org/packages/23/26/fcb2f6e37175b04f53570b59937867e2b80ee1685e744023153028fc14f9/pillow-12.3.0-cp314-cp314t-win32.whl", hash = "sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7", size = 6474125, upload-time = "2026-07-01T11:55:30.956Z" }, - { url = "https://files.pythonhosted.org/packages/90/de/3634abee5f1c9e13c56787b7d5517b0ba8d6de51700b95578cf338349c9f/pillow-12.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c", size = 7242939, upload-time = "2026-07-01T11:55:34.044Z" }, - { url = "https://files.pythonhosted.org/packages/ce/2a/fd13f8eb24de5714a6eb444a3d67e2842c6c576e159a43793adf23051351/pillow-12.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45", size = 2567506, upload-time = "2026-07-01T11:55:35.988Z" }, - { url = "https://files.pythonhosted.org/packages/5d/dc/8fdce34ec725a33c81c6ba122b904d6b9024e50ea9ac7bede62fab54506c/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139", size = 4162063, upload-time = "2026-07-01T11:55:37.941Z" }, - { url = "https://files.pythonhosted.org/packages/76/66/2044b9a63d3b84ff048228dfcb7cd9bf0df983e8470971bf7d4c57b693de/pillow-12.3.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402", size = 4255549, upload-time = "2026-07-01T11:55:40.022Z" }, - { url = "https://files.pythonhosted.org/packages/52/7e/1f67e6f4ece6b582ee4b539decbcc9f848dc245a93ed8cd7338bafef72f1/pillow-12.3.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c", size = 3696331, upload-time = "2026-07-01T11:55:41.98Z" }, - { url = "https://files.pythonhosted.org/packages/12/40/d306fc2c8e4d45d7f175c77edca7063be7b86fe7fe6e68f4353bf71d808c/pillow-12.3.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f", size = 5350370, upload-time = "2026-07-01T11:55:44.028Z" }, - { url = "https://files.pythonhosted.org/packages/dd/44/668fb1437e8ce420f62d6106eb66e44a5971602a4d794615bdf79315d82d/pillow-12.3.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701", size = 4780147, upload-time = "2026-07-01T11:55:46.073Z" }, - { url = "https://files.pythonhosted.org/packages/0c/08/93fa2e70e30a2d81547e481b6ee2bb9522117221fb1e0ce4b5df70967677/pillow-12.3.0-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace", size = 6273659, upload-time = "2026-07-01T11:55:48.264Z" }, - { url = "https://files.pythonhosted.org/packages/f8/6d/043e96ff814fc31a33077e4cba86082167db520c93632afdf2042febbb0c/pillow-12.3.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4", size = 6947439, upload-time = "2026-07-01T11:55:50.503Z" }, - { url = "https://files.pythonhosted.org/packages/af/92/ba71d2ee2ac0edf3fa33bd9d5ee9ee080da70b1766f3ca3934f9938ddac9/pillow-12.3.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39", size = 6353577, upload-time = "2026-07-01T11:55:52.697Z" }, - { url = "https://files.pythonhosted.org/packages/0f/ce/e63064e2122923ff687c8ad792d0d736a7b3920a56a46982e81a7fdd25d6/pillow-12.3.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71", size = 7060394, upload-time = "2026-07-01T11:55:55.149Z" }, - { url = "https://files.pythonhosted.org/packages/54/76/a09cc3ccc8d773a7283d34c38bec1708f9e3cc932093cbc4c5e71ac4060b/pillow-12.3.0-cp315-cp315-win32.whl", hash = "sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827", size = 6467375, upload-time = "2026-07-01T11:55:57.769Z" }, - { url = "https://files.pythonhosted.org/packages/3e/03/1846c49ba3b1d5550392a4bbd06d6fb4578e1cd91a803198b5c90f5f7d53/pillow-12.3.0-cp315-cp315-win_amd64.whl", hash = "sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5", size = 7237048, upload-time = "2026-07-01T11:55:59.975Z" }, - { url = "https://files.pythonhosted.org/packages/fb/bb/89f35dcc79610423f9f195504d7def7f0d1416a711541b42867e25fe3412/pillow-12.3.0-cp315-cp315-win_arm64.whl", hash = "sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658", size = 2566006, upload-time = "2026-07-01T11:56:02.143Z" }, - { url = "https://files.pythonhosted.org/packages/30/88/707027ba09942dfa2c28759b5c222d769290a41c6d20ea60ec250801941f/pillow-12.3.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf", size = 5352509, upload-time = "2026-07-01T11:56:04.2Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6d/00352fa25332c2569cd387851f568cc5a4b75a9adbfb37ac4fbce4c02eec/pillow-12.3.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64", size = 4783167, upload-time = "2026-07-01T11:56:06.631Z" }, - { url = "https://files.pythonhosted.org/packages/13/4f/9e049dfa21af7c22427275720e2490267ba8138120add5c4c574deb69782/pillow-12.3.0-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e", size = 6329237, upload-time = "2026-07-01T11:56:08.868Z" }, - { url = "https://files.pythonhosted.org/packages/36/16/cf6eeaae8d0fce8dd390a33437cf68c5d5bd73834a2bc6e2f14efda0ab45/pillow-12.3.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777", size = 6997047, upload-time = "2026-07-01T11:56:11.379Z" }, - { url = "https://files.pythonhosted.org/packages/1e/69/dbf769bdd55f48bf5733cac28edc6364ffaa072ec9ba336266e4fe66be55/pillow-12.3.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1", size = 6400440, upload-time = "2026-07-01T11:56:13.908Z" }, - { url = "https://files.pythonhosted.org/packages/a0/e1/ffc9cfc2eea0d178da8018e18e959301ad9d6bc9f3edb7181e748a474b97/pillow-12.3.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9", size = 7105895, upload-time = "2026-07-01T11:56:16.575Z" }, - { url = "https://files.pythonhosted.org/packages/18/f0/a5595c1e8c3ae44b9828cb2f0fa8155e5095ef04d6327b8f61cf44a3df85/pillow-12.3.0-cp315-cp315t-win32.whl", hash = "sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8", size = 6474384, upload-time = "2026-07-01T11:56:18.855Z" }, - { url = "https://files.pythonhosted.org/packages/e4/04/62bcd9f844984c5938d3b05264a61d797a29d3e0812341a8204af70bbdee/pillow-12.3.0-cp315-cp315t-win_amd64.whl", hash = "sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418", size = 7243537, upload-time = "2026-07-01T11:56:21.214Z" }, - { url = "https://files.pythonhosted.org/packages/3d/68/1f3066acedf37673694a7141381d8f811ae97f30d34413d236abe7d489f1/pillow-12.3.0-cp315-cp315t-win_arm64.whl", hash = "sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59", size = 2567491, upload-time = "2026-07-01T11:56:23.506Z" }, +version = "13.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/a4/9cc30690a394a8305e8be4c9036aa16d0dfddadd09079860b582f562496d/pillow-13.0.0.tar.gz", hash = "sha256:cdcd1ba258178f7356d74170c9a81ba4eab6a5d55748bc402a5a2a6fe6be3510", size = 47058631, upload-time = "2026-10-16T22:18:09.718Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/b8/58d79332229482eb0d27c82973850808c19d37e5bdc14443d3417bd373f5/pillow-13.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:67c8d44ad89fa7eb88de5d6ef6199b1e03dd24974f85a67639fc8badb801fe79", size = 5568643, upload-time = "2026-10-16T22:15:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/39/4b/f2ed53d83aa44ac19599ac0a54897f867fafb95f406980d1e24083f8cbe3/pillow-13.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc481f742ccda20e9ed760b8f978dff50f2a4e9bc253ac167fb0a05b0783ef52", size = 4852329, upload-time = "2026-10-16T22:15:46.284Z" }, + { url = "https://files.pythonhosted.org/packages/3b/bb/9e30e8ed18c20800ee327a12107d5249ad8dc444867b3adfcc21654e3c71/pillow-13.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8bf295fe459343bc6093c8e5e0df60bfa189e0fcb775a22e2c2488fdeccc6c0d", size = 6519309, upload-time = "2026-10-16T22:15:48.14Z" }, + { url = "https://files.pythonhosted.org/packages/e6/99/fdf65cc539e266ab93546c261bdf98411fe165c6e4e13f9dbf597097192b/pillow-13.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42d63be3af4f9b951b199b0a9d23365d37ab14687e6d77b74940432c8515c4ca", size = 7144542, upload-time = "2026-10-16T22:15:50.093Z" }, + { url = "https://files.pythonhosted.org/packages/26/9b/f38b7c4d8f599537e2d1a6d546cec9beef7536ff8f5c49a3f9c78179d8ac/pillow-13.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4bd024d567eca931b668978d672dba914d4b8e2628e2c3073a2ad178de8a2620", size = 6618042, upload-time = "2026-10-16T22:15:52.054Z" }, + { url = "https://files.pythonhosted.org/packages/a8/7c/45ee28531f89ee4582967d8a17f7a26d71ca64cd902b93c269590cd60a00/pillow-13.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:23edf4ec4b6f4f240e8df6e4985e9ee2ced86474632433e55fb1e2548744bf40", size = 7228137, upload-time = "2026-10-16T22:15:54.009Z" }, + { url = "https://files.pythonhosted.org/packages/01/bc/9c2a969cb1b70201d04fa17fd5aedf02a732870b8da86bceaaa30b0ca385/pillow-13.0.0-cp312-cp312-win32.whl", hash = "sha256:02464da86f561f410e13b061ec37c3068a9cb557a095494157742d07b3c24a27", size = 6515423, upload-time = "2026-10-16T22:15:56.25Z" }, + { url = "https://files.pythonhosted.org/packages/ff/cd/73a79ecdc822076002eb24b5e1e4a530b0bb5310fcb6d239abbec877110b/pillow-13.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:ff3fe9eb621fbb9db4c4be33ab946f6bac5f98ab50ca8d3260503653656c961b", size = 7272166, upload-time = "2026-10-16T22:15:58.597Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a3/be5a1236efd085b3984e4305da8f179ae9dab80c991d2ad78f2bd5c4c843/pillow-13.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:c3bc8ee0271387e0b1e3ad0ff893645990a656e79bf9c42f4f734a3642b11d51", size = 2698943, upload-time = "2026-10-16T22:16:00.637Z" }, + { url = "https://files.pythonhosted.org/packages/82/e2/9132d38df320e8099e2642d9fa538f18a7dfebf68a875a31725dc2a115aa/pillow-13.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:e98b4f91f99b24b1da72e10621ba181f7281922384a7403094debb4199de6c00", size = 4190620, upload-time = "2026-10-16T22:16:02.527Z" }, + { url = "https://files.pythonhosted.org/packages/cb/be/436dac0996876f65ef1916ffb711c5ef4af2ebc57414b6f16642e07f6b47/pillow-13.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:34fb3db1149c879343861831728c243c432d4a5afc8f1878ca7612ef8de2a033", size = 4290286, upload-time = "2026-10-16T22:16:04.861Z" }, + { url = "https://files.pythonhosted.org/packages/60/16/7c1007162e4169ea0d5bec47e2e0b2174f56c50cf5b8c02a1dc23e41037e/pillow-13.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:2d50500a4a3bc6469adcdb319cf05d688b08ca3bf0f22a05339f3b25b433a599", size = 3723169, upload-time = "2026-10-16T22:16:06.956Z" }, + { url = "https://files.pythonhosted.org/packages/08/bc/578ab2eaa04705a8978bd9be0fe15c3d43a8fc95097c4f7e39540e79e4fa/pillow-13.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ef5fe6b7db3f501c56000ba8fe7c7e1a35ca1d45824fbeb95a67daa85cff4dbe", size = 5568469, upload-time = "2026-10-16T22:16:08.664Z" }, + { url = "https://files.pythonhosted.org/packages/98/c8/ccede3dcc4f274b80fb49199eed1ef34ba05566c8b71976b9d1f111da2e3/pillow-13.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f11a3c1358bb3c68012a7b1f41b223c3db9f7bfde90b481df028cfe1c3363313", size = 4852187, upload-time = "2026-10-16T22:16:10.693Z" }, + { url = "https://files.pythonhosted.org/packages/fb/3c/cd0770e96d20bfd990db024bcbd43897ff3e88da1f4782cf90ea231b1d4f/pillow-13.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19b66ca0a4d25cc0200b381ce824c7ea090db61427315e73cfb05dbf1b35c369", size = 6515908, upload-time = "2026-10-16T22:16:12.896Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fe/f5cdaa2d1c4086e757430f368c271a58ee29cfe7378e7ae7b9d964015c25/pillow-13.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5f56499c1a74d2b862beb0c33b8016f99d095858455df9d21583bbbc1c15b582", size = 7142544, upload-time = "2026-10-16T22:16:14.844Z" }, + { url = "https://files.pythonhosted.org/packages/fb/b5/a54f6d44adbcd23737c8c12953f42be107e4cca64e247c0ca3a5b563061c/pillow-13.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2a14cd73d5e6c927f644b0110ee81f59c4ef506259ec9183904747f2caacc81", size = 6613097, upload-time = "2026-10-16T22:16:16.893Z" }, + { url = "https://files.pythonhosted.org/packages/e6/b4/9e6c1207c21b2e91db0d15c16d30f3701ce5add1bd4da0e787761e66cb6e/pillow-13.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:08b826a9bf1265c76de04a42061d61ea6b109418b7826f28ff1ecdfaa26c5502", size = 7224846, upload-time = "2026-10-16T22:16:19.195Z" }, + { url = "https://files.pythonhosted.org/packages/78/9f/d3c3cb0518f3dd1eee0ef501535f53d15597a53c5c4118d178086143397a/pillow-13.0.0-cp313-cp313-win32.whl", hash = "sha256:12b0fa15879fe5a9d9eebe66e4e2d74128a773b1a4448010c9c714f45e04b9d8", size = 6516013, upload-time = "2026-10-16T22:16:21.389Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ed/1b16fb66a37e1b9e41370b93b2c614c7da761a5b2a41dc333f7af4639962/pillow-13.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:9dda0788a9932776a75d8bcc020076edc308ce2508b51f6739a45e3158b3fc42", size = 7284777, upload-time = "2026-10-16T22:16:23.393Z" }, + { url = "https://files.pythonhosted.org/packages/87/7d/8d02eba9f7ecc87f8e90f731e032cc4773802f2a843763afd0c66a535ff4/pillow-13.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:40a266371ece581e5de13b6635ef78d7487824af80561b6ca27694a88c19bc0f", size = 2698826, upload-time = "2026-10-16T22:16:25.382Z" }, + { url = "https://files.pythonhosted.org/packages/8e/45/fbad9c7f5e2f1745c373a434d46072bc84eddfefaa28b852425ac957fda6/pillow-13.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:44629d4498c9cb6b2051806155f22141df0d8a929c56134b166655232dfb2f8c", size = 4190721, upload-time = "2026-10-16T22:16:27.524Z" }, + { url = "https://files.pythonhosted.org/packages/a2/bf/2074902a259a90692c5dbf132885d21671644cbbd3f690047516243a55db/pillow-13.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:bf97ba1b5542050e9b0c74e632323b6d8136cc99d64e193abebee22fe6013c76", size = 4290236, upload-time = "2026-10-16T22:16:29.562Z" }, + { url = "https://files.pythonhosted.org/packages/ff/a5/3d1bb93b8ea38d15d21356c1b8e9f50971ac592aaa248f7fb71739094c0e/pillow-13.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:aa694c49787040943570d61c9b8fc01271bd2a2cfdd55f0d896f8aecdce1a981", size = 3723093, upload-time = "2026-10-16T22:16:31.249Z" }, + { url = "https://files.pythonhosted.org/packages/84/a1/be060135d85187b25fa8b2573786c0e45c62ae27527fff5257675eb97f4a/pillow-13.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:49c12af515073e9bf511e4ef736743bf70d531a643668722279314b937742ba4", size = 5572253, upload-time = "2026-10-16T22:16:33.103Z" }, + { url = "https://files.pythonhosted.org/packages/b5/f4/0bf6f1ac9ba7ee2ffe9914aeb410a1035a0c1a3c42f122388d7fc950bc4b/pillow-13.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d9b0a2bee3f3e03e9f29057aedb807dbf1e1d96ee1b9d0f422d9db6c8583271d", size = 4852269, upload-time = "2026-10-16T22:16:35.102Z" }, + { url = "https://files.pythonhosted.org/packages/83/16/b603274617b3e6728da3a0133d4fba1ea8d7fbe0c4ea5fef9cbffa398b8b/pillow-13.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5933fcea5a5ba64c686f55c886a115cbfd92f2900460784a1e79909fdbafd7b6", size = 6516058, upload-time = "2026-10-16T22:16:37.228Z" }, + { url = "https://files.pythonhosted.org/packages/1d/f2/1371707ce438ba9a43f9d24089828494ec6f9396e28cd7903aa704dd6306/pillow-13.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e91c2b1cbeae768c98752e67e717e283d68dae45717b41f2d91eaee648e37b7d", size = 7142574, upload-time = "2026-10-16T22:16:39.172Z" }, + { url = "https://files.pythonhosted.org/packages/b9/a9/62cf68587f910bc87c5951bcb6e9430c7643a65076adf5f18b4bf350e2bd/pillow-13.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f6299e494e46253d40c34653cac369412f44ca53b5f85d848d3f95b1ed0546c", size = 6614295, upload-time = "2026-10-16T22:16:41.117Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c9/9e9b48178649730299be0bafbf5f810a5b6977538f5a92d47e4ba5f5d608/pillow-13.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f9bd7d260d986f3553518c5d723544346fa48031f8aef3265d786aeb59845bc0", size = 7224841, upload-time = "2026-10-16T22:16:43.118Z" }, + { url = "https://files.pythonhosted.org/packages/8f/48/c44e91384b1b6c072a714a63d00608acc16a6a968735e478e4be4384e5ac/pillow-13.0.0-cp314-cp314-win32.whl", hash = "sha256:2e31c4e68cffd7b1f116127626813b82fcba19edf6b940a7b0c266d6484d0055", size = 6508694, upload-time = "2026-10-16T22:16:45.883Z" }, + { url = "https://files.pythonhosted.org/packages/50/e2/7ad17747517e4c813dca78257d6bb593466f8231baf1384bc98d92745edb/pillow-13.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:f7cbb7a64e7ec664775195e4f81923bc8a93d9451b963f844e59118f63147a7a", size = 7281830, upload-time = "2026-10-16T22:16:47.725Z" }, + { url = "https://files.pythonhosted.org/packages/41/9f/e5b51f2ce8ef4563215334035403ce61a244f93a2e65c24a940131618f87/pillow-13.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:a6aaa7871aebca081eb5c45f83e845bbd9712ae99fa9286dbfdcee835e63f4b4", size = 2695468, upload-time = "2026-10-16T22:16:49.515Z" }, + { url = "https://files.pythonhosted.org/packages/97/73/a53502f731f6c84805a4ce87a8881e86d07a65aee64728b900d112dc703e/pillow-13.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7b999816b5850a35ada08443e6e03945f1f6488144a83afe2d37b240a552aafa", size = 5578196, upload-time = "2026-10-16T22:16:51.291Z" }, + { url = "https://files.pythonhosted.org/packages/21/50/7e949959a56b5559c78ef172b70fc6025706acb289f3f648a15329e4fa6f/pillow-13.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:67871a13cf47275201553b536c025da777f997fa562a19eb798af4ad4b97c18f", size = 4857276, upload-time = "2026-10-16T22:16:53.399Z" }, + { url = "https://files.pythonhosted.org/packages/c9/52/43ded0ac08e77e39d17bd6d894162572201b5e8fdc4a022b14c55a1960a4/pillow-13.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e8ca8f69b7c77fa96dad99f8638c1fc4f1c0bed4acaa1baf7a3c31bdb80a0ab1", size = 6607008, upload-time = "2026-10-16T22:16:55.525Z" }, + { url = "https://files.pythonhosted.org/packages/0d/2e/4a57ed216d5bf877387cba4d44c02aa87abe51ad2e06404aa6b597c4da39/pillow-13.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6bce6a29c3898191f4c9998e4d4e8f69790caeabde46e54da4bc235ce5bde683", size = 7224281, upload-time = "2026-10-16T22:16:57.738Z" }, + { url = "https://files.pythonhosted.org/packages/5c/3d/2929b248e135752d63aaeabf53f6de797e905b7b6263f9c1e2adade20aba/pillow-13.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:816752a5ef76a80484c8c441c85593b7ea9304f6231fc5776ad1fbff7e773058", size = 6695600, upload-time = "2026-10-16T22:16:59.842Z" }, + { url = "https://files.pythonhosted.org/packages/bc/33/fb0da992cf084ed1ee6ee05e96b6191e35c351eb707ca2df874feb24ce47/pillow-13.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5bdb38ba220b61b4ec31dd1046dea6b016d3c6850a23f43ed8b58332b2fc668e", size = 7300589, upload-time = "2026-10-16T22:17:01.686Z" }, + { url = "https://files.pythonhosted.org/packages/bb/af/c30dd9ef6a3dce84ecb1b2393cac629047a32e66279056c6cb46c3ffd65c/pillow-13.0.0-cp314-cp314t-win32.whl", hash = "sha256:06903aac074d00c988e77a1fc435286dc498506d4ca8d6f69df9babddf4ecc15", size = 6517204, upload-time = "2026-10-16T22:17:03.722Z" }, + { url = "https://files.pythonhosted.org/packages/85/d5/ef3a8ae7609c8ab26570abf18194882534b480d245a9148b895a2262c004/pillow-13.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9a635068d9793c7f0d929f39f18b58f1bd86c236e8e7b64167b86af9232ebca0", size = 7286695, upload-time = "2026-10-16T22:17:05.543Z" }, + { url = "https://files.pythonhosted.org/packages/84/3c/0861db0c69a03689ebe3e7599d35668a414deb5aaafd8255215e4e62e3d3/pillow-13.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0d1a9cf7bc6917538b20f8d06b9ab2147e542f68849e96fc58eb66bdf6acc692", size = 2698098, upload-time = "2026-10-16T22:17:07.674Z" }, + { url = "https://files.pythonhosted.org/packages/6e/eb/e86a41962a3a31ad495a3d6a912d9002b01bba4a6fa71c28703abdca7f69/pillow-13.0.0-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7d5e097eabd5d4915c27ac9f6e9325bb1e01a7c94d7348b5c4451d3fc30e8521", size = 4191213, upload-time = "2026-10-16T22:17:09.449Z" }, + { url = "https://files.pythonhosted.org/packages/dd/04/7e7445e706afec84ef06dc25b2c77f9cecff242c23730c62928ad1089d4a/pillow-13.0.0-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:51ebb529fc5e8abdd55302f6c3f8943037348ec2384329a3e55677f69ae2fdfc", size = 4290650, upload-time = "2026-10-16T22:17:11.196Z" }, + { url = "https://files.pythonhosted.org/packages/46/85/d534089068ac40c0f61f650389a296c812eab745a8a733f81feec39ae955/pillow-13.0.0-cp315-cp315-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:c87a04e7f152ee4db5dbe15f0bfa3fe628a1aeedbe66b81c43b87f52c813f9ac", size = 3723078, upload-time = "2026-10-16T22:17:12.772Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2b/00b5c3b401df538b5dbe311d3899730fae5ba1e21cb8b80a128887ac6747/pillow-13.0.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:20722cd5375533ad754053363a80b8fb30c79d37930a6f7228030e237ce3bd5d", size = 5572292, upload-time = "2026-10-16T22:17:14.539Z" }, + { url = "https://files.pythonhosted.org/packages/72/f5/a6b0610f946e9b54ae888ba7ad29d6e2f8d9b11f69e212d70416b7186c09/pillow-13.0.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:04a63720f79e22fd54d897c233a68314c50ca0603360f54ce2bd5db8f0f43782", size = 4852222, upload-time = "2026-10-16T22:17:16.521Z" }, + { url = "https://files.pythonhosted.org/packages/1e/d0/c0ff25bb0427ec70f32aac995453321fc3c4494a46c7292ff02d9d260b04/pillow-13.0.0-cp315-cp315-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f8db54177035a2b5f717f94475b74907e12a96dc74f6d487f3966b0a4694071", size = 6527349, upload-time = "2026-10-16T22:17:18.534Z" }, + { url = "https://files.pythonhosted.org/packages/85/11/e46fa0bcc0fc117f1eacc206b3d51f04d583fab328b4b740672d0438d83f/pillow-13.0.0-cp315-cp315-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f36aa77f74b14a2103622b196402c71330e4e7cf4122ee45c854e9a01e0eecf", size = 7152873, upload-time = "2026-10-16T22:17:20.415Z" }, + { url = "https://files.pythonhosted.org/packages/7c/53/2bdeca705f3a58679fa9201233193c86a30238340ca29b3a152c3fcc719b/pillow-13.0.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:149a1c323ba366f90b48e6f1a6db6582eb50512df374588de56fc909abc0f0f3", size = 6626871, upload-time = "2026-10-16T22:17:22.361Z" }, + { url = "https://files.pythonhosted.org/packages/14/de/3829030f209722ade3753bb456b805a0e7f885cf885b483407365c82e9ca/pillow-13.0.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:e892354a424b1e82a78ba16785822bdd40de06f19446a3d4a28047df1a4f8932", size = 7236439, upload-time = "2026-10-16T22:17:24.352Z" }, + { url = "https://files.pythonhosted.org/packages/44/b1/67fc37388382bc036a74f04da5bb6fcbf90ec3ac1f45893e06176c373fd3/pillow-13.0.0-cp315-cp315-win32.whl", hash = "sha256:8e459b613cf31f8980f584387b4fe47bf08e076e288d61aa8eba1f7fd4ddbb81", size = 6508688, upload-time = "2026-10-16T22:17:26.314Z" }, + { url = "https://files.pythonhosted.org/packages/44/05/fdb6a79aee10861165526b41b7b440e36ee1ff58613b2fbefe3acbf06d4f/pillow-13.0.0-cp315-cp315-win_amd64.whl", hash = "sha256:d4737f50d23ddd11d6685faacbb9252887dde0bc7997127757247983d74399d6", size = 7281107, upload-time = "2026-10-16T22:17:28.198Z" }, + { url = "https://files.pythonhosted.org/packages/e6/9c/6c6f7dc2a566467baf121394e83de25ac287cffe34cc030726beb4be0224/pillow-13.0.0-cp315-cp315-win_arm64.whl", hash = "sha256:2310e2adfc13c6d457d7d0f2ffdd5c56a74a317650cf765887df8d515a647ac0", size = 2695513, upload-time = "2026-10-16T22:17:30.013Z" }, + { url = "https://files.pythonhosted.org/packages/23/16/e9120defdb8bff693b582d035312acc6f530cdc2bc5238a87f410efccd82/pillow-13.0.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:21c32061a5512dc13f87cc7303e120e4d77c2f70df89a35af0e3ce246e5ac57f", size = 5578129, upload-time = "2026-10-16T22:17:31.642Z" }, + { url = "https://files.pythonhosted.org/packages/47/22/76faf2bb2448f48a84cf894c1e2bb1090d7d2b1aa521ece131cb2f05d631/pillow-13.0.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:1c774b9c0ba0d0b356f71530677b39028878a2cae5a93e0a13779cfd17120f88", size = 4857428, upload-time = "2026-10-16T22:17:33.43Z" }, + { url = "https://files.pythonhosted.org/packages/b3/64/0861ea4e03c50b14af9ed9dd8b9f388ab42f445c623a9fcbab19aef7aa55/pillow-13.0.0-cp315-cp315t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20822140c9a2ba9c5e42df342b0a892ab2e102fc0e3db967a133bb9ce3f898bb", size = 6612582, upload-time = "2026-10-16T22:17:35.415Z" }, + { url = "https://files.pythonhosted.org/packages/5c/20/cd1e9b3f60a9f3d5ebe46da36955c26004092a501f7f2c42f9fcc26611bc/pillow-13.0.0-cp315-cp315t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ffea6b2986a797c84b6d1d27d4f43e0b83c73fc16281a930891cd237cf0d08fe", size = 7230176, upload-time = "2026-10-16T22:17:37.362Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ef/ffb0a2fc85690714fb7ac662956949645d57f15bf4426f520da361e7b6e3/pillow-13.0.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:05cd2cd39055d0b9650060e4513ef4a9a0aea870083950bd046a0d6490f93a22", size = 6703640, upload-time = "2026-10-16T22:17:39.313Z" }, + { url = "https://files.pythonhosted.org/packages/e0/c2/6402ee3ccb3363aeed8fdb3f9fe56703ac5377a539f0b81b53999d7e121f/pillow-13.0.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:c6fd031333dedcad7ce3e03d244093f43504f209e86925ebdb2b868fa4037630", size = 7309231, upload-time = "2026-10-16T22:17:41.021Z" }, + { url = "https://files.pythonhosted.org/packages/fc/96/d6b82e8b8c06ad143b66b12e0b31051e4bf489b4fabca1f390a14fe1ebde/pillow-13.0.0-cp315-cp315t-win32.whl", hash = "sha256:c50c80e3591e5cf9a8dfa6007d4f10732f02e32263850999286e56ccd650cfb2", size = 6517200, upload-time = "2026-10-16T22:17:42.886Z" }, + { url = "https://files.pythonhosted.org/packages/60/d4/0062e6005e9b270b165015aafd343364ac378ec5a685431ea42baad33357/pillow-13.0.0-cp315-cp315t-win_amd64.whl", hash = "sha256:adb3c2124c68e480f4632d06cb7caa3b48a51678475f483b4edb1c6dee29ea43", size = 7287488, upload-time = "2026-10-16T22:17:45.56Z" }, + { url = "https://files.pythonhosted.org/packages/e4/81/b8eb349746be7bce47dd95337c6634e84910af91b59aaa9159c034c614fa/pillow-13.0.0-cp315-cp315t-win_arm64.whl", hash = "sha256:4a25756244bdcce3b50580baadf320fa48297f0eeb8e114ba64139a40d4d0fc8", size = 2698073, upload-time = "2026-10-16T22:17:47.556Z" }, + { url = "https://files.pythonhosted.org/packages/60/da/f6d644e631c5b370c5d0b899f3ccadd2780aab070b29a110527cf4e1fd2c/pillow-13.0.0-pp312-pypy312_pp80-macosx_10_15_x86_64.whl", hash = "sha256:8619685cad8efc4c38c66d3b36aad854523297c43d748b3b6f0cc03c90ba3463", size = 5523188, upload-time = "2026-10-16T22:17:59.334Z" }, + { url = "https://files.pythonhosted.org/packages/e4/b0/2594f202d743a35d4fe80682bfd96f277e5ca7aecb27cf64ef5bfc1d000b/pillow-13.0.0-pp312-pypy312_pp80-macosx_11_0_arm64.whl", hash = "sha256:7e91e97a929232cdb828889ee6ad0e48d7f40f4ec38818f4e4a8968b2b1af22e", size = 4806808, upload-time = "2026-10-16T22:18:01.188Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ed/d504165ef79af6fafe25c76726cf30f544cc236002f7ed054f1d51adc4ff/pillow-13.0.0-pp312-pypy312_pp80-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93ff9c9c3663ce23aaa5d0b6b6abac55359e2a0c06c7e30f3771829af816be63", size = 5464358, upload-time = "2026-10-16T22:18:02.779Z" }, + { url = "https://files.pythonhosted.org/packages/7b/fe/a10aba5503ca13e9e009b8bd0a1a4ce5584bdce246245fd6f3a83701369c/pillow-13.0.0-pp312-pypy312_pp80-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e65dd6e75de67b2362a4fa3e16aa627595f65054dc4ec73d64680c84d592fa61", size = 6043514, upload-time = "2026-10-16T22:18:04.538Z" }, + { url = "https://files.pythonhosted.org/packages/c0/37/66b12dc476041fe523bca29c9d58fbf1ea92a4eaf73acfb9e993948f1191/pillow-13.0.0-pp312-pypy312_pp80-win_amd64.whl", hash = "sha256:567f20f1c75897d7663830da6ea8af719e03d712b1d9ee7f813319f9ece42e5a", size = 7366030, upload-time = "2026-10-16T22:18:06.638Z" }, ] [[package]] @@ -2858,20 +2934,20 @@ wheels = [ [[package]] name = "platformdirs" -version = "4.12.4" +version = "4.13.5" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/90/a1/d5f9002a70298c64a789779077d8dd90c10aa1f47fe40c86802df874f2a6/platformdirs-4.12.4.tar.gz", hash = "sha256:63743c02414e755de4e31b8f68125c1407495b86c5a006e203c01ff8b9924250", size = 60010, upload-time = "2026-10-07T23:30:32.426Z" } +sdist = { url = "https://files.pythonhosted.org/packages/58/e6/d0abbb256b44e6a05748c6942511ff67db8dbb068de0c35b24bf1b395b09/platformdirs-4.13.5.tar.gz", hash = "sha256:05831adf87d392760f4b5c3a0a95579ab5a10b18b9b9bd43680dcb47544788a0", size = 62362, upload-time = "2026-10-19T01:02:11.778Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/ba/223e00b885e960edd5d4b4d178c88acce019bd5b83786093681b8c393492/platformdirs-4.12.4-py3-none-any.whl", hash = "sha256:78bfb9db2a8471ed7eebe3c3c932da413911042994e699b384fbb4493fa872d7", size = 32596, upload-time = "2026-10-07T23:30:30.825Z" }, + { url = "https://files.pythonhosted.org/packages/6c/8a/1d8cb3842909dc193a73835adedf412e32e18f8ffd59f43983949622fe6f/platformdirs-4.13.5-py3-none-any.whl", hash = "sha256:53d3ec4280b815c1e0b02edad7f9ee8fda1ba9c0865dd9c2e6e63849ce82fc1e", size = 32779, upload-time = "2026-10-19T01:02:10.17Z" }, ] [[package]] name = "pluggy" -version = "1.6.0" +version = "1.7.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/db/7fc19e6f2dc92a966727031389fc2e08b558f0f25eb7403c1119ad4713cd/pluggy-1.7.0.tar.gz", hash = "sha256:d1eaa46ebb595891b860ab086b4d09c8588af65ebd4361b8e8f4bb8920b90ba8", size = 123304, upload-time = "2026-10-15T09:50:58.343Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, + { url = "https://files.pythonhosted.org/packages/40/9e/2b38731e0fc536806f16490e1a12d7f0dc2a1235aa8cc07bcc75416a7daa/pluggy-1.7.0-py3-none-any.whl", hash = "sha256:7dd7b0d8832ba3cb632c306926ded123429211b83641b35dc5c41ad2d34f9bec", size = 27082, upload-time = "2026-10-15T09:50:56.808Z" }, ] [[package]] @@ -2916,7 +2992,7 @@ wheels = [ [[package]] name = "py7zr" -version = "1.1.3" +version = "1.1.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "backports-zstd", marker = "python_full_version < '3.14'" }, @@ -2930,9 +3006,9 @@ dependencies = [ { name = "pyppmd" }, { name = "texttable" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/59/3f/ac248f25f3901d3d6cf80ac99d5bac6fd1e5e6543c1812c79b02b6074c60/py7zr-1.1.3.tar.gz", hash = "sha256:8d51894abb38355bf14881088bb97f01fe4cb5b14ebe22f66d6297668c7e1a74", size = 71695, upload-time = "2026-06-19T09:28:29.339Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/31/d5469ec310b57c730785068c227caf2263391be846ae5e99488f69b394eb/py7zr-1.1.4.tar.gz", hash = "sha256:7674697559bd06b697bf6e8249985cee6dc704a4b07b8e11f24d0b1695707c3e", size = 76503, upload-time = "2026-10-12T11:31:18.36Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/40/dc7f804abd0ea167ea8d4d9b3f5455321aaf671d040fcef647e9e952e714/py7zr-1.1.3-py3-none-any.whl", hash = "sha256:17934a35089e026dec6c72ee275d9b841e646881ef822d618e805c3006661d9a", size = 72242, upload-time = "2026-06-19T09:28:27.512Z" }, + { url = "https://files.pythonhosted.org/packages/96/bd/72bace0bf4025af8ab4bf972394fab466d4b565cdbea805281fbee9a8dbc/py7zr-1.1.4-py3-none-any.whl", hash = "sha256:f6f868a457a6bd485b78d26e619045718bcd0b7720a6bf97d5fe86a1523423e8", size = 75484, upload-time = "2026-10-12T11:31:16.526Z" }, ] [[package]] @@ -2990,51 +3066,51 @@ wheels = [ [[package]] name = "pycparser" -version = "3.0" +version = "3.11" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/a8/c5fdbeee588bb8ada9458774f43adf1bdd30bd59157055142183e769a024/pycparser-3.11.tar.gz", hash = "sha256:d875f09c3507d00e1aba0eecc6dcadc1352f30fff09dc6bff2f1c2935e97c2bc", size = 113796, upload-time = "2026-10-09T12:56:59.539Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, + { url = "https://files.pythonhosted.org/packages/90/11/0e6f11117525ff0eec40ebac3d313376f102df93ca44ad9e893ee85e4f89/pycparser-3.11-py3-none-any.whl", hash = "sha256:51d5a8ba2be0bbe440b99d2112604c95bbbc3c2748a64260186c541e1729cd80", size = 51178, upload-time = "2026-10-09T12:56:58.131Z" }, ] [[package]] name = "pycryptodomex" -version = "3.24.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4c/25/214ea825a9031f5af2c8b2506ee16701a2560d4712165dd00098dd527bcb/pycryptodomex-3.24.0.tar.gz", hash = "sha256:0428f19f13452c6b89bbaf2c530f84f369873811dfa77f0cee0da4f40fb0474f", size = 4933136, upload-time = "2026-10-04T17:41:08.988Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/52/5235086483b462600958549b27683ccffbb4941ba512934efc5a14b71a39/pycryptodomex-3.24.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:abf768c285d289c4a0e0678f055663162c9d6257c79f5904fbd2692ade94da1c", size = 2475900, upload-time = "2026-10-04T17:39:26.374Z" }, - { url = "https://files.pythonhosted.org/packages/9e/cd/eeed4b1a1eda71a78defe2c04ff37909461f9c04cd4bde23011d4350cbfb/pycryptodomex-3.24.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c2f42f24d7112ebb93d3aed581d011c82c20101da7d7a6248145c530e99bd2eb", size = 1643488, upload-time = "2026-10-04T17:39:28.545Z" }, - { url = "https://files.pythonhosted.org/packages/18/d2/22005d736858dddd3f7a5ddaf4a91dbb89292f0d9c503a9c13b1bb2ecfb8/pycryptodomex-3.24.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e42a2e9531c40315290278d9eee93ea5031eda3c83969f5709ada51a1c7491b4", size = 2194768, upload-time = "2026-10-04T17:39:31.713Z" }, - { url = "https://files.pythonhosted.org/packages/19/c4/c350bb48207ae2a6cca02eb45a2dafc3f2d0196b5b33b556cc9b6815e8cc/pycryptodomex-3.24.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7055400f773856cd219680d15525c6fb147237534cbe5394a5f92f57f7efaed", size = 2280612, upload-time = "2026-10-04T17:39:34.828Z" }, - { url = "https://files.pythonhosted.org/packages/fe/56/539e213fbd572f8e95cdef5a46b0c327c7b2412107c3dba73913cfd20753/pycryptodomex-3.24.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e8a7463d346015b42a0fb9c9179ebb7cccfd86bf40199c6796b546ac7be0b85c", size = 2186291, upload-time = "2026-10-04T17:39:38.184Z" }, - { url = "https://files.pythonhosted.org/packages/9b/f3/f8e73be610ef576c6ca98a78c8450a72f12c178bc89d3e94068e48115c97/pycryptodomex-3.24.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f96e10f0edff9d4b6b253e0a78f7c819749521d3ffe6af0139e08fcd35384405", size = 2278371, upload-time = "2026-10-04T17:39:41.539Z" }, - { url = "https://files.pythonhosted.org/packages/16/bd/99c89964c5017488992f412f8d645923d8ef996c7f35fc76b7fe019620e1/pycryptodomex-3.24.0-cp313-cp313t-win32.whl", hash = "sha256:3b6276fe007464502df796710fb57dcfeb813b6ccac0eabaf85100be1ad358f2", size = 1792741, upload-time = "2026-10-04T17:39:44.173Z" }, - { url = "https://files.pythonhosted.org/packages/ca/d5/5a1e469c7eab20c21090d396342894d2f0e25d429eb4df2d9174a03cb226/pycryptodomex-3.24.0-cp313-cp313t-win_amd64.whl", hash = "sha256:88d37b28b450c06a03bd5570467c601fe8c7dbe493ca39771716f56fdbe35d6e", size = 1825623, upload-time = "2026-10-04T17:39:46.422Z" }, - { url = "https://files.pythonhosted.org/packages/1b/fb/1ca14c7e5318125aff23cd19886a62c8eb9015caa373b5834216c60260a5/pycryptodomex-3.24.0-cp313-cp313t-win_arm64.whl", hash = "sha256:e635c7ac056f2a47d79e2bf7042fb3fc6d175f47796a954388a3cec1f2e082a4", size = 1759392, upload-time = "2026-10-04T17:39:48.676Z" }, - { url = "https://files.pythonhosted.org/packages/a0/dd/8f2d18986f752ceb245d4c3aeb0b13e9ed329d64434969981f0746b5b2ff/pycryptodomex-3.24.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:f6af77f15a91bb6c16607067cfd201330cf5dfefe1c715e955be1fb06d368613", size = 2476818, upload-time = "2026-10-04T17:39:51.311Z" }, - { url = "https://files.pythonhosted.org/packages/8a/64/6bc2394a249d1c7ba330d192e4bf22d7e5a8caf28ef1dd346b8b847b91b3/pycryptodomex-3.24.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:582efdf767d72c12538949b876a64b9a7af30f2cff063c06dd63ece32c4e5c1d", size = 1645659, upload-time = "2026-10-04T17:39:53.936Z" }, - { url = "https://files.pythonhosted.org/packages/46/36/f720afe32331ebf200bc37d335120f74da371969722d3c188fac757a8a71/pycryptodomex-3.24.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5be79564e05ed620a63f353ea50e0d474eb598f70cda1b28c2ca8e9e2f02c139", size = 2194769, upload-time = "2026-10-04T17:39:57.357Z" }, - { url = "https://files.pythonhosted.org/packages/05/ac/d0c3b629a9e91c9dee019fa59cdf9617b84b0d11909541e1d6c79b24637c/pycryptodomex-3.24.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb393480b5845ef4acbc9f713e4c473ad08be81bc3cdb5ef017cd02bdafd36e1", size = 2280609, upload-time = "2026-10-04T17:39:59.915Z" }, - { url = "https://files.pythonhosted.org/packages/5f/0e/e64276b7f3dbe9aeabd9c80dfff10bc97740ad8e24892eb6b0e3cbdcd549/pycryptodomex-3.24.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c7b8ad51baf3505dd3d94ec974855359d15769e45c58c2b89c6d4612b1f7ed94", size = 2186290, upload-time = "2026-10-04T17:40:02.856Z" }, - { url = "https://files.pythonhosted.org/packages/42/2f/b72cc71bff456971e24e886f1824d2efef7b25fbd806eb821b107f8253e6/pycryptodomex-3.24.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:7ffcedf4210d8c206fe9852ccde9f78ec9ce35e8039f0a989900ffe710e7a5db", size = 2278371, upload-time = "2026-10-04T17:40:06.135Z" }, - { url = "https://files.pythonhosted.org/packages/70/b0/9d0f0d4d6236f986c942d2933d4a5cbc209ebac1ea7d4c74b6e306efb439/pycryptodomex-3.24.0-cp314-cp314t-win32.whl", hash = "sha256:8d6c5e01e4fb1ddd20cc24d4d8706643dd78b5279453dabcf10ba4e0683bf9b2", size = 1808717, upload-time = "2026-10-04T17:40:09.172Z" }, - { url = "https://files.pythonhosted.org/packages/8f/99/55c75d5c8c0e3c966c6f639e3b2556c54b0172501f7377cff2aa570447c7/pycryptodomex-3.24.0-cp314-cp314t-win_amd64.whl", hash = "sha256:c55e6c42f9eb43d90c15792bf69bc09cb3e13a5e55a30eecb555695a02b0d4c0", size = 1842528, upload-time = "2026-10-04T17:40:12.033Z" }, - { url = "https://files.pythonhosted.org/packages/18/3d/2cdbda0eacc9875c5db5cede94389f8ca4a6a4bccbbbc74f47f8fa4f0c6c/pycryptodomex-3.24.0-cp314-cp314t-win_arm64.whl", hash = "sha256:6a62122fb4c85befcc01ec3a1ae5b2ba81689481aba1d383b4e21e34f18900dd", size = 1777885, upload-time = "2026-10-04T17:40:14.361Z" }, - { url = "https://files.pythonhosted.org/packages/bc/fd/b9186cea5e823f91f40904373cff30cdaea5dfe1863b4be0ed3bf51e4db6/pycryptodomex-3.24.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:ef2bd306328a8447d4d2af6037efddd67ef16630876ed3ec84babd16ca558941", size = 2476748, upload-time = "2026-10-04T17:40:17.326Z" }, - { url = "https://files.pythonhosted.org/packages/65/c4/bf354a7c435da08ba9905a302dce8fac57a33b2ab1e51c78542b698b4b89/pycryptodomex-3.24.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:42c8221e3a4ca04b070cb388fca004815f6544951bfb2cc6c7958e293b7caf64", size = 1644339, upload-time = "2026-10-04T17:40:19.872Z" }, - { url = "https://files.pythonhosted.org/packages/7b/ea/158d0ea838c92ba5d5081ce0f08e4af40d7278f7609ca007fca4d010aa4d/pycryptodomex-3.24.0-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:da9996407d03684221a4e1603b70fad97d8772185e5f75addcd97fcbc4c3281f", size = 2193232, upload-time = "2026-10-04T17:40:22.957Z" }, - { url = "https://files.pythonhosted.org/packages/c8/9f/376b705a536c65fe41806babe5cdcfb076273a0d72dfbbb92073d3d9b10c/pycryptodomex-3.24.0-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:556e063b52f338bd924fe5c40692cc1f50cb0453bd1d6580b7ffff2eade1a894", size = 2279395, upload-time = "2026-10-04T17:40:25.777Z" }, - { url = "https://files.pythonhosted.org/packages/d4/72/a0726c7165ba84d66923c3e5d5411c5abec9a9a4c1759a664e5cf8806a79/pycryptodomex-3.24.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b6690bfae043c81108e28e31dc7e3afa8cb1b1eb0ba590fdbff2b66e4c6913e7", size = 2184779, upload-time = "2026-10-04T17:40:28.813Z" }, - { url = "https://files.pythonhosted.org/packages/39/51/c5b9d8fc84d5cf67091a007b476e24f634252fb314472e27a58f3bd97458/pycryptodomex-3.24.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5fa46af1281be707e0ec5878aea0f77d58d8d4b465f63f7385a71ae0080bfff9", size = 2276914, upload-time = "2026-10-04T17:40:31.23Z" }, - { url = "https://files.pythonhosted.org/packages/c4/28/26f6d1b4257911bdab1c66c2a80e1193131bd8c02fa9ac04453cd45233c1/pycryptodomex-3.24.0-cp37-abi3-win32.whl", hash = "sha256:fab40542a863cc142a763aa92630d613925fe3e937bea3ba5fb735e0c42d4f96", size = 1792631, upload-time = "2026-10-04T17:40:33.61Z" }, - { url = "https://files.pythonhosted.org/packages/4d/91/fa406bbeea093b53d314dfb0fd186658a69a398b73a3a609636b8402b5c3/pycryptodomex-3.24.0-cp37-abi3-win_amd64.whl", hash = "sha256:55f22d72250d7923aac3c2442ec6a1dd8774d2efa3bdcb0f68d5e137d372268e", size = 1825514, upload-time = "2026-10-04T17:40:36.059Z" }, - { url = "https://files.pythonhosted.org/packages/10/b0/c53c7ac97c5deb721aa4f940309802c71ff5ac2fdeac473ce96754c69e5b/pycryptodomex-3.24.0-cp37-abi3-win_arm64.whl", hash = "sha256:908f92fbc307b642b65580d0295698f423b057018d87ae43d441f1d1a00674a2", size = 1759397, upload-time = "2026-10-04T17:40:38.641Z" }, +version = "3.24.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/e7/50e72301e32acb73a314e663c2014e1ddefc019d5f434ff14ec89861d664/pycryptodomex-3.24.1.tar.gz", hash = "sha256:09081666ffc599976c0b8b29caf2cf82212c0f05bed233c8f8ed53e4f6e1d356", size = 4934627, upload-time = "2026-10-11T19:26:49.624Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/2a/1129e2245c474edc9dde1eb3ee5dacc100b896977339117b30e29078784d/pycryptodomex-3.24.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5966f829f64c833cc72a8694cfee05ad50446a44167842c92dec4ebf6b84d72c", size = 2477074, upload-time = "2026-10-11T19:25:36.458Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5e/147a034ada6ecfb38effd375b55c27523851f18509a8312bc617bd0de7de/pycryptodomex-3.24.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7f30261641dac5ae60e0af2fb11ad7c87200575b0ce403f7531576b0f38a52be", size = 1644417, upload-time = "2026-10-11T19:25:38.567Z" }, + { url = "https://files.pythonhosted.org/packages/19/49/49fc9000d594fd76f9cfe15b6bbf0f9e8d0550202f5a7fa8ddf16846f965/pycryptodomex-3.24.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e2027f81fe6b700e7ff614d79111559bfb05ed8c4a9de9d2152d1a0a0768de", size = 2195698, upload-time = "2026-10-11T19:25:40.313Z" }, + { url = "https://files.pythonhosted.org/packages/85/40/f64fb00b5bac898d40b1806c4fdb0c6a40e4977a7b5178a38818adcf6043/pycryptodomex-3.24.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c20fb5e8cf874dc182091d6df122b8b588501d23e7b500acf662c49899afdd0f", size = 2281501, upload-time = "2026-10-11T19:25:42.037Z" }, + { url = "https://files.pythonhosted.org/packages/96/74/15119b835617b9dc02e78f4706b366e941959b535776b588f1e46ac569bb/pycryptodomex-3.24.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:147c742f73bbe8791d8c454b9972330d7ea501de94e8172957af375f9bdb4a7f", size = 2187040, upload-time = "2026-10-11T19:25:43.795Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c5/d0a7b0613bc3cd9632c5ee9bd85b8458312a217d4c38c8477527eddf7592/pycryptodomex-3.24.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:cdec09935db4cbd74da5b577ea7d9959c73374060b22abf7d505429c0da7ed63", size = 2279237, upload-time = "2026-10-11T19:25:45.724Z" }, + { url = "https://files.pythonhosted.org/packages/3c/3d/da0548d495dc2ccf8118e3902d321ed0fa025ff8a7319e9e97716d0d522c/pycryptodomex-3.24.1-cp313-cp313t-win32.whl", hash = "sha256:6159dc74824c591b4c294f8f96b74a71c3b5e9f637dab2f2da14cfa32dc24d47", size = 1793507, upload-time = "2026-10-11T19:25:47.825Z" }, + { url = "https://files.pythonhosted.org/packages/9b/4a/ddd59bff4eb0a62a5c484b3ad7335b2c8de4399c45d2b49bfba44268d0ac/pycryptodomex-3.24.1-cp313-cp313t-win_amd64.whl", hash = "sha256:edc1deb28fceab6b78e12bae506eaef62ee2fc1b3cabc96f7932f0d51e368acd", size = 1826054, upload-time = "2026-10-11T19:25:50.031Z" }, + { url = "https://files.pythonhosted.org/packages/e1/c0/a9c5270bdaeadc7b0e4674ffb993aadd6aaada37230bbc362423f75cff5a/pycryptodomex-3.24.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5b37b86a3771d6aa21cccf9f8448460e4be11e68bb8e699133ce632cb986f521", size = 1760465, upload-time = "2026-10-11T19:25:51.871Z" }, + { url = "https://files.pythonhosted.org/packages/48/3b/aeef17f479f6c7e367a9f6ad9974866ea311719b2f976e8b26cecd1b27de/pycryptodomex-3.24.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:514d685de4b0227d35d7114047fbd575bf162bff373e07af665aa41eee089dd0", size = 2477998, upload-time = "2026-10-11T19:25:53.619Z" }, + { url = "https://files.pythonhosted.org/packages/18/c1/d26287bf0e1f8c62ed7d448320a0d6704ddbb27f26506e66ffb4431e8ec5/pycryptodomex-3.24.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7a81e9be7084af3591912475b22c5d0646a9160f3974b6b7300138781fffdc0d", size = 1646567, upload-time = "2026-10-11T19:25:55.45Z" }, + { url = "https://files.pythonhosted.org/packages/82/a6/cf6db80b637d9480f7429797002779d5b57ecbeefb91169e0a70826359ca/pycryptodomex-3.24.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e87928d8f37952ba53d215836cb3d89c63c1367f037d055c3a5b3f4403f4c6b6", size = 2195699, upload-time = "2026-10-11T19:25:57.591Z" }, + { url = "https://files.pythonhosted.org/packages/2d/20/969e8df9f253b2b9586582e911c2b14ac0a8a0b2cc4f22abbe34c0b1d77c/pycryptodomex-3.24.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f3ed97cdde1d96894057778095238bad3dd94d3e46dc07d6d618e6d4b7700cce", size = 2281499, upload-time = "2026-10-11T19:25:59.648Z" }, + { url = "https://files.pythonhosted.org/packages/fe/33/6a0fe299a475a6f4dfc4dfd34ce70b158556d31e1a043eefa83651152d90/pycryptodomex-3.24.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:48d9058dd4c8f3af83e048b6ff83d9c6300841c42579f77fdfab19e49156a512", size = 2187039, upload-time = "2026-10-11T19:26:01.794Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6f/3580b64c6a166a00f4de5abe977bd4d9a0de893ce1fbe86ddb47851ca7d6/pycryptodomex-3.24.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9dd5104a1d8ccf725a3c1b40b21d5ed47530b6499abba30955c174d895c1be2f", size = 2279238, upload-time = "2026-10-11T19:26:03.558Z" }, + { url = "https://files.pythonhosted.org/packages/4d/55/ed1fdab2642548db89a3153143f4557315f1cba9e0c66166054bc07c2eaa/pycryptodomex-3.24.1-cp314-cp314t-win32.whl", hash = "sha256:569fdbeff936cbd5beb852b3969dc2f58fb255bd221b3f7a8999c035c30ec958", size = 1809532, upload-time = "2026-10-11T19:26:05.592Z" }, + { url = "https://files.pythonhosted.org/packages/d8/88/8ebf1ae58911beeb7316502decfb0b86913f00a983eecda6cf37ce0c61b6/pycryptodomex-3.24.1-cp314-cp314t-win_amd64.whl", hash = "sha256:3bbcc1807502da4b5d66c94357a99589c8547aa9ad2f9ecfa537b2e9a347538b", size = 1842970, upload-time = "2026-10-11T19:26:07.842Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e2/32a1ffba448295e642cb51f6fb8a5b796cdbefa23bc61379e7b1bea191ac/pycryptodomex-3.24.1-cp314-cp314t-win_arm64.whl", hash = "sha256:794f32227a480ab3b39971ac4a53dfa8ed444e28c0ddecbdc35f26d038bb46da", size = 1779090, upload-time = "2026-10-11T19:26:09.75Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ae/48679004ab908818326a62c35586b51ccd6ba0e3a03d0ae637cd13e8df99/pycryptodomex-3.24.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:9bb353c764c144a9fc03302ef3763ad0c3e75bc7ca41f445cc98455f36da6c59", size = 2477923, upload-time = "2026-10-11T19:26:11.828Z" }, + { url = "https://files.pythonhosted.org/packages/11/3f/14abc2a50521961dc864266d95898e87e073379ee9407f65c9d259f75018/pycryptodomex-3.24.1-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:eeac2c9acbd2d9f0ca493fdf692ce8245ca37cbebee08c496025868d4b8ef70f", size = 1645300, upload-time = "2026-10-11T19:26:13.583Z" }, + { url = "https://files.pythonhosted.org/packages/3b/5f/44916f6aa08a08b34b3ce41e2282d36149aa416a8edca9dbecd7c07e0a10/pycryptodomex-3.24.1-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9a732b9f5603b153dcdc071d6b342f192981907519827f2c1e4aeac41e2b34c2", size = 2194142, upload-time = "2026-10-11T19:26:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cf/93/a954b7a8746980e31648943e29772aca0311d0d8a407a3adf5788083b693/pycryptodomex-3.24.1-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9b94a8c647c1f80b4c82c7ac9642dda94a71abbb4efa29ad652c410ad7a39879", size = 2280275, upload-time = "2026-10-11T19:26:17.671Z" }, + { url = "https://files.pythonhosted.org/packages/90/8b/bb2bcc9da5cb1b70415bbfaa4d9dc837a677d021b4da16ed99b0159b42b1/pycryptodomex-3.24.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:bd06ab1d9cf90e8b198daae3b364e9ac23a640d210bb8faddad6627cf2e33be7", size = 2185457, upload-time = "2026-10-11T19:26:19.818Z" }, + { url = "https://files.pythonhosted.org/packages/e9/54/c123cfe95a7caba1eee9cb92e8482d59f74638b92d9035dff673246c45a2/pycryptodomex-3.24.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8321c315c4418dfe45a811b792380438ec81185deaaf202dbcd77711b4f51796", size = 2277787, upload-time = "2026-10-11T19:26:21.765Z" }, + { url = "https://files.pythonhosted.org/packages/5b/58/b06b695ff0f31261e841a25fc1342c8e774167e0d6db5d0a569fe1a137f6/pycryptodomex-3.24.1-cp37-abi3-win32.whl", hash = "sha256:cc64f4e1fc07a155ef31eb9815183a6a8eb13dfd6876ab049c01125223aa0c40", size = 1793402, upload-time = "2026-10-11T19:26:23.589Z" }, + { url = "https://files.pythonhosted.org/packages/13/4c/2c1963e4154da534a3b3a4d6ee9549f5cac4ecffe986d3b470d08b9c4df6/pycryptodomex-3.24.1-cp37-abi3-win_amd64.whl", hash = "sha256:82eb0dd8a95be97f03527b108ee49f9b86a7c534fa47fa7a510be3eab8ea9acd", size = 1825955, upload-time = "2026-10-11T19:26:25.258Z" }, + { url = "https://files.pythonhosted.org/packages/57/d2/a3a2158e44f468993583c2a0ae07f8b2a58f349e8cac1b4f039745d80945/pycryptodomex-3.24.1-cp37-abi3-win_arm64.whl", hash = "sha256:a692d2484ca8fa2c69f45c63f2b30cd00b8512834e3a522fc297d981dde5b34c", size = 1760463, upload-time = "2026-10-11T19:26:27.457Z" }, ] [[package]] name = "pydantic" -version = "2.13.5" +version = "2.14.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -3042,84 +3118,115 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/53/ef/fc4f868f4e2cee79f863883abffceff107875f569b848507319842d2a681/pydantic-2.13.5.tar.gz", hash = "sha256:51a9c5f7b2f8e636f04c6cada605d9b6a3bf1348fdf945a3d8869b19bba0ee08", size = 845750, upload-time = "2026-08-28T14:04:00.916Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/0b/8e10b2e693af8ec54346a14caf36221334775975a747c9ceaa3f8371d96d/pydantic-2.14.1.tar.gz", hash = "sha256:94f478203dd03404682a1ada216965651dd74b1d2d5ffd62e00e0837caab5c26", size = 900362, upload-time = "2026-10-11T18:37:55.396Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/47/c95ffc2009878c7aac0c5e08528022dcb885933252a88b5f170058014464/pydantic-2.13.5-py3-none-any.whl", hash = "sha256:346a034f080da3755d8e9cb5e00e8b07de1d39e4f6e2c87d8ab7cafa0b269a73", size = 472589, upload-time = "2026-08-28T14:03:59.136Z" }, + { url = "https://files.pythonhosted.org/packages/35/ea/a56b9fe5066f3537b7882f77e9c5dfb26d8c2eefdaed9b5fc73d57b4dc22/pydantic-2.14.1-py3-none-any.whl", hash = "sha256:9195d967ec791692a04438115466764fb8b9a27b31f14a760437694f40d6b454", size = 488106, upload-time = "2026-10-11T18:37:53.437Z" }, ] [[package]] name = "pydantic-core" -version = "2.46.5" +version = "2.50.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/af/f9/8a06bea35ef8daf588f707784c973a7046e0034c8d8cfb08828eeffb8b75/pydantic_core-2.46.5.tar.gz", hash = "sha256:10416c15b8839ecc4ef4d0885da76da6fd0f67333a0eb8aff6d93c4b8f2910fc", size = 472262, upload-time = "2026-08-28T10:01:31.677Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/82/3f/76358795aa7a8c6d4f36e2cb828ad1c90ee118e1393a9281664f5aade9d4/pydantic_core-2.46.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b9fe6fb92520e3fd61f2e49000b6911b188824f089b75973ea06d6267f0b476d", size = 2076516, upload-time = "2026-08-28T09:58:21.576Z" }, - { url = "https://files.pythonhosted.org/packages/db/50/26b091836076ce4cb2fac264186936acc069e0595772cfd02a563bc4761a/pydantic_core-2.46.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a39ac25a9a2fa4072efdb429833c4a4c8009a51ff9eea3eeae131713cd27991e", size = 1922874, upload-time = "2026-08-28T09:58:23.766Z" }, - { url = "https://files.pythonhosted.org/packages/09/f0/2a8ce3849e299d44e2d2c196b6082643a3235565a735cb51db7a6261f614/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fdc8b93a41521988916eeaa271173fcca7fa0803d62f87675aac8dcec1c8e29", size = 1951772, upload-time = "2026-08-28T09:58:25.435Z" }, - { url = "https://files.pythonhosted.org/packages/87/46/ac0dc8bdd9e6048183a14eb127764e7ad9240021c17513074a4711b0e31e/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b98134087d9de723658d17a42c7d0da8d6e2ef08015dee7dc93889047315f5e4", size = 2031832, upload-time = "2026-08-28T09:58:27.102Z" }, - { url = "https://files.pythonhosted.org/packages/c4/c2/339de5bef7be36301a2231eaa52e62163742c2281f11b5f4892bc79785cd/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e652ab17569c94bff5475520f907b7148b8c24036a8ebbe5cf7cf7493d28579a", size = 2208645, upload-time = "2026-08-28T09:58:28.948Z" }, - { url = "https://files.pythonhosted.org/packages/7b/a0/9ff22b797724262da14427abaed4dd1d864a139693fc5e7809114376a716/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d925f3d9afd05a8c0fb3a1031463a8d59ebe5e2afad297e29c78be19e13b4e62", size = 2265935, upload-time = "2026-08-28T09:58:30.625Z" }, - { url = "https://files.pythonhosted.org/packages/c0/a4/eb9409ec0736e50aa70a412f16c204ed149516846912f7e6724d4c73ee53/pydantic_core-2.46.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fc5be0abd4a407e200d844b404e33639a554e7bd0d448e7b9ae181be4789ac2", size = 2066284, upload-time = "2026-08-28T09:58:32.289Z" }, - { url = "https://files.pythonhosted.org/packages/c0/02/7f6156ffc926857f1c37c07d9a388682865a81830ab6a1b637082c25e399/pydantic_core-2.46.5-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:816ff0a6550ffc06c098ccd2e0698600f9aa7da192a79eaa6f9af504a35db869", size = 2105889, upload-time = "2026-08-28T09:58:33.986Z" }, - { url = "https://files.pythonhosted.org/packages/92/b1/e781d357ebe09fc929f995700f1b3503e8897f1cece183ecb1300d4d67e9/pydantic_core-2.46.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c7ea57fc63aa7da93a1bd2d644e6577befae10c52c4e36377635eea1056a74f5", size = 2158006, upload-time = "2026-08-28T09:58:35.647Z" }, - { url = "https://files.pythonhosted.org/packages/70/0a/644597d84ab400e50609c192120b85c9681c22d3a20461b9060a79be0a7a/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:efd62a42486f1bda5d24cb4f63d15a3c7768375fe83d36f9417b4ad7a2fb20b3", size = 2158408, upload-time = "2026-08-28T09:58:37.38Z" }, - { url = "https://files.pythonhosted.org/packages/1e/ee/ca3b7b3a4b3769ffe9ce9432a7c9be755de9593a46d3b0d54d0409323e44/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:2bc9419666990c06d7397831f2126a1ecc3594aaa3ff7de5bf2d066802f4e07b", size = 2309609, upload-time = "2026-08-28T09:58:39.22Z" }, - { url = "https://files.pythonhosted.org/packages/ce/52/39fa1f451486019524ca685020390e7ca351832fd874530ba30c8628e6dc/pydantic_core-2.46.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:18a09e1e1011b462f2e32774f25859ef1223d5c2b0546a633cf56654710721e0", size = 2342618, upload-time = "2026-08-28T09:58:40.89Z" }, - { url = "https://files.pythonhosted.org/packages/81/5e/468fc630568c61dcef3cd47ad32ffbeed9af643f49208d1ea86ab4f890c4/pydantic_core-2.46.5-cp312-cp312-win32.whl", hash = "sha256:5cb482e9e84c851f4e623fe4acc1ced89168cf1fe18f7089db4548c8f5bbb65b", size = 1939475, upload-time = "2026-08-28T09:58:42.591Z" }, - { url = "https://files.pythonhosted.org/packages/cf/c9/4c19f41b84cf6b622a72fbeed7665b25d47a187d68d47d0d430c07f23268/pydantic_core-2.46.5-cp312-cp312-win_amd64.whl", hash = "sha256:5e81740c09e310f5aa5cbd3e434a01c154d4bef93241c7877b39f211d2b78ba8", size = 2043140, upload-time = "2026-08-28T09:58:44.272Z" }, - { url = "https://files.pythonhosted.org/packages/af/dd/0c1a050299147c746e5256db16d645ab5efd4f78c59937d581a0524e74a2/pydantic_core-2.46.5-cp312-cp312-win_arm64.whl", hash = "sha256:f7b0ec93a2893de856652154d73b7ba622f26fa97726487dcac373de5f4c6084", size = 1997729, upload-time = "2026-08-28T09:58:46.13Z" }, - { url = "https://files.pythonhosted.org/packages/f5/37/5abe39a8372a61d3dc3c1338fc504281c01b32fdb3169cd7187153b56d3e/pydantic_core-2.46.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:b7ca9034437b6022f941f4857459562ee00a560b97e7cce8a0ec5a74fc6766e0", size = 2075885, upload-time = "2026-08-28T09:58:47.856Z" }, - { url = "https://files.pythonhosted.org/packages/21/43/6323b1f8b217780454c61304bcd2b38ae4762f50754414124603ccc90bb2/pydantic_core-2.46.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f332f0e72a5a0400141f830744e141bf9f97917878dbe968669e8a7fefea78ff", size = 1922768, upload-time = "2026-08-28T09:58:49.58Z" }, - { url = "https://files.pythonhosted.org/packages/0f/a3/c05ca796e1197618a774b01e596aeedfefc2f7d8c01ae3054e910b120e8a/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:193375f3548919d3f0b60936ca113ada3e38f264f91b9b8e0508efaad57be931", size = 1951241, upload-time = "2026-08-28T09:58:51.511Z" }, - { url = "https://files.pythonhosted.org/packages/68/32/33bc39ac705c52cffc908e8389f9754fdb208aea5c69cceddf4eb3ce99af/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:79bdfa52f843137045b2d081cc05c120ba6665d29b7559c2c47690906f39279f", size = 2031975, upload-time = "2026-08-28T09:58:53.166Z" }, - { url = "https://files.pythonhosted.org/packages/b0/70/2333e885c0f6a67bc105c5916965dac9b57f2718ee20d81d1a06a4ebdc13/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:24922243639cbdac66c75fcb6fd6495a9cb52b213d62f9a0d16f0310b1ff8038", size = 2208542, upload-time = "2026-08-28T09:58:55.017Z" }, - { url = "https://files.pythonhosted.org/packages/f7/ea/296debfb4264207bbda5936133892e027c0a58875ad53ebd512fba8ec3a2/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c76fe65e607be28c7fd4d56fc3c42b1583aa058ce3408b7ad0fd540171d31f9f", size = 2264692, upload-time = "2026-08-28T09:58:56.767Z" }, - { url = "https://files.pythonhosted.org/packages/d3/f2/9e4de77a6271e07a76d2d58b11c091a979c191ed2939bf80067568b369d2/pydantic_core-2.46.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f7b393a8b3da82f5c1fc0751e6d01ac6c55b93c18226a60bdfba4a724efafd1", size = 2066633, upload-time = "2026-08-28T09:58:58.531Z" }, - { url = "https://files.pythonhosted.org/packages/8d/db/f9e9d0c97445987b2084823d5c240de88087338f04fc2cfaa2df186b8049/pydantic_core-2.46.5-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:7ac031912d54f3d83ef3b3eb98dfabc1608802e2202263d25957eeed40b94761", size = 2105235, upload-time = "2026-08-28T09:59:00.421Z" }, - { url = "https://files.pythonhosted.org/packages/07/c5/79169b047b3b2c3e99e04bc76372af9637e0bf6db638274fa927df96369e/pydantic_core-2.46.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:837b396ca3d7b74091ca623f6cbd8351bd42d670a79c2683e79fb089f06a2de5", size = 2157367, upload-time = "2026-08-28T09:59:02.442Z" }, - { url = "https://files.pythonhosted.org/packages/26/b5/ba6057afb7c291bd449f51b867f95aef2072941c4ce4e5c31d6ffd132d3b/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:5ee239d575f80b08eca11f6e20f90c4c695de7825c67eefe6091fbf20dda648e", size = 2158420, upload-time = "2026-08-28T09:59:04.2Z" }, - { url = "https://files.pythonhosted.org/packages/6e/28/2057abecaafdc22912afa819603a51f0a62d40643b7c4871c51721fea9be/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:e80675d75ae2cd14372cb65cad5400d9347a3d3f6c13000183f22dfd027283ed", size = 2309588, upload-time = "2026-08-28T09:59:06.048Z" }, - { url = "https://files.pythonhosted.org/packages/71/9d/881156dc404e27479c4246128d73538464cab4a239bec61995e227644c30/pydantic_core-2.46.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:9c4b71f10dd532fb7a5cbc8f58707779e64f03a258c2bf8bfbaecfcd9970b519", size = 2341866, upload-time = "2026-08-28T09:59:08.539Z" }, - { url = "https://files.pythonhosted.org/packages/5a/38/d66f443a259f84d13babdceae568e572b0ed26da17ca5d0a649ebb110a67/pydantic_core-2.46.5-cp313-cp313-win32.whl", hash = "sha256:97bf8de4d541598c94a59344eeb988a94c08ff76b5723c41f6567ec18c7892ea", size = 1938580, upload-time = "2026-08-28T09:59:10.402Z" }, - { url = "https://files.pythonhosted.org/packages/2c/1e/1d5371213f4cc9a7ed70c0bfcc7911de22311ee99a662a56077d7292d2ac/pydantic_core-2.46.5-cp313-cp313-win_amd64.whl", hash = "sha256:15f4a94963c95accac15b7b657bb177d3ad82bb90b0d0526d9a9b85079925db5", size = 2041980, upload-time = "2026-08-28T09:59:12.396Z" }, - { url = "https://files.pythonhosted.org/packages/5a/48/4222d90b1c67568bace4dec6dca6271449c66de3595d72b6d098f5fde597/pydantic_core-2.46.5-cp313-cp313-win_arm64.whl", hash = "sha256:d22a945598fb91236b4dd793a6e42e4f3dd7740bb5aace5ebd7d4c08d13bb575", size = 1997213, upload-time = "2026-08-28T09:59:14.245Z" }, - { url = "https://files.pythonhosted.org/packages/8e/8a/14596f2a8367da50cf7cbac48169ee5d9c8e11d486a3b527082384630c72/pydantic_core-2.46.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c1c43ad4339643d70ebb8124e1305a7dab423001eff58bb41a0f731adbc98355", size = 2074081, upload-time = "2026-08-28T09:59:16.141Z" }, - { url = "https://files.pythonhosted.org/packages/ae/d5/d8a4eb6d6c7f66b91dd37c576d76e9e60fba900caf5372c17bcf949febc2/pydantic_core-2.46.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1a353f84de772f423b5ffb11d7ae352fbbef0f446f3c0b0af0f8236d7233606e", size = 1920497, upload-time = "2026-08-28T09:59:18.065Z" }, - { url = "https://files.pythonhosted.org/packages/8e/26/092079428f86e927e030b2c0ced87df69dbb1c875cdeaa67bf42ea2be746/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5086029a57366b8cf81b130a43908738095c270c21a8d7f0e8bdfdb89718e2f3", size = 1952130, upload-time = "2026-08-28T09:59:20.476Z" }, - { url = "https://files.pythonhosted.org/packages/08/c3/8ec0e290a9ebaebd64047bf5fda94be835c6b1551b02437e4b76778fbcd7/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:46c25dda9d092a06c08db76ffe0a197107904d0dfac653f7d5306bbcd6d6119c", size = 2026371, upload-time = "2026-08-28T09:59:22.227Z" }, - { url = "https://files.pythonhosted.org/packages/01/72/4fd20ad520fb8da0157f95b27a7eb05a72790ef08138e7701ac972c342ea/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:37ea7b83c935e5b0d68c9449b82651accf78a10828b2c02b2f2d9e9496446c21", size = 2202822, upload-time = "2026-08-28T09:59:24.277Z" }, - { url = "https://files.pythonhosted.org/packages/31/b0/d16e0771206b29314f0d52198b720be21e8a99ab2bf11e3bc0d7c9cebdff/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e64e88d5585bea9ce95861079de72006c7fa6d3df4e3a3b65ba31eb979c15c9f", size = 2262756, upload-time = "2026-08-28T09:59:26.608Z" }, - { url = "https://files.pythonhosted.org/packages/2c/9b/59634b7ac631c63b2a37760eb6943af3e29573d6b59a4abc5e7f019d4cee/pydantic_core-2.46.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d510bac3ee52247af28ed4bb18a1e799f040ac60fd2bf5ccd4c92f1fbe786f", size = 2068352, upload-time = "2026-08-28T09:59:29.044Z" }, - { url = "https://files.pythonhosted.org/packages/08/7c/570abb1ad2155348dc754ea91be22e5aaa18eb6d69a6068f7c6f2679a6ed/pydantic_core-2.46.5-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:a2a5e1d0ff29adddc9f6d6821a66302e4493f8ca898b715b6b1182c2c201ea0a", size = 2104777, upload-time = "2026-08-28T09:59:30.95Z" }, - { url = "https://files.pythonhosted.org/packages/8e/25/5bf74adc65a1ac5b7be3f6cb0bcb5433615c1598a801c19d830d84c98ded/pydantic_core-2.46.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:03b9666e41e35d8909852ba191a0607520f81b74eaf12ccf8737005dbb313821", size = 2156312, upload-time = "2026-08-28T09:59:32.604Z" }, - { url = "https://files.pythonhosted.org/packages/90/6a/2ef38830675e050121040618135564ed56b860b45433b02d9b4ebece46f3/pydantic_core-2.46.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:a91c17edf6eea2402cb5457b4c89e99bc5ed1004aa34c4adf1d4258c1a5c22c2", size = 2150067, upload-time = "2026-08-28T09:59:34.453Z" }, - { url = "https://files.pythonhosted.org/packages/90/ef/a7dbb03a14a64c2a4621f989c615ed9a892535a6cad938fc27079f919d80/pydantic_core-2.46.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b49924c73a235e969511bf2aabdff3beebf9820931f646c80274d5d780010c47", size = 2304516, upload-time = "2026-08-28T09:59:36.194Z" }, - { url = "https://files.pythonhosted.org/packages/68/f8/6bb4c4b80e8a6fde1904c64a51c62a1d04fcdfa3ea521a66b2ddefa1d885/pydantic_core-2.46.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:2cbd9a5eff05e51c447c34dfa4632145b26b09120cf04bd0c871e44c1a5e1c9a", size = 2335223, upload-time = "2026-08-28T09:59:37.931Z" }, - { url = "https://files.pythonhosted.org/packages/2a/80/f46b8c681195190b2c1f1c7c0a81abce60663e987613e09ef64d433dd96b/pydantic_core-2.46.5-cp314-cp314-win32.whl", hash = "sha256:2d5d76654becf5efd62c9e51c3756c67b49498b0c9a40884934c40807adbd074", size = 1934827, upload-time = "2026-08-28T09:59:39.836Z" }, - { url = "https://files.pythonhosted.org/packages/f7/3c/60674207246bc0a4009d2391b7c7251c7159f279c8d2ab8aae8ef46f3dee/pydantic_core-2.46.5-cp314-cp314-win_amd64.whl", hash = "sha256:fa10ef4112775900e7a0661068635eb67b2ab824fbde764de6e0e21982a93db0", size = 2042648, upload-time = "2026-08-28T09:59:41.792Z" }, - { url = "https://files.pythonhosted.org/packages/69/0c/117c562c7c1babdf44576b72a5e496906506c93690387ecfbca7c729ae2e/pydantic_core-2.46.5-cp314-cp314-win_arm64.whl", hash = "sha256:045ab3b6d308439e32b81cc173bba5b9018bc6ed896afd0c65b3b009b1699af5", size = 1989652, upload-time = "2026-08-28T09:59:43.702Z" }, - { url = "https://files.pythonhosted.org/packages/e8/66/9336ae58f9eb68c41d121894e52c4c89eccb07eb8f602a04ee9c3f37736a/pydantic_core-2.46.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8816f3d218beb4b787de5c9759c259b8fa61f9dec42dc7811f320a33771778b7", size = 2065829, upload-time = "2026-08-28T09:59:45.364Z" }, - { url = "https://files.pythonhosted.org/packages/c5/02/bc19b47a96c2d3109760711acf22369e56bd7e405ca52f7ade164d2ead57/pydantic_core-2.46.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:bce57638e08ac148e5778cce7feb968307a727d66f8e2274a543d0cf0c9ad6a3", size = 1905716, upload-time = "2026-08-28T09:59:47.18Z" }, - { url = "https://files.pythonhosted.org/packages/52/a4/70b47c0509923dd98ccfed04fb3e32ea3849c82a0ff2205bb41009b43c00/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976e1128455aa595ea04c79ccfedff1aaeab96ee013fcc916bed120c4f0ad94f", size = 1934216, upload-time = "2026-08-28T09:59:49.241Z" }, - { url = "https://files.pythonhosted.org/packages/52/ab/aa03b65f7bb198585edf806b906c3223ecf1795543e39e23aec4cce27ad2/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b891faeedeafba41b2983e5001a81b6a915b69544c7e7570d1989ce1c36ac7", size = 2010635, upload-time = "2026-08-28T09:59:51.692Z" }, - { url = "https://files.pythonhosted.org/packages/3c/8b/0da06343f30b84ec549aafd309c6456223d5dc8bd36af504c573faad561d/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5f194189415698233dd1114a093a9b56e61e2c57e11b469be3b0506f46f0771c", size = 2209369, upload-time = "2026-08-28T09:59:53.582Z" }, - { url = "https://files.pythonhosted.org/packages/d6/5b/844c4defaa34a3df66eb9257087d121d70c201298b96abdf9f492fc2f1bf/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82a36973cf8a2ef5406f4fe2edbf8ed0c99629535d959e0b100c76a32535a111", size = 2253238, upload-time = "2026-08-28T09:59:55.484Z" }, - { url = "https://files.pythonhosted.org/packages/f4/64/a4e536cb16d7f61a7fd3120b46c577fc7fa7325992f69c4f52bc786d77d8/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdbb78909f52b981d3b2d56b97328d71eb0b974c36bd77c920123a7ebb192829", size = 2065740, upload-time = "2026-08-28T09:59:58.038Z" }, - { url = "https://files.pythonhosted.org/packages/5f/75/aaa38c6bc2d085f6605b34eabdc6a8a4e0b2e61fc9c8e6e52b28e97b3125/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:52e24eacdb536cade636aa90fb851835222becff8484b7001fdc78cb0290f2aa", size = 2087425, upload-time = "2026-08-28T09:59:59.898Z" }, - { url = "https://files.pythonhosted.org/packages/55/ae/fcab4cfc39aba3689e1d20c8b5250ad280957022c09af2ed9cd585602a5e/pydantic_core-2.46.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:37ae34309d7bd8c0d61ab839668058f2a7962ea1fc51d105d2db228fe0618034", size = 2139306, upload-time = "2026-08-28T10:00:03.057Z" }, - { url = "https://files.pythonhosted.org/packages/2d/f4/f1d03a4bc9d9acbc62f4d742b8a319af52f71885079868b2ff8e48a651ee/pydantic_core-2.46.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:0cdbada856a1c69a7624a64d3d9aefe79300bd6ef827b43a4f265010b9b55184", size = 2144589, upload-time = "2026-08-28T10:00:05.645Z" }, - { url = "https://files.pythonhosted.org/packages/83/f3/7a53bb1356de514a4cd295f25b6ac39237895620c0462d2592b76c16e114/pydantic_core-2.46.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:545f26c504b27c3758439a5e6d9349931f0a04f855668d5fe323c89e82300a38", size = 2288882, upload-time = "2026-08-28T10:00:07.931Z" }, - { url = "https://files.pythonhosted.org/packages/cd/94/5a81583660c175c59d49ffb09f4b3a44debeaf86a19fca664ae1cdd9ee32/pydantic_core-2.46.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:ff218293c9c806138dca139765e3b067621be52bcd93cdc14c7711be7ddc90a9", size = 2335210, upload-time = "2026-08-28T10:00:10.177Z" }, - { url = "https://files.pythonhosted.org/packages/5a/9f/5d685c2693b972d1a59c998586e8823712b66603aeff47ee60a4bdaafd37/pydantic_core-2.46.5-cp314-cp314t-win32.whl", hash = "sha256:97cf3eb53a8cccacf9d46686a0926186c9bfb5574f2ed66d3639d5fe117cd3a9", size = 1921180, upload-time = "2026-08-28T10:00:12.35Z" }, - { url = "https://files.pythonhosted.org/packages/70/12/5c94ee16d65a37a15f9e869f5e6256df111154491173801a4c5e800ab548/pydantic_core-2.46.5-cp314-cp314t-win_amd64.whl", hash = "sha256:d2f9fc07a8042a8f95925b35c4f04f469707c981fc33245b6ca187cf5d2dd290", size = 2020515, upload-time = "2026-08-28T10:00:14.774Z" }, - { url = "https://files.pythonhosted.org/packages/63/19/67830dda664e6bdf9285ee2e40f355d0d7d6b92aa0c42e8d217bb8d33d36/pydantic_core-2.46.5-cp314-cp314t-win_arm64.whl", hash = "sha256:acf8a67ba51f4ca9ddbd0e6b3000a65ac51ab734661778b3e7ba64d99a710f2f", size = 1989276, upload-time = "2026-08-28T10:00:16.984Z" }, - { url = "https://files.pythonhosted.org/packages/df/dd/053c2e4303f791f3b8f8a14ab0b22008e8eb21d868c0c90b4f9be705b76a/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:013d6f3483d81e02e7c328831808f336c8596ee33b4bd4026b9ffb1e960b8942", size = 2062540, upload-time = "2026-08-28T10:01:00.318Z" }, - { url = "https://files.pythonhosted.org/packages/d7/dd/a18df751a5e37dd51bfad7f68e766999125bebe68c9e1d10a493ad01bd63/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:e9c134bb666dd54b778b9fc0d2b50cbb7f979b9e3716f26a88c9ab3b6fc1dd0f", size = 1902040, upload-time = "2026-08-28T10:01:02.529Z" }, - { url = "https://files.pythonhosted.org/packages/b7/13/01d40f9d07ce8a779fd6e0bd8ad4fba91309500dd67b869e2e219d261a6d/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:347ec774390c87326a2e4929d58d3f7e8763a104d5d35f4cd595a4c952366433", size = 1967479, upload-time = "2026-08-28T10:01:05.004Z" }, - { url = "https://files.pythonhosted.org/packages/fa/04/c81d4841331c2178b6fb09ae225425e110ed72d990c9fe556c4ec03d1013/pydantic_core-2.46.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e24d8f05fa2d28513d94e877e9c75ad66175376209b3977f916e240e623193c", size = 2111034, upload-time = "2026-08-28T10:01:07.345Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a6/24/af4ec4be49fbc810f35b0bdcacc3d433b56bbfa469fd3bfd4ae116cd9bf1/pydantic_core-2.50.1.tar.gz", hash = "sha256:e50d7b94baac6c7d09927fa5ca5800a0c7ee5015c7fcff65beb3a1931b5a6e09", size = 513515, upload-time = "2026-10-11T18:35:44.82Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/94/101b49a6c63f99586755690696eae14532772587d9e39e93f7b8d28a49da/pydantic_core-2.50.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:704075d10b74f2f3c6e15407c696d88701df35fc8953f434a431add0d0074db0", size = 2222428, upload-time = "2026-10-11T18:32:20.228Z" }, + { url = "https://files.pythonhosted.org/packages/db/a3/f8b1b39349c33037c73d7a1b794c9c29d8f07d5bd2b74399c1375a529cc6/pydantic_core-2.50.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e8e1d6ce820aa23317e8209a86bd65a540973c12dc7552b48a4f6c8e9926815e", size = 2025779, upload-time = "2026-10-11T18:32:21.723Z" }, + { url = "https://files.pythonhosted.org/packages/d2/2d/862a7d115305cc621358e51ba13f296e0ffdf4fbd984be9f63bc7862730b/pydantic_core-2.50.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c18db21573bd2c6489f9a544b7499f0df2853958c568e5e783536ee1f690af41", size = 2048429, upload-time = "2026-10-11T18:32:23.3Z" }, + { url = "https://files.pythonhosted.org/packages/c0/7d/fed95d18bf2b5abe2d5ab2bbec4184bfc22b6805994a33ccdae8edffd25a/pydantic_core-2.50.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cb57f304525a5e3c13333b772bf9a473f36326e9c821b2e8e1b2fd36f80ae2c3", size = 2173274, upload-time = "2026-10-11T18:32:24.697Z" }, + { url = "https://files.pythonhosted.org/packages/93/1e/c6f22ceac65dc3d291ff79bea0eb74cbd1de8b128f01fee48af03bcea1e1/pydantic_core-2.50.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a27c09d86600f1bf2fe3f37e1ae697faf3143931c09322cd799da94deee923b5", size = 2360403, upload-time = "2026-10-11T18:32:26.281Z" }, + { url = "https://files.pythonhosted.org/packages/2c/97/190b5b6bfe4c72f265feb657913eb30749193927a5ad7b83cfa7866a25a2/pydantic_core-2.50.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:46b3301d3b5c886f77de7546e47274a5842c622ea2020b8c6524c6b66913b4a6", size = 2439799, upload-time = "2026-10-11T18:32:27.844Z" }, + { url = "https://files.pythonhosted.org/packages/90/24/48cd98388e4ac2c08d0800af36d15413db15e20387f1038123a2c86cb2f6/pydantic_core-2.50.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93ba4e9d8210d941c200431a56b2c0400b131865947903937ed3ec5404307d2e", size = 2160157, upload-time = "2026-10-11T18:32:29.553Z" }, + { url = "https://files.pythonhosted.org/packages/00/86/d909133d0b9979ed14c20f110f21124a0e346caf071bd66ac5af3009062b/pydantic_core-2.50.1-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:e5faeaee74a57d32b3ab3aebad2e348f06d3ba946fc5d28c1728455f00a3d13a", size = 2229523, upload-time = "2026-10-11T18:32:31.027Z" }, + { url = "https://files.pythonhosted.org/packages/90/31/4b43f08131b2098e73a852fd932063385f3103b33839fd9d1abdb89e673d/pydantic_core-2.50.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3cda0e538208e5d722bbf3698b24f19c0a7d05bc8d5f8a7f9b121ea7fa243d9", size = 2242700, upload-time = "2026-10-11T18:32:32.622Z" }, + { url = "https://files.pythonhosted.org/packages/88/77/de39658569dc7a4c293d110a89629f61145e7538f00d1e4280c28debefd3/pydantic_core-2.50.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:57f51b31ff826e2859120cf4737c5a758a48d96f3e97da40ccee1796d58078ff", size = 2278452, upload-time = "2026-10-11T18:32:34.165Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/1eeb9e4e791e81210ef9096f58080b32ba15b5b13c108d50aaa3f8ce9f73/pydantic_core-2.50.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8daa7ee75245d43ad7d747e5c9ecc1b1d06552f72b14887e9276f787d57375f4", size = 2450098, upload-time = "2026-10-11T18:32:35.547Z" }, + { url = "https://files.pythonhosted.org/packages/1c/e6/b2accfdff17e5a88d6358536702146de00f9339adaa4d5bbe1ee93cb4832/pydantic_core-2.50.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:acbf31f37c53a5ac0c34706c80b4f5107ba20b05fdd3816124bf236ef0c57dd2", size = 2476839, upload-time = "2026-10-11T18:32:37.119Z" }, + { url = "https://files.pythonhosted.org/packages/3b/7e/c8a83eb5d2cd42c2e13507150fb777b1edea5a018adc9cbf2858a1d08285/pydantic_core-2.50.1-cp312-cp312-win32.whl", hash = "sha256:45b11cac094aa25725581d9304eee93c9028516b9ea80dd9e175e13a5a2c840e", size = 2101425, upload-time = "2026-10-11T18:32:38.593Z" }, + { url = "https://files.pythonhosted.org/packages/c5/17/8bbd530b8659e9d963f5b16f6cb8e159f4cd174b4d6304e48969ab12dba8/pydantic_core-2.50.1-cp312-cp312-win_amd64.whl", hash = "sha256:132529c83901437ff642f585216831bf5fd7a91df66829907e155192ead62498", size = 2172522, upload-time = "2026-10-11T18:32:40.112Z" }, + { url = "https://files.pythonhosted.org/packages/af/9f/a79d690b127e4e3cff143d031538ab9aa715f6b2fbeecbd07cd6f2bf9fb7/pydantic_core-2.50.1-cp312-cp312-win_arm64.whl", hash = "sha256:4e834f6a8e4ff772dcc34f58ef5504147a3ea5b0f4eeb13b0f8eb2ca75ac57f1", size = 2161366, upload-time = "2026-10-11T18:32:41.606Z" }, + { url = "https://files.pythonhosted.org/packages/ae/57/0e237d7091d2cd44a35d243b7344227f90440166860469cd036afc23a04d/pydantic_core-2.50.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:d5e062c01286d861fd6a1c4ff6e063547b3e713067f2df033c0ff97ac2ca006b", size = 2222774, upload-time = "2026-10-11T18:32:43.103Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b9/c720e56858d4e1539503297ed37063e0c08e0f3541c41b777f6a800f75fa/pydantic_core-2.50.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0c003c3b7f49debb893d2d85ae099ac5959c9839e2f330fadb1fcdf7a6594482", size = 2024738, upload-time = "2026-10-11T18:32:44.587Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b8/fbfc25875219cc060e613170ff10e850c6d8924beb4910da57c2ee3ba1d2/pydantic_core-2.50.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:409e0ea40ec30d9158f33574fd758e689f6045a0f2596701828c27816ca9687d", size = 2047049, upload-time = "2026-10-11T18:32:46.164Z" }, + { url = "https://files.pythonhosted.org/packages/d7/43/34210124d504c553688f2f04b48500b131237528ac545b445e0d6d30e0d5/pydantic_core-2.50.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:131059670f1d2444269b8585cb888963994871932447c08b39ac6a51fcfef658", size = 2173415, upload-time = "2026-10-11T18:32:47.722Z" }, + { url = "https://files.pythonhosted.org/packages/65/cf/6e178e8fdc11da5965bef980983bf46326a42f436871dd51ba0a57f39df1/pydantic_core-2.50.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dbcbee53bf17196a7f745aa9bf5a9603953a1e365b1f020be3207c676a3e7c4", size = 2361719, upload-time = "2026-10-11T18:32:49.217Z" }, + { url = "https://files.pythonhosted.org/packages/11/14/bd5169d356aa91bf777e28ba0b281c192d286d03c2812c9c9db023a2f00e/pydantic_core-2.50.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:325c23f3e35cfbf0fe3486fa5f7260d1e45885173002d30a28ca019994124255", size = 2439803, upload-time = "2026-10-11T18:32:51.025Z" }, + { url = "https://files.pythonhosted.org/packages/1c/bc/d79d000e5203ebef39af839f2ce77a777fcad6e08ad26af9a2fcd114ffc8/pydantic_core-2.50.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17e722e156d0444ecaefbe640bdb60928752bf2013e2b7a11cdb099aaae19bec", size = 2158402, upload-time = "2026-10-11T18:32:52.714Z" }, + { url = "https://files.pythonhosted.org/packages/1b/a5/4902cb5fd599422c130bd3124ab31ee8b771199bd56662702eed07d3fec7/pydantic_core-2.50.1-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:aa8224f10880d9bf1b5993988ba153d42a8b4f3f4f511f93b1f09c93ff613c72", size = 2229755, upload-time = "2026-10-11T18:32:54.126Z" }, + { url = "https://files.pythonhosted.org/packages/1a/f5/c1481f8669f6060d89110c9b1374173fc8767ca276b84f4870bd8acd5e3f/pydantic_core-2.50.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:41bc8237121bd8dc8d888dfd6279fc166ffc88c1f1bf3a8bf00869680533ca4c", size = 2242303, upload-time = "2026-10-11T18:32:55.641Z" }, + { url = "https://files.pythonhosted.org/packages/04/f9/77fc3c7653ba9b6e42049e17e96b25388187d4a7c274ab1cb07f58ac8419/pydantic_core-2.50.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:45c6266d071c241f2a168d45bf8c54344f0effce35e7e6b73afdec11f3687568", size = 2278345, upload-time = "2026-10-11T18:32:57.38Z" }, + { url = "https://files.pythonhosted.org/packages/95/9b/0579c5d12e7f2b16b27e6782427987341fcce07b0725e02ddb0b74add0c4/pydantic_core-2.50.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:1deeacb112d14d3f4fcb16b165f7dbaf76c70ba6e82f37ba042bdab51970a0b8", size = 2449947, upload-time = "2026-10-11T18:32:58.896Z" }, + { url = "https://files.pythonhosted.org/packages/a8/ac/1b677db91eba54cc5922f4de6edc46ba45c2bd712dfdc0130382d158e214/pydantic_core-2.50.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1c96fd793b73d1b92e65570132505498fe7b21eaef73cdf74e67e5dfba7ac9e4", size = 2476889, upload-time = "2026-10-11T18:33:00.665Z" }, + { url = "https://files.pythonhosted.org/packages/4d/2a/3a9f6624ee3ea9ccba5249dde11418bb4c35780a7a92608f8768bd3fea39/pydantic_core-2.50.1-cp313-cp313-win32.whl", hash = "sha256:06ead20d39ffd6f2f6f2a8f8a6de67ff8bb1b4f14a8a30e058502514ee2ac685", size = 2101118, upload-time = "2026-10-11T18:33:02.329Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1f/323f78ddd9d9938aac420c1abb4e8ba799fc8bdab0acc67c0593b837c979/pydantic_core-2.50.1-cp313-cp313-win_amd64.whl", hash = "sha256:7816e98acc08119dc0f340ab167048ecc54126316330c1f0caf7c6756c88e28f", size = 2170840, upload-time = "2026-10-11T18:33:03.919Z" }, + { url = "https://files.pythonhosted.org/packages/cb/09/8497c52a739ae425c3ac2f7f56414cbc711c67d374346174f40fe2062644/pydantic_core-2.50.1-cp313-cp313-win_arm64.whl", hash = "sha256:c17799a62c142d61b8a3c51752a7cbc87fe2ad4ccfab10e628a77b405075c662", size = 2161633, upload-time = "2026-10-11T18:33:05.518Z" }, + { url = "https://files.pythonhosted.org/packages/49/33/28b96e81677153715e3eafb9f26663a80841e859fde282a380359b0d3fa1/pydantic_core-2.50.1-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:1cf41f1ae3fa155cf167a72689ad044bcc1e3c97e064123677149bdfb5dafc4a", size = 2224428, upload-time = "2026-10-11T18:33:07.153Z" }, + { url = "https://files.pythonhosted.org/packages/94/40/15c06410c9b7b8da5805d27b64e09bd3f900e986728106db2689dbc51513/pydantic_core-2.50.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4df197990c15b5a37c5a277d131d9f2c67de6133f2e5dafd80d9bba4b99f46f9", size = 2023740, upload-time = "2026-10-11T18:33:08.763Z" }, + { url = "https://files.pythonhosted.org/packages/a1/4e/5eb629f6efc2a27e421d789dd4bfacbb5f6d09c80c28b13d1e87d73163d5/pydantic_core-2.50.1-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0036473f5583e6a60e50b8b21651511564277a3f05cc5dab8cf579f552cd5f6c", size = 2049435, upload-time = "2026-10-11T18:33:10.366Z" }, + { url = "https://files.pythonhosted.org/packages/ba/8e/f195aebec49ad12318876ac2368c197a7939f5d52f8e156d2238ef8a4588/pydantic_core-2.50.1-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:992c3514ec891fa7858099183e4d64e6bd5a5d4ff452fae29df22faa77a006bb", size = 2172975, upload-time = "2026-10-11T18:33:12.368Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f5/7ad9fb83010cd5ea0948409db105676ed779c4e709e2d3d89b9fe2558794/pydantic_core-2.50.1-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:739dc730e6be3bd5ec2f4ab5cfc7eb047cc45fc1497b3bafec74ff2ed07df597", size = 2364197, upload-time = "2026-10-11T18:33:14.244Z" }, + { url = "https://files.pythonhosted.org/packages/ca/fb/bf0aab3e78301d202b82a0322ec968cd703b11fc0623fde9a28708936f62/pydantic_core-2.50.1-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32fad3a91e51b6d2039c572db04a5a873260b399f6bd62c3552671fa7a4a2899", size = 2444259, upload-time = "2026-10-11T18:33:15.79Z" }, + { url = "https://files.pythonhosted.org/packages/45/35/38f6d6564fae57d9b12e5676dfa947e0e7d5c46dbeaa7eb3352261d6d299/pydantic_core-2.50.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42b54c2c90ad348b5e3a85e03e715d572c1fde357ef104cdfe3b03b697a404ea", size = 2159857, upload-time = "2026-10-11T18:33:17.51Z" }, + { url = "https://files.pythonhosted.org/packages/65/a0/fb0a3ca10f139dcf765b2d312d10cf0f65c57c59993229d00ad12b14ceff/pydantic_core-2.50.1-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:2df1ff41884de2bc4b307bafd7c40a691094fad2ff8e767e5b45a319257bcf4e", size = 2233954, upload-time = "2026-10-11T18:33:19.591Z" }, + { url = "https://files.pythonhosted.org/packages/8c/6a/e63842252702aa4ec6e6b7178ca85e541a77459076592c23ebe2d9840b33/pydantic_core-2.50.1-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe90228920fd8ff2be62622b6bb8a2b11acd65046d50c6b130614b5879605a20", size = 2243876, upload-time = "2026-10-11T18:33:21.393Z" }, + { url = "https://files.pythonhosted.org/packages/39/25/5991cf8318b37e0dfab47b87541619a1df8501a793cba0d978846cba37a7/pydantic_core-2.50.1-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:844b869f118e22a41a091bdcedda8a71bc1b0f62c38d1a0c3211cece47e1d8fc", size = 2277908, upload-time = "2026-10-11T18:33:23.324Z" }, + { url = "https://files.pythonhosted.org/packages/a7/3e/3ee8baaa6cc25a6961c69168cf9ff0f002d56f4e0d541ad6724c18fb61f3/pydantic_core-2.50.1-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:2eb75304506894a281d346220a4f7481a1b8729577c5ed2a05395991966a8396", size = 2449285, upload-time = "2026-10-11T18:33:24.942Z" }, + { url = "https://files.pythonhosted.org/packages/c0/c7/acbec6deac13fe697a80c275a9b6661db62c4d323bac8a47347b1f39c7cd/pydantic_core-2.50.1-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6b20a4bffabdad0db2927ac034ae3b8a681b1f7a0182f3e60b479ad2fde21ebb", size = 2479013, upload-time = "2026-10-11T18:33:26.925Z" }, + { url = "https://files.pythonhosted.org/packages/10/08/21a3f237b264389f6219d053ee78fc1b5c2fd402c1b1cb2b6cb8b85f9834/pydantic_core-2.50.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl", hash = "sha256:99ba9bc2b8062ea0c326a990f7f00e6530c23579de66dd246e72c4cafef950a5", size = 1484400, upload-time = "2026-10-11T18:33:28.693Z" }, + { url = "https://files.pythonhosted.org/packages/09/ce/077a6d262d12ef09108377ac0717f029f420d773ace63cafd6143af75568/pydantic_core-2.50.1-cp314-cp314-win32.whl", hash = "sha256:cf356f70551d40374eaffb1aa63f1eb6d2006681cbd7a9faea173ce0f4dd7cd2", size = 2103222, upload-time = "2026-10-11T18:33:30.326Z" }, + { url = "https://files.pythonhosted.org/packages/14/4c/350a2415209c43d670eb71d3c040f332c04a30583d39e311b05c7ac15762/pydantic_core-2.50.1-cp314-cp314-win_amd64.whl", hash = "sha256:d32f3acc081cc3923386d88f422cde8892335e95f034e0104bb4cf9310d9915f", size = 2171586, upload-time = "2026-10-11T18:33:32.139Z" }, + { url = "https://files.pythonhosted.org/packages/bf/92/9bea6ca96580a0902fed366f064f0829e404f41889b34543279a1162b888/pydantic_core-2.50.1-cp314-cp314-win_arm64.whl", hash = "sha256:bed5163e03b98bc1fa2eb05d74c63d9c5c95d8ed6254985481640fbf5e237dea", size = 2155773, upload-time = "2026-10-11T18:33:33.896Z" }, + { url = "https://files.pythonhosted.org/packages/86/8c/f121f073cf32bdd5cba7e6230b1ce0ac845b0cf43e44dd597d95af272db2/pydantic_core-2.50.1-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:9572c1369e9c9da2d64a7b7992c786d90ff295abc93964cfe3125e4290768070", size = 2234017, upload-time = "2026-10-11T18:33:35.588Z" }, + { url = "https://files.pythonhosted.org/packages/a4/69/2bb2bcd6146cffe98d760a46c42ae71efd5151d9b2f9c9bf6619a3b32083/pydantic_core-2.50.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2005207aafe1231315718bf6ed5d064a7300fb4772754af35ee72fc68159492e", size = 2001016, upload-time = "2026-10-11T18:33:37.57Z" }, + { url = "https://files.pythonhosted.org/packages/20/b3/fbf854c7d07ec114260c26e9e2071a4381740f9ae09641dbfcbdf2a18c45/pydantic_core-2.50.1-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f6047f62a6c5ae08d0a6afb035667aa2d97c3d20d69762e034c5ea144d92a5", size = 2023015, upload-time = "2026-10-11T18:33:39.433Z" }, + { url = "https://files.pythonhosted.org/packages/65/20/6de55b2f92cdb614b745c6e9ced639fc4fd7e1e77604825a88bdece6fcbd/pydantic_core-2.50.1-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1ef800dd7d85bcdadf4c3076e4c94e43939493558a3b69a1ea830c706d4617bb", size = 2192543, upload-time = "2026-10-11T18:33:41.381Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d9/19e91c94bd5c405945ce2f15526808aea37e162c253160de8ed7bf70b406/pydantic_core-2.50.1-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b0135bcdcaa0f23573f286e4cb5e0fd2962700964ed13df085b85f2b97aeab9e", size = 2388704, upload-time = "2026-10-11T18:33:43.167Z" }, + { url = "https://files.pythonhosted.org/packages/b6/bc/2e24c8415eae1a25ee5a5484946a917123bad2e9d01689a759236928175a/pydantic_core-2.50.1-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b3a6f334c6a2345ca15318ff894502a90012536404b37c844a976c76c846e0b", size = 2464118, upload-time = "2026-10-11T18:33:44.856Z" }, + { url = "https://files.pythonhosted.org/packages/bd/1f/945b8053cb061c64e102bcaf7bfb9ed740c0bd4349f9bb978a7d4ddff4ab/pydantic_core-2.50.1-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06e01fbbfdb9be777b316a71b6c49efaf4a08b615d0a98d678cda3023f79d019", size = 2150142, upload-time = "2026-10-11T18:33:46.661Z" }, + { url = "https://files.pythonhosted.org/packages/2b/78/96a3e50bf0d64aaae781107eb9335b7529d05a85793ed6e7241c4cd1d931/pydantic_core-2.50.1-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:a29a061fec0b4e2d714f277e70a3a18125ecff803f2fea6eade2f2e53711d112", size = 2245577, upload-time = "2026-10-11T18:33:48.574Z" }, + { url = "https://files.pythonhosted.org/packages/7a/5d/a6038a0322232758a6ebfa709f4ca14a60bf5b93940cd0b345056a557da4/pydantic_core-2.50.1-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f5187624823423e1d1b82b1072ac41dc837389e18d3d0572cc19bbee46cd550a", size = 2263728, upload-time = "2026-10-11T18:33:50.527Z" }, + { url = "https://files.pythonhosted.org/packages/0d/4b/76ded3333a457a9344c4f2d63f2d82d0101654b05178fa4ddfe7d3627674/pydantic_core-2.50.1-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:3e46a9eb0a0901dd6275e6b06ac3a464885ef350ec4121fe486869de8053e4bb", size = 2293630, upload-time = "2026-10-11T18:33:52.362Z" }, + { url = "https://files.pythonhosted.org/packages/a9/00/9eca378335c9c1b72bc779bf6e4c2a82ce784f14ec48a0e87102c9870e05/pydantic_core-2.50.1-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:756d669f04e62ec4148ecfe22be6a4484d9b1181a6ef32e205ebfd200540858b", size = 2468048, upload-time = "2026-10-11T18:33:54.118Z" }, + { url = "https://files.pythonhosted.org/packages/35/ca/e3832e9cf93651251de43c8c5c029ed680a3c1a0a1b17ee26c81bed08cbd/pydantic_core-2.50.1-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:c516cc5367ca3448995d42cb994bf3f4c9002d2a7c22eac9622551269ad1b807", size = 2512159, upload-time = "2026-10-11T18:33:55.99Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f2/773469b5a10a39116a2cb17edaf6d722f017dd8da07161b371465311c542/pydantic_core-2.50.1-cp314-cp314t-win32.whl", hash = "sha256:9d1bed94af6a63835461f3cf7502058eb166c58c4778e11d0f433cfb1bd69e19", size = 2098406, upload-time = "2026-10-11T18:33:58.043Z" }, + { url = "https://files.pythonhosted.org/packages/ee/42/0bb74f8f25204b259b11ab7c12dc7f180893b6bd706118b385147fb6efd5/pydantic_core-2.50.1-cp314-cp314t-win_amd64.whl", hash = "sha256:c8dce1f1e0e5358b682a6ad3fa5e31b31d4560997b8e61417e9217c8d60f8a0c", size = 2148481, upload-time = "2026-10-11T18:33:59.913Z" }, + { url = "https://files.pythonhosted.org/packages/47/0d/d801646c9679a4e630e15cf521d4108b93854b42a6e6e02391bd4c6b1095/pydantic_core-2.50.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ceff0acc940be2715bd6ad17b24c0e5304abf44f6efd0f81ee8499e640f9dc86", size = 2174972, upload-time = "2026-10-11T18:34:01.875Z" }, + { url = "https://files.pythonhosted.org/packages/b2/84/23984b763d8862a02a13d27a44b6e8169428fd85ecfed88f54c29108604d/pydantic_core-2.50.1-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:8a6791afa2245e6c6b180122d105941644f5bd410bb18623b408808cc41a3102", size = 2224599, upload-time = "2026-10-11T18:34:04.016Z" }, + { url = "https://files.pythonhosted.org/packages/4d/90/a63cf8586abc1d1a3f6d9b18f0224789ebf003851f092ebda3c7c863fd32/pydantic_core-2.50.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:84f34323a61a365b4e9295de6028474754829aaddd59c7bf1a040e7487ef8f3c", size = 2024191, upload-time = "2026-10-11T18:34:05.901Z" }, + { url = "https://files.pythonhosted.org/packages/a6/6a/f34bff9808ffb4907fbf5f5040457d253cacf2da7fce9efbc99ca1b1a44d/pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23edad659e8dbd8ca7e4e877fe6c81573abbdf215bd25a68b53e1272f58b80c7", size = 2048252, upload-time = "2026-10-11T18:34:07.757Z" }, + { url = "https://files.pythonhosted.org/packages/b2/54/13f419bf1eb59852003818e25935aaf175687d978f4c4bca70e08fe40a3b/pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a5fce22f1e87d181e924e12da7d81cfe031fb3881a5ddf26ad28f141756ca43", size = 2173376, upload-time = "2026-10-11T18:34:09.592Z" }, + { url = "https://files.pythonhosted.org/packages/6d/6c/b5a34d24cd0c81669d8f8339d74e6815abcf2f8fb48ab4b49b84c09be1d5/pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c73622ef819328873b53109ee4f77ceb598bffedd02daf916102be3228866b78", size = 2364559, upload-time = "2026-10-11T18:34:11.534Z" }, + { url = "https://files.pythonhosted.org/packages/eb/8d/d64d6216a8df365082665927ff923f183056f9049fee08e9777c9ac05296/pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce8c25ca38cc0e3d7753ba180808de2c0c8cb24eae0df64491e40921454e9831", size = 2444697, upload-time = "2026-10-11T18:34:13.535Z" }, + { url = "https://files.pythonhosted.org/packages/b8/0d/1b1149f60a00ea21ba5f70e28acbd40feb4598af414f80f53c921fac07c9/pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7689580e72a642ab5ec64d5f55b2e33636fa43b4ebe63c0c2c965ef307c7d1aa", size = 2159961, upload-time = "2026-10-11T18:34:15.56Z" }, + { url = "https://files.pythonhosted.org/packages/1e/35/f236549299dcc78e71e945495d7ec67e78d20844d0999c60601685003031/pydantic_core-2.50.1-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:d5c0e32fdbce7f1e8ef4d11f655694bf5f4175c757a9f1dc2be09b8864e5bcf5", size = 2234581, upload-time = "2026-10-11T18:34:17.502Z" }, + { url = "https://files.pythonhosted.org/packages/6a/85/26901a490522b7f75ef9bb9a7afb73e5bb550f0e1cb5b99a0069183e2eb9/pydantic_core-2.50.1-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:40f523349960fa30f3ea51404308ff50f9997a90df639590f47a057c1f32b415", size = 2244090, upload-time = "2026-10-11T18:34:19.402Z" }, + { url = "https://files.pythonhosted.org/packages/ca/2c/481bcfc70ceeb77a778ca6e5b705fe592cb64735c108157f81b7dd9c280e/pydantic_core-2.50.1-cp315-cp315-musllinux_1_1_aarch64.whl", hash = "sha256:d4193206b6587047437f6f11d7e776df23e1c1e23af2a54d9347275614791e10", size = 2277948, upload-time = "2026-10-11T18:34:21.317Z" }, + { url = "https://files.pythonhosted.org/packages/24/eb/f1e09333faa7ba447cde967310f758430cc7c5e987bdab5228816c70030d/pydantic_core-2.50.1-cp315-cp315-musllinux_1_1_armv7l.whl", hash = "sha256:84bc765b282a9d5b7fe0348b8648904f25a6a04b2139da52b1dd30c8ac3a2c8f", size = 2449688, upload-time = "2026-10-11T18:34:23.321Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b3/036bde636db8f76d92996e81aefc75678ab5cec4a07eea1ad0c72a893fc3/pydantic_core-2.50.1-cp315-cp315-musllinux_1_1_x86_64.whl", hash = "sha256:ed1e728b39a383c81035b2459cfcb35d99dfb01f7d6ebe3a913bc1cc5b81e459", size = 2479286, upload-time = "2026-10-11T18:34:25.214Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a3/07f018294ee18d144afeb6df1a47d9e92960f014be45c5ed13519fa5af95/pydantic_core-2.50.1-cp315-cp315-win32.whl", hash = "sha256:bc94f474417604bd383d2cd445d071b07dd55fedceed3ce33407bf1fcc107290", size = 2103683, upload-time = "2026-10-11T18:34:27.42Z" }, + { url = "https://files.pythonhosted.org/packages/5f/98/f9bd7e1f9b6709f155acb9ef826d9c3884fe925f811fd8e55b9b52280bad/pydantic_core-2.50.1-cp315-cp315-win_amd64.whl", hash = "sha256:983a662de2571cb2502fc8ff47b6770b03d025d2eb314c92f77b3f07c74720ed", size = 2171681, upload-time = "2026-10-11T18:34:29.508Z" }, + { url = "https://files.pythonhosted.org/packages/10/87/4bb3e1e7f385c076ab5af4d6dd0571b22042cd8207eb810d5b9fef15ae31/pydantic_core-2.50.1-cp315-cp315-win_arm64.whl", hash = "sha256:94845ff54dc5193f228cab81b2662a04bfbb892e95bdc15edf7399000ce57d54", size = 2156251, upload-time = "2026-10-11T18:34:31.455Z" }, + { url = "https://files.pythonhosted.org/packages/47/47/83643225b08f2aef6c8cc4bbe6e3f79c5e139c4364a6e450d0f399d87774/pydantic_core-2.50.1-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:4a53d13cdfbedbfa87f08b83c1a0a5efcc767d785a4b41934fa9cb672670493a", size = 2234363, upload-time = "2026-10-11T18:34:33.65Z" }, + { url = "https://files.pythonhosted.org/packages/5e/66/127ca649ba2f2462039dc1e694c6c01e00a3689f023a617364d3507e6d97/pydantic_core-2.50.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:efbecf43d321f7b9281441f1f213f7c21c66988b0e06c2730ba13ed47a46bb08", size = 2000972, upload-time = "2026-10-11T18:34:36.037Z" }, + { url = "https://files.pythonhosted.org/packages/5e/4f/e421e0a5d653b1203b090b2e48745976988d7338a647940704b5b9c2b399/pydantic_core-2.50.1-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc1f08f68dac9f9e83845a8039880aba2ab553eb9b2259c3243a313182c253fe", size = 2022925, upload-time = "2026-10-11T18:34:37.972Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4e/ea5568e2491e1a71100f15ae8c2d01ef52db42a184a2d4e716bc79e5eb8f/pydantic_core-2.50.1-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5dfe41f232befddb9c4377f6cfc702b51595e2d78ed082672adf8758d2c4619f", size = 2192867, upload-time = "2026-10-11T18:34:39.921Z" }, + { url = "https://files.pythonhosted.org/packages/ae/5e/3b8c3a35acbe219909ada5defad5d7d9fed845fb2b37bd5ec518f453c119/pydantic_core-2.50.1-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:adc06d218a1cadfd2ec4628424d7d79ce4eba69c2965e7e7b55106f0da5208c8", size = 2388687, upload-time = "2026-10-11T18:34:42.184Z" }, + { url = "https://files.pythonhosted.org/packages/b6/aa/7889b4e515f91a2e8c0ae6b5081fec0feb30c4398d1434e14793c60f173a/pydantic_core-2.50.1-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2cf91809d0721ab81592ba67bea7694821679c10b1a2e3c3460082b286c1918a", size = 2464415, upload-time = "2026-10-11T18:34:44.384Z" }, + { url = "https://files.pythonhosted.org/packages/08/78/93449e628eb8a6fdcce3eff9043081179d1bc7ce6f1bff32dc5006f41e00/pydantic_core-2.50.1-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23923ab9292c40da026330b1ecf4dc2618c8e86e0422e5d1fbf50d94d64ca4f8", size = 2150823, upload-time = "2026-10-11T18:34:46.392Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f1/72c5bc129fceb0d00f05dc1e67f518c1728de1928c55f81fc13d7690de39/pydantic_core-2.50.1-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:f3377c8c2b3ce898423c5e5dd94c7982e30aa7717a7e6ab2470b9de364963709", size = 2245806, upload-time = "2026-10-11T18:34:48.805Z" }, + { url = "https://files.pythonhosted.org/packages/28/2a/922a0e78f3aa6ab837b59f88190233fb8dad546c17995fde9bb3ed3b9b49/pydantic_core-2.50.1-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:455a773617b5913bf5c20d0692e5787b119e52c4d40ea644ca31f5758fd31be2", size = 2264160, upload-time = "2026-10-11T18:34:50.876Z" }, + { url = "https://files.pythonhosted.org/packages/52/a8/0f1449e3e1b20941c9372faa18e7b6a092e30cdfa841902473f7989532ac/pydantic_core-2.50.1-cp315-cp315t-musllinux_1_1_aarch64.whl", hash = "sha256:1a9006395dece0e32e704c315eff8a00bede494f6108546cfc5539c89fef4f9a", size = 2294031, upload-time = "2026-10-11T18:34:52.876Z" }, + { url = "https://files.pythonhosted.org/packages/d1/d0/1031f492857de70355fb16524bbb03efce5fd34c93ed4a1ec60be07e0d4b/pydantic_core-2.50.1-cp315-cp315t-musllinux_1_1_armv7l.whl", hash = "sha256:d2d82aa62521c55ddfb000ae70f88cdd8de974078f6024e821dfe5addd0c818f", size = 2468423, upload-time = "2026-10-11T18:34:54.995Z" }, + { url = "https://files.pythonhosted.org/packages/46/52/269ffffa645b8e47906395a39cf9db1151ae9fa4bcd7f47b960bc31baf37/pydantic_core-2.50.1-cp315-cp315t-musllinux_1_1_x86_64.whl", hash = "sha256:009634b83993777ddcd69cad0ffcace43dabde692109528e35f0fde91e386a8b", size = 2512598, upload-time = "2026-10-11T18:34:57.149Z" }, + { url = "https://files.pythonhosted.org/packages/31/5c/e47e28281f20326ff6f3c31d626f0a83e615d2d94ba41bb0ad6ec237184a/pydantic_core-2.50.1-cp315-cp315t-win32.whl", hash = "sha256:3fde4fdc6487a58d944ca87cf5adc95d5f266e872c19599f5f4c0a8a1b1f9f9f", size = 2098535, upload-time = "2026-10-11T18:34:59.313Z" }, + { url = "https://files.pythonhosted.org/packages/03/ad/759e181e69c1b472c60b2049e5f61d5da1deefdd5ce1df4bb2ebcf771f25/pydantic_core-2.50.1-cp315-cp315t-win_amd64.whl", hash = "sha256:1c8632d4ac04e6f91128fca584b3a8a507d81604c24eeaaad00d4be42765c32b", size = 2148645, upload-time = "2026-10-11T18:35:01.571Z" }, + { url = "https://files.pythonhosted.org/packages/6d/56/8a702c27e5be9f47e5f19d8669227424290e4c024e7c370279cbaf244b4e/pydantic_core-2.50.1-cp315-cp315t-win_arm64.whl", hash = "sha256:c3ede305158e75510be50869b319550ab072008c13d64d4ab1e094fb286b6f44", size = 2175297, upload-time = "2026-10-11T18:35:04.079Z" }, + { url = "https://files.pythonhosted.org/packages/a5/09/1bcf160f3cd6333e2a76982fae5963e5032de0bcaaba38464223dc266bfe/pydantic_core-2.50.1-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:76e2e83fa6ec8cdc972d438dafc2522b3a47bee4ec0ae668b29cfb1977ab5242", size = 2217070, upload-time = "2026-10-11T18:35:15.688Z" }, + { url = "https://files.pythonhosted.org/packages/3d/81/f02de95eec7794dfc7a5bc69a834f0e834b31b3009014ce6de903855f775/pydantic_core-2.50.1-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:a51eee75939cf811ac09b278745a6cee7dc873ccfbc8b9af3cc88fe4b7ce25b5", size = 2039027, upload-time = "2026-10-11T18:35:18.07Z" }, + { url = "https://files.pythonhosted.org/packages/4d/16/227746ed3771d9bf2304568b55134849ece34e13b38b1d76de763015c77f/pydantic_core-2.50.1-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae28183297fb0d2b8dc46a1f01d51f5e45825fc5afe76a835a6cb7fb34821295", size = 2109009, upload-time = "2026-10-11T18:35:20.218Z" }, + { url = "https://files.pythonhosted.org/packages/e5/b9/7664d1592a0e5a74903f357cd5b28ceb7336f3473256c5a4e8c8432f1881/pydantic_core-2.50.1-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88e492e8b9d0312e7dc13667c30222abf284dc3b79b5302b3607b41a5784ce61", size = 2269883, upload-time = "2026-10-11T18:35:22.48Z" }, ] [[package]] @@ -3178,14 +3285,14 @@ wheels = [ [[package]] name = "pypi-cleanup" -version = "0.1.11" +version = "0.1.12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/67/e2/5d03e163db7b67e164e5353d6a69c13e8523a503286f0f11efd0f94e261d/pypi_cleanup-0.1.11.tar.gz", hash = "sha256:d4be3c95c8584f692e41589c76421f1aafdff36145a11d72a600930a62534d4b", size = 21152, upload-time = "2026-10-06T18:16:07.126Z" } +sdist = { url = "https://files.pythonhosted.org/packages/50/1a/74f54a319bc44a489ee005ff961370005b1d739d6b2214198732da36daf8/pypi_cleanup-0.1.12.tar.gz", hash = "sha256:620601a8cede1a866c43872a65cf2182652d7b308580f661a209e5bf5fbf037f", size = 21139, upload-time = "2026-10-11T00:19:37.771Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/71/d19eeac822ccf7196fcece0542895b7807373bb08f36d3f3372c98e97969/pypi_cleanup-0.1.11-py3-none-any.whl", hash = "sha256:38985d0584ebe3a5dba185f5dd867b261353abde990f4c2a160ac9db515e99fd", size = 16210, upload-time = "2026-10-06T18:16:06.112Z" }, + { url = "https://files.pythonhosted.org/packages/9f/95/1d263614c8afd9ac4dc08418a482d3f85f68d06e0724fbcb45f43a27169a/pypi_cleanup-0.1.12-py3-none-any.whl", hash = "sha256:9721aa963de6f5170e9216470815cfa6891850aee421a107bcf33c9aa93519ad", size = 16210, upload-time = "2026-10-11T00:19:36.712Z" }, ] [[package]] @@ -3300,6 +3407,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9c/03/850bffad2b581c440ca51c039d74504d5a422c94bda0bdb8a8ba5068d48b/pytest_django-4.14.0-py3-none-any.whl", hash = "sha256:c533b08d89cc675efcd5398eea270b34547e35f9a3608e2c9748dd88428ea187", size = 27067, upload-time = "2026-08-10T14:13:06.998Z" }, ] +[[package]] +name = "pytest-xdist" +version = "3.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "execnet" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069, upload-time = "2025-07-01T13:30:59.346Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396, upload-time = "2025-07-01T13:30:56.632Z" }, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -3919,27 +4039,27 @@ wheels = [ [[package]] name = "ruff" -version = "0.16.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c4/49/23802c45f093eb14bde54b141d2b2f058edfa63a06db7beed047308cc08f/ruff-0.16.10.tar.gz", hash = "sha256:eff4728c4eaae93f0955cd264d24b2ab348e74bf59986ccf282ba6dc16b3b017", size = 4958724, upload-time = "2026-10-01T18:03:21.697Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2f/21/ebce22e1d90cdb2cd691026b9c6e9bec6499f0b396089481755b5d49efff/ruff-0.16.10-py3-none-linux_armv6l.whl", hash = "sha256:488b0fe3f3574210e5cf80d9f59b9e3ab17a127a8155de3f307b392589cfb511", size = 10095557, upload-time = "2026-10-01T18:02:36.072Z" }, - { url = "https://files.pythonhosted.org/packages/cb/98/a54de85876a8b2612bfa0d84c7b9abfb39c6a3354aee7800b09c1649b9e3/ruff-0.16.10-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:e748ff95c934c4e978783b8e687bc174e7bd84e8ad24e3243e1ecfcda5e0282d", size = 10340577, upload-time = "2026-10-01T18:02:39.258Z" }, - { url = "https://files.pythonhosted.org/packages/9f/16/1a5a4a2657effe4806110f2b907313802f1367fcdbb29e8122766e407fab/ruff-0.16.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:3031a4a2e8e7b8a46f70be45f198c35a11ece509a94b80334d8d397a33c67550", size = 9774282, upload-time = "2026-10-01T18:02:41.79Z" }, - { url = "https://files.pythonhosted.org/packages/6e/fb/470085af734da396e68cd80fb0a3e7c109a459716ae59588c0f6fab8a17d/ruff-0.16.10-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:494401c86df4c4c25f69b9419605d944467ee98c42fb6ad405ef4fa40b8fb67d", size = 9920895, upload-time = "2026-10-01T18:02:44.458Z" }, - { url = "https://files.pythonhosted.org/packages/57/de/f10cffe4f88a37ea6615ec460f01bf76f0bc1477737a35d9ee61a630a78b/ruff-0.16.10-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d203abc0ff2b773ee33d00ab8df0bb67046fbc7c07b119332f08b9b345cf8221", size = 9902707, upload-time = "2026-10-01T18:02:47.041Z" }, - { url = "https://files.pythonhosted.org/packages/ff/44/3fdcedf83ae60ef837dd239170e480dce606a9142cfa2db911afdf855fd9/ruff-0.16.10-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd83d1235a5258d318477bc5b576303974cbdef5df0c01a1bff14efcc23bd12a", size = 10619287, upload-time = "2026-10-01T18:02:49.485Z" }, - { url = "https://files.pythonhosted.org/packages/c1/62/02e76a5574002153618eafbb70e159468addc72a5d2c488e65cbb4639d2d/ruff-0.16.10-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bc2610fb269fa56dd8a68669ae470fa6272902668c0fc2ebc3aa112b2633d5b8", size = 11339942, upload-time = "2026-10-01T18:02:52.008Z" }, - { url = "https://files.pythonhosted.org/packages/6b/c4/cde27d47ad8d4126c587e608c67c46e7feac11763f606d261a1bc8a489e6/ruff-0.16.10-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e70175e29cc94c26ea296c80e470180b744b7419026898e58f520c6ab32578e", size = 10934316, upload-time = "2026-10-01T18:02:54.811Z" }, - { url = "https://files.pythonhosted.org/packages/e4/03/17234145f302a645a123e8c3bb2411ecf4669fbc350de3b0d803230a1729/ruff-0.16.10-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f33f43a864a8483eebd160e713336c8bab02c934feaff0a33cf5ccb41546d09a", size = 10387968, upload-time = "2026-10-01T18:02:57.497Z" }, - { url = "https://files.pythonhosted.org/packages/71/29/2493af60240ee7644b38a4b821f5f9c3b5a4fa3178770fe1d0c685217395/ruff-0.16.10-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:1dfc6f0088149fb6a362c1c446bcbb3fd2157b3852fe2fa68409276eab9ad9b3", size = 10537906, upload-time = "2026-10-01T18:03:00.006Z" }, - { url = "https://files.pythonhosted.org/packages/2e/9a/f56b28f3b143bb9e518c34fb89ab191b626bca8b70dbf8af0d2e2d473572/ruff-0.16.10-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:6553498afc35f580f036030795810b9e6bcea31604b0fd9e8d352795473042e3", size = 10012938, upload-time = "2026-10-01T18:03:03.006Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c4/fca37362848ea4d4d80712df13632e645e7c7cfb1bdedf140699ac7a090b/ruff-0.16.10-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a3b8471dea115d37f123882be852bed13403746d3a76c11de4a19ec5f9ff5a03", size = 9897945, upload-time = "2026-10-01T18:03:05.818Z" }, - { url = "https://files.pythonhosted.org/packages/7d/c7/e0bc57664d6e0c61fd22f620af260fe9662d7e1ddb320ea7f160e76ef165/ruff-0.16.10-py3-none-musllinux_1_2_i686.whl", hash = "sha256:92e59a70bcbd9d3a5483656da906ec28edfdacfce00afd99edb8b4e9d15644be", size = 10333134, upload-time = "2026-10-01T18:03:08.25Z" }, - { url = "https://files.pythonhosted.org/packages/21/aa/5c9f3b68737c0e4a33a1db5dfab44f7b786d96ca91a7233112ddab1e6dc2/ruff-0.16.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7ae7375f803b5520dc9f546bed7e3a0acb70b91812e9bb4b19927de22f25b77d", size = 10741702, upload-time = "2026-10-01T18:03:10.775Z" }, - { url = "https://files.pythonhosted.org/packages/78/fa/0f9c2020dc316c53d983be011720b8157cc052b97e3f4dfa7db6d0f880a6/ruff-0.16.10-py3-none-win32.whl", hash = "sha256:2a12e01cb9156c10c466f63b46eaae5ecea28dfbd21b5836353ae498e7d1349a", size = 10139176, upload-time = "2026-10-01T18:03:13.267Z" }, - { url = "https://files.pythonhosted.org/packages/99/29/cfb0df9448d4d4ad48c2de029ada9ebd71baa6da983a6c77ee6c6cd0fe82/ruff-0.16.10-py3-none-win_amd64.whl", hash = "sha256:97f2015c92aa97105b0eab19eb5d224884399281cfc5da86a92db4ab5e7fb2ca", size = 10584734, upload-time = "2026-10-01T18:03:16.006Z" }, - { url = "https://files.pythonhosted.org/packages/fc/05/c16957eb287c3fc062e032619a25868d93d408a844b725bcf514f7a378ff/ruff-0.16.10-py3-none-win_arm64.whl", hash = "sha256:25a65fe998c4e6861ec079ada5826a2fc605e6cbccbe9dcd7fac1f54e791621b", size = 10366440, upload-time = "2026-10-01T18:03:19.04Z" }, +version = "0.17.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e7/e6d5749983b020e6cb1055abec0a6f361a8e94f0184cdcf56d4760995f02/ruff-0.17.1.tar.gz", hash = "sha256:5bb796c5112e9fb9527f2ef2faa0a130d6312d19de92bcfaddd70dbb2d41020f", size = 5323349, upload-time = "2026-10-15T15:23:18.64Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/78/90c46ca6250709f7c37e397b60d06061adee8d0f7d13959ed6a8e49b14fd/ruff-0.17.1-py3-none-linux_armv6l.whl", hash = "sha256:1796c41eafec66f4635125dd1e074a7aa27b8d20c187d484360acf11d247fc4a", size = 10147528, upload-time = "2026-10-15T15:22:33.667Z" }, + { url = "https://files.pythonhosted.org/packages/aa/d2/a2e28bc35b083ae51fa07dfba5280a667c8b01ecaee7802fc8849dcd5c46/ruff-0.17.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:8eadb09a788010be29c895418bdfa513e4e1c65e64b94e5b19e4cd381f6cc7fb", size = 10225974, upload-time = "2026-10-15T15:22:36.328Z" }, + { url = "https://files.pythonhosted.org/packages/8e/71/7a9029a81c8206ee01a98f6cfeeb56e6c095af86857581a37045c46d7e94/ruff-0.17.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:29b454f18ca3eeaf37fbf140841dcf27d36109e29dee9aae8acecb68c26c6f74", size = 9270361, upload-time = "2026-10-15T15:22:38.651Z" }, + { url = "https://files.pythonhosted.org/packages/c0/8c/e075e9c917cb0575297880c96768304e881240171c870cbd8d9b7b54bec2/ruff-0.17.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872e03dd231744d6c5ec5c8af6be52b71323fc6ee096e4c8b34d9f844ee3b978", size = 9938300, upload-time = "2026-10-15T15:22:41.284Z" }, + { url = "https://files.pythonhosted.org/packages/87/27/0b4bb926a49de2383f161272b4d863571a4c7ecdbf595a6bc58813a13367/ruff-0.17.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4c0d6cb5f8fbac77eec9af49f4fc0eaf856b05545e372b0694d24b4e76b1c640", size = 9948464, upload-time = "2026-10-15T15:22:43.681Z" }, + { url = "https://files.pythonhosted.org/packages/14/27/518d57e0e02aecb8ea4acac6b57b51a53173d25fa734952bfdd7d531e88e/ruff-0.17.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78beced4a3c94dfedbee4b999b95b6a27b35820fdc0afbacc6d37a8da26c1cd1", size = 10638639, upload-time = "2026-10-15T15:22:46.081Z" }, + { url = "https://files.pythonhosted.org/packages/01/82/d89a4e498ade59e6cee52d67f8da569019372212b87468c1fdeae884601c/ruff-0.17.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7feefc63921202894f0e158b0e32f45a5950d70a7fb693ccb9264816c25b1c05", size = 11337238, upload-time = "2026-10-15T15:22:48.894Z" }, + { url = "https://files.pythonhosted.org/packages/a2/7c/3b0fdef9352656317c977086fe1d802902406e4f2a0d8578da90c0e6d1c5/ruff-0.17.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:684154861a819bf1f433669d2a0ce9c3e54677c65b8ebb866cc2a7ec86345785", size = 10896327, upload-time = "2026-10-15T15:22:51.45Z" }, + { url = "https://files.pythonhosted.org/packages/62/86/5566290219708ce2928f3a29c4f843a1185b341ec6111c4631a33c5ceced/ruff-0.17.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6ef98e51de8ef38082f90653ceeb84944bd7673783eea13e1647c5b9b064189", size = 10350811, upload-time = "2026-10-15T15:22:54.401Z" }, + { url = "https://files.pythonhosted.org/packages/ad/d2/ca8462dabb3c413990d49703ba306c30c862195a75448d080fa8fcce9775/ruff-0.17.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:8f9aa5b5bd5fa1937803ea609c8f153b8de39bf3e0e149897ae34b0c5b52f467", size = 10569994, upload-time = "2026-10-15T15:22:57.142Z" }, + { url = "https://files.pythonhosted.org/packages/e3/ad/dd1864c1f1db17c8cfb297ce70b352388e6977620f66f7182c52855407df/ruff-0.17.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:80e53b0e5faa3c5667f035daaa032893ae42b7cfe708c886d39ed131e54688ab", size = 10059672, upload-time = "2026-10-15T15:23:00.084Z" }, + { url = "https://files.pythonhosted.org/packages/65/45/3f56cf1d2168c2165cdd5ac6f9668aee66a4cfdd4caf2b2cc5ccb2b1d568/ruff-0.17.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:056c5d5fa0ac790051ae165d7035c7bf956d02de2db557f2e9b31d877a505fca", size = 9947803, upload-time = "2026-10-15T15:23:03.132Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4b/5457cb2be4c1d1ea5e919558131a0f197a4a454a0530d9e30820e8206e4c/ruff-0.17.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:bd8f5a55b10f371642eacd0e8665a42a8b97da15c9a7187c79e697b77b5e0ce4", size = 10351807, upload-time = "2026-10-15T15:23:05.628Z" }, + { url = "https://files.pythonhosted.org/packages/49/fb/db15b4f8fa24a1e36b99e1401f42ef6df16ee299a48670d5d262b771e7d7/ruff-0.17.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ce05e6f3973611d9550a600e04bb531061e368baba31610eb57c1509a8f21a0a", size = 10765716, upload-time = "2026-10-15T15:23:08.092Z" }, + { url = "https://files.pythonhosted.org/packages/0a/e8/1e186578076aff7a80735f625005fde678412ab609cd323ed182eb7d6b87/ruff-0.17.1-py3-none-win32.whl", hash = "sha256:1de0030a8aa78c65c5fecb84b2e5c390ac684c0452875a02afc7c083d49a496a", size = 9895093, upload-time = "2026-10-15T15:23:10.582Z" }, + { url = "https://files.pythonhosted.org/packages/6a/2e/da3d9589bae8e8b58f3a48bd5bc0b980232fb14a83bf02c3be7660f87c1b/ruff-0.17.1-py3-none-win_amd64.whl", hash = "sha256:5df76f16580fab58d0f6c98a3ac254a4abceb7b2489b8b678335869cff77b3d7", size = 10097955, upload-time = "2026-10-15T15:23:13.309Z" }, + { url = "https://files.pythonhosted.org/packages/df/c9/0f2a4dea06a5e12c1191ee3d96b1e1233797d0d5e18f97a2b909a95a9836/ruff-0.17.1-py3-none-win_arm64.whl", hash = "sha256:42400b9a6ff8515ff27796f07f92e0195be011c86e81e381606f58ea5502fef4", size = 9853542, upload-time = "2026-10-15T15:23:16.05Z" }, ] [[package]] @@ -4186,11 +4306,11 @@ wheels = [ [[package]] name = "texttable" -version = "1.7.0" +version = "1.7.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1c/dc/0aff23d6036a4d3bf4f1d8c8204c5c79c4437e25e0ae94ffe4bbb55ee3c2/texttable-1.7.0.tar.gz", hash = "sha256:2d2068fb55115807d3ac77a4ca68fa48803e84ebb0ee2340f858107a36522638", size = 12831, upload-time = "2023-10-03T09:48:12.272Z" } +sdist = { url = "https://files.pythonhosted.org/packages/03/19/9590fd39a668ea0a0869493441fe65852246a3ec67616877baad98bcb039/texttable-1.7.2.tar.gz", hash = "sha256:dc16ea6b35fbf5291ba6ef79d79e37d9b3ca6acd7bae3ca3450488d7c2e19c99", size = 15400, upload-time = "2026-10-18T17:32:36.017Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/24/99/4772b8e00a136f3e01236de33b0efda31ee7077203ba5967fcc76da94d65/texttable-1.7.0-py2.py3-none-any.whl", hash = "sha256:72227d592c82b3d7f672731ae73e4d1f88cd8e2ef5b075a7a7f01a23a3743917", size = 10768, upload-time = "2023-10-03T09:48:10.434Z" }, + { url = "https://files.pythonhosted.org/packages/b9/4d/4de8896d9edcfb421e54d236b22a62be3827ca195ff649cad6fcae660f04/texttable-1.7.2-py2.py3-none-any.whl", hash = "sha256:a381e1ed30e4d4bd24cdacabe26463b7a570c0e964fc0b35d8d9276b2fcbe252", size = 10862, upload-time = "2026-10-18T17:32:34.587Z" }, ] [[package]] @@ -4210,11 +4330,11 @@ wheels = [ [[package]] name = "tomlkit" -version = "0.15.1" +version = "0.15.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/96/e07752635b98536177fa1f37671c8f3cdde2e724c6bcf6034b2cfb571565/tomlkit-0.15.1.tar.gz", hash = "sha256:e25bbf38843005246210a12982776f27f99cb9be67160e14434d0c0d21ee1e97", size = 180129, upload-time = "2026-07-17T01:48:04.562Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/72/fc01563df95c189a9f65850096bdc205bc2fe37da6c740cd64afaf18d07e/tomlkit-0.15.2.tar.gz", hash = "sha256:83e32755ba1d20d9340bd069ee97e9f6232ba2346b63ffcba425de01f7e327a6", size = 190522, upload-time = "2026-10-16T04:07:08.166Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/13/bc/8c13eb66537dce1d2bd3a57132902f38d0e7f5bb46fa9f4daed9fe9d76ee/tomlkit-0.15.1-py3-none-any.whl", hash = "sha256:177a05aece5a8ca5266fd3c448abb47b8d352f09d477d3ca8332db4d89b24304", size = 49449, upload-time = "2026-07-17T01:48:05.728Z" }, + { url = "https://files.pythonhosted.org/packages/da/46/7d84138a60a8bd796825b2d38ebe92d0d16501ca57d501b7c5d677401bbc/tomlkit-0.15.2-py3-none-any.whl", hash = "sha256:05562412163a3037b94497385fb7f9204c637bc605af7a48199e41cf2272f437", size = 52225, upload-time = "2026-10-16T04:07:09.216Z" }, ] [[package]] @@ -4232,27 +4352,27 @@ wheels = [ [[package]] name = "ty" -version = "0.0.85" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/66/8f/8de9c4ff90e7131a3c832ea074e123d551fed84c899d37a522f649ca7c6a/ty-0.0.85.tar.gz", hash = "sha256:ef442cbc2fd6dad02eb00dee4213c1e0f18e09bcbeec2cdce6aa802603c5c6bb", size = 7519853, upload-time = "2026-10-06T22:05:41.732Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/06/1716c1778088c5c8f96b248f0e0304e839ca69c096bde82b827bc00e4194/ty-0.0.85-py3-none-linux_armv6l.whl", hash = "sha256:012d71e0dcb51e74599adfb0e5c1416bdac3bf983115e42230545c782b06cfca", size = 14097338, upload-time = "2026-10-06T22:04:58.838Z" }, - { url = "https://files.pythonhosted.org/packages/4a/26/d6b2c7221096c3fa36a0afd4aa8134ffd450df63635ec3862a5a8cf6c9fd/ty-0.0.85-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:391d1993ea3b26509ddb3878dbe79e4cb92487c73109893ee2e51394846e0a69", size = 13684794, upload-time = "2026-10-06T22:05:02.204Z" }, - { url = "https://files.pythonhosted.org/packages/e7/7a/dd1e2e1c54551d61451c18eeb918db833fdbc0a48022fd2bffc93c755735/ty-0.0.85-py3-none-macosx_11_0_arm64.whl", hash = "sha256:90e1bb090348cb560c7ba6109f2c898735b0520fd3114cd316d8bd80439aabb7", size = 13318789, upload-time = "2026-10-06T22:05:04.61Z" }, - { url = "https://files.pythonhosted.org/packages/ff/9c/6c4fc7badf3e1e2e160d0b5c68632d85eb48dd0341422ac44fdd855d1eaf/ty-0.0.85-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:311c131f735bf76be8852305817d5fd10165d6289c76350f6188b0749a66a7f8", size = 13526827, upload-time = "2026-10-06T22:05:07.046Z" }, - { url = "https://files.pythonhosted.org/packages/ba/e5/f6f2d279ef810d89b688425a72150bbbd84a2d6bf54eb9a5ae172f13e3a5/ty-0.0.85-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a0971dc7b2f9e9cabdf654f53c8a40e563921227d05567b670f171cba2b3e385", size = 13823871, upload-time = "2026-10-06T22:05:09.731Z" }, - { url = "https://files.pythonhosted.org/packages/47/5d/1210c1f59e8c8c970807a2f13c180fa953ce58a6ddf28e90564db6f8890d/ty-0.0.85-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5fada6d10172b4c88d44b1f9697c9f5f40d34f8fb40fe716da0366f094268c9b", size = 14727151, upload-time = "2026-10-06T22:05:12.299Z" }, - { url = "https://files.pythonhosted.org/packages/20/26/cdd96e45c33079174d5cd70649a5ae77758bc209f0685e8a4fecee9b7094/ty-0.0.85-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d06c9aa616672e9f9856ff7b539be5c3a4719702e5636e58b4196a8c850a884b", size = 15148511, upload-time = "2026-10-06T22:05:15.304Z" }, - { url = "https://files.pythonhosted.org/packages/f0/28/fd471f2edc0f38a70f0494f9949d1983591073555d254031542c0ed29454/ty-0.0.85-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2280d31c369ef61ed9a4c2399cd663340d85a5fd7965a8ad881203ea6b8b130e", size = 15090530, upload-time = "2026-10-06T22:05:17.874Z" }, - { url = "https://files.pythonhosted.org/packages/7b/4f/6ebfe4f14c399856fc80c448ab442521072f688dfde72b075d8a90d7cafa/ty-0.0.85-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc1fff0eab4e73fcc66df761a7a4759da04d3e9c2b82d57c628c50434e2ff0d7", size = 14322051, upload-time = "2026-10-06T22:05:20.366Z" }, - { url = "https://files.pythonhosted.org/packages/36/38/866054d20e12e72a76a37eaf60f1374f7ad4d0b973c145685782065d84cf/ty-0.0.85-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:453dcb85b5f2486ddc6ade57a50698e9a8d8e3aae34e50f0b20bc5e8c2a3bc2b", size = 14637631, upload-time = "2026-10-06T22:05:22.628Z" }, - { url = "https://files.pythonhosted.org/packages/08/16/700c730b4978de81bab82974c23db0229e58d852e10767e1f1f8b0e217db/ty-0.0.85-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:820eb594b1d30cd6a0776e59449ed6994b03c27af8da0c287ad351de193eb4a7", size = 13553358, upload-time = "2026-10-06T22:05:24.903Z" }, - { url = "https://files.pythonhosted.org/packages/2e/60/d2dda3a3443d55083429b1eccabed95cbf8769bc61c51831e0ece890780f/ty-0.0.85-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4b76c6a2fc5974fc2c5f95156a34f44127be794f4b3dc9793aae5b6a4b774e83", size = 13837412, upload-time = "2026-10-06T22:05:27.163Z" }, - { url = "https://files.pythonhosted.org/packages/f2/54/05043adf78fa5c0440fe9b956505b24d2568da256b60e7479c691510bb92/ty-0.0.85-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0e3a32de0731efce574367fdd680b7524c681909a92e6cf64bb40ad48ccbc110", size = 14167568, upload-time = "2026-10-06T22:05:29.519Z" }, - { url = "https://files.pythonhosted.org/packages/9d/31/0372621051cc807f23d2e9c55bab65818ed131852c05fbe4c65be365895e/ty-0.0.85-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d622348c05a9fe99ad087dc93f174617a96f9fef23dd7a0acbdb0adaf8bd5ae6", size = 14489824, upload-time = "2026-10-06T22:05:32.089Z" }, - { url = "https://files.pythonhosted.org/packages/b5/64/0fca31db8c48dc72285f17b878e2c6a015279ab04a26e16f62abb384094f/ty-0.0.85-py3-none-win32.whl", hash = "sha256:0742d21a002481af8d2324b16ce5df210b5bb7673b0ea1096cfc02745c6b7280", size = 13410281, upload-time = "2026-10-06T22:05:34.418Z" }, - { url = "https://files.pythonhosted.org/packages/f6/a8/65d865185ecb18ee45b85cd99b34aedb3d8a4a9fe0438dab695e1390dbb7/ty-0.0.85-py3-none-win_amd64.whl", hash = "sha256:2636f8255b97c357dac1f9f50ca58f58a49642c8adb5c76643f483401a577014", size = 14112013, upload-time = "2026-10-06T22:05:36.946Z" }, - { url = "https://files.pythonhosted.org/packages/24/40/110b4f01af47fbb061f03e2f8e85cb30dd3d9ea614b2059dfaa058a044a5/ty-0.0.85-py3-none-win_arm64.whl", hash = "sha256:953574167a79d9dba7781238879955fa37fea405393710bfe53069ac82dff4d9", size = 13825189, upload-time = "2026-10-06T22:05:39.467Z" }, +version = "0.0.89" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/67/ea/dfb9bdbc168c50a568809466596751afa0c7da60da03b8c12906d1decde4/ty-0.0.89.tar.gz", hash = "sha256:bc1027b1ea95cca25c2a3a0b41433c809cf4b86a384d2b2434eba4bcd34548d4", size = 7978241, upload-time = "2026-10-16T10:35:05.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/84/e199d9a3dc3c94c804ddd9e94b63dbe543ae7f39329574963b6a6a95872f/ty-0.0.89-py3-none-linux_armv6l.whl", hash = "sha256:739b087e8873e177ffda99ff8a3600a4a7704d06523a8e88c4493021eee40b8a", size = 14254879, upload-time = "2026-10-16T10:34:24.813Z" }, + { url = "https://files.pythonhosted.org/packages/e5/d5/5afe09bf5c83c4e3a9e5913386a460e240a7029f2ae5fc96df5b43563a91/ty-0.0.89-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:47ebc98480c8a301955e18a8bdd67ef07090071ad47349b3254f325d3d5ab4e7", size = 13790417, upload-time = "2026-10-16T10:34:27.672Z" }, + { url = "https://files.pythonhosted.org/packages/7e/f9/88648f0ba9400dfd642c1e8dc0aeecb87945b121f3ff51f3902883c016d6/ty-0.0.89-py3-none-macosx_11_0_arm64.whl", hash = "sha256:b0631291af5c850a15007c0ffb906d813966466e4ec12173c44977c0c5a2d51d", size = 12856900, upload-time = "2026-10-16T10:34:29.871Z" }, + { url = "https://files.pythonhosted.org/packages/6a/89/baae2b407101c4cb02f19216123900c147af8fd87cdb1ed7eba139472734/ty-0.0.89-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d768300ae16274ce656006e9199869ad68684b74400d963e1c82deddf3a22ad", size = 13653330, upload-time = "2026-10-16T10:34:32.296Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1d/293516c2e10a77134cfc40d22c3fc08edd8c5eadae9c75531ec8a9263348/ty-0.0.89-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3dd4c57ba58bab8f6c816b2c254db52b58834b5dbf8268287382f7a2f9735c8f", size = 13986215, upload-time = "2026-10-16T10:34:34.506Z" }, + { url = "https://files.pythonhosted.org/packages/2f/c3/da911c8fc22d2664692432570619576b25c7cd0a586401cab08987763094/ty-0.0.89-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1af774c24117d366b69142d4f35edee518617f8b926d13560d0334cbe5aa3f85", size = 14905008, upload-time = "2026-10-16T10:34:36.632Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c3/aed8d920b9bbf7b582e9fc0305acb2f2c748ede788e7dba9d6952e939c78/ty-0.0.89-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8147811b9b3bc2dc9338cd01c7893ac931fc3fae7aace169047ecbd627e6628", size = 15278217, upload-time = "2026-10-16T10:34:39.144Z" }, + { url = "https://files.pythonhosted.org/packages/96/92/c6b4320f08fca44ffe279e5ddeb3eae12869c6341f596931accdefea1182/ty-0.0.89-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d5f178c91d50fb62461b5e579028b7d2e92872e1d8f02e96ace26464c2277a6", size = 15206289, upload-time = "2026-10-16T10:34:41.626Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/da22c714fd4f4dff642d60fb0d8bf8da1985d126f21cc89237f8bf707c92/ty-0.0.89-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a410f10b26cc3861757b626727db9d979deba7d2a3ab59f964fac8f0514fdc", size = 14510395, upload-time = "2026-10-16T10:34:44.063Z" }, + { url = "https://files.pythonhosted.org/packages/f0/32/5f9ce2377a77ad9ff36d8996edf86b1f069c1e8716e37c7d6d668402b110/ty-0.0.89-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:a70ab1a402746d7837407dc169e461fdf90945bc1eef0d3c0f1be543490060bf", size = 14767366, upload-time = "2026-10-16T10:34:46.154Z" }, + { url = "https://files.pythonhosted.org/packages/63/72/2b28c71d6ebd97b5bb1378f1806598c5dd90278f7b99a431dd3879dddcfc/ty-0.0.89-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b55c28a49bd2676eac9b3540a1dcc4cc053e4671c65dcec9fdad3dfe55fb148c", size = 13670284, upload-time = "2026-10-16T10:34:48.225Z" }, + { url = "https://files.pythonhosted.org/packages/34/cc/68b8ebf98c9bc582fddc3d2b93f6e0f53719d1ddee1c5037dfa2e1cb8467/ty-0.0.89-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4c9f22edeb8176f8ab189337e8cbd8f92b66744534a2886df9e252b52ade991c", size = 13997891, upload-time = "2026-10-16T10:34:50.556Z" }, + { url = "https://files.pythonhosted.org/packages/cf/4d/a1d61e06092fd5726f48a8711bd32eac6af132308eb222a0027caba4f42d/ty-0.0.89-py3-none-musllinux_1_2_i686.whl", hash = "sha256:0c186185cad57a1469b851096b51345de7b625e353c1f4acd338402daed22fa7", size = 14326247, upload-time = "2026-10-16T10:34:53.005Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d2/466d3762e330504a2c114dbbd0f0383229f9652dccd56277dde008bfe0da/ty-0.0.89-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:5e38302ac218d2404758241093b5542ed0345d4f569096589f1810034244e998", size = 14661527, upload-time = "2026-10-16T10:34:55.555Z" }, + { url = "https://files.pythonhosted.org/packages/b1/d5/dfd7ed5e4af472b20a11ef651da4bca55f9dc8be485cd152337f94caddde/ty-0.0.89-py3-none-win32.whl", hash = "sha256:0146637ed2321717280bfe4e4b20a18813b741da280e8039d7df2bf22b0251f1", size = 13224078, upload-time = "2026-10-16T10:34:57.735Z" }, + { url = "https://files.pythonhosted.org/packages/b4/14/1ee663c422e3a2d910c5cc27e7d84bd7709a3df0aca28a713843c6c3fa5d/ty-0.0.89-py3-none-win_amd64.whl", hash = "sha256:9fc56322a1aff29a19088d2025f3c42a6d25a7035668048bb908c9f8b66f480d", size = 13727433, upload-time = "2026-10-16T10:35:00.15Z" }, + { url = "https://files.pythonhosted.org/packages/09/93/af8f7250920823ca6d582bcf0abf803fb92c8b99415ba7f40f2304102c6f/ty-0.0.89-py3-none-win_arm64.whl", hash = "sha256:1d4967c8f7bfd67c9708115b41d7049197c5d20c76fb2e136fe78b0437ada05b", size = 13287101, upload-time = "2026-10-16T10:35:02.918Z" }, ] [[package]] @@ -4272,11 +4392,11 @@ wheels = [ [[package]] name = "types-psycopg2" -version = "2.9.21.20260911" +version = "2.9.21.20261008" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/23/6e/6dd8466de262775179699bebe9d21b2aabac4a53df512686f9f7c405fabc/types_psycopg2-2.9.21.20260911.tar.gz", hash = "sha256:834373add0aaf2497401acc49c41c540c4adfdec9bcc265f0460bb0808826a7d", size = 27831, upload-time = "2026-09-11T06:45:03.02Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/31/936ed138b7b891e5e7e281ae6850c9beb4f82d7631130e5094e7a038fd02/types_psycopg2-2.9.21.20261008.tar.gz", hash = "sha256:6211642ac3ed423de069669d2d4516dfd02451049201c3ecb2740f5083cfccaa", size = 27860, upload-time = "2026-10-08T08:06:21.143Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/79/1fb4dd00dad9a230af7485bcd2da0cb3b653c2de9bfa38e3ffe93d2e8d20/types_psycopg2-2.9.21.20260911-py3-none-any.whl", hash = "sha256:429920488100aa22c220f40aaaac96270125ea64333cf159858e422daa7d8174", size = 25026, upload-time = "2026-09-11T06:45:01.783Z" }, + { url = "https://files.pythonhosted.org/packages/0e/1f/e46bf261dff17ee1b8e69bce5d2627583ab69754c204d8ecc4399d54280a/types_psycopg2-2.9.21.20261008-py3-none-any.whl", hash = "sha256:4fe092ebf1b61c8b63a376dd8fa41f9bc0c3876948c1d3c0a039d1a0e842df07", size = 25035, upload-time = "2026-10-08T08:06:20.24Z" }, ] [[package]] @@ -4290,14 +4410,14 @@ wheels = [ [[package]] name = "typeshed-client" -version = "2.13.0" +version = "2.14.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/62/eb/ef31fadb73c5a9da6e88adf146b9db88282cf17136beb65a1c88905afe2f/typeshed_client-2.13.0.tar.gz", hash = "sha256:85ce73be98a5e3a51cafb2e2921653e3759ce7e9d1530adcca935dec201152f2", size = 532578, upload-time = "2026-08-03T04:11:13.63Z" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/51/42f516f1e67dd3e291d8e80d9217704af16241cbd2b6c2c4c1f3eba8bfe1/typeshed_client-2.14.0.tar.gz", hash = "sha256:b7438c6f1d843e87e734102ca875d45a4c55b8abd15c4e16ce4af9345ad4085d", size = 536464, upload-time = "2026-10-12T23:12:48.319Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/2b/83e50380aa9ca001ee74460f027b518eefd330edb7ab7787442424f1e584/typeshed_client-2.13.0-py3-none-any.whl", hash = "sha256:71bc9ed297ddb32d3c4b2d29b5e688c6b0b9a21ca8ce6082d0aa7cee9cad5077", size = 800208, upload-time = "2026-08-03T04:11:12.368Z" }, + { url = "https://files.pythonhosted.org/packages/b2/81/3eee24796e76355265fbcd5fd424bab0f16cb05c87107473c999525dc0ef/typeshed_client-2.14.0-py3-none-any.whl", hash = "sha256:9784bdb4bcb6235d015375b1225847d324d351a6a309cf30c869b08489a7f9d3", size = 803863, upload-time = "2026-10-12T23:12:46.461Z" }, ] [[package]]