diff --git a/.ansible-lint b/.ansible-lint deleted file mode 100644 index 7e44170..0000000 --- a/.ansible-lint +++ /dev/null @@ -1,4 +0,0 @@ ---- -exclude_paths: - - galaxy_collections/ - - galaxy_roles/ diff --git a/.config/ls-lint.yml b/.config/ls-lint.yml new file mode 100644 index 0000000..5573c69 --- /dev/null +++ b/.config/ls-lint.yml @@ -0,0 +1,7 @@ +--- +ls: + .*: kebab-case + +ignore: + - README.md + - src/templates/scripts/xcode/tests/test_xcode-utils.bash diff --git a/.config/lychee.toml b/.config/lychee.toml new file mode 100644 index 0000000..7e0fe3c --- /dev/null +++ b/.config/lychee.toml @@ -0,0 +1,6 @@ +cache = true +exclude = [ + # StackExchange and StackOverflow URLs keep throwing 403s for some reason + '^https?://(.*\.)?stackexchange\.com', + '^https?://(.*\.)?stackoverflow\.com', +] diff --git a/.config/ryl.toml b/.config/ryl.toml new file mode 100644 index 0000000..ebcec7a --- /dev/null +++ b/.config/ryl.toml @@ -0,0 +1,33 @@ +[files] +yaml = [ + "*.yaml", + "*.yml", + ".yamllint", +] + +[rules] +anchors = "enable" +braces = "enable" +brackets = "enable" +colons = "enable" +commas = "enable" +document-end = "disable" +empty-lines = "enable" +empty-values = "disable" +float-values = "disable" +hyphens = "enable" +indentation = "enable" +key-duplicates = "enable" +key-ordering = "disable" +line-length = "enable" +new-line-at-end-of-file = "enable" +new-lines = "enable" +octal-values = "disable" +quoted-strings = "disable" +trailing-spaces = "enable" + +[rules.comments] +min-spaces-from-content = 1 + +[per-file-ignores] +".github/workflows/*" = ["truthy"] diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e16b9a8..844bd4c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,5 +1,6 @@ --- -# Documentation for this file: https://docs.github.com/en/code-security/reference/supply-chain-security/dependabot-options-reference +# Documentation for this file: +# https://docs.github.com/en/code-security/reference/supply-chain-security/dependabot-options-reference version: 2 updates: @@ -8,8 +9,3 @@ updates: schedule: interval: "weekly" assignees: ["hisaac"] - - package-ecosystem: "uv" - directory: "/" - schedule: - interval: "weekly" - assignees: ["hisaac"] diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index f2220c0..3651df6 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -6,7 +6,6 @@ on: workflow_dispatch: env: MISE_ENV: ci - MISE_LOCKED: 1 jobs: lint: @@ -15,14 +14,6 @@ jobs: - name: checkout repo uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - name: cache Ansible dependencies - uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 - with: - path: |- - galaxy_collection - galaxy_roles - key: ${{ runner.os }}-${{ hashFiles('ansible.cfg', 'requirements.yml') }} - - name: setup mise uses: jdx/mise-action@c2a87611a18de5b3828c5652fe268e992400cb5c # v4.3.0 diff --git a/.gitignore b/.gitignore index 53d2c36..6b76e41 100644 --- a/.gitignore +++ b/.gitignore @@ -1,28 +1,10 @@ -# General +# general +*.env +*.log .DS_Store .env -# Cached files +# caches .cache/ - -# Packer +.lycheecache packer_cache/ - -# Ansible -.ansible -ansible.log - -# External roles/collections installed via ansible-galaxy -galaxy_roles/ -galaxy_collections/ - -# Ansible retry files -*.retry - -# Vault password file (if used locally) -.vault_pass - -# Python -__pycache__ -.ruff_cache -.venv/ diff --git a/.mise/locks/pipx-ansible-core/2.21.4/pyproject.toml b/.mise/locks/pipx-ansible-core/2.21.4/pyproject.toml deleted file mode 100644 index bbf3dac..0000000 --- a/.mise/locks/pipx-ansible-core/2.21.4/pyproject.toml +++ /dev/null @@ -1,5 +0,0 @@ -[project] -name = "mise-pypi-tool-environment" -version = "0.0.0" -requires-python = ">=3.12" -dependencies = ["ansible-core==2.21.4"] diff --git a/.mise/locks/pipx-ansible-core/2.21.4/uv.lock b/.mise/locks/pipx-ansible-core/2.21.4/uv.lock deleted file mode 100644 index 497c5a2..0000000 --- a/.mise/locks/pipx-ansible-core/2.21.4/uv.lock +++ /dev/null @@ -1,316 +0,0 @@ -version = 1 -revision = 3 -requires-python = ">=3.12" - -[options] -exclude-newer = "2026-09-22T13:07:02.804113Z" - -[[package]] -name = "ansible-core" -version = "2.21.4" -source = { registry = "https://pypi.org/simple/" } -dependencies = [ - { name = "cryptography" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "resolvelib" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/df/72/2152230f254bd9c6b892f95d6d291a96fd09b632ce01c6b406eda8c5cd75/ansible_core-2.21.4.tar.gz", hash = "sha256:81a9329f4f12cfa5008dcab5d1bf23ae69b7effc08c0f00048ab2461147ae95a", size = 3394492, upload-time = "2026-09-08T16:51:48.569Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/05/d4e28474dd027db4d60fef2422cf6bc80df100ab32e5fa5e7aad898ffd55/ansible_core-2.21.4-py3-none-any.whl", hash = "sha256:ebe74d9c8fadcb41ad2151e031bf1e785e3098aaa015019b4e19a0a96f0dcc4f", size = 2457154, upload-time = "2026-09-08T16:51:47.044Z" }, -] - -[[package]] -name = "cffi" -version = "2.1.1" -source = { registry = "https://pypi.org/simple/" } -dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/10/69/43965eccfdead3b9220015fd1320e117be8c6ed01a62ffab76eeb752f5d5/cffi-2.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0", size = 184821, upload-time = "2026-08-03T21:19:44.887Z" }, - { url = "https://files.pythonhosted.org/packages/54/7d/16e5a096677b5e313ca80cd5e5170efa3ea44624a82bb111925522da64b1/cffi-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf", size = 184719, upload-time = "2026-08-03T21:19:46.129Z" }, - { url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" }, - { url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" }, - { url = "https://files.pythonhosted.org/packages/6a/5b/717f1526b9957b34456313c31645c5b82b8fb5c3fe9e4752999be7128bfc/cffi-2.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50", size = 210249, upload-time = "2026-08-03T21:19:49.543Z" }, - { url = "https://files.pythonhosted.org/packages/64/b3/f8aa4f3e34986c7e4ec45072d1b1b9dd295b6b18007b45518d79726dd725/cffi-2.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e", size = 208775, upload-time = "2026-08-03T21:19:50.918Z" }, - { url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" }, - { url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" }, - { url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" }, - { url = "https://files.pythonhosted.org/packages/80/fb/0bb75b7039588c074b37ae99f40d9bfddf990ecb2fbc346ebccd2e56b9be/cffi-2.1.1-cp312-cp312-win32.whl", hash = "sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e", size = 175292, upload-time = "2026-08-03T21:19:55.566Z" }, - { url = "https://files.pythonhosted.org/packages/d9/79/615cc094e2fb508cade7de88d3b4f6c4ec2bab695c97bce9153dc65aadf5/cffi-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a", size = 185919, upload-time = "2026-08-03T21:19:56.89Z" }, - { url = "https://files.pythonhosted.org/packages/70/c6/d0ea84713fe46b243a436a18fcd47d639732747e21635c8a27191b06dc30/cffi-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80", size = 180093, upload-time = "2026-08-03T21:19:58.155Z" }, - { url = "https://files.pythonhosted.org/packages/9d/f4/035513d4117049066b4779dc3b7c0c0fdad175fa13731c9f4003f1cd1478/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e", size = 194248, upload-time = "2026-08-03T21:19:59.399Z" }, - { url = "https://files.pythonhosted.org/packages/76/af/2aeb4dbb5fc41a04161ae9ff1518de7cec08e164f44a8ce6a4cf7fd2cd1d/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c", size = 196908, upload-time = "2026-08-03T21:20:00.746Z" }, - { url = "https://files.pythonhosted.org/packages/a7/46/2e5fdde8555706dd98139a910ca11be02809f3f605ce956f655d0214e100/cffi-2.1.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:9d2055050ea716bd38b7f7f1579c275386646b4894c155a3e2f3cd62ed41b7c6", size = 184805, upload-time = "2026-08-03T21:20:02.02Z" }, - { url = "https://files.pythonhosted.org/packages/55/41/4c7042f317b9217502988f0873af87e16ad606dc20f84e546e3e6ce9764c/cffi-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19ee6127ee34de7d83ce3d371ebc5ed91addbdcc39f9ab15ce4eb35a4e534971", size = 184764, upload-time = "2026-08-03T21:20:03.141Z" }, - { url = "https://files.pythonhosted.org/packages/43/1f/1c3d90d91811c8f86ced9ed637956c54bfe5b79ca98fe976d7f8c8979f6b/cffi-2.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c", size = 214722, upload-time = "2026-08-03T21:20:04.377Z" }, - { url = "https://files.pythonhosted.org/packages/37/6f/3b5ce4c3b2192d250f04908f2bfd91ef34552ec8f7716a5d4abdb8d67bb2/cffi-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125", size = 222369, upload-time = "2026-08-03T21:20:05.544Z" }, - { url = "https://files.pythonhosted.org/packages/02/10/4b3c75dde3d9663c9e02ba05c2668b954f671d4bbe346413ca8c696b295a/cffi-2.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264", size = 210175, upload-time = "2026-08-03T21:20:06.75Z" }, - { url = "https://files.pythonhosted.org/packages/df/62/14f74b9543e605d17701dc797b815958b8bb70b7624ce1b832ddad48ed6c/cffi-2.1.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3", size = 208670, upload-time = "2026-08-03T21:20:08.04Z" }, - { url = "https://files.pythonhosted.org/packages/95/95/86342356ff5953b3fb06f7ef7c5bee212d45e770abc7218d451b9148313c/cffi-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2", size = 221824, upload-time = "2026-08-03T21:20:09.274Z" }, - { url = "https://files.pythonhosted.org/packages/eb/ff/7b3429ff53aafe931ed8a5fc69f481bbef7ba6de87ddcbb63d08f483f613/cffi-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b", size = 225148, upload-time = "2026-08-03T21:20:10.7Z" }, - { url = "https://files.pythonhosted.org/packages/34/34/a95870b9221e09cf4f2ce3178b1a210abdfe63a1bd357da940418d7b8d15/cffi-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7", size = 223564, upload-time = "2026-08-03T21:20:12.165Z" }, - { url = "https://files.pythonhosted.org/packages/70/ea/839b50531021a647fb5e929f72cf97bc1ff702b5472166164b5b6e76b851/cffi-2.1.1-cp313-cp313-win32.whl", hash = "sha256:334644fbac4eff73d985a17a91226df55d0f394160c4cfb880e084c8f7161cac", size = 175263, upload-time = "2026-08-03T21:20:13.559Z" }, - { url = "https://files.pythonhosted.org/packages/60/a6/8b149b2c3f2e11aaa1618ef64500b45f50f22c57a977a4dff1aff1f91042/cffi-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:1aa5645c30469b09530c4ebca77ebf8f17618293c58f8549cb1a543a50236e7d", size = 185688, upload-time = "2026-08-03T21:20:14.69Z" }, - { url = "https://files.pythonhosted.org/packages/01/9a/11f687cb39d6a3504060d5242f04f48c735afb4d3d533958a20594890cb2/cffi-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:63bbfd5ded17c4840ac07cd8f1c21ba9d9708141f840b324f422f41b207e3973", size = 180078, upload-time = "2026-08-03T21:20:15.917Z" }, - { url = "https://files.pythonhosted.org/packages/d3/7b/d6bbf82b8b96e7391438898c42f5bd96dd02030fd5b64937d248220003e2/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c", size = 194064, upload-time = "2026-08-03T21:20:17.148Z" }, - { url = "https://files.pythonhosted.org/packages/94/e6/bcc91b283be94735e268487a054004f0aa19947b6348fa367db53230abc8/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb", size = 196720, upload-time = "2026-08-03T21:20:18.268Z" }, - { url = "https://files.pythonhosted.org/packages/d9/99/c4b0c17cacdc9c3b8f280026286a9826d6a208c0f047591a3c3ce99b91fd/cffi-2.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d28630f5854ab07ab1fd4aba756de52326c82e6be15d414b12793f1975048b54", size = 184964, upload-time = "2026-08-03T21:20:19.708Z" }, - { url = "https://files.pythonhosted.org/packages/b3/a9/9db617d05d7367c1ad0ab00b3aa6e6f9281edd689b4ee9ea0e5a84e89c97/cffi-2.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:661c298b4821edebead0c91edd2b00374d67ad7c5a1f7a91d4442633b79d6a72", size = 184962, upload-time = "2026-08-03T21:20:20.833Z" }, - { url = "https://files.pythonhosted.org/packages/67/b8/b42132ca113dc567d37684437b46ca1dafc885902b02a110a02d5b511857/cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1", size = 222328, upload-time = "2026-08-03T21:20:22.118Z" }, - { url = "https://files.pythonhosted.org/packages/80/10/c5c0cbf0a657aecf59ef511409734230bf556f05a0d6c9eed7aa5c0a0166/cffi-2.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062", size = 209985, upload-time = "2026-08-03T21:20:23.401Z" }, - { url = "https://files.pythonhosted.org/packages/d5/6c/bfa0b87b03b9238148beca990292843c9396ba069b54496596594173de7b/cffi-2.1.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03", size = 208530, upload-time = "2026-08-03T21:20:24.628Z" }, - { url = "https://files.pythonhosted.org/packages/e9/02/4e7d553a7ac4b4238b38b3c1b80d486e9d4436f8d2acbf87a0997fe3f402/cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96", size = 221525, upload-time = "2026-08-03T21:20:25.758Z" }, - { url = "https://files.pythonhosted.org/packages/82/1d/a4aaf9babd75acb4d5f223bff71533bee748dd770a382619a798960ee9ba/cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527", size = 225053, upload-time = "2026-08-03T21:20:26.985Z" }, - { url = "https://files.pythonhosted.org/packages/81/10/5dc0e7bdd18e22107054288283380fc97a06ae3f1656a106908d666a3c88/cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13", size = 223213, upload-time = "2026-08-03T21:20:28.277Z" }, - { url = "https://files.pythonhosted.org/packages/0b/e9/d0061c364cde06ee43168a0d076ac1da512cbc380d44767b844ba34fe2b6/cffi-2.1.1-cp314-cp314-win32.whl", hash = "sha256:1a18a57b58cfb21fc28d72e876acf10eaed67a1ed96226f92af4df681d571c4c", size = 177682, upload-time = "2026-08-03T21:20:44.288Z" }, - { url = "https://files.pythonhosted.org/packages/a7/06/1c3e01e3ba14c39f6d10bfbac52753b7e22259e38088e5cfe1d704918690/cffi-2.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:3222ba5d678f80a030e6afbcc33dc1ae5cb45facabb61cee2c7016b8432fde48", size = 187949, upload-time = "2026-08-03T21:20:45.623Z" }, - { url = "https://files.pythonhosted.org/packages/87/5b/da4e39efe18eeb89cf580ea9cfc66b6a7c3eadb808fc0cc1d3a295cb5a5d/cffi-2.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:ab36d55f9ed2d067327667c2fea18dda018eb628dd6347aa01dda6cf1f5d3836", size = 182947, upload-time = "2026-08-03T21:20:46.955Z" }, - { url = "https://files.pythonhosted.org/packages/23/59/40338bf421c5accea1d45158170c87006ef1cd371b05c077e76476949728/cffi-2.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7750c6449dff7864bb9bb27ddfb0267756189201a3afc911d82b3caacd70dfc3", size = 188504, upload-time = "2026-08-03T21:20:29.495Z" }, - { url = "https://files.pythonhosted.org/packages/7d/47/5ecf1023850036e674c77ec4de86182d309ae344e39e7cba984b7df5d647/cffi-2.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0beceaabe56af686895136a2de78db54ecd8e4046b236b8fd6d6cb61389e9bf2", size = 188259, upload-time = "2026-08-03T21:20:31.291Z" }, - { url = "https://files.pythonhosted.org/packages/2a/9c/92934c3bea9f785b23eba304538c0b4d37a2a96d2431eb3a1bc87a11aa19/cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94", size = 223864, upload-time = "2026-08-03T21:20:32.571Z" }, - { url = "https://files.pythonhosted.org/packages/4d/45/ba4c93527bc38616a8bd36488acb69a2212d60486794f0c1f318949bbb76/cffi-2.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc", size = 211538, upload-time = "2026-08-03T21:20:33.808Z" }, - { url = "https://files.pythonhosted.org/packages/80/e9/b6ef565e452acb932fb0cb5443f44a78efbd1233e566f02b5a83855e9115/cffi-2.1.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29", size = 210688, upload-time = "2026-08-03T21:20:34.974Z" }, - { url = "https://files.pythonhosted.org/packages/9a/95/eff5f0cee78d2eabc7eebffec40d3fc1876b5f3c95582e018bb4b99601f2/cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676", size = 223803, upload-time = "2026-08-03T21:20:36.564Z" }, - { url = "https://files.pythonhosted.org/packages/fa/01/579d39fb8bef00a335a23d83757b44feb24cd6345a2c451b64cb67b9c362/cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e", size = 226763, upload-time = "2026-08-03T21:20:37.816Z" }, - { url = "https://files.pythonhosted.org/packages/8d/b0/0b44f47c60b01b57b6e2bbd92343f13a85a1d93bc46ccf6e47e244acd99c/cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f", size = 225688, upload-time = "2026-08-03T21:20:38.959Z" }, - { url = "https://files.pythonhosted.org/packages/eb/d2/3b7176cb570a1d3e27faf67b72f591af508036e0d8b2be2ef9af9e8c84bb/cffi-2.1.1-cp314-cp314t-win32.whl", hash = "sha256:8ef53b2de9bcb9197d31854256575d59dbac0cba72ac627bb291ef5eceb74be4", size = 182868, upload-time = "2026-08-03T21:20:40.388Z" }, - { url = "https://files.pythonhosted.org/packages/56/78/31f00c1bcd97c9bbf55f1bfdf5bc809a5de8887473e90bb9960dca825e80/cffi-2.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:616f097f2fe415bc92a247f02e11f634e1f9e9a83d327e3c915c15089c87869e", size = 194104, upload-time = "2026-08-03T21:20:41.725Z" }, - { url = "https://files.pythonhosted.org/packages/7b/1b/58496f2ed0a35de575250c02a43ab3cc2c04d494a88fed31c1cabc0fd176/cffi-2.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ad2c86c495b899d862ea0f4b42891b8713a3bd45dd4105c7fd51c2a72f39f3a5", size = 186402, upload-time = "2026-08-03T21:20:43.042Z" }, - { url = "https://files.pythonhosted.org/packages/c1/8f/9ebe220eab48a093d1a5a5e339ab0dc7316eef3bb04d63c42f0251b61f50/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d", size = 194043, upload-time = "2026-08-03T21:20:48.179Z" }, - { url = "https://files.pythonhosted.org/packages/ff/69/844bad3ece306c4782c2ecb93597035b6690d48704b803914c199da1e8b3/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b", size = 196737, upload-time = "2026-08-03T21:20:49.457Z" }, - { url = "https://files.pythonhosted.org/packages/1b/8a/af668013284634733f02d683458a0728739c7d6ddb5e14cb0c20832266fe/cffi-2.1.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4", size = 184933, upload-time = "2026-08-03T21:20:50.639Z" }, - { url = "https://files.pythonhosted.org/packages/0c/75/2f5207ff6d1a613133b23a5203cc0c2a628313b5eb3974d7956ae3c57950/cffi-2.1.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2ae64be792b8966f2c69538199728b290e34726562896df1e5dc8ffd8d8188e8", size = 185002, upload-time = "2026-08-03T21:20:52.173Z" }, - { url = "https://files.pythonhosted.org/packages/e2/31/9e1313b0a6e30e91b3b3d3fff51ae99c857c07738e3afcce1f7334e1b7ab/cffi-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6", size = 222271, upload-time = "2026-08-03T21:20:53.462Z" }, - { url = "https://files.pythonhosted.org/packages/50/e3/f6234a833e6e08c7007003074723c406559eecf9b48dfc97471e5a8eb7a0/cffi-2.1.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80", size = 209919, upload-time = "2026-08-03T21:20:54.783Z" }, - { url = "https://files.pythonhosted.org/packages/0d/fc/5f74e293fced6edb51af3a46c4ccf6c23c9943774ecb375ddbd522c76add/cffi-2.1.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779", size = 208529, upload-time = "2026-08-03T21:20:56.066Z" }, - { url = "https://files.pythonhosted.org/packages/44/16/29e6d01b388bef055ecd6ca8244b3f4d336bd09e92d5d892187b9601084e/cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399", size = 221630, upload-time = "2026-08-03T21:20:57.336Z" }, - { url = "https://files.pythonhosted.org/packages/a4/18/fa7f1f6857d5eb88a4ca99ffcbfb7c387a287ccc154c64a73e86314745d7/cffi-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688", size = 225134, upload-time = "2026-08-03T21:20:58.675Z" }, - { url = "https://files.pythonhosted.org/packages/e0/9f/e8e3dfa04a1b4c241f8c91faacad872b4d4efd051d49764ad4e2fd4b9fea/cffi-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7", size = 223197, upload-time = "2026-08-03T21:20:59.968Z" }, - { url = "https://files.pythonhosted.org/packages/f8/7e/8debeb04f1ab9fe2a6963964cd6f1aaf7192627b83926586a6a4e089c9fa/cffi-2.1.1-cp315-cp315-win32.whl", hash = "sha256:4f42141fc14250de6dde5ee7ea4432be017252d91f19c5ad043c084cea629cac", size = 177683, upload-time = "2026-08-03T21:21:14.901Z" }, - { url = "https://files.pythonhosted.org/packages/e0/31/5158704cc474ab65c1647932e88be78dc0873f47130e253be38bcaf13d01/cffi-2.1.1-cp315-cp315-win_amd64.whl", hash = "sha256:e6e8cff14d6fb0be70a09c0bdc58096f501952d04624ebf867e0e56da2df8960", size = 187897, upload-time = "2026-08-03T21:21:16.108Z" }, - { url = "https://files.pythonhosted.org/packages/cc/4b/b3a2da8570c704ffc0f9762cdc3ec0f02c8573798e0b5cf7f11c82bbb70f/cffi-2.1.1-cp315-cp315-win_arm64.whl", hash = "sha256:27350daa11d4f10c540e6e89dada4c54feb7256ad03e9a4dc075ebad7ba360d1", size = 182935, upload-time = "2026-08-03T21:21:17.271Z" }, - { url = "https://files.pythonhosted.org/packages/d0/ef/5443574510a1207e6f6bc38ba6e1f1de36cb48fef07b2728bb896a21f430/cffi-2.1.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c26608d2222fb1e94487e4a387d85f13eb55d5ed725cb25a0c589ac4ee60e7bc", size = 188464, upload-time = "2026-08-03T21:21:01.163Z" }, - { url = "https://files.pythonhosted.org/packages/7e/ae/a56fa8c4686ad50e148fcbc8d3ae0d03915ff5c30d795058988c24118cef/cffi-2.1.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:4be96343e422f2dfcd12ab5c9f5aebe03f82f737c6bffeca6830b3875cb44aab", size = 188262, upload-time = "2026-08-03T21:21:02.382Z" }, - { url = "https://files.pythonhosted.org/packages/53/b2/6187f46f2912276a3ae284076109cc5c8680482f11f766ccf26db4a86427/cffi-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e", size = 223779, upload-time = "2026-08-03T21:21:03.553Z" }, - { url = "https://files.pythonhosted.org/packages/8a/f6/c3ad28bd19f77047a03084424fbd4cbe997303267c14423737324be0385d/cffi-2.1.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358", size = 211520, upload-time = "2026-08-03T21:21:04.863Z" }, - { url = "https://files.pythonhosted.org/packages/a0/cd/ccac9013a5bd9fd764de118674ab9c805b5ca10c19270d90ee273f8b2240/cffi-2.1.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231", size = 210673, upload-time = "2026-08-03T21:21:06.223Z" }, - { url = "https://files.pythonhosted.org/packages/52/86/2976131c639aead931c5bee5aba67e4b09fbeb8018b6f282f70803f923a7/cffi-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6", size = 223835, upload-time = "2026-08-03T21:21:07.539Z" }, - { url = "https://files.pythonhosted.org/packages/ac/0c/33a7aeab2f9c76918c52e084beb39c570db3588133412929e8ec06fab90b/cffi-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94", size = 226705, upload-time = "2026-08-03T21:21:08.774Z" }, - { url = "https://files.pythonhosted.org/packages/e3/26/2cde30fdde421130bfc18f70395731a6e6b2053c6a1978a5258ff04e72fa/cffi-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5", size = 225539, upload-time = "2026-08-03T21:21:09.911Z" }, - { url = "https://files.pythonhosted.org/packages/6d/cd/a361394c94b2129d604bb846f624a8e88255a3ee33129c434a00d715e64f/cffi-2.1.1-cp315-cp315t-win32.whl", hash = "sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66", size = 182707, upload-time = "2026-08-03T21:21:11.226Z" }, - { url = "https://files.pythonhosted.org/packages/9b/b5/ba2b299993c26577d529b6ae29841f9e15b9fcf004d65f423f4fcf94ade9/cffi-2.1.1-cp315-cp315t-win_amd64.whl", hash = "sha256:d9c275eaacd24aa73f94ffd6de08fc3f932424d8b6c376f4bed7cde376fe7bc3", size = 193772, upload-time = "2026-08-03T21:21:12.39Z" }, - { url = "https://files.pythonhosted.org/packages/aa/29/35e016098c814cd93de9cd320c66b5bfba14dc6ecedd3cb518fa7c408c69/cffi-2.1.1-cp315-cp315t-win_arm64.whl", hash = "sha256:d18e5ac0f2f03f4f518d3e23db0f0cad7faa1da8620e9c09461d443bbf6e6692", size = 186360, upload-time = "2026-08-03T21:21:13.636Z" }, -] - -[[package]] -name = "cryptography" -version = "50.0.1" -source = { registry = "https://pypi.org/simple/" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bb/ad/5d6702db60b1e40b41ef513b6967ff5848f307d50f8449baf1634f5908f1/cryptography-50.0.1.tar.gz", hash = "sha256:5dd9bda1c12b4162f6ff568eeb5e0ff956c28d14406e875cfe8a63a2d414ff20", size = 880381, upload-time = "2026-08-25T19:45:45.499Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/19/797e2aaac9df6a66f1550f49979dc1b1e39ecd2077501c30efa81e8d5d67/cryptography-50.0.1-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:b8f852c65863251b9e3a1b8c150ce21e59b522dbb6a7d4bc80e680d38388e986", size = 4010153, upload-time = "2026-08-25T19:44:03.155Z" }, - { url = "https://files.pythonhosted.org/packages/90/34/9ce9a62ed9dc82ca9fd6a34445b6904af56e5f38b3eae2ed32e49c36053d/cryptography-50.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e279950892dc102c6b4e52af03ae5ea92fac572a1ddab78ca73a997f62b69f", size = 4723133, upload-time = "2026-08-25T19:44:05.461Z" }, - { url = "https://files.pythonhosted.org/packages/57/26/e6d4fc8512a51a5f9ee7bfdbfb853bce1197087df40c9ad993ad370b846f/cryptography-50.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ff838d62ec1bfce4f9ba7fa16f4a7b554cd8d0c299e6be37502161a660c84eef", size = 4712478, upload-time = "2026-08-25T19:44:07.375Z" }, - { url = "https://files.pythonhosted.org/packages/e6/de/d3cdc2815697aae84126cbd6a030ca7b6b452e28a88b501b836bd3aa7a86/cryptography-50.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e74591e283fe6eb956416c929eb58262a719fe0311fd9054c62c3350ed8760d8", size = 4730726, upload-time = "2026-08-25T19:44:09.294Z" }, - { url = "https://files.pythonhosted.org/packages/55/32/38c0d344b98c06d34b5df8946565a9c0d6dbf32c8e0730a7f05f0a3c6cab/cryptography-50.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5fe002589592ed749ce77fe0695fcbd3500dd61d7d6db5858a7544c612fa8e45", size = 5353524, upload-time = "2026-08-25T19:44:11.96Z" }, - { url = "https://files.pythonhosted.org/packages/e1/1b/82f0f0d8858d4432be1af790477edf62aef90324041aa07c57e57bef1af7/cryptography-50.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:51593d180cf6d179bde5c5d065bed81386b1f381656ae7d042b7ffc87a9895ad", size = 4746720, upload-time = "2026-08-25T19:44:14.051Z" }, - { url = "https://files.pythonhosted.org/packages/29/ba/042ca458b8c64348c768284b5d23e69b92ed53d057ab779fee628564676d/cryptography-50.0.1-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:359e62deae718bce96170e223fdcb6357e4fbd3bb7a3a75f4430763532560e49", size = 4361866, upload-time = "2026-08-25T19:44:16.167Z" }, - { url = "https://files.pythonhosted.org/packages/39/3b/e96c1ef71edef71057c7e3c3d982ce8fda554e0c52d0cc19c18845cde3eb/cryptography-50.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e2ca8fd1b6b4b82a1c4cb02841d0837e3c12336c2e24b520ab8ab3b969733d8f", size = 4730028, upload-time = "2026-08-25T19:44:18.085Z" }, - { url = "https://files.pythonhosted.org/packages/e3/38/45abd72ef63f2e7d0754a6cacf97bd8b69512ace7f6130d24c39ece65da2/cryptography-50.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:76de83fbd91ac49c0feaaa983d0748fd7a53176afac5fb3bf7478d244f0eb527", size = 5308405, upload-time = "2026-08-25T19:44:20.197Z" }, - { url = "https://files.pythonhosted.org/packages/85/66/6ccca4722987ddedaa7fc9c3f4708af7431f5535666c174350830888c6b7/cryptography-50.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:51afcfceb15597cf2635068e4ac9a56b2abde622edde17f37d85fd7b5306497a", size = 4746230, upload-time = "2026-08-25T19:44:22.376Z" }, - { url = "https://files.pythonhosted.org/packages/13/0e/b1f92e013228111413f2e6743948b80bc24dfd3c1b87ba98ceea16f5df89/cryptography-50.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:be224a65493ec5b74a158ff22a5522ce4a5ca1e543c647a3a4730d4a09e5f959", size = 4862596, upload-time = "2026-08-25T19:44:24.472Z" }, - { url = "https://files.pythonhosted.org/packages/7e/22/c3654cccc856e9d682817b04ac3ee79731cb09ca6f95996a95c904de2883/cryptography-50.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9ebcdd5519be9b652a46f507817a74591774fc3d6923ac364e4dfa64e36b291b", size = 5014082, upload-time = "2026-08-25T19:44:26.709Z" }, - { url = "https://files.pythonhosted.org/packages/42/8b/cb12b1b60c91b074ca6bf0fdd59aa8f10d8bc5f73af8faece86ef0421b37/cryptography-50.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:aed8db4f6d71c51efb89530e12d9464e7bf2923d46c3205dc794a2a93f8c0648", size = 3842826, upload-time = "2026-08-25T19:44:28.784Z" }, - { url = "https://files.pythonhosted.org/packages/5b/f0/424cb557d99aa86ac55da5e2add02e2882e44047b6264f93ade1b975a993/cryptography-50.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:30a125032e5642a21ff816e021152bd4e7e94f03eff3f4b7fca41cd22bc3110f", size = 3973525, upload-time = "2026-08-25T19:44:30.7Z" }, - { url = "https://files.pythonhosted.org/packages/4d/72/3a2711d967977ab5fc80b782837c7e8d1ac7445e764c20c381a265c57ef3/cryptography-50.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a0b1a59e3a089064a0ec309e9428c8e3ae4e161419d20ac33600767e83fc658a", size = 4708817, upload-time = "2026-08-25T19:44:32.773Z" }, - { url = "https://files.pythonhosted.org/packages/b4/f2/bb1f56e10815b789df0b409a69fa4992ff3d3fef9c72747f4a6b26fed38e/cryptography-50.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8921d58f426793c5f1b47f0b59575780de9a095214958d0eb37d909593db8367", size = 4697300, upload-time = "2026-08-25T19:44:35.144Z" }, - { url = "https://files.pythonhosted.org/packages/08/bd/ed5396be499ffcf8807a585bfe38b71a1fbdd1c342b4f9b6d0ef5162a946/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a8f40ea47330e71b594a7e246898f93177c259490c63183dbaf9e571d71ed9a5", size = 4716039, upload-time = "2026-08-25T19:44:37.192Z" }, - { url = "https://files.pythonhosted.org/packages/f6/6e/1cf405c5c8e8df7545378048e954792f00b7f2367af8863ce8b8f3e10607/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:a255449073358275b64b67d3f595f268bbef70e72b6edb65e0c70c735bf739c9", size = 5332388, upload-time = "2026-08-25T19:44:39.16Z" }, - { url = "https://files.pythonhosted.org/packages/47/92/b4317e8c32c4f47b062f5398bd79106b220a124546f42be83bf32b761e2a/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:8df2de9102026855887e4587084f6eabd80ed0f345b8ad8a7ac27ab9bf4723e0", size = 4730293, upload-time = "2026-08-25T19:44:41.298Z" }, - { url = "https://files.pythonhosted.org/packages/39/0d/a1e7633e2c744d0f2983320a27e924ef2264c79c56e1a58d5fb0a1cfd413/cryptography-50.0.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:ac02b07824d4d1001bd4367599f839c19cb171924c796e52c23508ac14c2c0cc", size = 4346031, upload-time = "2026-08-25T19:44:43.245Z" }, - { url = "https://files.pythonhosted.org/packages/88/dd/b215616f9bab3fc18510c78a4e5c9f362d77838503c363dc747c7d4f5c6f/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:cbf74a81765ee67413503ca6e26dcc4f6f5a519822436cc0a1b97aab6c1b8a17", size = 4715344, upload-time = "2026-08-25T19:44:45.291Z" }, - { url = "https://files.pythonhosted.org/packages/b1/1b/ec3ebd31741d0e963612c4fe43caa39341b9b1e031e469820e42e4c83918/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:16c5ecd954b3330ebfb6605eca4fd952da8bef376551d5cc264534e3770a9ee6", size = 5287201, upload-time = "2026-08-25T19:44:47.297Z" }, - { url = "https://files.pythonhosted.org/packages/1a/01/0127d11a762b31a9ee0221894f540318761783f3fdc4bc5d057698caebd5/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:79bf008d1f9af6071c797ad133e39915dfee7614f18f18f4db9072eb715064a3", size = 4730023, upload-time = "2026-08-25T19:44:49.435Z" }, - { url = "https://files.pythonhosted.org/packages/9e/b9/e7425ebfb599241a0c1d7000f1b466c3062da66c19d9525031315dff7213/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:330fbb252391c596f1ae42c5754449dc924e6ad012dca8efe0d703f9f2d12ec6", size = 4847362, upload-time = "2026-08-25T19:44:51.94Z" }, - { url = "https://files.pythonhosted.org/packages/2d/fd/60d0ddf4defa12e482c9d5e0f554384d6e8ab25341fd15f060028fd92e6a/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:42be3bb70596b3abe4ac097b75be223e8b3ab614a0e5de068e3dcc54d71d6149", size = 4999247, upload-time = "2026-08-25T19:44:53.876Z" }, - { url = "https://files.pythonhosted.org/packages/4d/56/bc4f2b209e766c93372cfcd59b781a0b2b59700f62a969580415b699c2b2/cryptography-50.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f74455bb086a85d5e81246412602aaa97ed095e504cd40dd261ef50be42205bf", size = 3825806, upload-time = "2026-08-25T19:44:56.209Z" }, - { url = "https://files.pythonhosted.org/packages/84/a9/ee16a903f13755e914d1eecc482fe64d1f10761c3960e5d8fa6837377aff/cryptography-50.0.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ca83d00d9e69cd5eb63f2e69c3a5a59e0cecae5ae14c6ae0b35830fe3b37bad0", size = 4035307, upload-time = "2026-08-25T19:44:58.305Z" }, - { url = "https://files.pythonhosted.org/packages/5e/a5/9ec7e81e8526c0d7a387d73386b2daed3f39e10d81a85930bd1b6bfba65c/cryptography-50.0.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:05ba322c4da95b262a212c345af888ef2c37c88c0509756ea00a0e6d68850f23", size = 4751900, upload-time = "2026-08-25T19:45:00.401Z" }, - { url = "https://files.pythonhosted.org/packages/7e/3c/0e77bd5ffcf078e9dd27d3074aad6c030d9b10d0bf69329d573c927a188c/cryptography-50.0.1-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e22dfed744bd4002e909464cb23d2f0b05c6f3113a79ef2e9864a53db737c733", size = 4738357, upload-time = "2026-08-25T19:45:02.786Z" }, - { url = "https://files.pythonhosted.org/packages/27/3a/3c5f80daa4dcd47323c7af8a2fcb90de27a33564d4fcac69846c0972691a/cryptography-50.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4c4188f7c0cf655be5c06342b817ed0f9595b69ffa2b12026e5353eed29dea88", size = 4758474, upload-time = "2026-08-25T19:45:04.889Z" }, - { url = "https://files.pythonhosted.org/packages/6e/2b/214cf0cf93db9628c3c20c896b229f327f6fb1b20e4b3743d8ad3f00af8b/cryptography-50.0.1-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2ebbfb0f1fed745e91796e3e1080a1440423fdae8ece1b995a1d80883a409054", size = 5375862, upload-time = "2026-08-25T19:45:07.163Z" }, - { url = "https://files.pythonhosted.org/packages/d6/51/3f9701867a46b6c1740c9b52fc4d3bed6cbdcfedcc9b6e64305c07f39cff/cryptography-50.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:407fe2b6db00939c05c0e945e9914238f2f0a430974839429dafc82b1ee6bee5", size = 4772942, upload-time = "2026-08-25T19:45:09.396Z" }, - { url = "https://files.pythonhosted.org/packages/0d/5c/13ea642e08e2544d0f5396122055f4820cfacb3203562197b5967125ea97/cryptography-50.0.1-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:2b34d76a652ea2b6faf777c35df230c5637842cd904e04f16230c3f9f03e4361", size = 4383347, upload-time = "2026-08-25T19:45:11.659Z" }, - { url = "https://files.pythonhosted.org/packages/84/d5/7d1fe1cb93f91c428093ff234e128c89ba8ea61a6f26aab406081f9b996e/cryptography-50.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:01f41478cf33fc605a6a089cd56d28b45c6c0b45a1928b61797f2621a04bac71", size = 4758050, upload-time = "2026-08-25T19:45:13.745Z" }, - { url = "https://files.pythonhosted.org/packages/dd/04/557fc5ead96a829e0bc812a3b9dc4a52a2f27e4f7f5950da7ff27653a805/cryptography-50.0.1-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:fc3ed7ebd2a8c96f5b166de0ab9b624996bef3b07bbeb19364dfb78222c22c80", size = 5332955, upload-time = "2026-08-25T19:45:16.193Z" }, - { url = "https://files.pythonhosted.org/packages/8c/eb/5d7124083e8d8cda8f5b348f544b71ad6f707ad63193758ef4d8e569da02/cryptography-50.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9dde0a357190eb3b1da1bb9ab750e9c85cba82ca5977aa0836cbb94e92611239", size = 4772694, upload-time = "2026-08-25T19:45:18.315Z" }, - { url = "https://files.pythonhosted.org/packages/63/8e/f1f955e0921dd2b6d22eae7e8d24a4c4b638d10735ffbf6a71f99eb0fcb8/cryptography-50.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd3718b960d0b5dd213cdf03f3bcb7000e69dda0de8b956061947ff6bcff5558", size = 4888413, upload-time = "2026-08-25T19:45:20.4Z" }, - { url = "https://files.pythonhosted.org/packages/1f/ab/89e2b798d2c3925f82e2bb72d5979f3d2f6da2dd22ef4a8cd8b70d920039/cryptography-50.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2a93d05e34d5f67fba6f891fe85d929999baa7195e853923ea6d7576c9e68c5e", size = 5044355, upload-time = "2026-08-25T19:45:22.353Z" }, - { url = "https://files.pythonhosted.org/packages/99/89/87ef49ffe383ef4e147d27b7bf2088fb0b54ea409dd87b5a89442e5828a5/cryptography-50.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:55d16b1ef3ee0958d893a977b19777887e546c9954ea81b200c3301a864013f2", size = 3875429, upload-time = "2026-08-25T19:45:24.418Z" }, -] - -[[package]] -name = "jinja2" -version = "3.1.6" -source = { registry = "https://pypi.org/simple/" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, -] - -[[package]] -name = "markupsafe" -version = "3.0.3" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, - { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, - { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, - { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, - { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, - { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, - { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, - { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, - { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, - { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, - { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, - { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, - { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, - { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, - { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, - { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, - { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, - { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, - { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, - { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, - { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, - { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, - { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, - { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, - { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, - { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, - { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, - { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, - { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, - { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, - { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, - { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, - { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, - { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, - { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, - { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, - { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, - { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, - { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, - { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, - { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, - { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, - { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, - { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, - { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, - { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, - { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, - { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, - { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, - { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, - { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, -] - -[[package]] -name = "mise-pypi-tool-environment" -version = "0.0.0" -source = { virtual = "." } -dependencies = [ - { name = "ansible-core" }, -] - -[package.metadata] -requires-dist = [{ name = "ansible-core", specifier = "==2.21.4" }] - -[[package]] -name = "packaging" -version = "26.3" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, -] - -[[package]] -name = "pycparser" -version = "3.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, -] - -[[package]] -name = "pyyaml" -version = "6.0.3" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, - { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, - { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, - { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, - { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, - { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, - { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, - { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, - { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, - { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, - { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, - { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, - { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, - { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, - { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, - { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, - { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, - { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, - { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, - { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, - { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, - { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, - { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, - { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, - { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, - { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, - { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, - { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, - { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, - { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, - { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, -] - -[[package]] -name = "resolvelib" -version = "1.2.1" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/14/4669927e06631070edb968c78fdb6ce8992e27c9ab2cde4b3993e22ac7af/resolvelib-1.2.1.tar.gz", hash = "sha256:7d08a2022f6e16ce405d60b68c390f054efcfd0477d4b9bd019cc941c28fad1c", size = 24575, upload-time = "2025-10-11T01:07:44.582Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/23/c941a0d0353681ca138489983c4309e0f5095dfd902e1357004f2357ddf2/resolvelib-1.2.1-py3-none-any.whl", hash = "sha256:fb06b66c8da04172d9e72a21d7d06186d8919e32ae5ab5cdf5b9d920be805ac2", size = 18737, upload-time = "2025-10-11T01:07:43.081Z" }, -] diff --git a/.mise/locks/pipx-ansible-lint/26.9.0/pyproject.toml b/.mise/locks/pipx-ansible-lint/26.9.0/pyproject.toml deleted file mode 100644 index d2aa16d..0000000 --- a/.mise/locks/pipx-ansible-lint/26.9.0/pyproject.toml +++ /dev/null @@ -1,5 +0,0 @@ -[project] -name = "mise-pypi-tool-environment" -version = "0.0.0" -requires-python = ">=3.10" -dependencies = ["ansible-lint==26.9.0"] diff --git a/.mise/locks/pipx-ansible-lint/26.9.0/uv.lock b/.mise/locks/pipx-ansible-lint/26.9.0/uv.lock deleted file mode 100644 index 1ccd3d0..0000000 --- a/.mise/locks/pipx-ansible-lint/26.9.0/uv.lock +++ /dev/null @@ -1,1057 +0,0 @@ -version = 1 -revision = 3 -requires-python = ">=3.10" -resolution-markers = [ - "python_full_version >= '3.14'", - "python_full_version >= '3.12' and python_full_version < '3.14'", - "python_full_version == '3.11.*'", - "python_full_version < '3.11'", -] - -[options] -exclude-newer = "2026-09-22T19:26:09.686683Z" - -[[package]] -name = "ansible-compat" -version = "26.9.0" -source = { registry = "https://pypi.org/simple/" } -dependencies = [ - { name = "ansible-core", version = "2.16.19", source = { registry = "https://pypi.org/simple/" }, marker = "python_full_version < '3.11'" }, - { name = "ansible-core", version = "2.19.13", source = { registry = "https://pypi.org/simple/" }, marker = "python_full_version == '3.11.*'" }, - { name = "ansible-core", version = "2.21.4", source = { registry = "https://pypi.org/simple/" }, marker = "python_full_version >= '3.12'" }, - { name = "jsonschema" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "subprocess-tee" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4c/bf/75ac51c0377ffe4863900a1ad4b2726c7cb664dd5da5c33c2c6b4fc3040a/ansible_compat-26.9.0.tar.gz", hash = "sha256:e101649196e4fffc810c3f9f4f185107cc1e5be0ef26d38ad9c4abfa22b0b183", size = 256824, upload-time = "2026-09-22T09:37:17.218Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/ad/19b4698bcf4af5e730e1b002eac0a4174ca4088c5178348783735132d041/ansible_compat-26.9.0-py3-none-any.whl", hash = "sha256:6756ba0adee1a07d609ede35483fc563b9838df25ec70e57378ae8b564f185cf", size = 28980, upload-time = "2026-09-22T09:37:15.86Z" }, -] - -[[package]] -name = "ansible-core" -version = "2.16.19" -source = { registry = "https://pypi.org/simple/" } -resolution-markers = [ - "python_full_version < '3.11'", -] -dependencies = [ - { name = "cryptography" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "resolvelib", version = "1.0.1", source = { registry = "https://pypi.org/simple/" } }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9d/75/b73552520a48c6a7822445f760e23a59612c0d77df481ba1b9ba8ed4e1d9/ansible_core-2.16.19.tar.gz", hash = "sha256:5125f26412039ffb99a3a7723618535ab80e6ef38944aa2453997350388f4ef4", size = 3172397, upload-time = "2026-06-18T19:40:08.358Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3e/0a/fdb88b61521a1f263acf420d27bca357a38a2ac5865364016cedd41c15a5/ansible_core-2.16.19-py3-none-any.whl", hash = "sha256:d7a32ba0f96f9c6582b7ff159a4a6f0e694662cfc4840497c88fed63bf58cd14", size = 2261447, upload-time = "2026-06-18T19:40:06.223Z" }, -] - -[[package]] -name = "ansible-core" -version = "2.19.13" -source = { registry = "https://pypi.org/simple/" } -resolution-markers = [ - "python_full_version == '3.11.*'", -] -dependencies = [ - { name = "cryptography" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "resolvelib", version = "1.2.1", source = { registry = "https://pypi.org/simple/" } }, -] -sdist = { url = "https://files.pythonhosted.org/packages/70/10/fb022a98682af71ec7b21ea24dab3103af1c85ae884ac21c9e3f0a2ded9b/ansible_core-2.19.13.tar.gz", hash = "sha256:3711fc5db7a265f93b34cf3f0db8b9708fb0eec12211a6be32ed6edd6c68044b", size = 3432103, upload-time = "2026-09-08T16:47:54.44Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/ed/ab619a69824b22e6b6262c4ba5819d2745f5d9255561eea7f23f42c91a43/ansible_core-2.19.13-py3-none-any.whl", hash = "sha256:d4a256d0891b3cb31ddbc9ff8a7bf6fd359379007799c54390b66b8f94fed3d3", size = 2426742, upload-time = "2026-09-08T16:47:52.556Z" }, -] - -[[package]] -name = "ansible-core" -version = "2.21.4" -source = { registry = "https://pypi.org/simple/" } -resolution-markers = [ - "python_full_version >= '3.14'", - "python_full_version >= '3.12' and python_full_version < '3.14'", -] -dependencies = [ - { name = "cryptography" }, - { name = "jinja2" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "resolvelib", version = "1.2.1", source = { registry = "https://pypi.org/simple/" } }, -] -sdist = { url = "https://files.pythonhosted.org/packages/df/72/2152230f254bd9c6b892f95d6d291a96fd09b632ce01c6b406eda8c5cd75/ansible_core-2.21.4.tar.gz", hash = "sha256:81a9329f4f12cfa5008dcab5d1bf23ae69b7effc08c0f00048ab2461147ae95a", size = 3394492, upload-time = "2026-09-08T16:51:48.569Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a1/05/d4e28474dd027db4d60fef2422cf6bc80df100ab32e5fa5e7aad898ffd55/ansible_core-2.21.4-py3-none-any.whl", hash = "sha256:ebe74d9c8fadcb41ad2151e031bf1e785e3098aaa015019b4e19a0a96f0dcc4f", size = 2457154, upload-time = "2026-09-08T16:51:47.044Z" }, -] - -[[package]] -name = "ansible-lint" -version = "26.9.0" -source = { registry = "https://pypi.org/simple/" } -dependencies = [ - { name = "ansible-compat" }, - { name = "ansible-core", version = "2.16.19", source = { registry = "https://pypi.org/simple/" }, marker = "python_full_version < '3.11'" }, - { name = "ansible-core", version = "2.19.13", source = { registry = "https://pypi.org/simple/" }, marker = "python_full_version == '3.11.*'" }, - { name = "ansible-core", version = "2.21.4", source = { registry = "https://pypi.org/simple/" }, marker = "python_full_version >= '3.12'" }, - { name = "black" }, - { name = "cffi" }, - { name = "cryptography" }, - { name = "distro" }, - { name = "filelock" }, - { name = "jsonschema" }, - { name = "packaging" }, - { name = "pathspec" }, - { name = "pyyaml" }, - { name = "referencing" }, - { name = "ruamel-yaml" }, - { name = "subprocess-tee" }, - { name = "wcmatch" }, - { name = "yamllint" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/09/b5/841f5ae439a2a039c6045880042d6acd8a8e2fd4e2fb66bc706e321ecb59/ansible_lint-26.9.0.tar.gz", hash = "sha256:cb3265888f30815de0dcf0964d34768b45c98bb4361eea7eb42c0342e81b51b4", size = 826447, upload-time = "2026-09-22T17:05:32.099Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/23/abf992bbe521b4c9cac629d87a5928b35b3a39084ea299df64daed216e55/ansible_lint-26.9.0-py3-none-any.whl", hash = "sha256:4d01903fca9c42f7ce2b366ea5503d0701a27b3c6fdf684276a72888eea57f50", size = 341699, upload-time = "2026-09-22T17:05:30.311Z" }, -] - -[[package]] -name = "attrs" -version = "26.1.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, -] - -[[package]] -name = "black" -version = "26.5.1" -source = { registry = "https://pypi.org/simple/" } -dependencies = [ - { name = "click" }, - { name = "mypy-extensions" }, - { name = "packaging" }, - { name = "pathspec" }, - { name = "platformdirs" }, - { name = "pytokens" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c0/37/5628dd55bf2b34257fc7603f0fe97c40e3aaf24265f416a9c85c95ca1436/black-26.5.1.tar.gz", hash = "sha256:dd321f668053961824bcc1be1cc1df748b2d7e4fa28086b08331e577b0100a73", size = 679439, upload-time = "2026-05-18T16:53:36.107Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/be/84/b3f55026206a9e8820a91503308075ca48eadc515e436731ca01dbe043b3/black-26.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9942db8888e06943c5dde66ca0037dcff82a2a4ec1ad0ada9e0d2ee9d9823893", size = 1987719, upload-time = "2026-05-18T17:05:02.757Z" }, - { url = "https://files.pythonhosted.org/packages/c6/34/7db312c5e5783d6e76cffd9d5ac8972a32badae4c6e3288dac0eed8d3bed/black-26.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:89c93167a74d3a75dfaa38a5c7cca015537d5820dd7f17d63267d674a61cae90", size = 1810083, upload-time = "2026-05-18T17:05:04.302Z" }, - { url = "https://files.pythonhosted.org/packages/33/e2/e0101e73c2c8727634e2efcb35e2b34bd23ad70dfa673789f5773a591b21/black-26.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22f2cd76d069cc54c71f10360744ba8983fbb616903b4304a85b734915c8e1b4", size = 1860633, upload-time = "2026-05-18T17:05:06.391Z" }, - { url = "https://files.pythonhosted.org/packages/b0/4c/e15c0c5b23cf3651035fe5addcce90e283af3548a3f91bb03d81b83106ab/black-26.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:87ed5c6f450580a2f6790bc7cbfb016dfc73bc750249762268a3695361315eef", size = 1477886, upload-time = "2026-05-18T17:05:07.96Z" }, - { url = "https://files.pythonhosted.org/packages/9f/3f/59d43ade98d2ce5c8dc34a4e46cbecd177e6d55d7d4092969c6003ccc655/black-26.5.1-cp310-cp310-win_arm64.whl", hash = "sha256:58b4bd92cf88aacf83d88479c8f9caee044b1ec55f2451a337354a7ea2590a22", size = 1277111, upload-time = "2026-05-18T17:05:09.473Z" }, - { url = "https://files.pythonhosted.org/packages/4b/96/3c3e09f09f44a37aac36b178a279cd19aa7001bd796187a7b162a294c81f/black-26.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:96ae2c733b2aabdd9986e2c5df628ff3473676cd1c5faded1ff496cf6d74083c", size = 1970639, upload-time = "2026-05-18T17:05:11.461Z" }, - { url = "https://files.pythonhosted.org/packages/83/ea/5ad117b9ee3ecd933c712bcbae610006e5b7cc9f41c526cd7ed3b6c4124c/black-26.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0e48b87e03bf109288e55cfceadcfa15ff5470aca2851a851950ed2926f450d7", size = 1792130, upload-time = "2026-05-18T17:05:12.983Z" }, - { url = "https://files.pythonhosted.org/packages/06/3a/7c448bc623fcdfa96672531beb5a616ea5e64f6975955254d7731ffb0ad9/black-26.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5119fa92ae61f786e8c3662fd60aece1d0a2dd5cca5d0c79417a95e7a4272a59", size = 1846134, upload-time = "2026-05-18T17:05:14.506Z" }, - { url = "https://files.pythonhosted.org/packages/a1/5b/0b39b3a5917f0657ac014ad2edb58c139553a478adfe7f817abf1622ff6e/black-26.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:30d3c14661f2792e9142cce3eeeb1cbc175b3eb5f733be0c8eeb99651e52b0c3", size = 1478883, upload-time = "2026-05-18T17:05:16.542Z" }, - { url = "https://files.pythonhosted.org/packages/4c/48/dc222692e0f95030db1bbfb6c857e76858bad09058221ea7aae815255327/black-26.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:1ef92b76f7733f282fd096ea406200b5a286c42947412b0eaff3a74e3616cefe", size = 1277776, upload-time = "2026-05-18T17:05:18.029Z" }, - { url = "https://files.pythonhosted.org/packages/24/99/7744b906703228264ef73bdd534df88ec1ef3de45c4e78f6d31b9e32d0c9/black-26.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4ad6fa01f941920f54f2bbb35f3df7673428a0ef98a0b0840c2eaef3b110efa8", size = 2012518, upload-time = "2026-05-18T17:05:20.108Z" }, - { url = "https://files.pythonhosted.org/packages/b7/c0/c5a3b1636dfd09c42534f2b3cf33506814f6d3e066fb0879ffa16c1ae860/black-26.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3915f256e75a2d7cf88d8953d37f780455dc586cc72dee059c528fe77f581217", size = 1816016, upload-time = "2026-05-18T17:05:21.84Z" }, - { url = "https://files.pythonhosted.org/packages/1f/0e/36044316b65ca471d3bb6d3703fd06fb50c6b727c3562f6a5a3153634f88/black-26.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d98d4137277c75dfb898ec8d846c4fd68ba1e9cf77f95e2865c203dc18f4c3d", size = 1884150, upload-time = "2026-05-18T17:05:23.546Z" }, - { url = "https://files.pythonhosted.org/packages/b3/33/dafc5808c2af43672912111d7c3354af1615f7e2be3bed7a878461abbe4d/black-26.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:a1dca32d9f1784af512a13410ec204c6f7f0aa9797a111c42e1c03449821c264", size = 1486825, upload-time = "2026-05-18T17:05:25.004Z" }, - { url = "https://files.pythonhosted.org/packages/82/14/b965ee6ad2a311f28bdbf692def3ee9848d2ae289dab28b27657fcee3e78/black-26.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:1037d5ac7b7b310b2632ad867ec8d0e4c4819dcdb0b820f63135da746a24e418", size = 1288646, upload-time = "2026-05-18T17:05:26.477Z" }, - { url = "https://files.pythonhosted.org/packages/3f/5c/c384363980e11e25ca6b93205949bb331fbf35f4e0dbec376dfa6326cec8/black-26.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b36cf2ddf5566e205f6535f782a62194a184d33e175b64ae8c40b1737522be3", size = 2009020, upload-time = "2026-05-18T17:05:28.132Z" }, - { url = "https://files.pythonhosted.org/packages/0b/df/9f31c5e0babbfed77d505fc5d120beb98b21b33feaeded3924ea941fe360/black-26.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f7ea64ebfa01b50f693508fc39f875e264446d3b097088f84f203b9d09618a0", size = 1813335, upload-time = "2026-05-18T17:05:31.266Z" }, - { url = "https://files.pythonhosted.org/packages/fb/24/8e7b9a2fa61b0afd82209efe937557d180a1fa055bd7f6161eb9defc3719/black-26.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecb3e624844c798144e9bd986954e0adc81d8911a1f30f375e1252fe26e8c294", size = 1881614, upload-time = "2026-05-18T17:05:32.718Z" }, - { url = "https://files.pythonhosted.org/packages/49/ad/b4e0d9365ba8ac34f6bbab62a4b1b2dd5d618fac3fa1b8db968c844201b5/black-26.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:e1a26503279b6b310669fb0b219c39e4820b77e8189fe80f522bb511f247db0a", size = 1488925, upload-time = "2026-05-18T17:05:34.259Z" }, - { url = "https://files.pythonhosted.org/packages/a1/4b/652b859bf5df88a751c30451b09338f7fd26a77d1271c666992f836b7711/black-26.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c34b25da232ead53a6f335b76dbea124f4d152ad568b9080d6f944bc2b34b52", size = 1289883, upload-time = "2026-05-18T17:05:36.019Z" }, - { url = "https://files.pythonhosted.org/packages/a6/16/a8da8eb208c51c7f4ce74609a45d0dcc6d8a2141e45e81ee5289d1bb0d59/black-26.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e88976690a64b0af98312ca958415849cb42423423c5f2ee74af4b49a97a2168", size = 2004800, upload-time = "2026-05-18T17:05:38.182Z" }, - { url = "https://files.pythonhosted.org/packages/11/8a/a479296a19e383b70a725882a6cf3d786540601ff03cabbaaf1cce864c5a/black-26.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32d5ea7f6c8bdfa6e648326ebca1f02b0764e2a029edc6f8dce2627e19d468c3", size = 1815576, upload-time = "2026-05-18T17:05:40.309Z" }, - { url = "https://files.pythonhosted.org/packages/81/6b/cfaf3d39f25132c156a068f6b805576c9103a84086019507c70e1911ee7d/black-26.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea8d16dc41655aa113cd64665e7219446cd7e4ff2248d7178eaa905190c86b18", size = 1877927, upload-time = "2026-05-18T17:05:42.463Z" }, - { url = "https://files.pythonhosted.org/packages/66/76/302e313964bcff7e28df329d39f84f5270095730d85ff0acc260610a0d82/black-26.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:577f21094ea469ef92ec1adaf2c9441a226d2144d01a5be2fa823cecf6543e50", size = 1511860, upload-time = "2026-05-18T17:05:43.943Z" }, - { url = "https://files.pythonhosted.org/packages/27/4e/a3827e35e0e567f9f9ee59e2a0ab979267dca98718f25547ca8c6733afd4/black-26.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:ed1a20af114c301a0269bf01163d51dbef72737fd65f850001e7cbe7f3c7abae", size = 1316632, upload-time = "2026-05-18T17:05:45.521Z" }, - { url = "https://files.pythonhosted.org/packages/94/51/f975cae76d44274cc2868dc9040ac5d58d464784610234455b4e7b19c6ef/black-26.5.1-py3-none-any.whl", hash = "sha256:4ed7f7da04046d2e488437170797d3b4a4ad83906683bcb7dfc68b673bbce5e2", size = 213693, upload-time = "2026-05-18T16:53:33.964Z" }, -] - -[[package]] -name = "bracex" -version = "3.0.1" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/ac/01/5f394b8bcd6e5b92f73130990960423bbb19711f906bd9fe9ea5557c667c/bracex-3.0.1.tar.gz", hash = "sha256:4e38e32392e4a4780fe15d644bfc7c8514057cfc3861e060b11814ce829c25e4", size = 44019, upload-time = "2026-07-20T13:43:00.335Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/8f/6f7273a7adb8d73fc8d21ede4376a3e475e52f98435c6007f69100dec8ca/bracex-3.0.1-py3-none-any.whl", hash = "sha256:6523ad83aeb5098a4ee597cff0f964442ff74e460bd3fafaffab6a013ff2288c", size = 11940, upload-time = "2026-07-20T13:42:59.268Z" }, -] - -[[package]] -name = "cffi" -version = "2.1.1" -source = { registry = "https://pypi.org/simple/" } -dependencies = [ - { name = "pycparser", marker = "implementation_name != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz", hash = "sha256:dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be", size = 530807, upload-time = "2026-08-03T21:21:18.939Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b6/d2/2cde336b375f55c76ca670f0be3978cc048e31e24f3b4d7ce8473150a388/cffi-2.1.1-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:baed1e86cc735622097354b9d1281406caf42ff42a886d29faa8e8d1630333be", size = 183779, upload-time = "2026-08-03T21:19:15.602Z" }, - { url = "https://files.pythonhosted.org/packages/94/1a/4b2f7c92293ba05cbd4a9a1b28faaf0326272d9488e6354657571c48a7aa/cffi-2.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ca82be1a1d406ecfe1d25dc16cb33488e5a16bf4438c9fb590484ea29d92478b", size = 184178, upload-time = "2026-08-03T21:19:16.67Z" }, - { url = "https://files.pythonhosted.org/packages/17/0b/ba385d8ccedf926c3cd06e8e2f327027da5afe5f0eb30f1f7bc43ac55125/cffi-2.1.1-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:42e2f76b9455f5a9a844f770bf3e200ed3da0e15f5df3db9c31fe80b04b3d004", size = 211037, upload-time = "2026-08-03T21:19:17.705Z" }, - { url = "https://files.pythonhosted.org/packages/a3/b9/0f2e58b2cefa33255bff36935d42b13180fe559bba82596540eb404bde7d/cffi-2.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5a59cc1c4442bc3d5c703bf720b51138d0bfc173618807c9ee2490a7541dd3d9", size = 218652, upload-time = "2026-08-03T21:19:18.735Z" }, - { url = "https://files.pythonhosted.org/packages/37/15/180e0dab27b9312c7479003d14c9e547634b7dcb934e2cc4650e1b131a7a/cffi-2.1.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:9f8d177621de5cb38ee3e731eda45d421db093ec0739f46a5594babda7987a98", size = 205422, upload-time = "2026-08-03T21:19:19.96Z" }, - { url = "https://files.pythonhosted.org/packages/18/d4/03026f0c850cbbaa9030750490225b4a7f4d524ea4df72c3cc740a90f4ef/cffi-2.1.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:75f80557d1389eddbd0de2681f6a390a0c5338c31ddaa821381c203fc3fd50d9", size = 205444, upload-time = "2026-08-03T21:19:21.246Z" }, - { url = "https://files.pythonhosted.org/packages/75/77/60bebf6f818bec84210ac5b6979ce4eeadce6fbbaabc9c7ab23e506d1ce5/cffi-2.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:194cffa889098ced9976c3fc6340305e43f6303657d298da55366907c05c22d6", size = 218742, upload-time = "2026-08-03T21:19:22.523Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ae/679bf47e73fd77b352171727f07de559a003f14de5d02b904a6ec1fa73ca/cffi-2.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5bb4e7ea95dcd6a014a6fef62e62467d67d8e582326443f3d68e71d6320a9fcf", size = 221054, upload-time = "2026-08-03T21:19:23.694Z" }, - { url = "https://files.pythonhosted.org/packages/09/b8/eefc0e06913b70aa153bf74c946094a18f58fd4aff11b7f372bfdfdca050/cffi-2.1.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3d22a20b1fb1632cc72c22f95f7b0d2961c3e1c235f245ba4c606c4771035659", size = 213489, upload-time = "2026-08-03T21:19:24.922Z" }, - { url = "https://files.pythonhosted.org/packages/6f/13/4e56852824a03cdf68523a35686f1c28eacd4bd30a7b0a78e682e6e6e1d3/cffi-2.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1dea0e4d7d4f11f619fe8c1d76caf49e24405b4b5743c0e3be16a500ecd930c9", size = 220241, upload-time = "2026-08-03T21:19:26.214Z" }, - { url = "https://files.pythonhosted.org/packages/99/7f/040f9e163e4acac3ee3d85b02d00b2576e7ca980d8785f0a3a5f1a9bf7f5/cffi-2.1.1-cp310-cp310-win32.whl", hash = "sha256:7ce713ace7c0e4520535b42b77eaa742c16dab813978064913e5a3cf82973b41", size = 174578, upload-time = "2026-08-03T21:19:27.338Z" }, - { url = "https://files.pythonhosted.org/packages/ba/0b/644a2ec1a4eaba49c2939410bb1eb1d25b09d6d0582f5d2f95c537043725/cffi-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:a48d62ab9d6f4f98c983223a547af44be6ca3691074c31cecced6facd3ba2dc1", size = 185082, upload-time = "2026-08-03T21:19:28.409Z" }, - { url = "https://files.pythonhosted.org/packages/70/d2/16d99a0c4948febc0ebd133a13b2f688ff7f8cb04da971e1128872ce0c03/cffi-2.1.1-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:c8d2c9fd1f2d16f780d15127abb050d13d1a76c03a4bd87d7e4980e45e511e12", size = 183838, upload-time = "2026-08-03T21:19:29.637Z" }, - { url = "https://files.pythonhosted.org/packages/cd/95/31b535a9f0220ae9f357de4a08d57ce89cb417653c2fd9f075f50822a388/cffi-2.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:398aff33cee2767e3e781d2554c54bd0dff386bb437581e0d8011fde1a942ec1", size = 184168, upload-time = "2026-08-03T21:19:30.764Z" }, - { url = "https://files.pythonhosted.org/packages/ad/5a/4707a0dc1f203f5dde5a907b0d4e3c25d71120241048bd5bc6f1bb9d4e71/cffi-2.1.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:154852545011f779917b11c78db2358d095da62a9a172b78ad0a583ee5adc0d0", size = 211805, upload-time = "2026-08-03T21:19:31.867Z" }, - { url = "https://files.pythonhosted.org/packages/ad/66/c19feabb28485b6e0bbaaafa90837a1ef5d302e90f2178bd33f17a49879b/cffi-2.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3311ed60d36f83378794e1009ac6258bafbf81f7888b4caa7b35a521e3f95813", size = 218716, upload-time = "2026-08-03T21:19:32.896Z" }, - { url = "https://files.pythonhosted.org/packages/a7/92/500760486c8baab49a7a8a58ba7fc3355ec3974b454b8a09e528efde9e1d/cffi-2.1.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6e192623c49c94421616a5778fba35cf0d5a8d000650c1967ef4448ee5cdd990", size = 205569, upload-time = "2026-08-03T21:19:34.142Z" }, - { url = "https://files.pythonhosted.org/packages/a5/a7/a67c733254d6e7373f7822f8082d8d6beade791e0cf12a7611f376fa61c7/cffi-2.1.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a6e721d4b0e45d5b65e87534470e67b18dcd092c83f68fba09f152b9cbc061af", size = 204907, upload-time = "2026-08-03T21:19:35.174Z" }, - { url = "https://files.pythonhosted.org/packages/f7/a4/4399daaf8f7dfee9d7c3327fdb0426ee041cc63edc358b93911ceb2bfc7a/cffi-2.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:34e261f78cb6ceaaa36f42f2613f4380d94d9c759a9c73c769ee6e0247364632", size = 217807, upload-time = "2026-08-03T21:19:36.286Z" }, - { url = "https://files.pythonhosted.org/packages/28/f7/dabe6da2466ecbd82dc62e7342dc6b1065dad990c06f00f0ede9ebf2a0ed/cffi-2.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7225e4514edb64eb6740324353e0da0711954fd8d7da4576755b1c6e09b697cd", size = 221252, upload-time = "2026-08-03T21:19:37.416Z" }, - { url = "https://files.pythonhosted.org/packages/ce/87/616202d8e51342c07d2534c510111c4cc37201775ce8f60802c9335d1edd/cffi-2.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df913725b79db7bcf03448f36b7bf8815363417d5b58deecf9305e3e30f0f21a", size = 214214, upload-time = "2026-08-03T21:19:38.507Z" }, - { url = "https://files.pythonhosted.org/packages/b4/c6/ab025d75d2c26c19b087c0124e75ee31cb65032f4fe345d356d8c507ab97/cffi-2.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f5cfbc5fe74540d335175b656c725d74d90e3730c626d92575eea35029d9afaa", size = 219408, upload-time = "2026-08-03T21:19:39.809Z" }, - { url = "https://files.pythonhosted.org/packages/db/e2/7e8109f65445bdc673a7b54f02c677de462db75674220fd1335efc8eb598/cffi-2.1.1-cp311-cp311-win32.whl", hash = "sha256:f8ec5e643a9a937f64e1999eb9f75d072263751912dc5cd06d3c85f8f44be7c3", size = 174470, upload-time = "2026-08-03T21:19:41.246Z" }, - { url = "https://files.pythonhosted.org/packages/73/c0/77ba02423c2f7d7091143c45cd49e0e6575c4c1967394bb542bd923a9b74/cffi-2.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:42f6930c31dc7f50732c9ae793c2786c7b6b044195967bbdde40bb9be81c4cc0", size = 185096, upload-time = "2026-08-03T21:19:42.615Z" }, - { url = "https://files.pythonhosted.org/packages/7c/47/9f1f85f9672ceda4984dc6c4f8824e8558992a2972c3d3c81fb8eb28d4ba/cffi-2.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:c7659f22557c5a0bc4855cd635f55edec690cc008a40768527762cb9fb263455", size = 179941, upload-time = "2026-08-03T21:19:43.747Z" }, - { url = "https://files.pythonhosted.org/packages/10/69/43965eccfdead3b9220015fd1320e117be8c6ed01a62ffab76eeb752f5d5/cffi-2.1.1-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:c8c69575568085ba0b1b10c0249d779a214aea6f6522e949a0fc9fb0fcb449d0", size = 184821, upload-time = "2026-08-03T21:19:44.887Z" }, - { url = "https://files.pythonhosted.org/packages/54/7d/16e5a096677b5e313ca80cd5e5170efa3ea44624a82bb111925522da64b1/cffi-2.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f81b3b8f3d4e343550fa4baa0e479bba9f2d29ce9c2e9b51d1ce1718d7442fcf", size = 184719, upload-time = "2026-08-03T21:19:46.129Z" }, - { url = "https://files.pythonhosted.org/packages/56/e6/8941622732edec876dd17d0453dce07317ae96db34f2ec1436c9d3785986/cffi-2.1.1-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:811bd1e21d32de12efca32393a0ab3f5133b54fce9bd44b8bd77ab07da14bf6a", size = 214799, upload-time = "2026-08-03T21:19:47.218Z" }, - { url = "https://files.pythonhosted.org/packages/44/de/f98430906df1545ffde0d543dd124a7a439bc2cd32b36b9c53f805df7333/cffi-2.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:68e62fe11f30d5ca8289242866f0a5291402d8529ca2178ab8afc5c9694ae890", size = 222389, upload-time = "2026-08-03T21:19:48.331Z" }, - { url = "https://files.pythonhosted.org/packages/6a/5b/717f1526b9957b34456313c31645c5b82b8fb5c3fe9e4752999be7128bfc/cffi-2.1.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:4a7c934f7360e8cd64fe9efadcbd10c7c6364f531e432b9a4bf5ccbc9e0e8b50", size = 210249, upload-time = "2026-08-03T21:19:49.543Z" }, - { url = "https://files.pythonhosted.org/packages/64/b3/f8aa4f3e34986c7e4ec45072d1b1b9dd295b6b18007b45518d79726dd725/cffi-2.1.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:3143d81e29e1e20a9ce10901ec369012947876596f75a222235965f2b7ae832e", size = 208775, upload-time = "2026-08-03T21:19:50.918Z" }, - { url = "https://files.pythonhosted.org/packages/b1/db/dceb9dd5b231e1da801793f8acc9f3c52a7e1afe40bb1aae37e02b0faad5/cffi-2.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c1453022f490d2459a11819d83ad1d586e9ff65a12ac3e705ffebd46d3685dcf", size = 221822, upload-time = "2026-08-03T21:19:52.054Z" }, - { url = "https://files.pythonhosted.org/packages/a0/d2/6cd24ae3be000a634109c247d1475d62e5616d0dc78c82770942ec384248/cffi-2.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:208f941bb9d18e768138677f0a6d2ce01f590df56043dda1df1535ac57c88517", size = 225232, upload-time = "2026-08-03T21:19:53.109Z" }, - { url = "https://files.pythonhosted.org/packages/cb/52/3fa190537004dd7f0ab860a6dc7c0175b8667f68d1e618a46f5498d30250/cffi-2.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:210019b6c7cf07f081b4c54635c8cf744377001350e29cc0f81c4377b4797735", size = 223597, upload-time = "2026-08-03T21:19:54.515Z" }, - { url = "https://files.pythonhosted.org/packages/80/fb/0bb75b7039588c074b37ae99f40d9bfddf990ecb2fbc346ebccd2e56b9be/cffi-2.1.1-cp312-cp312-win32.whl", hash = "sha256:046bfc24911b37851ee1b51aab8bffe713d89c68c6a057b09484ce9fd5f69b4e", size = 175292, upload-time = "2026-08-03T21:19:55.566Z" }, - { url = "https://files.pythonhosted.org/packages/d9/79/615cc094e2fb508cade7de88d3b4f6c4ec2bab695c97bce9153dc65aadf5/cffi-2.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f53e442b08449d42821fa4a4fba000095af9f62742a500f978a9f557ec44339a", size = 185919, upload-time = "2026-08-03T21:19:56.89Z" }, - { url = "https://files.pythonhosted.org/packages/70/c6/d0ea84713fe46b243a436a18fcd47d639732747e21635c8a27191b06dc30/cffi-2.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:7bde5e4cc5c10140859842b9d383af292b22639a4dffb725314baf45968cef80", size = 180093, upload-time = "2026-08-03T21:19:58.155Z" }, - { url = "https://files.pythonhosted.org/packages/9d/f4/035513d4117049066b4779dc3b7c0c0fdad175fa13731c9f4003f1cd1478/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:b5bdfd1c873d4e093aabc0ca84c4ca6dbc4f752afb5c86f146d9742580c9da2e", size = 194248, upload-time = "2026-08-03T21:19:59.399Z" }, - { url = "https://files.pythonhosted.org/packages/76/af/2aeb4dbb5fc41a04161ae9ff1518de7cec08e164f44a8ce6a4cf7fd2cd1d/cffi-2.1.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:31348097ff5bbe827ccc41795d4dd099d9f0625e7def00ee653c137a490c2a6c", size = 196908, upload-time = "2026-08-03T21:20:00.746Z" }, - { url = "https://files.pythonhosted.org/packages/a7/46/2e5fdde8555706dd98139a910ca11be02809f3f605ce956f655d0214e100/cffi-2.1.1-cp313-cp313-macosx_10_15_x86_64.whl", hash = "sha256:9d2055050ea716bd38b7f7f1579c275386646b4894c155a3e2f3cd62ed41b7c6", size = 184805, upload-time = "2026-08-03T21:20:02.02Z" }, - { url = "https://files.pythonhosted.org/packages/55/41/4c7042f317b9217502988f0873af87e16ad606dc20f84e546e3e6ce9764c/cffi-2.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:19ee6127ee34de7d83ce3d371ebc5ed91addbdcc39f9ab15ce4eb35a4e534971", size = 184764, upload-time = "2026-08-03T21:20:03.141Z" }, - { url = "https://files.pythonhosted.org/packages/43/1f/1c3d90d91811c8f86ced9ed637956c54bfe5b79ca98fe976d7f8c8979f6b/cffi-2.1.1-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:6a8dddef476fab96d066d578fc88526767b836ab5ab21754e1d5bf3879c31c7c", size = 214722, upload-time = "2026-08-03T21:20:04.377Z" }, - { url = "https://files.pythonhosted.org/packages/37/6f/3b5ce4c3b2192d250f04908f2bfd91ef34552ec8f7716a5d4abdb8d67bb2/cffi-2.1.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f16c709686a78c727bbbf059f92b0bf41c6fc60deec706d2dc19f529175a6125", size = 222369, upload-time = "2026-08-03T21:20:05.544Z" }, - { url = "https://files.pythonhosted.org/packages/02/10/4b3c75dde3d9663c9e02ba05c2668b954f671d4bbe346413ca8c696b295a/cffi-2.1.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:fcd22650c908d7b7da162bbfaab594a1227a15d1643a98c68b122ac642fa2264", size = 210175, upload-time = "2026-08-03T21:20:06.75Z" }, - { url = "https://files.pythonhosted.org/packages/df/62/14f74b9543e605d17701dc797b815958b8bb70b7624ce1b832ddad48ed6c/cffi-2.1.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aa9511c62d14da7aacc9b4bf51f3f697a621e83b2d6919008243c3aad168eea3", size = 208670, upload-time = "2026-08-03T21:20:08.04Z" }, - { url = "https://files.pythonhosted.org/packages/95/95/86342356ff5953b3fb06f7ef7c5bee212d45e770abc7218d451b9148313c/cffi-2.1.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a931079504ecc49efed7744c476a5c343a92fabf66dec2db95edb1b2fdc770e2", size = 221824, upload-time = "2026-08-03T21:20:09.274Z" }, - { url = "https://files.pythonhosted.org/packages/eb/ff/7b3429ff53aafe931ed8a5fc69f481bbef7ba6de87ddcbb63d08f483f613/cffi-2.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a2d7755bef5a12ed488f4ef1f1b69ee9191d7396083b755a5d2295f6edb4768b", size = 225148, upload-time = "2026-08-03T21:20:10.7Z" }, - { url = "https://files.pythonhosted.org/packages/34/34/a95870b9221e09cf4f2ce3178b1a210abdfe63a1bd357da940418d7b8d15/cffi-2.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e0bcb7e0f677f543555d2adff3bf19c05f66cdb4796e5ff602442ab2fe3c4ef7", size = 223564, upload-time = "2026-08-03T21:20:12.165Z" }, - { url = "https://files.pythonhosted.org/packages/70/ea/839b50531021a647fb5e929f72cf97bc1ff702b5472166164b5b6e76b851/cffi-2.1.1-cp313-cp313-win32.whl", hash = "sha256:334644fbac4eff73d985a17a91226df55d0f394160c4cfb880e084c8f7161cac", size = 175263, upload-time = "2026-08-03T21:20:13.559Z" }, - { url = "https://files.pythonhosted.org/packages/60/a6/8b149b2c3f2e11aaa1618ef64500b45f50f22c57a977a4dff1aff1f91042/cffi-2.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:1aa5645c30469b09530c4ebca77ebf8f17618293c58f8549cb1a543a50236e7d", size = 185688, upload-time = "2026-08-03T21:20:14.69Z" }, - { url = "https://files.pythonhosted.org/packages/01/9a/11f687cb39d6a3504060d5242f04f48c735afb4d3d533958a20594890cb2/cffi-2.1.1-cp313-cp313-win_arm64.whl", hash = "sha256:63bbfd5ded17c4840ac07cd8f1c21ba9d9708141f840b324f422f41b207e3973", size = 180078, upload-time = "2026-08-03T21:20:15.917Z" }, - { url = "https://files.pythonhosted.org/packages/d3/7b/d6bbf82b8b96e7391438898c42f5bd96dd02030fd5b64937d248220003e2/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:7dbb61fe3a7699468030f71bbe5f8a0e326a151daa91beb11a6fc1f980c55e1c", size = 194064, upload-time = "2026-08-03T21:20:17.148Z" }, - { url = "https://files.pythonhosted.org/packages/94/e6/bcc91b283be94735e268487a054004f0aa19947b6348fa367db53230abc8/cffi-2.1.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:f24fb43132a4c6b4cb4eb029492919b2db645be6808d738f244fd146c03c32cb", size = 196720, upload-time = "2026-08-03T21:20:18.268Z" }, - { url = "https://files.pythonhosted.org/packages/d9/99/c4b0c17cacdc9c3b8f280026286a9826d6a208c0f047591a3c3ce99b91fd/cffi-2.1.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d28630f5854ab07ab1fd4aba756de52326c82e6be15d414b12793f1975048b54", size = 184964, upload-time = "2026-08-03T21:20:19.708Z" }, - { url = "https://files.pythonhosted.org/packages/b3/a9/9db617d05d7367c1ad0ab00b3aa6e6f9281edd689b4ee9ea0e5a84e89c97/cffi-2.1.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:661c298b4821edebead0c91edd2b00374d67ad7c5a1f7a91d4442633b79d6a72", size = 184962, upload-time = "2026-08-03T21:20:20.833Z" }, - { url = "https://files.pythonhosted.org/packages/67/b8/b42132ca113dc567d37684437b46ca1dafc885902b02a110a02d5b511857/cffi-2.1.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58acb8ab8e295e6c5ea12f888cbb13cf21511ef2a3303a23f4325c29d17fe5c1", size = 222328, upload-time = "2026-08-03T21:20:22.118Z" }, - { url = "https://files.pythonhosted.org/packages/80/10/c5c0cbf0a657aecf59ef511409734230bf556f05a0d6c9eed7aa5c0a0166/cffi-2.1.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:456a61fa52d579ebf9df2e9552ead5129855dbaff6c1e5a9b1bc408809bdc062", size = 209985, upload-time = "2026-08-03T21:20:23.401Z" }, - { url = "https://files.pythonhosted.org/packages/d5/6c/bfa0b87b03b9238148beca990292843c9396ba069b54496596594173de7b/cffi-2.1.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a4f00aa42f75d6e4595e8866e748cc1705adc0cddfeb2ca86d0d03993d63ba03", size = 208530, upload-time = "2026-08-03T21:20:24.628Z" }, - { url = "https://files.pythonhosted.org/packages/e9/02/4e7d553a7ac4b4238b38b3c1b80d486e9d4436f8d2acbf87a0997fe3f402/cffi-2.1.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b0431303acaea1089ad4b3e9ce4e6518193def1118d4073ca848635ee4ea2e96", size = 221525, upload-time = "2026-08-03T21:20:25.758Z" }, - { url = "https://files.pythonhosted.org/packages/82/1d/a4aaf9babd75acb4d5f223bff71533bee748dd770a382619a798960ee9ba/cffi-2.1.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:64faea20f4e2613363a1a9b9c7dd73058f3ecd00133a511e72ad7c511658f527", size = 225053, upload-time = "2026-08-03T21:20:26.985Z" }, - { url = "https://files.pythonhosted.org/packages/81/10/5dc0e7bdd18e22107054288283380fc97a06ae3f1656a106908d666a3c88/cffi-2.1.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5c58fe613dc5e5336357eff555824a314d8e43282600435c8d1cb6a7a2fedd13", size = 223213, upload-time = "2026-08-03T21:20:28.277Z" }, - { url = "https://files.pythonhosted.org/packages/0b/e9/d0061c364cde06ee43168a0d076ac1da512cbc380d44767b844ba34fe2b6/cffi-2.1.1-cp314-cp314-win32.whl", hash = "sha256:1a18a57b58cfb21fc28d72e876acf10eaed67a1ed96226f92af4df681d571c4c", size = 177682, upload-time = "2026-08-03T21:20:44.288Z" }, - { url = "https://files.pythonhosted.org/packages/a7/06/1c3e01e3ba14c39f6d10bfbac52753b7e22259e38088e5cfe1d704918690/cffi-2.1.1-cp314-cp314-win_amd64.whl", hash = "sha256:3222ba5d678f80a030e6afbcc33dc1ae5cb45facabb61cee2c7016b8432fde48", size = 187949, upload-time = "2026-08-03T21:20:45.623Z" }, - { url = "https://files.pythonhosted.org/packages/87/5b/da4e39efe18eeb89cf580ea9cfc66b6a7c3eadb808fc0cc1d3a295cb5a5d/cffi-2.1.1-cp314-cp314-win_arm64.whl", hash = "sha256:ab36d55f9ed2d067327667c2fea18dda018eb628dd6347aa01dda6cf1f5d3836", size = 182947, upload-time = "2026-08-03T21:20:46.955Z" }, - { url = "https://files.pythonhosted.org/packages/23/59/40338bf421c5accea1d45158170c87006ef1cd371b05c077e76476949728/cffi-2.1.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:7750c6449dff7864bb9bb27ddfb0267756189201a3afc911d82b3caacd70dfc3", size = 188504, upload-time = "2026-08-03T21:20:29.495Z" }, - { url = "https://files.pythonhosted.org/packages/7d/47/5ecf1023850036e674c77ec4de86182d309ae344e39e7cba984b7df5d647/cffi-2.1.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0beceaabe56af686895136a2de78db54ecd8e4046b236b8fd6d6cb61389e9bf2", size = 188259, upload-time = "2026-08-03T21:20:31.291Z" }, - { url = "https://files.pythonhosted.org/packages/2a/9c/92934c3bea9f785b23eba304538c0b4d37a2a96d2431eb3a1bc87a11aa19/cffi-2.1.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:49cbc70e6542d4ccccb936558d1064a8012541e78f821f955cff24e357776c94", size = 223864, upload-time = "2026-08-03T21:20:32.571Z" }, - { url = "https://files.pythonhosted.org/packages/4d/45/ba4c93527bc38616a8bd36488acb69a2212d60486794f0c1f318949bbb76/cffi-2.1.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e2d65b31f36619cda3999b78b2aa9632e76b78448e7a56fc4240824200e7c4fc", size = 211538, upload-time = "2026-08-03T21:20:33.808Z" }, - { url = "https://files.pythonhosted.org/packages/80/e9/b6ef565e452acb932fb0cb5443f44a78efbd1233e566f02b5a83855e9115/cffi-2.1.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:28907ab9bfb6aa13184cfc17c6b8e1023c5ab6fd7076d8c20a35e59fe04f8f29", size = 210688, upload-time = "2026-08-03T21:20:34.974Z" }, - { url = "https://files.pythonhosted.org/packages/9a/95/eff5f0cee78d2eabc7eebffec40d3fc1876b5f3c95582e018bb4b99601f2/cffi-2.1.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:51b31d1c98274844cfd7838ce00bfc27c7423a4dc00fc0772fc3331c2cc90676", size = 223803, upload-time = "2026-08-03T21:20:36.564Z" }, - { url = "https://files.pythonhosted.org/packages/fa/01/579d39fb8bef00a335a23d83757b44feb24cd6345a2c451b64cb67b9c362/cffi-2.1.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e7cecbaadb83884793e05828cee59b210b24583b9c7425d0ba6a754fe22eb4e", size = 226763, upload-time = "2026-08-03T21:20:37.816Z" }, - { url = "https://files.pythonhosted.org/packages/8d/b0/0b44f47c60b01b57b6e2bbd92343f13a85a1d93bc46ccf6e47e244acd99c/cffi-2.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:25792eac27877609e7bb06d42ff88278a6624fff2ba9bbb523c09616b117e80f", size = 225688, upload-time = "2026-08-03T21:20:38.959Z" }, - { url = "https://files.pythonhosted.org/packages/eb/d2/3b7176cb570a1d3e27faf67b72f591af508036e0d8b2be2ef9af9e8c84bb/cffi-2.1.1-cp314-cp314t-win32.whl", hash = "sha256:8ef53b2de9bcb9197d31854256575d59dbac0cba72ac627bb291ef5eceb74be4", size = 182868, upload-time = "2026-08-03T21:20:40.388Z" }, - { url = "https://files.pythonhosted.org/packages/56/78/31f00c1bcd97c9bbf55f1bfdf5bc809a5de8887473e90bb9960dca825e80/cffi-2.1.1-cp314-cp314t-win_amd64.whl", hash = "sha256:616f097f2fe415bc92a247f02e11f634e1f9e9a83d327e3c915c15089c87869e", size = 194104, upload-time = "2026-08-03T21:20:41.725Z" }, - { url = "https://files.pythonhosted.org/packages/7b/1b/58496f2ed0a35de575250c02a43ab3cc2c04d494a88fed31c1cabc0fd176/cffi-2.1.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ad2c86c495b899d862ea0f4b42891b8713a3bd45dd4105c7fd51c2a72f39f3a5", size = 186402, upload-time = "2026-08-03T21:20:43.042Z" }, - { url = "https://files.pythonhosted.org/packages/c1/8f/9ebe220eab48a093d1a5a5e339ab0dc7316eef3bb04d63c42f0251b61f50/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphoneos.whl", hash = "sha256:dddad92b554513a31f272570678ba307fb9f618f05e3d4a5eacafff9eae03e1d", size = 194043, upload-time = "2026-08-03T21:20:48.179Z" }, - { url = "https://files.pythonhosted.org/packages/ff/69/844bad3ece306c4782c2ecb93597035b6690d48704b803914c199da1e8b3/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b", size = 196737, upload-time = "2026-08-03T21:20:49.457Z" }, - { url = "https://files.pythonhosted.org/packages/1b/8a/af668013284634733f02d683458a0728739c7d6ddb5e14cb0c20832266fe/cffi-2.1.1-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:fb92203a88b3d3053034db775110081c49d28be6551923805e039924093761e4", size = 184933, upload-time = "2026-08-03T21:20:50.639Z" }, - { url = "https://files.pythonhosted.org/packages/0c/75/2f5207ff6d1a613133b23a5203cc0c2a628313b5eb3974d7956ae3c57950/cffi-2.1.1-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2ae64be792b8966f2c69538199728b290e34726562896df1e5dc8ffd8d8188e8", size = 185002, upload-time = "2026-08-03T21:20:52.173Z" }, - { url = "https://files.pythonhosted.org/packages/e2/31/9e1313b0a6e30e91b3b3d3fff51ae99c857c07738e3afcce1f7334e1b7ab/cffi-2.1.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:507a24c282e0f42f8ed737cf048572cbf580468da5555764a8331735e9c736b6", size = 222271, upload-time = "2026-08-03T21:20:53.462Z" }, - { url = "https://files.pythonhosted.org/packages/50/e3/f6234a833e6e08c7007003074723c406559eecf9b48dfc97471e5a8eb7a0/cffi-2.1.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:246fa40ce8645a614ff682e0b70f37134e460eaf93a775e0cbe3cca585a67a80", size = 209919, upload-time = "2026-08-03T21:20:54.783Z" }, - { url = "https://files.pythonhosted.org/packages/0d/fc/5f74e293fced6edb51af3a46c4ccf6c23c9943774ecb375ddbd522c76add/cffi-2.1.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:471cee653ae88de62096552e6d24ccb4a5adb8c8c9f10b5054d0122c15bf2779", size = 208529, upload-time = "2026-08-03T21:20:56.066Z" }, - { url = "https://files.pythonhosted.org/packages/44/16/29e6d01b388bef055ecd6ca8244b3f4d336bd09e92d5d892187b9601084e/cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399", size = 221630, upload-time = "2026-08-03T21:20:57.336Z" }, - { url = "https://files.pythonhosted.org/packages/a4/18/fa7f1f6857d5eb88a4ca99ffcbfb7c387a287ccc154c64a73e86314745d7/cffi-2.1.1-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:42a494cee34437f05546455144f2b5d9ac09b1face62bcfce597d2e521066688", size = 225134, upload-time = "2026-08-03T21:20:58.675Z" }, - { url = "https://files.pythonhosted.org/packages/e0/9f/e8e3dfa04a1b4c241f8c91faacad872b4d4efd051d49764ad4e2fd4b9fea/cffi-2.1.1-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:cc572dace3f60ef98d7b12ff411d20f5362feb31a0439eab0085bbfd349982d7", size = 223197, upload-time = "2026-08-03T21:20:59.968Z" }, - { url = "https://files.pythonhosted.org/packages/f8/7e/8debeb04f1ab9fe2a6963964cd6f1aaf7192627b83926586a6a4e089c9fa/cffi-2.1.1-cp315-cp315-win32.whl", hash = "sha256:4f42141fc14250de6dde5ee7ea4432be017252d91f19c5ad043c084cea629cac", size = 177683, upload-time = "2026-08-03T21:21:14.901Z" }, - { url = "https://files.pythonhosted.org/packages/e0/31/5158704cc474ab65c1647932e88be78dc0873f47130e253be38bcaf13d01/cffi-2.1.1-cp315-cp315-win_amd64.whl", hash = "sha256:e6e8cff14d6fb0be70a09c0bdc58096f501952d04624ebf867e0e56da2df8960", size = 187897, upload-time = "2026-08-03T21:21:16.108Z" }, - { url = "https://files.pythonhosted.org/packages/cc/4b/b3a2da8570c704ffc0f9762cdc3ec0f02c8573798e0b5cf7f11c82bbb70f/cffi-2.1.1-cp315-cp315-win_arm64.whl", hash = "sha256:27350daa11d4f10c540e6e89dada4c54feb7256ad03e9a4dc075ebad7ba360d1", size = 182935, upload-time = "2026-08-03T21:21:17.271Z" }, - { url = "https://files.pythonhosted.org/packages/d0/ef/5443574510a1207e6f6bc38ba6e1f1de36cb48fef07b2728bb896a21f430/cffi-2.1.1-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:c26608d2222fb1e94487e4a387d85f13eb55d5ed725cb25a0c589ac4ee60e7bc", size = 188464, upload-time = "2026-08-03T21:21:01.163Z" }, - { url = "https://files.pythonhosted.org/packages/7e/ae/a56fa8c4686ad50e148fcbc8d3ae0d03915ff5c30d795058988c24118cef/cffi-2.1.1-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:4be96343e422f2dfcd12ab5c9f5aebe03f82f737c6bffeca6830b3875cb44aab", size = 188262, upload-time = "2026-08-03T21:21:02.382Z" }, - { url = "https://files.pythonhosted.org/packages/53/b2/6187f46f2912276a3ae284076109cc5c8680482f11f766ccf26db4a86427/cffi-2.1.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:937c0052c05a31ca1daf18de3158eed4dbfcb9cc107adbea227728d647be701e", size = 223779, upload-time = "2026-08-03T21:21:03.553Z" }, - { url = "https://files.pythonhosted.org/packages/8a/f6/c3ad28bd19f77047a03084424fbd4cbe997303267c14423737324be0385d/cffi-2.1.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:df423d40ee8654634421812bc3b196da3f9bd7d32929da813f8394c4348a5358", size = 211520, upload-time = "2026-08-03T21:21:04.863Z" }, - { url = "https://files.pythonhosted.org/packages/a0/cd/ccac9013a5bd9fd764de118674ab9c805b5ca10c19270d90ee273f8b2240/cffi-2.1.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:a730a083190634c65cca36ba5f489531576ebd79bcd5c8e172130f6453127231", size = 210673, upload-time = "2026-08-03T21:21:06.223Z" }, - { url = "https://files.pythonhosted.org/packages/52/86/2976131c639aead931c5bee5aba67e4b09fbeb8018b6f282f70803f923a7/cffi-2.1.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:363e05fa78e15116c3c32c210ee36884fd6b9afa6d440e47112c3bd511d64cb6", size = 223835, upload-time = "2026-08-03T21:21:07.539Z" }, - { url = "https://files.pythonhosted.org/packages/ac/0c/33a7aeab2f9c76918c52e084beb39c570db3588133412929e8ec06fab90b/cffi-2.1.1-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:770de9db11e84213beec501cfcaa013b019820ca881e03344dea5844f7876d94", size = 226705, upload-time = "2026-08-03T21:21:08.774Z" }, - { url = "https://files.pythonhosted.org/packages/e3/26/2cde30fdde421130bfc18f70395731a6e6b2053c6a1978a5258ff04e72fa/cffi-2.1.1-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:7da0c5eff80f0197f3b3d1232ec5a682a9325f4ae9016a78f5f5ca35f9ced1f5", size = 225539, upload-time = "2026-08-03T21:21:09.911Z" }, - { url = "https://files.pythonhosted.org/packages/6d/cd/a361394c94b2129d604bb846f624a8e88255a3ee33129c434a00d715e64f/cffi-2.1.1-cp315-cp315t-win32.whl", hash = "sha256:06c72bb76605a4b0cd0aad6930b69d4baf7dd5d806cfc409b824191099700e66", size = 182707, upload-time = "2026-08-03T21:21:11.226Z" }, - { url = "https://files.pythonhosted.org/packages/9b/b5/ba2b299993c26577d529b6ae29841f9e15b9fcf004d65f423f4fcf94ade9/cffi-2.1.1-cp315-cp315t-win_amd64.whl", hash = "sha256:d9c275eaacd24aa73f94ffd6de08fc3f932424d8b6c376f4bed7cde376fe7bc3", size = 193772, upload-time = "2026-08-03T21:21:12.39Z" }, - { url = "https://files.pythonhosted.org/packages/aa/29/35e016098c814cd93de9cd320c66b5bfba14dc6ecedd3cb518fa7c408c69/cffi-2.1.1-cp315-cp315t-win_arm64.whl", hash = "sha256:d18e5ac0f2f03f4f518d3e23db0f0cad7faa1da8620e9c09461d443bbf6e6692", size = 186360, upload-time = "2026-08-03T21:21:13.636Z" }, -] - -[[package]] -name = "click" -version = "8.5.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/0e/7fa0ef50764b67090eca4114772a2abf8b6148198475e54c660b97caeee6/click-8.5.0.tar.gz", hash = "sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34", size = 382235, upload-time = "2026-08-26T13:33:14.56Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl", hash = "sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360", size = 125251, upload-time = "2026-08-26T13:33:12.928Z" }, -] - -[[package]] -name = "cryptography" -version = "50.0.1" -source = { registry = "https://pypi.org/simple/" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/bb/ad/5d6702db60b1e40b41ef513b6967ff5848f307d50f8449baf1634f5908f1/cryptography-50.0.1.tar.gz", hash = "sha256:5dd9bda1c12b4162f6ff568eeb5e0ff956c28d14406e875cfe8a63a2d414ff20", size = 880381, upload-time = "2026-08-25T19:45:45.499Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/19/797e2aaac9df6a66f1550f49979dc1b1e39ecd2077501c30efa81e8d5d67/cryptography-50.0.1-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:b8f852c65863251b9e3a1b8c150ce21e59b522dbb6a7d4bc80e680d38388e986", size = 4010153, upload-time = "2026-08-25T19:44:03.155Z" }, - { url = "https://files.pythonhosted.org/packages/90/34/9ce9a62ed9dc82ca9fd6a34445b6904af56e5f38b3eae2ed32e49c36053d/cryptography-50.0.1-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e279950892dc102c6b4e52af03ae5ea92fac572a1ddab78ca73a997f62b69f", size = 4723133, upload-time = "2026-08-25T19:44:05.461Z" }, - { url = "https://files.pythonhosted.org/packages/57/26/e6d4fc8512a51a5f9ee7bfdbfb853bce1197087df40c9ad993ad370b846f/cryptography-50.0.1-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ff838d62ec1bfce4f9ba7fa16f4a7b554cd8d0c299e6be37502161a660c84eef", size = 4712478, upload-time = "2026-08-25T19:44:07.375Z" }, - { url = "https://files.pythonhosted.org/packages/e6/de/d3cdc2815697aae84126cbd6a030ca7b6b452e28a88b501b836bd3aa7a86/cryptography-50.0.1-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:e74591e283fe6eb956416c929eb58262a719fe0311fd9054c62c3350ed8760d8", size = 4730726, upload-time = "2026-08-25T19:44:09.294Z" }, - { url = "https://files.pythonhosted.org/packages/55/32/38c0d344b98c06d34b5df8946565a9c0d6dbf32c8e0730a7f05f0a3c6cab/cryptography-50.0.1-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5fe002589592ed749ce77fe0695fcbd3500dd61d7d6db5858a7544c612fa8e45", size = 5353524, upload-time = "2026-08-25T19:44:11.96Z" }, - { url = "https://files.pythonhosted.org/packages/e1/1b/82f0f0d8858d4432be1af790477edf62aef90324041aa07c57e57bef1af7/cryptography-50.0.1-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:51593d180cf6d179bde5c5d065bed81386b1f381656ae7d042b7ffc87a9895ad", size = 4746720, upload-time = "2026-08-25T19:44:14.051Z" }, - { url = "https://files.pythonhosted.org/packages/29/ba/042ca458b8c64348c768284b5d23e69b92ed53d057ab779fee628564676d/cryptography-50.0.1-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:359e62deae718bce96170e223fdcb6357e4fbd3bb7a3a75f4430763532560e49", size = 4361866, upload-time = "2026-08-25T19:44:16.167Z" }, - { url = "https://files.pythonhosted.org/packages/39/3b/e96c1ef71edef71057c7e3c3d982ce8fda554e0c52d0cc19c18845cde3eb/cryptography-50.0.1-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e2ca8fd1b6b4b82a1c4cb02841d0837e3c12336c2e24b520ab8ab3b969733d8f", size = 4730028, upload-time = "2026-08-25T19:44:18.085Z" }, - { url = "https://files.pythonhosted.org/packages/e3/38/45abd72ef63f2e7d0754a6cacf97bd8b69512ace7f6130d24c39ece65da2/cryptography-50.0.1-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:76de83fbd91ac49c0feaaa983d0748fd7a53176afac5fb3bf7478d244f0eb527", size = 5308405, upload-time = "2026-08-25T19:44:20.197Z" }, - { url = "https://files.pythonhosted.org/packages/85/66/6ccca4722987ddedaa7fc9c3f4708af7431f5535666c174350830888c6b7/cryptography-50.0.1-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:51afcfceb15597cf2635068e4ac9a56b2abde622edde17f37d85fd7b5306497a", size = 4746230, upload-time = "2026-08-25T19:44:22.376Z" }, - { url = "https://files.pythonhosted.org/packages/13/0e/b1f92e013228111413f2e6743948b80bc24dfd3c1b87ba98ceea16f5df89/cryptography-50.0.1-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:be224a65493ec5b74a158ff22a5522ce4a5ca1e543c647a3a4730d4a09e5f959", size = 4862596, upload-time = "2026-08-25T19:44:24.472Z" }, - { url = "https://files.pythonhosted.org/packages/7e/22/c3654cccc856e9d682817b04ac3ee79731cb09ca6f95996a95c904de2883/cryptography-50.0.1-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9ebcdd5519be9b652a46f507817a74591774fc3d6923ac364e4dfa64e36b291b", size = 5014082, upload-time = "2026-08-25T19:44:26.709Z" }, - { url = "https://files.pythonhosted.org/packages/42/8b/cb12b1b60c91b074ca6bf0fdd59aa8f10d8bc5f73af8faece86ef0421b37/cryptography-50.0.1-cp311-abi3-win_amd64.whl", hash = "sha256:aed8db4f6d71c51efb89530e12d9464e7bf2923d46c3205dc794a2a93f8c0648", size = 3842826, upload-time = "2026-08-25T19:44:28.784Z" }, - { url = "https://files.pythonhosted.org/packages/5b/f0/424cb557d99aa86ac55da5e2add02e2882e44047b6264f93ade1b975a993/cryptography-50.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:30a125032e5642a21ff816e021152bd4e7e94f03eff3f4b7fca41cd22bc3110f", size = 3973525, upload-time = "2026-08-25T19:44:30.7Z" }, - { url = "https://files.pythonhosted.org/packages/4d/72/3a2711d967977ab5fc80b782837c7e8d1ac7445e764c20c381a265c57ef3/cryptography-50.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a0b1a59e3a089064a0ec309e9428c8e3ae4e161419d20ac33600767e83fc658a", size = 4708817, upload-time = "2026-08-25T19:44:32.773Z" }, - { url = "https://files.pythonhosted.org/packages/b4/f2/bb1f56e10815b789df0b409a69fa4992ff3d3fef9c72747f4a6b26fed38e/cryptography-50.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8921d58f426793c5f1b47f0b59575780de9a095214958d0eb37d909593db8367", size = 4697300, upload-time = "2026-08-25T19:44:35.144Z" }, - { url = "https://files.pythonhosted.org/packages/08/bd/ed5396be499ffcf8807a585bfe38b71a1fbdd1c342b4f9b6d0ef5162a946/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a8f40ea47330e71b594a7e246898f93177c259490c63183dbaf9e571d71ed9a5", size = 4716039, upload-time = "2026-08-25T19:44:37.192Z" }, - { url = "https://files.pythonhosted.org/packages/f6/6e/1cf405c5c8e8df7545378048e954792f00b7f2367af8863ce8b8f3e10607/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:a255449073358275b64b67d3f595f268bbef70e72b6edb65e0c70c735bf739c9", size = 5332388, upload-time = "2026-08-25T19:44:39.16Z" }, - { url = "https://files.pythonhosted.org/packages/47/92/b4317e8c32c4f47b062f5398bd79106b220a124546f42be83bf32b761e2a/cryptography-50.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:8df2de9102026855887e4587084f6eabd80ed0f345b8ad8a7ac27ab9bf4723e0", size = 4730293, upload-time = "2026-08-25T19:44:41.298Z" }, - { url = "https://files.pythonhosted.org/packages/39/0d/a1e7633e2c744d0f2983320a27e924ef2264c79c56e1a58d5fb0a1cfd413/cryptography-50.0.1-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:ac02b07824d4d1001bd4367599f839c19cb171924c796e52c23508ac14c2c0cc", size = 4346031, upload-time = "2026-08-25T19:44:43.245Z" }, - { url = "https://files.pythonhosted.org/packages/88/dd/b215616f9bab3fc18510c78a4e5c9f362d77838503c363dc747c7d4f5c6f/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:cbf74a81765ee67413503ca6e26dcc4f6f5a519822436cc0a1b97aab6c1b8a17", size = 4715344, upload-time = "2026-08-25T19:44:45.291Z" }, - { url = "https://files.pythonhosted.org/packages/b1/1b/ec3ebd31741d0e963612c4fe43caa39341b9b1e031e469820e42e4c83918/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:16c5ecd954b3330ebfb6605eca4fd952da8bef376551d5cc264534e3770a9ee6", size = 5287201, upload-time = "2026-08-25T19:44:47.297Z" }, - { url = "https://files.pythonhosted.org/packages/1a/01/0127d11a762b31a9ee0221894f540318761783f3fdc4bc5d057698caebd5/cryptography-50.0.1-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:79bf008d1f9af6071c797ad133e39915dfee7614f18f18f4db9072eb715064a3", size = 4730023, upload-time = "2026-08-25T19:44:49.435Z" }, - { url = "https://files.pythonhosted.org/packages/9e/b9/e7425ebfb599241a0c1d7000f1b466c3062da66c19d9525031315dff7213/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:330fbb252391c596f1ae42c5754449dc924e6ad012dca8efe0d703f9f2d12ec6", size = 4847362, upload-time = "2026-08-25T19:44:51.94Z" }, - { url = "https://files.pythonhosted.org/packages/2d/fd/60d0ddf4defa12e482c9d5e0f554384d6e8ab25341fd15f060028fd92e6a/cryptography-50.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:42be3bb70596b3abe4ac097b75be223e8b3ab614a0e5de068e3dcc54d71d6149", size = 4999247, upload-time = "2026-08-25T19:44:53.876Z" }, - { url = "https://files.pythonhosted.org/packages/4d/56/bc4f2b209e766c93372cfcd59b781a0b2b59700f62a969580415b699c2b2/cryptography-50.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:f74455bb086a85d5e81246412602aaa97ed095e504cd40dd261ef50be42205bf", size = 3825806, upload-time = "2026-08-25T19:44:56.209Z" }, - { url = "https://files.pythonhosted.org/packages/84/a9/ee16a903f13755e914d1eecc482fe64d1f10761c3960e5d8fa6837377aff/cryptography-50.0.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ca83d00d9e69cd5eb63f2e69c3a5a59e0cecae5ae14c6ae0b35830fe3b37bad0", size = 4035307, upload-time = "2026-08-25T19:44:58.305Z" }, - { url = "https://files.pythonhosted.org/packages/5e/a5/9ec7e81e8526c0d7a387d73386b2daed3f39e10d81a85930bd1b6bfba65c/cryptography-50.0.1-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:05ba322c4da95b262a212c345af888ef2c37c88c0509756ea00a0e6d68850f23", size = 4751900, upload-time = "2026-08-25T19:45:00.401Z" }, - { url = "https://files.pythonhosted.org/packages/7e/3c/0e77bd5ffcf078e9dd27d3074aad6c030d9b10d0bf69329d573c927a188c/cryptography-50.0.1-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e22dfed744bd4002e909464cb23d2f0b05c6f3113a79ef2e9864a53db737c733", size = 4738357, upload-time = "2026-08-25T19:45:02.786Z" }, - { url = "https://files.pythonhosted.org/packages/27/3a/3c5f80daa4dcd47323c7af8a2fcb90de27a33564d4fcac69846c0972691a/cryptography-50.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:4c4188f7c0cf655be5c06342b817ed0f9595b69ffa2b12026e5353eed29dea88", size = 4758474, upload-time = "2026-08-25T19:45:04.889Z" }, - { url = "https://files.pythonhosted.org/packages/6e/2b/214cf0cf93db9628c3c20c896b229f327f6fb1b20e4b3743d8ad3f00af8b/cryptography-50.0.1-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2ebbfb0f1fed745e91796e3e1080a1440423fdae8ece1b995a1d80883a409054", size = 5375862, upload-time = "2026-08-25T19:45:07.163Z" }, - { url = "https://files.pythonhosted.org/packages/d6/51/3f9701867a46b6c1740c9b52fc4d3bed6cbdcfedcc9b6e64305c07f39cff/cryptography-50.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:407fe2b6db00939c05c0e945e9914238f2f0a430974839429dafc82b1ee6bee5", size = 4772942, upload-time = "2026-08-25T19:45:09.396Z" }, - { url = "https://files.pythonhosted.org/packages/0d/5c/13ea642e08e2544d0f5396122055f4820cfacb3203562197b5967125ea97/cryptography-50.0.1-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:2b34d76a652ea2b6faf777c35df230c5637842cd904e04f16230c3f9f03e4361", size = 4383347, upload-time = "2026-08-25T19:45:11.659Z" }, - { url = "https://files.pythonhosted.org/packages/84/d5/7d1fe1cb93f91c428093ff234e128c89ba8ea61a6f26aab406081f9b996e/cryptography-50.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:01f41478cf33fc605a6a089cd56d28b45c6c0b45a1928b61797f2621a04bac71", size = 4758050, upload-time = "2026-08-25T19:45:13.745Z" }, - { url = "https://files.pythonhosted.org/packages/dd/04/557fc5ead96a829e0bc812a3b9dc4a52a2f27e4f7f5950da7ff27653a805/cryptography-50.0.1-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:fc3ed7ebd2a8c96f5b166de0ab9b624996bef3b07bbeb19364dfb78222c22c80", size = 5332955, upload-time = "2026-08-25T19:45:16.193Z" }, - { url = "https://files.pythonhosted.org/packages/8c/eb/5d7124083e8d8cda8f5b348f544b71ad6f707ad63193758ef4d8e569da02/cryptography-50.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:9dde0a357190eb3b1da1bb9ab750e9c85cba82ca5977aa0836cbb94e92611239", size = 4772694, upload-time = "2026-08-25T19:45:18.315Z" }, - { url = "https://files.pythonhosted.org/packages/63/8e/f1f955e0921dd2b6d22eae7e8d24a4c4b638d10735ffbf6a71f99eb0fcb8/cryptography-50.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd3718b960d0b5dd213cdf03f3bcb7000e69dda0de8b956061947ff6bcff5558", size = 4888413, upload-time = "2026-08-25T19:45:20.4Z" }, - { url = "https://files.pythonhosted.org/packages/1f/ab/89e2b798d2c3925f82e2bb72d5979f3d2f6da2dd22ef4a8cd8b70d920039/cryptography-50.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2a93d05e34d5f67fba6f891fe85d929999baa7195e853923ea6d7576c9e68c5e", size = 5044355, upload-time = "2026-08-25T19:45:22.353Z" }, - { url = "https://files.pythonhosted.org/packages/99/89/87ef49ffe383ef4e147d27b7bf2088fb0b54ea409dd87b5a89442e5828a5/cryptography-50.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:55d16b1ef3ee0958d893a977b19777887e546c9954ea81b200c3301a864013f2", size = 3875429, upload-time = "2026-08-25T19:45:24.418Z" }, - { url = "https://files.pythonhosted.org/packages/c7/27/8d207af749c453ee17ea087340b3f2b4adef75aadd1d277b1b129bdda84e/cryptography-50.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9cb3cb952cf5a8abd50c782a98a89d71699715e802fe349704b47f2425b42a94", size = 3974350, upload-time = "2026-08-25T19:45:26.551Z" }, - { url = "https://files.pythonhosted.org/packages/14/9a/6d3a4d7852e22d657438b7bf51f66102c7d71c0e1fafeec652281d0403e5/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5fe939deeb161024a6be98229c953b6591fef1f41214497a78fe793a244c017f", size = 4698675, upload-time = "2026-08-25T19:45:28.658Z" }, - { url = "https://files.pythonhosted.org/packages/73/35/5c3717edf9e68a0550ce04e28eab493fe545eccd81742af03f6a75fe260b/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fb4b9672d389c738b175c4166e78310f8a70358886aacd9173ee03a85ffdc671", size = 4707410, upload-time = "2026-08-25T19:45:30.816Z" }, - { url = "https://files.pythonhosted.org/packages/1d/e0/e786934472e3ac4ecdecc7b129a0ca1a2a40dffdafcf2c3ea9d4397f8def/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d63ae8f6481fec907ac0f588eee8a90aefde112c633131fe540e5711ddbb5a4e", size = 4698378, upload-time = "2026-08-25T19:45:33.043Z" }, - { url = "https://files.pythonhosted.org/packages/51/cf/5b3f53a0b74d122f023476ede40ba5d3e70d5cf475f73b899740d26a4fb2/cryptography-50.0.1-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:804728ce710890870f3aaa344b2e161172d258d768ac139d02cfd9092d0d94e6", size = 4706889, upload-time = "2026-08-25T19:45:35.086Z" }, - { url = "https://files.pythonhosted.org/packages/71/44/711e61f7d014be825ef79b285b047292d1bf893732ac1bc030a351fb517f/cryptography-50.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:693c99b49bd37d0d096e4334c10232c77248c415b98d35236094cdf96d57258b", size = 3824006, upload-time = "2026-08-25T19:45:37.281Z" }, -] - -[[package]] -name = "distro" -version = "1.9.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, -] - -[[package]] -name = "filelock" -version = "4.0.1" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/38/88cd6eda96c40594a1e3da7d8b40f04bc40ace5a6aef9ac5cb407540f173/filelock-4.0.1.tar.gz", hash = "sha256:fdefc3f3e87716d855ae2b732c1cfd521dd99799ef2b4d00e8c0d4dcdc7cc94b", size = 238888, upload-time = "2026-09-19T01:08:15.958Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/29/33/af0635ab07fe83b1788a1dbe370ff3e226062495a998335cb18a1cac81aa/filelock-4.0.1-py3-none-any.whl", hash = "sha256:481a321a27bef441e23c53371c6abc8d7d16e26b97090074ba44f7538a3fd55a", size = 106219, upload-time = "2026-09-19T01:08:14.49Z" }, -] - -[[package]] -name = "jinja2" -version = "3.1.6" -source = { registry = "https://pypi.org/simple/" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, -] - -[[package]] -name = "jsonschema" -version = "4.26.0" -source = { registry = "https://pypi.org/simple/" } -dependencies = [ - { name = "attrs" }, - { name = "jsonschema-specifications" }, - { name = "referencing" }, - { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple/" }, marker = "python_full_version < '3.11'" }, - { name = "rpds-py", version = "2026.6.3", source = { registry = "https://pypi.org/simple/" }, marker = "python_full_version >= '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, -] - -[[package]] -name = "jsonschema-specifications" -version = "2025.9.1" -source = { registry = "https://pypi.org/simple/" } -dependencies = [ - { name = "referencing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, -] - -[[package]] -name = "markupsafe" -version = "3.0.3" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, - { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, - { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, - { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, - { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, - { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, - { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, - { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, - { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, - { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, - { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, - { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, - { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, - { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, - { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, - { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, - { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, - { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, - { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, - { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, - { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, - { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, - { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, - { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, - { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, - { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, - { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, - { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, - { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, - { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, - { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, - { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, - { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, - { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, - { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, - { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, - { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, - { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, - { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, - { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, - { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, - { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, - { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, - { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, - { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, - { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, - { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, - { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, - { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, - { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, - { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, - { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, - { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, - { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, - { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, - { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, - { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, - { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, - { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, - { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, - { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, - { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, - { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, - { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, - { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, - { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, - { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, - { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, - { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, - { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, -] - -[[package]] -name = "mise-pypi-tool-environment" -version = "0.0.0" -source = { virtual = "." } -dependencies = [ - { name = "ansible-lint" }, -] - -[package.metadata] -requires-dist = [{ name = "ansible-lint", specifier = "==26.9.0" }] - -[[package]] -name = "mypy-extensions" -version = "1.1.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, -] - -[[package]] -name = "packaging" -version = "26.3" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" }, -] - -[[package]] -name = "pathspec" -version = "1.1.1" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, -] - -[[package]] -name = "platformdirs" -version = "4.11.12" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/ea/dd/65804b0c2925a1c821a05502ea57517b69a073ff400d25ab9faa3a2cf012/platformdirs-4.11.12.tar.gz", hash = "sha256:e8dc1cb58f1153fd7f61db1374317770baababec2480b37b8f01c6cc25b45267", size = 40016, upload-time = "2026-09-22T01:02:36.973Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/2b/69de6317fbf48865bb12aa56c9cfcfff46b3add0cd45250725d96146dce0/platformdirs-4.11.12-py3-none-any.whl", hash = "sha256:b1ba966ac76153d9985a0787ffab951e7c18416189873d4e4ddb2c8a04a0a254", size = 24976, upload-time = "2026-09-22T01:02:35.742Z" }, -] - -[[package]] -name = "pycparser" -version = "3.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, -] - -[[package]] -name = "pytokens" -version = "0.4.1" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", size = 23015, upload-time = "2026-01-30T01:03:45.924Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/24/f206113e05cb8ef51b3850e7ef88f20da6f4bf932190ceb48bd3da103e10/pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5", size = 161522, upload-time = "2026-01-30T01:02:50.393Z" }, - { url = "https://files.pythonhosted.org/packages/d4/e9/06a6bf1b90c2ed81a9c7d2544232fe5d2891d1cd480e8a1809ca354a8eb2/pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe", size = 246945, upload-time = "2026-01-30T01:02:52.399Z" }, - { url = "https://files.pythonhosted.org/packages/69/66/f6fb1007a4c3d8b682d5d65b7c1fb33257587a5f782647091e3408abe0b8/pytokens-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c", size = 259525, upload-time = "2026-01-30T01:02:53.737Z" }, - { url = "https://files.pythonhosted.org/packages/04/92/086f89b4d622a18418bac74ab5db7f68cf0c21cf7cc92de6c7b919d76c88/pytokens-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7", size = 262693, upload-time = "2026-01-30T01:02:54.871Z" }, - { url = "https://files.pythonhosted.org/packages/b4/7b/8b31c347cf94a3f900bdde750b2e9131575a61fdb620d3d3c75832262137/pytokens-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2", size = 103567, upload-time = "2026-01-30T01:02:56.414Z" }, - { url = "https://files.pythonhosted.org/packages/3d/92/790ebe03f07b57e53b10884c329b9a1a308648fc083a6d4a39a10a28c8fc/pytokens-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440", size = 160864, upload-time = "2026-01-30T01:02:57.882Z" }, - { url = "https://files.pythonhosted.org/packages/13/25/a4f555281d975bfdd1eba731450e2fe3a95870274da73fb12c40aeae7625/pytokens-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc", size = 248565, upload-time = "2026-01-30T01:02:59.912Z" }, - { url = "https://files.pythonhosted.org/packages/17/50/bc0394b4ad5b1601be22fa43652173d47e4c9efbf0044c62e9a59b747c56/pytokens-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d", size = 260824, upload-time = "2026-01-30T01:03:01.471Z" }, - { url = "https://files.pythonhosted.org/packages/4e/54/3e04f9d92a4be4fc6c80016bc396b923d2a6933ae94b5f557c939c460ee0/pytokens-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16", size = 264075, upload-time = "2026-01-30T01:03:04.143Z" }, - { url = "https://files.pythonhosted.org/packages/d1/1b/44b0326cb5470a4375f37988aea5d61b5cc52407143303015ebee94abfd6/pytokens-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6", size = 103323, upload-time = "2026-01-30T01:03:05.412Z" }, - { url = "https://files.pythonhosted.org/packages/41/5d/e44573011401fb82e9d51e97f1290ceb377800fb4eed650b96f4753b499c/pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083", size = 160663, upload-time = "2026-01-30T01:03:06.473Z" }, - { url = "https://files.pythonhosted.org/packages/f0/e6/5bbc3019f8e6f21d09c41f8b8654536117e5e211a85d89212d59cbdab381/pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1", size = 255626, upload-time = "2026-01-30T01:03:08.177Z" }, - { url = "https://files.pythonhosted.org/packages/bf/3c/2d5297d82286f6f3d92770289fd439956b201c0a4fc7e72efb9b2293758e/pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1", size = 269779, upload-time = "2026-01-30T01:03:09.756Z" }, - { url = "https://files.pythonhosted.org/packages/20/01/7436e9ad693cebda0551203e0bf28f7669976c60ad07d6402098208476de/pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9", size = 268076, upload-time = "2026-01-30T01:03:10.957Z" }, - { url = "https://files.pythonhosted.org/packages/2e/df/533c82a3c752ba13ae7ef238b7f8cdd272cf1475f03c63ac6cf3fcfb00b6/pytokens-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68", size = 103552, upload-time = "2026-01-30T01:03:12.066Z" }, - { url = "https://files.pythonhosted.org/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", size = 160720, upload-time = "2026-01-30T01:03:13.843Z" }, - { url = "https://files.pythonhosted.org/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", size = 254204, upload-time = "2026-01-30T01:03:14.886Z" }, - { url = "https://files.pythonhosted.org/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", size = 268423, upload-time = "2026-01-30T01:03:15.936Z" }, - { url = "https://files.pythonhosted.org/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", size = 266859, upload-time = "2026-01-30T01:03:17.458Z" }, - { url = "https://files.pythonhosted.org/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", size = 103520, upload-time = "2026-01-30T01:03:18.652Z" }, - { url = "https://files.pythonhosted.org/packages/8f/a7/b470f672e6fc5fee0a01d9e75005a0e617e162381974213a945fcd274843/pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321", size = 160821, upload-time = "2026-01-30T01:03:19.684Z" }, - { url = "https://files.pythonhosted.org/packages/80/98/e83a36fe8d170c911f864bfded690d2542bfcfacb9c649d11a9e6eb9dc41/pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa", size = 254263, upload-time = "2026-01-30T01:03:20.834Z" }, - { url = "https://files.pythonhosted.org/packages/0f/95/70d7041273890f9f97a24234c00b746e8da86df462620194cef1d411ddeb/pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d", size = 268071, upload-time = "2026-01-30T01:03:21.888Z" }, - { url = "https://files.pythonhosted.org/packages/da/79/76e6d09ae19c99404656d7db9c35dfd20f2086f3eb6ecb496b5b31163bad/pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324", size = 271716, upload-time = "2026-01-30T01:03:23.633Z" }, - { url = "https://files.pythonhosted.org/packages/79/37/482e55fa1602e0a7ff012661d8c946bafdc05e480ea5a32f4f7e336d4aa9/pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9", size = 104539, upload-time = "2026-01-30T01:03:24.788Z" }, - { url = "https://files.pythonhosted.org/packages/30/e8/20e7db907c23f3d63b0be3b8a4fd1927f6da2395f5bcc7f72242bb963dfe/pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb", size = 168474, upload-time = "2026-01-30T01:03:26.428Z" }, - { url = "https://files.pythonhosted.org/packages/d6/81/88a95ee9fafdd8f5f3452107748fd04c24930d500b9aba9738f3ade642cc/pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3", size = 290473, upload-time = "2026-01-30T01:03:27.415Z" }, - { url = "https://files.pythonhosted.org/packages/cf/35/3aa899645e29b6375b4aed9f8d21df219e7c958c4c186b465e42ee0a06bf/pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975", size = 303485, upload-time = "2026-01-30T01:03:28.558Z" }, - { url = "https://files.pythonhosted.org/packages/52/a0/07907b6ff512674d9b201859f7d212298c44933633c946703a20c25e9d81/pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a", size = 306698, upload-time = "2026-01-30T01:03:29.653Z" }, - { url = "https://files.pythonhosted.org/packages/39/2a/cbbf9250020a4a8dd53ba83a46c097b69e5eb49dd14e708f496f548c6612/pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918", size = 116287, upload-time = "2026-01-30T01:03:30.912Z" }, - { url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", size = 13729, upload-time = "2026-01-30T01:03:45.029Z" }, -] - -[[package]] -name = "pyyaml" -version = "6.0.3" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, - { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, - { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, - { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, - { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, - { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, - { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, - { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, - { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, - { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, - { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, - { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, - { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, - { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, - { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, - { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, - { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, - { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, - { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, - { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, - { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, - { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, - { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, - { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, - { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, - { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, - { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, - { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, - { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, - { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, - { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, - { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, - { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, - { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, - { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, - { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, - { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, - { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, - { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, - { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, - { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, - { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, - { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, - { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, - { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, - { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, - { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, -] - -[[package]] -name = "referencing" -version = "0.37.0" -source = { registry = "https://pypi.org/simple/" } -dependencies = [ - { name = "attrs" }, - { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple/" }, marker = "python_full_version < '3.11'" }, - { name = "rpds-py", version = "2026.6.3", source = { registry = "https://pypi.org/simple/" }, marker = "python_full_version >= '3.11'" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, -] - -[[package]] -name = "resolvelib" -version = "1.0.1" -source = { registry = "https://pypi.org/simple/" } -resolution-markers = [ - "python_full_version < '3.11'", -] -sdist = { url = "https://files.pythonhosted.org/packages/ce/10/f699366ce577423cbc3df3280063099054c23df70856465080798c6ebad6/resolvelib-1.0.1.tar.gz", hash = "sha256:04ce76cbd63fded2078ce224785da6ecd42b9564b1390793f64ddecbe997b309", size = 21065, upload-time = "2023-03-09T05:10:38.292Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/fc/e9ccf0521607bcd244aa0b3fbd574f71b65e9ce6a112c83af988bbbe2e23/resolvelib-1.0.1-py2.py3-none-any.whl", hash = "sha256:d2da45d1a8dfee81bdd591647783e340ef3bcb104b54c383f70d422ef5cc7dbf", size = 17194, upload-time = "2023-03-09T05:10:36.214Z" }, -] - -[[package]] -name = "resolvelib" -version = "1.2.1" -source = { registry = "https://pypi.org/simple/" } -resolution-markers = [ - "python_full_version >= '3.14'", - "python_full_version >= '3.12' and python_full_version < '3.14'", - "python_full_version == '3.11.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/1d/14/4669927e06631070edb968c78fdb6ce8992e27c9ab2cde4b3993e22ac7af/resolvelib-1.2.1.tar.gz", hash = "sha256:7d08a2022f6e16ce405d60b68c390f054efcfd0477d4b9bd019cc941c28fad1c", size = 24575, upload-time = "2025-10-11T01:07:44.582Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/23/c941a0d0353681ca138489983c4309e0f5095dfd902e1357004f2357ddf2/resolvelib-1.2.1-py3-none-any.whl", hash = "sha256:fb06b66c8da04172d9e72a21d7d06186d8919e32ae5ab5cdf5b9d920be805ac2", size = 18737, upload-time = "2025-10-11T01:07:43.081Z" }, -] - -[[package]] -name = "rpds-py" -version = "0.30.0" -source = { registry = "https://pypi.org/simple/" } -resolution-markers = [ - "python_full_version < '3.11'", -] -sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", size = 370490, upload-time = "2025-11-30T20:21:33.256Z" }, - { url = "https://files.pythonhosted.org/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", size = 359751, upload-time = "2025-11-30T20:21:34.591Z" }, - { url = "https://files.pythonhosted.org/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", size = 389696, upload-time = "2025-11-30T20:21:36.122Z" }, - { url = "https://files.pythonhosted.org/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", size = 403136, upload-time = "2025-11-30T20:21:37.728Z" }, - { url = "https://files.pythonhosted.org/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", size = 524699, upload-time = "2025-11-30T20:21:38.92Z" }, - { url = "https://files.pythonhosted.org/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", size = 412022, upload-time = "2025-11-30T20:21:40.407Z" }, - { url = "https://files.pythonhosted.org/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", size = 390522, upload-time = "2025-11-30T20:21:42.17Z" }, - { url = "https://files.pythonhosted.org/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", size = 404579, upload-time = "2025-11-30T20:21:43.769Z" }, - { url = "https://files.pythonhosted.org/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", size = 421305, upload-time = "2025-11-30T20:21:44.994Z" }, - { url = "https://files.pythonhosted.org/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", size = 572503, upload-time = "2025-11-30T20:21:46.91Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", size = 598322, upload-time = "2025-11-30T20:21:48.709Z" }, - { url = "https://files.pythonhosted.org/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", size = 560792, upload-time = "2025-11-30T20:21:50.024Z" }, - { url = "https://files.pythonhosted.org/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", size = 221901, upload-time = "2025-11-30T20:21:51.32Z" }, - { url = "https://files.pythonhosted.org/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", size = 235823, upload-time = "2025-11-30T20:21:52.505Z" }, - { url = "https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", size = 370157, upload-time = "2025-11-30T20:21:53.789Z" }, - { url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" }, - { url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" }, - { url = "https://files.pythonhosted.org/packages/42/bb/1463f0b1722b7f45431bdd468301991d1328b16cffe0b1c2918eba2c4eee/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f", size = 402932, upload-time = "2025-11-30T20:21:58.47Z" }, - { url = "https://files.pythonhosted.org/packages/99/ee/2520700a5c1f2d76631f948b0736cdf9b0acb25abd0ca8e889b5c62ac2e3/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4", size = 525830, upload-time = "2025-11-30T20:21:59.699Z" }, - { url = "https://files.pythonhosted.org/packages/e0/ad/bd0331f740f5705cc555a5e17fdf334671262160270962e69a2bdef3bf76/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97", size = 412033, upload-time = "2025-11-30T20:22:00.991Z" }, - { url = "https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", size = 390828, upload-time = "2025-11-30T20:22:02.723Z" }, - { url = "https://files.pythonhosted.org/packages/ab/2b/d88bb33294e3e0c76bc8f351a3721212713629ffca1700fa94979cb3eae8/rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d", size = 404683, upload-time = "2025-11-30T20:22:04.367Z" }, - { url = "https://files.pythonhosted.org/packages/50/32/c759a8d42bcb5289c1fac697cd92f6fe01a018dd937e62ae77e0e7f15702/rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038", size = 421583, upload-time = "2025-11-30T20:22:05.814Z" }, - { url = "https://files.pythonhosted.org/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", size = 572496, upload-time = "2025-11-30T20:22:07.713Z" }, - { url = "https://files.pythonhosted.org/packages/14/f6/69066a924c3557c9c30baa6ec3a0aa07526305684c6f86c696b08860726c/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed", size = 598669, upload-time = "2025-11-30T20:22:09.312Z" }, - { url = "https://files.pythonhosted.org/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", size = 561011, upload-time = "2025-11-30T20:22:11.309Z" }, - { url = "https://files.pythonhosted.org/packages/22/16/cd3027c7e279d22e5eb431dd3c0fbc677bed58797fe7581e148f3f68818b/rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c", size = 221406, upload-time = "2025-11-30T20:22:13.101Z" }, - { url = "https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825", size = 236024, upload-time = "2025-11-30T20:22:14.853Z" }, - { url = "https://files.pythonhosted.org/packages/14/a6/364bba985e4c13658edb156640608f2c9e1d3ea3c81b27aa9d889fff0e31/rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229", size = 229069, upload-time = "2025-11-30T20:22:16.577Z" }, - { url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" }, - { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" }, - { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" }, - { url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" }, - { url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" }, - { url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" }, - { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" }, - { url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" }, - { url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" }, - { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" }, - { url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" }, - { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", size = 223782, upload-time = "2025-11-30T20:22:37.271Z" }, - { url = "https://files.pythonhosted.org/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", size = 240463, upload-time = "2025-11-30T20:22:39.021Z" }, - { url = "https://files.pythonhosted.org/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", size = 230868, upload-time = "2025-11-30T20:22:40.493Z" }, - { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, - { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, - { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, - { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, - { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, - { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, - { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, - { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, - { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, - { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, - { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, - { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, - { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" }, - { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" }, - { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" }, - { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, - { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, - { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, - { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, - { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, - { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, - { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, - { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, - { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, - { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, - { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, - { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" }, - { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" }, - { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, - { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, - { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, - { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, - { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, - { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, - { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, - { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, - { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, - { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, - { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, - { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, - { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, - { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, - { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, - { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, - { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, - { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, - { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, - { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, - { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, - { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, - { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, - { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, - { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, - { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, - { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, - { url = "https://files.pythonhosted.org/packages/69/71/3f34339ee70521864411f8b6992e7ab13ac30d8e4e3309e07c7361767d91/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58", size = 372292, upload-time = "2025-11-30T20:24:16.537Z" }, - { url = "https://files.pythonhosted.org/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", size = 362128, upload-time = "2025-11-30T20:24:18.086Z" }, - { url = "https://files.pythonhosted.org/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", size = 391542, upload-time = "2025-11-30T20:24:20.092Z" }, - { url = "https://files.pythonhosted.org/packages/49/5c/31ef1afd70b4b4fbdb2800249f34c57c64beb687495b10aec0365f53dfc4/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c", size = 404004, upload-time = "2025-11-30T20:24:22.231Z" }, - { url = "https://files.pythonhosted.org/packages/e3/63/0cfbea38d05756f3440ce6534d51a491d26176ac045e2707adc99bb6e60a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3", size = 527063, upload-time = "2025-11-30T20:24:24.302Z" }, - { url = "https://files.pythonhosted.org/packages/42/e6/01e1f72a2456678b0f618fc9a1a13f882061690893c192fcad9f2926553a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5", size = 413099, upload-time = "2025-11-30T20:24:25.916Z" }, - { url = "https://files.pythonhosted.org/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", size = 392177, upload-time = "2025-11-30T20:24:27.834Z" }, - { url = "https://files.pythonhosted.org/packages/4a/b4/0a771378c5f16f8115f796d1f437950158679bcd2a7c68cf251cfb00ed5b/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f", size = 406015, upload-time = "2025-11-30T20:24:29.457Z" }, - { url = "https://files.pythonhosted.org/packages/36/d8/456dbba0af75049dc6f63ff295a2f92766b9d521fa00de67a2bd6427d57a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877", size = 423736, upload-time = "2025-11-30T20:24:31.22Z" }, - { url = "https://files.pythonhosted.org/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", size = 573981, upload-time = "2025-11-30T20:24:32.934Z" }, - { url = "https://files.pythonhosted.org/packages/20/91/092bacadeda3edf92bf743cc96a7be133e13a39cdbfd7b5082e7ab638406/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4", size = 599782, upload-time = "2025-11-30T20:24:35.169Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" }, -] - -[[package]] -name = "rpds-py" -version = "2026.6.3" -source = { registry = "https://pypi.org/simple/" } -resolution-markers = [ - "python_full_version >= '3.14'", - "python_full_version >= '3.12' and python_full_version < '3.14'", - "python_full_version == '3.11.*'", -] -sdist = { url = "https://files.pythonhosted.org/packages/aa/2a/9618a122aeb2a169a28b03889a2995fe297588964333d4a7d67bdf46e147/rpds_py-2026.6.3.tar.gz", hash = "sha256:1cebd1337c242e4ec2293e541f712b2da849b29f48f0c293684b71c0632625d4", size = 64051, upload-time = "2026-06-30T07:17:53.009Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/94/1f/a2dca5ffdbf1d475ffc4e80e4d5d720ff3a00f691795910116960ee12511/rpds_py-2026.6.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7b689145a1485c335569bd056464f3243a29af7ed3871c7be31ad624ba239bc7", size = 342174, upload-time = "2026-06-30T07:14:54.821Z" }, - { url = "https://files.pythonhosted.org/packages/4d/dc/323d08583c0832911768663d1944f0107fcd4088704858d84b5e06d105a0/rpds_py-2026.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db08f45aecde626498fb3df07bcf6d2ec040af42e859a4f5040d79c200342911", size = 345513, upload-time = "2026-06-30T07:14:56.515Z" }, - { url = "https://files.pythonhosted.org/packages/0b/2a/e31989834d18d2f26ec1d2774c5b1eb3331df4ea8ada525175294c94b48a/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc992ab27b15f852c76755eb2ab7dce86585ddadba6fa5946e58556088845b4", size = 373783, upload-time = "2026-06-30T07:14:57.736Z" }, - { url = "https://files.pythonhosted.org/packages/87/fe/e80107ee3639585c9941c17d6a42cd65325022f656c023191fce78c324c8/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f88d653e7b3b779d71ae7454e20dcc9b6bae903f33c269db9f2be41bda3f261", size = 378316, upload-time = "2026-06-30T07:14:59.077Z" }, - { url = "https://files.pythonhosted.org/packages/22/6f/81e3adf81acfb6fa694de2a6e4e7d8863121e3e0799e0a7725e6cf5679c4/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e52655eaf81e32593abedaa4bfe33170c8cfedf3365ed9be6e11e07f148f0278", size = 499423, upload-time = "2026-06-30T07:15:00.488Z" }, - { url = "https://files.pythonhosted.org/packages/2d/9a/41263969df0ce3d9af2a96d5005a288200af1989aed3354bfceb5fc0b21f/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dfcc8b909769d19db55c7cc9541eb64b9b774b1057ffffb4f1048070475bb9f9", size = 386077, upload-time = "2026-06-30T07:15:01.911Z" }, - { url = "https://files.pythonhosted.org/packages/5e/19/7e98f468bd50346faff5b10e5297374b443bfdddacc8e9fbc65984539597/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c1255b302953c86a486b81d330d5ee1d5bd937691ce271b6be0ef0e299eaab7", size = 371315, upload-time = "2026-06-30T07:15:03.317Z" }, - { url = "https://files.pythonhosted.org/packages/99/3c/2b973b4d371906a134b03decfea7f5d9835a2c6d263454392e15b64b5b18/rpds_py-2026.6.3-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:8d2294a31386bfa251d8c8a39472beee17db67d4f1a6eabea665d35c9a4461c3", size = 383502, upload-time = "2026-06-30T07:15:04.627Z" }, - { url = "https://files.pythonhosted.org/packages/98/2a/12e2799500af0a307bca76b63361c51f9fe479223561489c29eea1f2ee41/rpds_py-2026.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8f23ead891a3b762f35ab3b04623da7056545b48aa60d59957e6789914545da", size = 402673, upload-time = "2026-06-30T07:15:05.856Z" }, - { url = "https://files.pythonhosted.org/packages/2d/e3/21e5872d165fe08be4f229e3d5ee9d90019c0bf0e5538de60dbd54009450/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:421aba32367055614287a4292b6a17f1939c9452299f7a0209c117e990b646d4", size = 549964, upload-time = "2026-06-30T07:15:07.159Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d0/5ee0fe36844297de8123bee27bc12078c1a7416ad9f1b8a8ca18d6b0c0ac/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1e5822dfc2f0d4ab7e745eaa6d85945069329beeccef965af3f3bb26058fcab6", size = 615446, upload-time = "2026-06-30T07:15:08.531Z" }, - { url = "https://files.pythonhosted.org/packages/b1/80/1ea5873cb683f2fbe5f21b23ea1f6d179ead19f3c5b249b7eb5dca568ef2/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:83e35b57523816c8613fd0776b40cd8bb9f596b37ddd2692eb4a6bb5ab2f8c93", size = 576975, upload-time = "2026-06-30T07:15:09.97Z" }, - { url = "https://files.pythonhosted.org/packages/c9/e1/90ef639217a5ddb15b7f4f61b1c33911fd044ad03c311bafdd2bcab85582/rpds_py-2026.6.3-cp311-cp311-win32.whl", hash = "sha256:de3eceba0b683bcbb1ab93da016d0270df1f9ae7be716b40214c5dafac6ea45a", size = 204453, upload-time = "2026-06-30T07:15:11.324Z" }, - { url = "https://files.pythonhosted.org/packages/f2/b7/b7a1695d7af36f521fb11e80d6d3adbd744f73b921859bd3c2a2c0dc706f/rpds_py-2026.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:2c54a076ca4d370980ab57bc0e31df57bbe8d41340436a90ef8b1219a3cbb127", size = 223219, upload-time = "2026-06-30T07:15:12.476Z" }, - { url = "https://files.pythonhosted.org/packages/d7/a2/145afacf796e4506062825941176ad9445c2dcf2b3b6a1f13d3030a15e19/rpds_py-2026.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:168c733a7112e071bb7a66460e667edfcff06c017a3c523f7a8a8e08d0140804", size = 219137, upload-time = "2026-06-30T07:15:13.631Z" }, - { url = "https://files.pythonhosted.org/packages/5c/be/2e8974163072e7bab7df1a5acd54c4498e75e35d6d18b864d3a9d5dadc92/rpds_py-2026.6.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a0811d33247c3d6128a3001d763f2aa056bb3425204335400ac54f89eec3a0d0", size = 343691, upload-time = "2026-06-30T07:15:14.96Z" }, - { url = "https://files.pythonhosted.org/packages/a4/73/319dfa745dd668efe89309141ded489126461fcecd2b8f3a3cda185129b6/rpds_py-2026.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:538949e262e46caa31ac01bdb3c1e8f642622922cacbabbae6a8445d9dc33eaf", size = 338542, upload-time = "2026-06-30T07:15:16.267Z" }, - { url = "https://files.pythonhosted.org/packages/21/63/4239893be1c4d09b709b1a8f6be4188f0870084ff547f46606b8a75f1b03/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55927d532399c2c646100ff7feb48eaa940ad70f42cd68e1328f3ded9f81ca24", size = 368180, upload-time = "2026-06-30T07:15:17.62Z" }, - { url = "https://files.pythonhosted.org/packages/1c/ca/9c5de382225234ceb37b1844ebdb140db12b2a278bb9efe2fcd19f6c82ce/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f56f1695bc5c0871cbc33dc0130fcf503aab0c57dcc5a6700a4f49eba4f2652e", size = 375067, upload-time = "2026-06-30T07:15:18.952Z" }, - { url = "https://files.pythonhosted.org/packages/87/dc/863f69d1bf04ade34b7fe0d59b9fdf6f0135fe2d7cbca74f1d665589559d/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:270b293dae9058fc9fcedab50f13cebf46fb8ed1d1d54e0521a9da5d6b211975", size = 490509, upload-time = "2026-06-30T07:15:20.434Z" }, - { url = "https://files.pythonhosted.org/packages/ce/ef/eac16a12048b45ec7c7fa94f2be3438a5f26bf9cc8580b18a1cfd609b7f6/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:127565fead0a10943b282957bd5447804ff3160ad79f2ad2635e6d249e380680", size = 382754, upload-time = "2026-06-30T07:15:21.831Z" }, - { url = "https://files.pythonhosted.org/packages/04/8f/d2f3f532616be4d06c316ef119683e832bd3d41e112bf3a88f4151c95b17/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecabd69db66de867690f9797f2f8fa27ba501bbc24540cbdbdc649cd15888ba6", size = 366189, upload-time = "2026-06-30T07:15:23.371Z" }, - { url = "https://files.pythonhosted.org/packages/e3/29/41a7b0e98a4b44cd676ab7598419623373eb43b20be68c084935c1a8cf88/rpds_py-2026.6.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:58eadac9cd119677b60e1cf8ac4052f35949d71b8a9e5556efccbe82533cf22a", size = 377750, upload-time = "2026-06-30T07:15:24.659Z" }, - { url = "https://files.pythonhosted.org/packages/2e/05/ecda0bec46f9a1565090bcdc941d023f6a25aff85fda28f89f8d19878152/rpds_py-2026.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7491ee23305ac3eb59e492b6945881f5cd77a6f731061a3f25b77fd40f9e99a4", size = 395576, upload-time = "2026-06-30T07:15:25.987Z" }, - { url = "https://files.pythonhosted.org/packages/68/a8/6ed52f03ee6cb854ce78785cc9a9a672eb880e83fd7224d471f667d151f1/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c99f7e8ccb3dd6e3e4bfeac657a7b208c9bac8075f4b078c02d7404c34107fa", size = 543807, upload-time = "2026-06-30T07:15:27.356Z" }, - { url = "https://files.pythonhosted.org/packages/8f/d6/156c0d3eea27ba09b92562ba2364ba124c0a061b199e17eac637cd25a5e2/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:62698275682bf121181861295c9181e789030a2d516071f5b8f3c23c170cd0fc", size = 611187, upload-time = "2026-06-30T07:15:28.931Z" }, - { url = "https://files.pythonhosted.org/packages/f1/31/774212ed989c62f7f310220089f9b0a3fb8f40f5443d1727abd5d9f52bc9/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a214c993455f99a89aaeadc9b21241900037adc9d97203e374d75513c5911822", size = 573030, upload-time = "2026-06-30T07:15:30.553Z" }, - { url = "https://files.pythonhosted.org/packages/c9/50/22f73127a41f1ce4f87fe39aadfb9a126345801c274aa93ae88456249327/rpds_py-2026.6.3-cp312-cp312-win32.whl", hash = "sha256:501f9f04a588d6a09179368c57071301445191767c64e4b52a6aa9871f1ef5ed", size = 202185, upload-time = "2026-06-30T07:15:32.027Z" }, - { url = "https://files.pythonhosted.org/packages/04/3a/f0ee4d4dde9d3b69dedf1b5f74e7a40017046d55052d173e418c6a94f960/rpds_py-2026.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:2c958bf94822e9290a40aaf2a822d4bc5c88099093e3948ad6c571eca9272e5f", size = 220394, upload-time = "2026-06-30T07:15:33.359Z" }, - { url = "https://files.pythonhosted.org/packages/f3/83/3382fe37f809b59f02aac04dbc4e765b480b46ee0227ed516e3bdc4d3dfc/rpds_py-2026.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:22bffe6042b9bcb0822bcd1955ec00e245daf17b4344e4ed8e9551b976b63e96", size = 215753, upload-time = "2026-06-30T07:15:34.778Z" }, - { url = "https://files.pythonhosted.org/packages/a4/9e/b818ee580026ec578138e961027a68820c40afeb1ec8f6819b54fb99e196/rpds_py-2026.6.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:3cfe765c1da0072636ca06628261e0ea05688e160d5c8a03e0217c3854037223", size = 343012, upload-time = "2026-06-30T07:15:36.005Z" }, - { url = "https://files.pythonhosted.org/packages/f3/6b/686d9dc4359a8f163cfbbf89ee0b4e586431de22fe8248edb63a8cf50d49/rpds_py-2026.6.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f4d78253f6996be4901669ad25319f842f740eccf4d58e3c7f3dd39e6dde1d8f", size = 338203, upload-time = "2026-06-30T07:15:37.462Z" }, - { url = "https://files.pythonhosted.org/packages/9e/9b/069aa329940f8207615e091f5eedbbd40e1e15eac68a0790fd05ccdf796c/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f45a148e28767bf343d33a684693c70e451c6f4c0e9904709a723fafbdfc1f", size = 367984, upload-time = "2026-06-30T07:15:39.008Z" }, - { url = "https://files.pythonhosted.org/packages/14/db/34c203e4becff3703e4d3bc121842c00b8689197f398161203a880052f4e/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:842e7b070435622248c7a2c44ae53fa1440e073cc3023bc919fed570884097a7", size = 374815, upload-time = "2026-06-30T07:15:40.253Z" }, - { url = "https://files.pythonhosted.org/packages/ee/7d/8071067d2cc453d916ad836e828c943f575e8a44612537759002a1e07381/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8020133a74bd81b4572dd8e4be028a6b1ebcd70e6726edc3918008c08bee6ee6", size = 490545, upload-time = "2026-06-30T07:15:41.729Z" }, - { url = "https://files.pythonhosted.org/packages/a3/42/da06c5aa8f0484ff07f270787434204d9f4535e2f8c3b51ed402267e63c3/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdc7e35386f3847df728fbcb5e887e2d79c19e2fa1eba9e51b6621d23e3243af", size = 382828, upload-time = "2026-06-30T07:15:43.327Z" }, - { url = "https://files.pythonhosted.org/packages/57/d7/fe978efc2ae50abe48eb7464668ea99f53c010c60aeebb7b35ad27f23661/rpds_py-2026.6.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acac386b453c2516111b50985d60ce46e7fadb5ea71ae7b25f4c946935bf27cf", size = 365678, upload-time = "2026-06-30T07:15:44.992Z" }, - { url = "https://files.pythonhosted.org/packages/69/9d/1d8922e1990b2a6eb532b6ff53d3e73d2b3bbffc84116c75826bee73dfc6/rpds_py-2026.6.3-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:425560c6fa0415f27261727bb20bd097568485e5eb0c121f1949417d1c516885", size = 377811, upload-time = "2026-06-30T07:15:46.523Z" }, - { url = "https://files.pythonhosted.org/packages/b1/3d/198dceafb4fb034a6a47347e1b0735d34e0bd4a50be4e898d408ee66cb14/rpds_py-2026.6.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a550fb4950a06dde3beb4721f5ad4b25bf4513784665b0a8522c792e2bd822a4", size = 395382, upload-time = "2026-06-30T07:15:47.955Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f1/13968e49655d40b6b19d8b9140296bbc6f1d86b3f0f6c346cf9f1adddf4b/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f4bca01b63096f606e095734dd56e74e175f94cfbf24ff3d63281cec61f7bb7", size = 543832, upload-time = "2026-06-30T07:15:49.33Z" }, - { url = "https://files.pythonhosted.org/packages/ac/ab/289bcb1b90bd3e40a2900c561fa0e2087345ecbb094f0b870f2345142b7c/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ccffae9a092a00deb7efd545fe5e2c33c33b88e7c054337e9a74c179347d0b7d", size = 611011, upload-time = "2026-06-30T07:15:50.847Z" }, - { url = "https://files.pythonhosted.org/packages/1e/16/5043105e679436ccfbc8e5e0dd2d663ed18a8b8113515fd06a5e5d77c83e/rpds_py-2026.6.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1cf01971c4f2c5553b772a542e4aaf191789cd331bc2cd4ff0e6e65ba49e1e97", size = 572431, upload-time = "2026-06-30T07:15:52.394Z" }, - { url = "https://files.pythonhosted.org/packages/85/ed/adab103321c0a6565d5ae1c2998349bc3ee175b82ccc5ae8fc04cc413075/rpds_py-2026.6.3-cp313-cp313-win32.whl", hash = "sha256:8c3d1e9c15b9d51ca0391e13da1a25a0a4df3c58a37c9dc368e0736cf7f69df0", size = 201710, upload-time = "2026-06-30T07:15:53.894Z" }, - { url = "https://files.pythonhosted.org/packages/7b/ed/a03b09668e74e5dabbf2e211f6468e1820c0552f7b0500082da31841bf7b/rpds_py-2026.6.3-cp313-cp313-win_amd64.whl", hash = "sha256:9250a9a0a6fd4648b3f868da8d91a4c52b5811a62df58e753d50ae4454a36f80", size = 219454, upload-time = "2026-06-30T07:15:55.25Z" }, - { url = "https://files.pythonhosted.org/packages/27/17/b8642c12930b71bc2b25831f6708ccf0f75abcd11883932ec9ce54ba3a78/rpds_py-2026.6.3-cp313-cp313-win_arm64.whl", hash = "sha256:900a67df3fd1660b035a4761c4ce73c382ea6b35f90f9863c36c6fd8bf8b09bb", size = 215063, upload-time = "2026-06-30T07:15:56.573Z" }, - { url = "https://files.pythonhosted.org/packages/b6/36/7fbe9dcdaf857fb3f63c2a2284b62492d95f5e8334e947e5fb6e7f68c9be/rpds_py-2026.6.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:931908d9fc855d8f74783377822be318edb6dcb19e47169dc038f9a1bf60b06e", size = 344510, upload-time = "2026-06-30T07:15:57.921Z" }, - { url = "https://files.pythonhosted.org/packages/ba/54/f785cc3d3f60839ca57a5af4927a9f347b07b2799c373fc20f7949f87c7e/rpds_py-2026.6.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7469697dce35be237db177d42e2a2ee26e6dcc5fc052078a6fefabd288c6edd", size = 339495, upload-time = "2026-06-30T07:15:59.238Z" }, - { url = "https://files.pythonhosted.org/packages/63/ef/d4cdaf309e6b095b43597103cf8c0b951d6cca2acce68c474f75ec12e0c7/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bcfbcf66006befb9fd2aeaa9e01feaf881b4dc330a02ba07d2322b1c11be7b5d", size = 369454, upload-time = "2026-06-30T07:16:01.021Z" }, - { url = "https://files.pythonhosted.org/packages/96/4a/9559a68b7ee15db09d7981212e8c2e219d2a1d6d4faa0391d813c3496a36/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:847927daf4cffbd4e90e42bc890069897101edd015f956cb8721b3473372edda", size = 374583, upload-time = "2026-06-30T07:16:02.287Z" }, - { url = "https://files.pythonhosted.org/packages/ef/75/8964aa7d2c6e8ac43eba8eb6e6b0fdda1f46d39f2fc3e6aa9f2cb17f485d/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aca6c1ef08a82bfe327cc156da694660f599923e2e6665b6d81c9c2d0ac9ffc8", size = 492919, upload-time = "2026-06-30T07:16:03.723Z" }, - { url = "https://files.pythonhosted.org/packages/8f/97/6908094ac804115e65aedfd90f1b5fee4eebebd3f6c4cfc5419939267565/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae50181a047c871561212bb97f7932a2d45fb53e947bd9b57ebad85b529cbc53", size = 383725, upload-time = "2026-06-30T07:16:05.305Z" }, - { url = "https://files.pythonhosted.org/packages/d1/9c/0d1fdc2e7aba23e290d603bc494e97bd205bae262ce33c6b32a69768ed5e/rpds_py-2026.6.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc319e5a1de4b6913aac94bf6a2f9e847371e0a140a43dd4991db1a09bc2d504", size = 367255, upload-time = "2026-06-30T07:16:07.086Z" }, - { url = "https://files.pythonhosted.org/packages/c4/fe/f0209ca4a9ed074bc8acb44dfd0e81c3122e94c9689f5645b7973a866719/rpds_py-2026.6.3-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:e4316bf32babbed84e691e352faf967ce2f0f024174a8643c37c94a1080374fc", size = 379060, upload-time = "2026-06-30T07:16:08.525Z" }, - { url = "https://files.pythonhosted.org/packages/c6/8d/f1cc54c616b9d8897de8738aac148d20afca93f68187475fe194d09a71b9/rpds_py-2026.6.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8c6e5a2f750cc71c3e3b11d71661f21d6f9bc6cebc6564b1466417a1ec03ec77", size = 395960, upload-time = "2026-06-30T07:16:09.989Z" }, - { url = "https://files.pythonhosted.org/packages/fb/04/aafff00f73aeca2945f734f1d483c64ab8f472d0864ab02377fd8e89c3b2/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4470ce197d4090875cf6affbf1f853338387428df97c4fb7b7106317b8214698", size = 545356, upload-time = "2026-06-30T07:16:11.816Z" }, - { url = "https://files.pythonhosted.org/packages/fd/cc/e229663b9e4ddac5a4acbe9085dd80a71af2a5d356b8b39d6bff233f24b0/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ea964164cc9afa72d4d9b23cc28dafae93693c0a53e0b42acbff15b22c3f9ddd", size = 612319, upload-time = "2026-06-30T07:16:13.586Z" }, - { url = "https://files.pythonhosted.org/packages/e3/7a/8a0e6d3e6cd066af108b71b43122c3fe158dd9eb86acac626593a2582eb1/rpds_py-2026.6.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:639c8929aa0afe81be836b04de888460d6bed38b9c54cfc18da8f6bfabf5af5d", size = 573508, upload-time = "2026-06-30T07:16:15.23Z" }, - { url = "https://files.pythonhosted.org/packages/87/03/2a69ab618a789cf6cf85c86bb844c62d090e700ab1a2aa676b3741b6c516/rpds_py-2026.6.3-cp314-cp314-win32.whl", hash = "sha256:882076c00c0a608b131187055ddc5ae29f2e7eaf870d6168980420d58528a5c8", size = 202504, upload-time = "2026-06-30T07:16:16.893Z" }, - { url = "https://files.pythonhosted.org/packages/85/62/a3892ba945f4e24c78f352e5de3c7620d8479f73f211406a97263d13c7d2/rpds_py-2026.6.3-cp314-cp314-win_amd64.whl", hash = "sha256:0be972be84cfcaf46c8c6edf690ca0f154ac17babf1f6a955a51579b34ad2dc5", size = 220380, upload-time = "2026-06-30T07:16:18.108Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e7/c2bd44dc831931815ad11ebb5f430b5a0a4d3caa9de837107876c30c3432/rpds_py-2026.6.3-cp314-cp314-win_arm64.whl", hash = "sha256:2a9c6f195058cb45335e8cc3802745c603d716eb96bc9625950c1aac71c0c703", size = 215976, upload-time = "2026-06-30T07:16:19.654Z" }, - { url = "https://files.pythonhosted.org/packages/79/9c/fff7b74bce9a091ec9a012a03f9ff5f69364eaf9451060dfc4486da2ffdd/rpds_py-2026.6.3-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:f90938e92afda60266da758ee7d363447f7f0138c9559f9e1811629580582d90", size = 346840, upload-time = "2026-06-30T07:16:21.268Z" }, - { url = "https://files.pythonhosted.org/packages/e9/44/77bcb1168b33704908295533d27f10eb811e9e3e193e8993dc99572211d3/rpds_py-2026.6.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ec829541c45bca16e61c7ae50c20501f213605beb75d1aba91a6ee37fbbb56a4", size = 340282, upload-time = "2026-06-30T07:16:22.875Z" }, - { url = "https://files.pythonhosted.org/packages/87/3c/7a9081c7c9e645b39efe19e4ffbeccd80add246327cd9b888aecffd72317/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd70d95892096cdb26f15a00c45907b17817577aa8d1c76b2dcc2788391f9e9", size = 370403, upload-time = "2026-06-30T07:16:24.415Z" }, - { url = "https://files.pythonhosted.org/packages/f7/69/af47021eb7dad6ff3396cb001c08f0f3c4d06c20253f75be6421a59fe6b7/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29dfa0533a5d4c94d4dfa1b694fcb56c9c63aad8330ffdd816fd225d0a7a162f", size = 376055, upload-time = "2026-06-30T07:16:26.111Z" }, - { url = "https://files.pythonhosted.org/packages/81/fc/a3bcf517084396a6dd258c592567a3c011ba4557f2fde23dceaf26e74f2e/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:af05d726809bff6b141be124d4c7ce998f9c9c7f30edb1f46c07aa103d540b41", size = 494419, upload-time = "2026-06-30T07:16:27.596Z" }, - { url = "https://files.pythonhosted.org/packages/c9/eb/13d529d1788135425c7bf207f8463458ca5d92e43f3f701365b83e9dffc1/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9826217f048f620d9a712672818bf231442c1b35d96b227a07eabd11b4bb6945", size = 384848, upload-time = "2026-06-30T07:16:29.183Z" }, - { url = "https://files.pythonhosted.org/packages/8e/f4/b7ac49f30013aba8f7b9566b1dd07e81de95e708c1374b7bacc5b9bc5c9c/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:536bceea4fa4acf7e1c61da2b5786304367c816c8895be71b8f537c480b0ea1f", size = 371369, upload-time = "2026-06-30T07:16:30.912Z" }, - { url = "https://files.pythonhosted.org/packages/31/86/6260bafa622f788b07ddec0e52d810305c8b9b0b8c27f58a2ab04bf62b4f/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:bc0011654b91cc4fb2ae701bec0a0ba1e552c0714247fa7af6c59e0ccfa3a4e1", size = 379673, upload-time = "2026-06-30T07:16:32.486Z" }, - { url = "https://files.pythonhosted.org/packages/19/c3/03f1ee79a047b48daeca157c89a18509cde22b6b951d642b9b0af1be660a/rpds_py-2026.6.3-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:539d75de9e0d536c84ff18dfeb805398e58227001ce09231a26a08b9aed1ee0e", size = 397500, upload-time = "2026-06-30T07:16:34.471Z" }, - { url = "https://files.pythonhosted.org/packages/f0/95/8ed0cd8c377dca12aea498f119fe639fc474d1461545c39d2b5872eb1c0f/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:166cf54d9f44fc6ceb53c7860258dde44a81406646de79f8ed3234fca3b6e538", size = 545978, upload-time = "2026-06-30T07:16:36.45Z" }, - { url = "https://files.pythonhosted.org/packages/d3/f2/0eb57f0eaa83f8fc152a7e03de968ab77e1f00732bebc892b190c6eebde7/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:d34c20167764fbcf927194d532dd7e0c56772f0a5f943fa5ef9e9afbba8fb9db", size = 613350, upload-time = "2026-06-30T07:16:38.213Z" }, - { url = "https://files.pythonhosted.org/packages/5b/de/e0674bdbc3ef7634989b3f854c3f34bc1f587d36e5bfdc5c378d57034619/rpds_py-2026.6.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ea7bb13b7c9a29791f87a0387ba7d3ad3a6d783d827e4d3f27b40a0ff44495e2", size = 576486, upload-time = "2026-06-30T07:16:39.797Z" }, - { url = "https://files.pythonhosted.org/packages/f2/f6/21101359743cd136ada781e8210a85769578422ba460672eea0e29739200/rpds_py-2026.6.3-cp314-cp314t-win32.whl", hash = "sha256:6de4744d05bd1aa1be4ed7ea1189e3979196808008113bbbf899a460966b925e", size = 201068, upload-time = "2026-06-30T07:16:41.316Z" }, - { url = "https://files.pythonhosted.org/packages/a6/b2/9574d4d44f7760c2aa32d92a0a4f41698e33f5b204a0bf5c9758f52c79d5/rpds_py-2026.6.3-cp314-cp314t-win_amd64.whl", hash = "sha256:c7b9a2f8f4d8e90af72571d3d495deebdd7e3c75451f5b41719aee166e940fc2", size = 220600, upload-time = "2026-06-30T07:16:43.091Z" }, - { url = "https://files.pythonhosted.org/packages/08/ae/f23a2697e6ee6340a578b0f136be6483657bef0c6f9497b752bb5c0964bb/rpds_py-2026.6.3-cp315-cp315-macosx_10_12_x86_64.whl", hash = "sha256:e059c5dde6452b44424bd1834557556c226b57781dee1227af23518459722b13", size = 344726, upload-time = "2026-06-30T07:16:44.5Z" }, - { url = "https://files.pythonhosted.org/packages/c3/63/e7b3a1a5358dd32c930a1062d8e15b67fd6e8922e81df9e91706d66ee5c8/rpds_py-2026.6.3-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:2f7c26fbc5acd2522b95d4177fe4710ffd8e9b20529e703ffbf8db4d93903f05", size = 339587, upload-time = "2026-06-30T07:16:46.255Z" }, - { url = "https://files.pythonhosted.org/packages/ec/64/10a85681916ca55fffb91b0a211f84e34297c109243484dd6394660a8a7c/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3086b538543802f84c843911242db20447de00d8752dd0efc936dbcf02218ba", size = 369585, upload-time = "2026-06-30T07:16:48.101Z" }, - { url = "https://files.pythonhosted.org/packages/76/c2/baf95c7c38823e12ba34407c5f5767a89e5cf2233895e56f608167ae9493/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2e5c5ee828d42cb11760761c0af6507927bec42d0ad5458f97c9203b054617", size = 375479, upload-time = "2026-06-30T07:16:49.93Z" }, - { url = "https://files.pythonhosted.org/packages/6a/94/0aad06c72d65101e11d33528d438cda99a39ce0da99466e156158f2541d3/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ed0c1e5d10cdc7135537988c74a0188da68e2f3c30813ba3744ab1e42e0480f9", size = 492418, upload-time = "2026-06-30T07:16:51.641Z" }, - { url = "https://files.pythonhosted.org/packages/b5/17/de3f5a479a1f056535d7489819639d8cd591ea6281d700390b43b1abd745/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c2642a7603ec0b16ed77da4555db3b4b472341904873788327c0b0d7b95f1bb", size = 384123, upload-time = "2026-06-30T07:16:53.622Z" }, - { url = "https://files.pythonhosted.org/packages/46/7d/bf09bd1b145bb2671c03e1e6d1ab8651858d90d8c7dfeadd85a37a934fd8/rpds_py-2026.6.3-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e4320744c1ffdd95a603def63344bfab2d33edeab301c5007e7de9f9f5b3885", size = 367351, upload-time = "2026-06-30T07:16:55.241Z" }, - { url = "https://files.pythonhosted.org/packages/a3/ea/1bb734f314b8be319149ddee80b18bd41372bdcfbdf88d28131c0cd37719/rpds_py-2026.6.3-cp315-cp315-manylinux_2_31_riscv64.whl", hash = "sha256:a9f4645593036b81bbdb36b9c8e0ea0d1c3fee968c4d59db0344c14087ef143a", size = 378827, upload-time = "2026-06-30T07:16:56.841Z" }, - { url = "https://files.pythonhosted.org/packages/4b/93/d9611e5b25e26df9a3649813ed66193ace9347a7c7fc4ab7cf70e94851c0/rpds_py-2026.6.3-cp315-cp315-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e55d236be29255554da47abe5c577637db7c24a02b8b46f0ca9524c855801868", size = 395966, upload-time = "2026-06-30T07:16:58.557Z" }, - { url = "https://files.pythonhosted.org/packages/c3/cb/99d77e16e5534ae1d90629bbe419ba6ee170833a6a85e3aa1cc41726fbbc/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:24e9c5386e16669b674a69c156c8eeefcb578f3b3397b713b08e6d60f3c7b187", size = 545680, upload-time = "2026-06-30T07:17:00.164Z" }, - { url = "https://files.pythonhosted.org/packages/59/15/11a29755f790cef7a2f755e8e14f4f0c33f39489e1893a632a2eee59672b/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_i686.whl", hash = "sha256:c60924535c75f1566b6eb75b5c31a48a43fef04fa2d0d201acbad8a9969c6107", size = 611853, upload-time = "2026-06-30T07:17:01.962Z" }, - { url = "https://files.pythonhosted.org/packages/68/86/0c27547e21644da938fb530f7e1a8148dd24d02db07e7a5f2567a17ce710/rpds_py-2026.6.3-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:38a2fea2787428f811719ceb9114cb78964a3138838320c29ac39526c79c16ba", size = 573715, upload-time = "2026-06-30T07:17:03.693Z" }, - { url = "https://files.pythonhosted.org/packages/29/71/4d8fcf700931815594bce892255bbd973b94efaf0fc1932b0590df18d886/rpds_py-2026.6.3-cp315-cp315-win32.whl", hash = "sha256:d483fe17f01ad64b7bf7cc38fcefff1ca9fb83f8c2b2542b68f97ffe0611b369", size = 202864, upload-time = "2026-06-30T07:17:05.746Z" }, - { url = "https://files.pythonhosted.org/packages/eb/62/b577562de0edbb55b2be85ce5fd09c33e386b9b13eee09833af4240fd5c4/rpds_py-2026.6.3-cp315-cp315-win_amd64.whl", hash = "sha256:67e3a721ffc5d8d2210d3671872298c4a84e4b8035cfe42ffd7cde35d772b146", size = 220430, upload-time = "2026-06-30T07:17:07.471Z" }, - { url = "https://files.pythonhosted.org/packages/c8/95/d6d0b2509825141eef60669a5739eec88dbc6a48053d6c92993a5704defe/rpds_py-2026.6.3-cp315-cp315-win_arm64.whl", hash = "sha256:6e84adbcf4bf841aed8116a8264b9f50b4cb3e7bd89b516122e616ac56ca269e", size = 215877, upload-time = "2026-06-30T07:17:09.008Z" }, - { url = "https://files.pythonhosted.org/packages/b7/bf/f3ea278f0afd615c1d0f19cb69043a41526e2bb600c2b536eb192218eb27/rpds_py-2026.6.3-cp315-cp315t-macosx_10_12_x86_64.whl", hash = "sha256:ae6dd8f10bd17aad820876d24caec9efdafd80a318d16c0a48edb5e136902c6b", size = 346933, upload-time = "2026-06-30T07:17:10.762Z" }, - { url = "https://files.pythonhosted.org/packages/9d/29/9907bdf1c5346763cf10b7f6852aad86652168c259def904cbe0082c5864/rpds_py-2026.6.3-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:bdbd97738551fca3917c1bd7188bec1920bb520104f28e7e1007f9ceb17b7690", size = 340274, upload-time = "2026-06-30T07:17:12.266Z" }, - { url = "https://files.pythonhosted.org/packages/6f/2c/8e03767b5778ef25cebf74a7a91a2c3806f8eced4c92cb7406bbe060756d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b95977e7211527ab0ba576e286d023389fbeeb32a6b7b771665d333c60e5342", size = 370763, upload-time = "2026-06-30T07:17:14.107Z" }, - { url = "https://files.pythonhosted.org/packages/2e/e1/df2a7e1ba2efd796af26194250b8d42c821b46592311595162af9ef0528d/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d15fde0e6fb0d88a60d221204873743e5d9f0b7d29165e62cd86d0413ad74ba6", size = 376467, upload-time = "2026-06-30T07:17:15.76Z" }, - { url = "https://files.pythonhosted.org/packages/6b/de/8a0814d1946af29cb068fb259aa8622f856df1d0bab58429448726b537f5/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a136d453475ac0fcbda502ef1e6504bd28d6d904700915d278deeab0d00fe140", size = 496689, upload-time = "2026-06-30T07:17:17.308Z" }, - { url = "https://files.pythonhosted.org/packages/df/f3/f19e0c852ba13694f5a79f3b719331051573cb5693feacf8a88ffffc3a71/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f826877d462181e5eb1c26a0026b8d0cab05d99844ecb6d8bf3627a2ca0c0442", size = 385340, upload-time = "2026-06-30T07:17:18.928Z" }, - { url = "https://files.pythonhosted.org/packages/e2/ae/7ec3a9d2d4351f99e37bcb06b6b6f954512646bfdbf9742e1de727865daf/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79486287de1730dbaff3dbd124d0ca4d2ef7f9d29bf2544f1f93c09b5bcbbd12", size = 372179, upload-time = "2026-06-30T07:17:20.539Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ac/9cee911dff2aaa9a5a8354f6610bf2e6a616de9197c5fff4f54f82585f1e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_31_riscv64.whl", hash = "sha256:808345f53cb952433ca2816f1604ff3515608a81784954f38d4452acfe8e61d5", size = 379993, upload-time = "2026-06-30T07:17:22.212Z" }, - { url = "https://files.pythonhosted.org/packages/83/6b/7c2a07ba88d1e9a936612f7a5d067467ed03d971d5a06f7d309dff044a7e/rpds_py-2026.6.3-cp315-cp315t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1967debc37f64f2c4dc90a7f563aec558b471966e12adcac4e1c4240496b6ebf", size = 398909, upload-time = "2026-06-30T07:17:23.66Z" }, - { url = "https://files.pythonhosted.org/packages/97/0b/776ffcb66783637b0031f6d58d6fb55913c8b5abf00aeecd46bf933fb477/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:f0840b5b17057f7fd918b76183a4b5a0635f43e14eb2ce60dce1d4ee4707ea00", size = 546584, upload-time = "2026-06-30T07:17:25.264Z" }, - { url = "https://files.pythonhosted.org/packages/55/33/ba3bc04d7092bd553c9b2b195624992d2cc4f3de1f380b7b93cbee67bd79/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_i686.whl", hash = "sha256:faa679d19a6696fd54259ad321251ad77a13e70e03dd834daa762a44fb6196ef", size = 614357, upload-time = "2026-06-30T07:17:26.888Z" }, - { url = "https://files.pythonhosted.org/packages/8b/71/14edf065f04630b1a8472f7653cad03f6c478bcf95ea0e6aed55451e33ea/rpds_py-2026.6.3-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:23a439f31ccbeff1574e24889128821d1f7917470e830cf6544dced1c662262a", size = 576533, upload-time = "2026-06-30T07:17:28.546Z" }, - { url = "https://files.pythonhosted.org/packages/ba/76/65002b08596c389105720a8c0d22298b8dc25a4baf89b2ce431343c8b1de/rpds_py-2026.6.3-cp315-cp315t-win32.whl", hash = "sha256:913ca42ccad3f8cc6e292b587ae8ae49c8c823e5dce51a736252fc7c7cdfa577", size = 201204, upload-time = "2026-06-30T07:17:30.193Z" }, - { url = "https://files.pythonhosted.org/packages/8c/97/d855d6b3c322d1f27e26f5241c42016b56cf01377ea8ed348285f54652f0/rpds_py-2026.6.3-cp315-cp315t-win_amd64.whl", hash = "sha256:ae3d4fe8c0b9213624fdce7279d70e3b148b682ca20719ebd193a23ebfa47324", size = 220719, upload-time = "2026-06-30T07:17:31.788Z" }, - { url = "https://files.pythonhosted.org/packages/b4/9c/f0d19ac587fd0e4ab6b72cda355e9c5a6166b01ef7e064e437aef8eb9fef/rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4cf2d36a2357e4d07bb5a4f98801265327b48256867816cfd2ceb001e9754a8f", size = 349791, upload-time = "2026-06-30T07:17:33.315Z" }, - { url = "https://files.pythonhosted.org/packages/38/c7/1d49d204c9fd2ee6c537601dc4c1ba921e03363ca576bfab94a00254ac9a/rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:30c6dc199b24a5e3e81d50da0f00858c5bbdb2617a750395687f4339c5818171", size = 352842, upload-time = "2026-06-30T07:17:34.897Z" }, - { url = "https://files.pythonhosted.org/packages/ac/e5/c0b5dc93cd0d4c06ce1f438907649514e2ea077bcd911e3154a51e96c38e/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9891e594296ab9dada6551c8e7b387b2721f27a67eecd528412e8906247a7b90", size = 382094, upload-time = "2026-06-30T07:17:36.514Z" }, - { url = "https://files.pythonhosted.org/packages/0d/54/ec0e907b4ca8d541112db352409bd15f871c9b243e0c92c9b5a46ae96f01/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5c2dc92304aa48a4a60443b548bb12f12e119d4b72f314015e67b9e1be97fca", size = 388662, upload-time = "2026-06-30T07:17:38.235Z" }, - { url = "https://files.pythonhosted.org/packages/d3/f4/921c22a4fd0f1c1ac13a3996ffbf0aa67951e2c8ad0d1d9574938a2932e8/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:127e08c0642d880cf32ca47ec2a4a77b901f7e2dd1ad9762adb13955d72ffcc9", size = 504896, upload-time = "2026-06-30T07:17:39.689Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1b/a114b972cefa1ab1cdb3c7bb177cd3844a12826c507c722d3a73516dbbaf/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bb68f03f395eb793220b45c097bd4d8c32944393da0fad8b999efac0868fc8c", size = 391545, upload-time = "2026-06-30T07:17:41.336Z" }, - { url = "https://files.pythonhosted.org/packages/4e/98/af9b3db77d47fcbe6c8c1f36e2c2147ec70292819e99c325f871584a1c11/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3450b693fde92133e9f51060568a4c31fcca76d5e53bbd611e689ca446517e9", size = 380059, upload-time = "2026-06-30T07:17:42.857Z" }, - { url = "https://files.pythonhosted.org/packages/c9/ba/0efd8668b97c1d26a61566386c636a7a7a09829e474fdf807caa15a2c844/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:5e8d07bddee435a2ff6f1920e18feff28d0bc4533e42f4bf6927fbd073312c41", size = 393235, upload-time = "2026-06-30T07:17:44.637Z" }, - { url = "https://files.pythonhosted.org/packages/62/90/8c139ee9690f73b0829f32647de6f40d826f8f443af6fa72644f96351aac/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a83ae6c67b7676b9878378547ca8e93ed77a580037bcbcd1d32f739e1e6089c", size = 413008, upload-time = "2026-06-30T07:17:46.225Z" }, - { url = "https://files.pythonhosted.org/packages/9c/97/0043896fdd7828ce09a1d9a8b06433714d0960fc4ff3fc4aa72b666b764e/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2bfd04c19ddbd6640de0b51894d764bd2758854d5b75bd102d2ef10cb9c293a9", size = 558118, upload-time = "2026-06-30T07:17:47.759Z" }, - { url = "https://files.pythonhosted.org/packages/f6/40/02355f0e134f783a8f9814c4680a1bd311d37671577a5964ea838573ff37/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:ca6546b66be9dc4738b1b043d5ebd5488c66c578c5ff0fd0e8065313fe3afb76", size = 623138, upload-time = "2026-06-30T07:17:49.355Z" }, - { url = "https://files.pythonhosted.org/packages/10/85/48f0abdcef5cce4e034c7a5b0ceeceba0b01bf0d942824f4bb720afe2dec/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8e65860d238379ed982fd9ba690579b5e95af2f4840f99c772816dbe573cb826", size = 586486, upload-time = "2026-06-30T07:17:51.141Z" }, -] - -[[package]] -name = "ruamel-yaml" -version = "0.19.1" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/3b/ebda527b56beb90cb7652cb1c7e4f91f48649fbcd8d2eb2fb6e77cd3329b/ruamel_yaml-0.19.1.tar.gz", hash = "sha256:53eb66cd27849eff968ebf8f0bf61f46cdac2da1d1f3576dd4ccee9b25c31993", size = 142709, upload-time = "2026-01-02T16:50:31.84Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b8/0c/51f6841f1d84f404f92463fc2b1ba0da357ca1e3db6b7fbda26956c3b82a/ruamel_yaml-0.19.1-py3-none-any.whl", hash = "sha256:27592957fedf6e0b62f281e96effd28043345e0e66001f97683aa9a40c667c93", size = 118102, upload-time = "2026-01-02T16:50:29.201Z" }, -] - -[[package]] -name = "subprocess-tee" -version = "0.4.2" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/d7/22/991efbf35bc811dfe7edcd749253f0931d2d4838cf55176132633e1c82a7/subprocess_tee-0.4.2.tar.gz", hash = "sha256:91b2b4da3aae9a7088d84acaf2ea0abee3f4fd9c0d2eae69a9b9122a71476590", size = 14951, upload-time = "2024-06-17T19:51:51.249Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4d/ab/e3a3be062cd544b2803760ff707dee38f0b1cb5685b2446de0ec19be28d9/subprocess_tee-0.4.2-py3-none-any.whl", hash = "sha256:21942e976715af4a19a526918adb03a8a27a8edab959f2d075b777e3d78f532d", size = 5249, upload-time = "2024-06-17T19:51:15.949Z" }, -] - -[[package]] -name = "tomli" -version = "2.4.1" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, - { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, - { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, - { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, - { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, - { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, - { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, - { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, - { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, - { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, - { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, - { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, - { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, - { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, - { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, - { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, - { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, - { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, - { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, - { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, - { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, - { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, - { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, - { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, - { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, - { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, - { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, - { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, - { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, - { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, - { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, - { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, - { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, - { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, - { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, - { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, - { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, - { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, - { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, - { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, - { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, - { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, - { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, - { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, - { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, - { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, -] - -[[package]] -name = "typing-extensions" -version = "4.16.0" -source = { registry = "https://pypi.org/simple/" } -sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, -] - -[[package]] -name = "wcmatch" -version = "11.0.1" -source = { registry = "https://pypi.org/simple/" } -dependencies = [ - { name = "bracex" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/57/43/30e407989e313677dbb9d5f045f966549a7254834571e342eaa4b55cc67b/wcmatch-11.0.1.tar.gz", hash = "sha256:1ea2b4fa678b8ca268253798d5963935df39132d47c3e241c0a0732224005e7d", size = 144662, upload-time = "2026-08-14T15:20:40.477Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/77/7a02b0f05b3ffcdbef9719ce3ee0b508d6a29b58e95299f1580055671db3/wcmatch-11.0.1-py3-none-any.whl", hash = "sha256:fd149ecddb9f0a88ea780017d6dde17c994e494e7f7303d4e3c9d6251f978f4b", size = 43449, upload-time = "2026-08-14T15:20:39.379Z" }, -] - -[[package]] -name = "yamllint" -version = "1.38.0" -source = { registry = "https://pypi.org/simple/" } -dependencies = [ - { name = "pathspec" }, - { name = "pyyaml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/28/a0/8fc2d68e132cf918f18273fdc8a1b8432b60d75ac12fdae4b0ef5c9d2e8d/yamllint-1.38.0.tar.gz", hash = "sha256:09e5f29531daab93366bb061e76019d5e91691ef0a40328f04c927387d1d364d", size = 142446, upload-time = "2026-01-13T07:47:53.276Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/05/92/aed08e68de6e6a3d7c2328ce7388072cd6affc26e2917197430b646aed02/yamllint-1.38.0-py3-none-any.whl", hash = "sha256:fc394a5b3be980a4062607b8fdddc0843f4fa394152b6da21722f5d59013c220", size = 68940, upload-time = "2026-01-13T07:47:51.343Z" }, -] diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 6108ca5..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "pkl.cli.path": "/Users/hisaac/.local/share/mise/shims/pkl", - "shellcheck.executablePath": "/Users/hisaac/.local/share/mise/shims/shellcheck", - "ruff.path": [ - "/Users/hisaac/.local/share/mise/shims/ruff" - ], - "python.defaultInterpreterPath": "${workspaceFolder}/.venv", - "ruff.interpreter": [ - "/Users/hisaac/.local/share/mise/shims/python" - ] -} diff --git a/AGENTS.md b/AGENTS.md deleted file mode 100644 index e0daaa3..0000000 --- a/AGENTS.md +++ /dev/null @@ -1,66 +0,0 @@ -# CLAUDE.md - -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. - -## Overview - -This repo experiments with building macOS VM images for CI/CD pipelines. The two active components are: - -- **`templates/`** — Bash scripts sourced/run inside Packer/Tart VM images to configure macOS -- **`ansible/`** — Ansible playbook for provisioning macOS CI build agents (physical hardware or VMs) - -Packer `.hcl` templates and older `mise` tasks have been deleted; the current focus is Ansible-managed provisioning of agents running Tart VMs. - -## Tooling - -Dependencies are managed with [mise](https://mise.jdx.dev). Tools in use: `packer`, `tart`, `ansible`, `python`, `jq`, `tombi`. - -```bash -mise install # install all tools from mise.toml -mise run upd # upgrade tools within current version constraints (mise upgrade + mise lock) -mise run upg # bump tool versions (mise upgrade --bump + mise lock) -``` - -## Ansible - -All commands run from the `ansible/` directory (or rely on `ansible.cfg` there). - -```bash -# Install external roles/collections (required once, output to gitignored galaxy_roles/) -ansible-galaxy install --roles-path ./galaxy_roles --role-file requirements.yml - -# Run the full provisioning playbook -ansible-playbook playbooks/provision.yml --ask-become-pass - -# Lint -ansible-lint playbooks/provision.yml -``` - -**Playbook order matters:** `bootstrap` runs first using only `raw`/`script` modules (no Python required) to install Xcode CLT and Homebrew. All subsequent roles (`geerlingguy.mac.homebrew`, `xcode`, `ci_agent`) require Python, which is available after bootstrap via Xcode CLT. - -**Before running:** update `inventory/hosts.yml` with agent IPs, `inventory/group_vars/macos_agents.yml` with config, and `roles/xcode/defaults/main.yml` with the path to a pre-staged Xcode installer (Xcode cannot be downloaded non-interactively from Apple). - -Sensitive values (tokens, vault passwords) go in Ansible Vault — the local vault password file `.vault_pass` is gitignored. - -## Shell Scripts (`templates/scripts/`) - -Scripts are Bash, targeting macOS exclusively. They are designed to run inside Tart VMs during image baking. - -- `lib/xcode-utils.bash` — shared Xcode utility functions (install, select, normalize version, simulator management) -- `tests/test_xcode-utils.bash` — lightweight test runner (no framework; run directly on a macOS host with Xcode installed) - -Run tests: -```bash -bash templates/scripts/tests/test_xcode-utils.bash -``` - -ShellCheck is configured via `.shellcheckrc`: -- `external-sources=true` (suppress source warnings) -- SC2096 disabled (macOS allows multi-word shebangs) -- SC2154 disabled (variables injected by `usage`) - -## Code Style - -- **Indentation:** tabs for all files; 2-space indent for `.yml`/`.yaml`/`.hcl` (enforced by `.editorconfig`) -- **Bash:** `#!/bin/bash -euo pipefail` or `#!/bin/bash` depending on the script; `local -r` for readonly locals; subshells via `()` function bodies when directory isolation is needed; prefer long-form flags when available (e.g. `--verbose` over `-v`) — note that macOS BSD tools (`tail`, `cut`, `rm`, etc.) often lack long options, so short flags are acceptable there -- **Ansible:** use fully-qualified module names (e.g. `ansible.builtin.command`); `become: true` only where needed diff --git a/CLAUDE.md b/CLAUDE.md deleted file mode 120000 index 47dc3e3..0000000 --- a/CLAUDE.md +++ /dev/null @@ -1 +0,0 @@ -AGENTS.md \ No newline at end of file diff --git a/README.md b/README.md index f2a7c33..1df9d99 100644 --- a/README.md +++ b/README.md @@ -1,172 +1,38 @@ # hisaac-ci -Ansible-first automation for provisioning macOS CI agents, with Tart VM support for local iteration. +Build the macOS 27 VM in two stages on a Mac with macOS 27 and Tart installed: -## Overview - -This repository provisions macOS hosts (VMs or physical machines) using Ansible roles and playbooks. - -The current active stack is: - -- Root-level Ansible project (`ansible.cfg`, `inventory/`, `playbooks/`, `roles/`) -- Dynamic Tart inventory (`inventory/tart_inventory.py`) for VM IP discovery at runtime -- Role-scoped reference scripts in `scripts/` used as implementation references and helpers -- Toolchain and workflow orchestration via `mise` - -## Repository Structure - -```text -. -├── ansible.cfg -├── requirements.yml -├── inventory/ -│ ├── tart_inventory.py -│ └── group_vars/ -│ ├── macos_agents.yml -│ ├── macos_15_agents.yml -│ ├── macos_26_agents.yml -│ ├── tart_agents.yml -│ └── orka_agents.yml -├── playbooks/ -│ └── provision.yml -├── roles/ -│ ├── xcode_clt/ -│ ├── macos_updates/ -│ ├── rosetta/ -│ ├── ssh_config/ -│ ├── system_config/ -│ ├── auth_config/ -│ ├── homebrew/ -│ └── xcode/ -├── scripts/ -│ ├── xcode/ -│ ├── xcode_clt/ -│ ├── homebrew/ -│ ├── system_config/ -│ ├── auth_config/ -│ ├── ssh_config/ -│ ├── rosetta/ -│ └── macos_updates/ -├── mise.toml -└── pyproject.toml -``` - -## Prerequisites - -- macOS host for Tart-based workflows -- [mise](https://mise.jdx.dev) -- Tart VMs prepared locally (if using dynamic Tart inventory) -- Pre-staged Xcode `.xip` and Simulator Runtime `.dmg` assets for the target OS version(s) - -## Setup - -Run commands from the repository root. - -1. Install toolchain from `mise.toml`: - - ```bash - mise install - ``` - -2. Bootstrap Python/Ansible dependencies and Galaxy content: - - ```bash - mise run bootstrap - ``` - - This installs: - - - Python dependencies from `pyproject.toml` (`ansible-core`, `ansible-lint`, `paramiko`) - - Roles and collections from `requirements.yml` - -## Inventory and Variables - -`ansible.cfg` points to `inventory/tart_inventory.py` as the default inventory. - -- `inventory/tart_inventory.py` discovers VM IPs via `tart ip ` -- Hosts are grouped into: - - `macos_agents` (parent) - - `tart_agents` (runtime Tart VM group) - - version-specific groups like `macos_15_agents` and `macos_26_agents` - -Primary variable files: - -- `inventory/group_vars/macos_agents.yml`: shared settings (admin credentials, Homebrew base packages, Dock config) -- `inventory/group_vars/tart_agents.yml`: Tart-specific packages (`tart-guest-agent`) -- `inventory/group_vars/macos_15_agents.yml` and `inventory/group_vars/macos_26_agents.yml`: Xcode/runtime/simulator presets - -## Xcode Cache Inputs - -The `xcode` role installs all `*.xip` files found in the admin user's Downloads folder on the remote host. Stage the desired Xcode `.xip` files there before running provisioning — they will be deleted after installation. - -## Provisioning - -Run the full playbook: - -```bash -ansible-playbook playbooks/provision.yml -``` - -Or run common role slices with tags: - -```bash -ansible-playbook playbooks/provision.yml --tags xcode -ansible-playbook playbooks/provision.yml --tags homebrew -ansible-playbook playbooks/provision.yml --tags system_config -``` - -Playbook role order in `playbooks/provision.yml` is intentional: - -1. `xcode_clt` -2. `macos_updates` -3. `rosetta` -4. `ssh_config` -5. `system_config` -6. `auth_config` -7. `homebrew` -8. `geerlingguy.mac.dock` -9. `xcode` -10. Spotlight re-index task -11. Reboot task - -## Tart VM Workflow (Local) - -`mise` includes helper tasks for local Tart loops: - -- `mise run run-tart-vms`: starts configured VMs and waits for SSH readiness -- `mise run provision`: verifies Xcode/simruntime cache inputs, starts VMs, then runs `ansible-playbook playbooks/provision.yml` -- `mise run shutdown-tart-vms`: shuts down hosts in `tart_agents` -- `mise run refresh-tart-vms`: recreates local Tart VM clones from frozen images - -Adjust VM names in: - -- `inventory/tart_inventory.py` (`VMS` list) -- `mise.toml` (`tasks.run-tart-vms` and `tasks.refresh-tart-vms`) - -## Linting and Formatting - -This repo uses `hk` and `mise` task aliases: - -```bash -mise run chk # lint/check -mise run fmt # auto-fix formatting and supported lint issues +```sh +mise run build:base +mise run build:boot ``` -`chk` includes `ansible-lint`, `shellcheck`, `shfmt`, `ruff`, `yamlfmt`, and additional utility checks defined in `hk.pkl`. - -## Shell Script Tests - -Xcode utility script tests can be run directly on macOS: - -```bash -bash scripts/xcode/tests/test_xcode-utils.bash +`build:base` installs macOS from the IPSW into `macos-27-01-base`, creates the +admin account, enables automatic login and SSH, and waits for SSH to become +available. It then waits for Spotlight metadata power assertions to remain +absent for 60 seconds, failing if they do not settle within 15 minutes. This is +an indexing-idle heuristic, not proof that every item is indexed. It does not +run the UI boot commands. + +`build:boot` clones `macos-27-01-base` into `macos-27-02-ci-gui`, runs the boot commands +from `src/templates/macos-27-02-ci-gui.pkr.hcl`, and checks keyboard navigation, +Gatekeeper, and Screen Sharing. The base VM is preserved for future attempts. + +To troubleshoot, edit the boot template and rerun only `mise run build:boot`. +If the previous attempt left a `macos-27-02-ci-gui` VM, stop it if it is running +and delete that clone before retrying: + +```sh +tart stop macos-27-02-ci-gui +tart delete macos-27-02-ci-gui +mise run build:boot ``` -## References - -- https://github.com/timsutton/osx-vm-templates -- https://github.com/boxcutter/macos -- https://github.com/cirruslabs/macos-image-templates -- https://github.com/actions/runner-images -- https://github.com/torarnv/tart-image-bakery -- https://gist.github.com/aessam/aa9c32af6900123277c36d4d0ac7f73d#9d-skip-setup-assistant--6-layers +Both builds use Packer's `-on-error=ask` to allow inspection after a failure. +Packer debug logging is enabled for all commands in these tasks, writing to +`packer-base.log` and `packer-boot.log`, respectively. Each Packer invocation +replaces its task's log, so the build log remains after a normal task run. +These log files are ignored by Git. +The default username and password are both `admin`. When invoking Packer +directly, build each template file separately. For a differently named base VM, +set `vm_base_name` on the boot build to match the base build's `vm_name`. diff --git a/TODO.md b/TODO.md deleted file mode 100644 index 4e08192..0000000 --- a/TODO.md +++ /dev/null @@ -1,8 +0,0 @@ -# Todos - -- Incorporate tart-image-bakery for end-to-end local VM image creation and provisioning - - Add xcode-clt and software-update installation to image baking process -- Improve logging output and error handling in Ansible playbooks and roles -- Improve how we specify which VMs to provision in the inventory and playbooks -- Automate caching the needed xcode versions and apple sdks -- Find a better way to determine if the system has settled or not diff --git a/ansible.cfg b/ansible.cfg deleted file mode 100644 index 0b3e898..0000000 --- a/ansible.cfg +++ /dev/null @@ -1,14 +0,0 @@ -[defaults] -collections_path = galaxy_collections -roles_path = galaxy_roles:roles -host_key_checking = false -remote_user = admin -interpreter_python = auto_silent -display_args_to_stdout = true -log_path = ansible.log -inject_facts_as_vars = false - -# Speeds up runs by using SSH multiplexing -[ssh_connection] -ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -pipelining = true diff --git a/docs/github-actions-runners-macos-vm-bootstrapping.md b/docs/github-actions-runners-macos-vm-bootstrapping.md deleted file mode 100644 index 5b02d26..0000000 --- a/docs/github-actions-runners-macos-vm-bootstrapping.md +++ /dev/null @@ -1,1131 +0,0 @@ -# macOS VM Bootstrapping: How GitHub Actions Runner Images Work - -This document explains how macOS virtual machines are bootstrapped for GitHub Actions runners. The VMs are not truly headless — they boot into a full GUI session — but are configured so that no human interaction is ever required. This enables unattended UI automation, Xcode testing, and job provisioning. - ---- - -## Virtualization Platform: Anka by Veertu - -macOS images use [Anka](https://veertu.com/anka-build/) virtualization (unlike Windows/Ubuntu which use Azure + Packer). The Packer templates use the `veertu-anka-vm-clone` plugin to clone a base VM, provision it via SSH, then save the result as a new image. - -**Relevant files:** - -- `images/macos/templates/macOS-15.anka.pkr.hcl` — Packer template for macOS 15 (Intel) -- `images/macos/templates/macOS-15.arm64.anka.pkr.hcl` — Packer template for macOS 15 (Apple Silicon) -- Similar files exist for macOS 14 and macOS 26. - -**How it works:** - -The Packer `veertu-anka-vm-clone` source block clones an existing base Anka VM (specified by `source_vm_name`), configures CPU/RAM, then provisions it through a sequence of file uploads and shell scripts executed over SSH. After provisioning, the VM is stopped and the image is saved. - -```hcl -source "veertu-anka-vm-clone" "template" { - vm_name = "${var.build_id}" - source_vm_name = "${var.source_vm_name}" - source_vm_tag = "${var.source_vm_tag}" - vcpu_count = "${var.vcpu_count}" - ram_size = "${var.ram_size}" - stop_vm = "true" -} -``` - ---- - -## Automatic GUI Login (No Lock Screen) - -**Relevant files:** - -- `images/macos/scripts/build/configure-autologin.sh` -- `images/macos/assets/bootstrap-provisioner/kcpassword.py` -- `images/macos/assets/bootstrap-provisioner/setAutoLogin.sh` - -**What it does:** - -Configures the VM to boot directly into a logged-in desktop session without showing a login screen. - -**How it works:** - -macOS supports automatic login via an XOR-encoded password file at `/etc/kcpassword`. The `kcpassword.py` script encodes the VM user's password using Apple's known 11-byte XOR cipher and writes the result to that file. Then `com.apple.loginwindow` preferences are set: - -```bash -python3 $HOME/bootstrap/kcpassword.py "$PASSWORD" -/usr/bin/defaults write /Library/Preferences/com.apple.loginwindow autoLoginUser "$USERNAME" -/usr/bin/defaults write /Library/Preferences/com.apple.loginwindow autoLoginUserScreenLocked -bool false -``` - -**Why:** - -The VM must boot into an active GUI session because: -1. WindowServer must be running for UI tests (XCUITest, Simulator, etc.) -2. Many macOS developer tools assume a logged-in session -3. The provisioner agent needs access to the Aqua session to drive automation - ---- - -## UI Automation Without Authentication (`automationmodetool`) - -**Relevant file:** - -- `images/macos/scripts/build/configure-machine.sh` (lines 55–94) - -**What it does:** - -Enables Apple's XCTest UI automation framework to operate without requiring user authentication prompts at runtime. - -**How it works:** - -The script uses `expect` (an interactive automation tool) to feed the admin password to `automationmodetool`: - -```bash -/usr/bin/expect < /private/var/db/Accessibility/.VoiceOverAppleScriptEnabled' -fi -``` - -**Why:** - -SIP must be disabled to: -- Directly write to the TCC privacy database (bypassing consent dialogs) -- Write to protected system directories (`/private/var/db/Accessibility/`) -- Unload system LaunchDaemons -- Grant accessibility permissions to arbitrary binaries - ---- - -## Pre-populated TCC Database (Permission Pre-granting) - -**Relevant files:** - -- `images/macos/scripts/build/configure-tccdb-macos.sh` -- `images/macos/scripts/helpers/utils.sh` (lines 137–149) - -**What it does:** - -Directly injects rows into macOS's Transparency, Consent, and Control (TCC) SQLite databases, pre-granting every permission that the runner and provisioner will need — without any user-facing dialog ever appearing. - -**How it works:** - -The helper functions write directly to the TCC databases: - -```bash -configure_system_tccdb () { - local values=$1 - local dbPath="/Library/Application Support/com.apple.TCC/TCC.db" - local sqlQuery="INSERT OR IGNORE INTO access VALUES($values);" - sudo sqlite3 "$dbPath" "$sqlQuery" -} - -configure_user_tccdb () { - local values=$1 - local dbPath="$HOME/Library/Application Support/com.apple.TCC/TCC.db" - local sqlQuery="INSERT OR IGNORE INTO access VALUES($values);" - sqlite3 "$dbPath" "$sqlQuery" -} -``` - -**Permissions granted include:** - -| Service | Granted To | Purpose | -|---------|-----------|---------| -| `kTCCServiceAccessibility` | `/bin/bash`, `/usr/bin/osascript`, provisioner, Terminal | Drive UI elements programmatically | -| `kTCCServiceScreenCapture` | `/bin/bash`, provisioner, Terminal | Capture screenshots for debugging | -| `kTCCServiceAppleEvents` | bash, osascript, sshd, provisioner | Inter-process communication (AppleScript) | -| `kTCCServiceSystemPolicyAllFiles` | bash, sshd, provisioner, Terminal | Full disk access | -| `kTCCServicePostEvent` | Anka addons, provisioner | Synthetic keyboard/mouse input | -| `kTCCServiceMicrophone` | provisioner, Simulator | Audio device access for tests | -| `kTCCServiceBluetoothAlways` | provisioner | Bluetooth access for tests | - -**Why:** - -On a normal Mac, each of these permissions triggers a system dialog the first time an app requests access. In CI, those dialogs would block indefinitely. By pre-populating the database (only possible with SIP disabled), all permissions are silently granted. - ---- - -## Aggressive Service/Daemon Stripping - -**Relevant file:** - -- `images/macos/scripts/build/configure-system.sh` - -**What it does:** - -Unloads and disables system services that would waste CPU, trigger unexpected UI, or interfere with test reliability. - -**Services disabled:** - -```bash -# Notification center — can overlay UI and interfere with tests -launchctl unload -w /System/Library/LaunchAgents/com.apple.notificationcenterui.plist - -# Analytics/diagnostics — wastes CPU and network -sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist - -# Time Machine — disk I/O interference -sudo tmutil disable -sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.backupd.plist - -# Apple Push Notification Service — unnecessary in CI -sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.apsd.plist - -# Performance/Power Management — CPU overhead -sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.PerfPowerServices.plist -``` - -**Additional optimizations:** - -```bash -# Disable animations and transparency (faster UI, less GPU load) -defaults write com.apple.universalaccess reduceMotion -bool true -defaults write com.apple.universalaccess reduceTransparency -bool true - -# Set solid black wallpaper (avoids dynamic wallpaper CPU usage) -osascript -e 'tell application "Finder" to set desktop picture to POSIX file "/System/Library/Desktop Pictures/Solid Colors/Black.png"' - -# Close all Finder windows (can interfere with UI tests) -close_finder_window -``` - -**Why:** - -Every unnecessary service is a potential source of: -- Non-deterministic test failures (unexpected windows/dialogs) -- CPU/disk contention (slows builds and tests) -- Network traffic (unnecessary connections) - ---- - -## Sleep and Power Management Disabled - -**Relevant file:** - -- `images/macos/scripts/build/configure-machine.sh` (lines 13–20) - -**What it does:** - -Ensures the VM never sleeps, hibernates, or dims the display. - -```bash -# Disable hibernation and remove sleep image -sudo pmset -a hibernatemode 0 -sudo rm -f /var/vm/sleepimage - -# Disable all sleep modes -sudo pmset -a sleep 0 disksleep 0 displaysleep 0 - -# Disable App Nap system-wide -defaults write NSGlobalDomain NSAppSleepDisabled -bool YES -``` - -**Why:** - -A sleeping VM would be unresponsive to SSH commands and job requests. App Nap could throttle background processes (like build tools or test runners) if macOS decides they're "inactive." - ---- - -## Automatic Software Updates Disabled - -**Relevant file:** - -- `images/macos/scripts/build/configure-auto-updates.sh` - -```bash -sudo softwareupdate --schedule off -defaults write com.apple.SoftwareUpdate AutomaticDownload -int 0 -defaults write com.apple.SoftwareUpdate CriticalUpdateInstall -int 0 -defaults write com.apple.commerce AutoUpdate -bool false -defaults write com.apple.SoftwareUpdate AutomaticCheckEnabled -bool false -``` - -**Why:** - -Automatic updates would: -- Change the installed software unexpectedly (breaking reproducibility) -- Consume bandwidth and CPU during jobs -- Potentially trigger restart prompts - ---- - -## Provisioner Agent Installation - -**Relevant files:** - -- `images/macos/assets/bootstrap-provisioner/installNewProvisioner.sh` -- `images/macos/assets/bootstrap-provisioner/change_password` - -**What it does:** - -Installs a **provisioner agent** binary at `/usr/local/opt//provisioner/provisioner` with a wrapper script at `/usr/local/opt//runprovisioner.sh`. This is the process that receives and executes Actions runner jobs. - -**How it works:** - -1. Creates the provisioner directory structure -2. Downloads the provisioner binary and install script via `aria2c` -3. Runs the install script -4. Creates a `runprovisioner.sh` wrapper that sources `.bashrc` and launches the binary -5. Writes a state file (`provisionerDone`) to signal completion - -```bash -PROVISIONER_ROOT=/usr/local/opt/${Username} -sudo mkdir -p ${PROVISIONER_ROOT} - -tee -a ${PROVISIONER_ROOT}/runprovisioner.sh > /dev/null <<\EOF -#!/bin/bash -. ${HOME}/.bashrc -/usr/local/opt/$USER/provisioner/provisioner -EOF -``` - -The provisioner is pre-granted extensive TCC permissions (accessibility, screen capture, Apple Events, full disk access, microphone, Bluetooth) so it can drive the system without any consent prompts. - -**Why:** - -The provisioner is the orchestration layer between GitHub's infrastructure and the macOS VM. It needs deep system access to: -- Launch and monitor runner processes -- Interact with the GUI for UI testing workloads -- Manage the VM lifecycle (password rotation, etc.) - ---- - -## Window Management at Build Time - -**Relevant file:** - -- `images/macos/scripts/build/configure-windows.sh` - -**What it does:** - -Ensures no stray windows are open in the GUI session before the image is finalized. On ARM64 machines, it also kills the Setup Assistant that auto-launches on first boot. - -```bash -# Close System Preferences (opens by default on ARM64 Ventura+) -osascript -e 'tell application "System Preferences" to quit' - -# Kill Setup Assistant if running -if pgrep -x "Setup Assistant" >/dev/null 2>&1; then - osascript -e 'tell application "Setup Assistant" to quit' 2>/dev/null || true -fi - -# Verify no unexpected windows remain -openwindows=$(osascript -e 'tell application "System Events" to get every window of (every process whose class of windows contains window)') -``` - -**Why:** - -Open windows in the saved image would appear in every job run, potentially interfering with UI tests or causing non-deterministic behavior. - ---- - -## Developer Mode and Accessibility - -**Relevant file:** - -- `images/macos/scripts/build/configure-machine.sh` (lines 9–31) - -```bash -# Enable developer mode (allows attaching debuggers, running unsigned code, etc.) -sudo /usr/sbin/DevToolsSecurity --enable - -# Suppress Keyboard Setup Assistant -sudo defaults write /Library/Preferences/com.apple.keyboardtype "keyboardtype" -dict-add "3-7582-0" -int 40 - -# Enable VoiceOver AppleScript control (requires SIP disabled) -sudo bash -c 'echo -n "a" > /private/var/db/Accessibility/.VoiceOverAppleScriptEnabled' -defaults write com.apple.VoiceOver4/default SCREnableAppleScript -bool YES -``` - -**Why:** - -- Developer mode is required for Xcode debugging and running tests -- The Keyboard Setup Assistant dialog would block the session on first boot -- VoiceOver scripting support enables accessibility testing without user interaction - ---- - -## NOPASSWD Sudo Access - -**Relevant file:** - -- `images/macos/scripts/build/configure-machine.sh` (lines 99–100) - -```bash -sudo sed -i '' 's/%admin ALL = (ALL) ALL/%admin ALL = (ALL) NOPASSWD: ALL/g' /etc/sudoers -``` - -**Why:** - -Build scripts and the provisioner frequently need root access. Without NOPASSWD, every `sudo` call would prompt for a password, blocking automation. - ---- - -## Summary: The Full Boot Sequence - -When a macOS runner VM boots: - -1. **Anka** starts the VM on physical Mac hardware -2. **Auto-login** kicks in — the user session starts without a login screen -3. **WindowServer** launches the GUI (needed for simulators and UI tests) -4. **No consent dialogs** appear thanks to pre-populated TCC entries -5. **The provisioner agent** starts and connects to GitHub's infrastructure -6. **Jobs execute** with full system access — accessibility, screen capture, Apple Events, etc. -7. **Nothing sleeps**, nothing updates, nothing prompts — the VM is a fully automated, unattended workstation. - -The result is not "headless" in the traditional sense (WindowServer is running, there's a full Aqua session), but it behaves like a headless system from the perspective of automation: no human interaction is ever required or expected. - ---- - -## Additional Tricks and Techniques - -### Dynamic Hostname Generation at Boot - -**Relevant file:** - -- `images/macos/scripts/build/configure-hostname.sh` - -**What it does:** - -Installs a LaunchDaemon that generates a unique hostname every time the VM boots, based on the current timestamp. - -```bash -name="Mac-$(python3 -c 'from time import time; print(int(round(time() * 1000)))')" -scutil --set HostName "${name}.local" -scutil --set LocalHostName $name -scutil --set ComputerName "${name}.local" -``` - -**Why:** - -Since many VMs are cloned from the same base image and run simultaneously, they'd all share the same hostname. This causes Bonjour/mDNS conflicts on the network. The `.local` suffix is intentional — without it, macOS can have DNS resolution issues in certain network configurations. A millisecond-precision timestamp ensures uniqueness without needing external coordination. - ---- - -### Parallel Xcode Installation (5 at a Time) - -**Relevant files:** - -- `images/macos/scripts/build/Install-Xcode.ps1` -- `images/macos/scripts/helpers/Xcode.Installer.psm1` - -**What it does:** - -Downloads and extracts multiple Xcode versions in parallel using PowerShell's `ForEach-Object -Parallel` with a throttle limit of 5. - -```powershell -$xcodeVersions | ForEach-Object -ThrottleLimit $threadCount -Parallel { - Install-XcodeVersion -Version $_.version -LinkTo $_.link -Sha256Sum $_.sha256 - Confirm-XcodeIntegrity -Version $_.link -} -``` - -**Why:** - -Xcode downloads are huge (10–30 GB each) and extraction is CPU-intensive. Installing them sequentially would take hours. Parallelizing with a throttle of 5 balances I/O throughput against available disk space (each XIP archive exists temporarily alongside the expanded app). - ---- - -### `unxip` — A Faster XIP Extractor - -**Relevant files:** - -- `images/macos/scripts/build/install-unxip.sh` -- `images/macos/scripts/helpers/Xcode.Installer.psm1` (line 57–61) - -**What it does:** - -Installs [saagarjha/unxip](https://github.com/saagarjha/unxip), a third-party replacement for Apple's `xip` tool, and uses it preferentially for Xcode extraction: - -```powershell -if ([boolean] (Get-Command 'unxip' -ErrorAction 'SilentlyContinue')) { - Invoke-ValidateCommand "unxip $xcodeXipPath" -} else { - Invoke-ValidateCommand "xip -x $xcodeXipPath" -} -``` - -**Why:** - -Apple's built-in `xip` command is single-threaded and very slow for large archives. `unxip` is significantly faster (often 3–5x) because it parallelizes decompression. When you're extracting multiple 15+ GB Xcode archives, this saves a massive amount of build time. The binary is pinned to a specific SHA-256 checksum for reproducibility. - ---- - -### AppleScript-Driven UI Automation for Kernel Extension Approval - -**Relevant files:** - -- `images/macos/scripts/helpers/confirm-identified-developers-macos15.scpt` -- `images/macos/scripts/build/install-common-utils.sh` (lines 49–76) - -**What it does:** - -Uses AppleScript to physically navigate System Settings, click the "Allow" button for third-party kernel extensions (Parallels), and enter the password — exactly as a human would. - -```applescript -tell application "System Settings" - activate - delay 5 -end tell - -tell application "System Events" - tell process "System Settings" - tell splitter group 1 of group 1 of window 1 - select row 27 of outline 1 of scroll area 1 of group 1 - click UI element 1 of row 27 of outline 1 of scroll area 1 of group 1 - keystroke userpassword - keystroke return - end tell - end tell -end tell -``` - -**Why:** - -macOS has no command-line API for approving third-party kernel extensions (kexts). Apple deliberately requires GUI interaction for security reasons. Since the VMs run with a full GUI session and have TCC permissions pre-granted for accessibility/AppleEvents, they can script the System Settings UI directly. The script includes retries because the UI can be timing-sensitive. - ---- - -### Kernel Extension Policy Validation via SQLite - -**Relevant file:** - -- `images/macos/scripts/build/install-common-utils.sh` (lines 79–93) - -**What it does:** - -After the AppleScript approves the Parallels kext, the script verifies the approval succeeded by querying the kernel extension policy database directly: - -```bash -dbName="/var/db/SystemPolicyConfiguration/KextPolicy" -dbQuery="SELECT * FROM kext_policy WHERE bundle_id LIKE 'com.parallels.kext.%';" -kext=$(sudo sqlite3 $dbName "$dbQuery") - -if [[ -z $kext ]]; then - echo "Parallels International GmbH not found" - exit 1 -fi -``` - -**Why:** - -AppleScript UI interactions are inherently fragile. Rather than trusting the script succeeded, it verifies the actual system state by querying the KextPolicy SQLite database — the same database the kernel reads to determine which extensions are allowed to load. - ---- - -### Homebrew Quarantine Bypass - -**Relevant file:** - -- `images/macos/assets/bashrc` (line 31) - -```bash -export HOMEBREW_CASK_OPTS="--no-quarantine" -``` - -**Why:** - -macOS marks downloaded files with a quarantine extended attribute (`com.apple.quarantine`). On first launch, this triggers a Gatekeeper dialog: "This app was downloaded from the internet. Are you sure you want to open it?" Setting `--no-quarantine` prevents Homebrew from applying this attribute, so cask-installed apps (Chrome, Firefox, etc.) launch without prompts. - ---- - -### Homebrew Auto-Update Suppression - -**Relevant file:** - -- `images/macos/assets/bashrc` (lines 29–30) - -```bash -export HOMEBREW_NO_AUTO_UPDATE=1 -export HOMEBREW_NO_INSTALL_CLEANUP=1 -``` - -**Why:** - -By default, every `brew install` triggers a `brew update` first (checking for formula updates). In CI this wastes time and risks introducing version drift mid-build. `NO_INSTALL_CLEANUP` prevents Homebrew from removing old versions during install, avoiding potential race conditions during parallel installs. - ---- - -### Shallow Git Clones for Homebrew Taps - -**Relevant file:** - -- `images/macos/scripts/build/install-homebrew.sh` (lines 23–24) - -```bash -git clone https://github.com/Homebrew/homebrew-cask $(brew --repository)/Library/Taps/homebrew/homebrew-cask \ - --origin=origin --template= --config core.fsmonitor=false --depth 1 -git clone https://github.com/Homebrew/homebrew-core $(brew --repository)/Library/Taps/homebrew/homebrew-core \ - --origin=origin --template= --config core.fsmonitor=false --depth 1 -``` - -**Why:** - -The homebrew-core repo has over 700,000 commits. A full clone would waste disk space and bandwidth. `--depth 1` grabs only the latest commit. `core.fsmonitor=false` disables the file system monitor (which would waste CPU watching thousands of formula files that never change in CI). - ---- - -### `expect`-Driven Software Updates for ARM64 - -**Relevant file:** - -- `images/macos/assets/auto-software-update-arm64.exp` - -```expect -spawn sudo /usr/sbin/softwareupdate --restart --verbose --install "MACOSUPDATE" -expect "Password*" -send "[lindex $argv 0]\r" -expect eof -``` - -**Why:** - -On ARM64 Macs, `softwareupdate` sometimes prompts for a password even when run with `sudo` (Apple Silicon secure boot requirements). The `expect` script automates this password entry. The placeholder `"MACOSUPDATE"` is replaced with the actual update label at runtime. - ---- - -### XCTest Command Line Tools Installation Trick - -**Relevant file:** - -- `images/macos/scripts/build/install-xcode-clt.sh` - -**What it does:** - -Triggers Apple's software update mechanism to list Command Line Tools by creating a specific marker file: - -```bash -clt_placeholder="/tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress" -sudo touch $clt_placeholder -``` - -Then parses the `softwareupdate -l` output for the latest CLT label and installs it. - -**Why:** - -There's no direct `xcode-select --install` equivalent that works non-interactively (it opens a GUI dialog). The `.installondemand.in-progress` marker file is an undocumented trick that tells `softwareupdate` to include Command Line Tools in its available updates list, enabling purely CLI-based installation. - ---- - -### Safari WebDriver Remote Automation - -**Relevant file:** - -- `images/macos/scripts/build/install-safari.sh` - -```bash -sudo safaridriver --enable - -mkdir -p $HOME/Library/WebDriver -safari_plist="$HOME/Library/WebDriver/com.apple.Safari.plist" -/usr/libexec/PlistBuddy -c 'delete AllowRemoteAutomation' $safari_plist || true -/usr/libexec/PlistBuddy -c 'add AllowRemoteAutomation bool true' $safari_plist -``` - -**Why:** - -Safari's WebDriver requires both the system-level driver to be enabled (`safaridriver --enable`) and the user-level "Allow Remote Automation" preference. Normally this is toggled in Safari's Develop menu — here it's set directly via `PlistBuddy` to avoid opening Safari's GUI. - ---- - -### Launch Services Database Rebuild for Xcode - -**Relevant file:** - -- `images/macos/scripts/helpers/Xcode.Installer.psm1` (lines 238–247) - -```powershell -function Initialize-XcodeLaunchServicesDb { - $lsregister = '/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister' - Get-ChildItem -Recurse -Filter "*.app" $xcodePath | Foreach-Object { & $lsregister -f $_.FullName } -} -``` - -**Why:** - -macOS's Launch Services maps file types to applications. After installing multiple Xcode versions (each containing hundreds of embedded `.app` bundles), the system needs to know about them for proper file associations and `open -a` functionality. Explicitly registering them ensures they're discoverable immediately rather than waiting for Spotlight to index them. - ---- - -### Dyld Shared Cache Pre-warming for Simulators - -**Relevant file:** - -- `images/macos/scripts/helpers/Xcode.Installer.psm1` (lines 326–335) - -```powershell -function Update-DyldCache { - Invoke-ValidateCommand "xcrun simctl runtime dyld_shared_cache update --all" -} -``` - -**Why:** - -The dynamic linker cache (`dyld_shared_cache`) is a pre-linked blob of all shared libraries. Without pre-warming it for simulator runtimes, the first simulator launch in a user's job would trigger an expensive cache build (potentially minutes of CPU time). Doing it at image build time means every job starts with a ready-to-use simulator. - ---- - -### Simulator Reset Across All Xcode Versions - -**Relevant file:** - -- `images/macos/scripts/build/configure-xcode.sh` - -```bash -for XCODE_VERSION in ${XCODE_LIST[@]}; do - launchctl remove com.apple.CoreSimulator.CoreSimulatorService || true - sleep 3 - sudo xcode-select -s /Applications/Xcode_${XCODE_VERSION}.app/Contents/Developer - xcrun simctl erase all - sleep 10 -done -``` - -**Why:** - -Each Xcode version has its own simulator runtime. Erasing all simulators ensures they start in a clean state (no leftover app data from the build process). The `launchctl remove` and sleep dance is needed because CoreSimulatorService caches state — it must be stopped and restarted for each Xcode version switch to properly erase that version's simulators. - ---- - -### Environment Variables for Non-Interactive Tool Behavior - -**Relevant file:** - -- `images/macos/assets/bashrc` - -```bash -export RCT_NO_LAUNCH_PACKAGER=1 # React Native: don't auto-launch Metro bundler -export DOTNET_MULTILEVEL_LOOKUP=0 # .NET: don't search for global SDKs -export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 # .NET: skip telemetry/welcome on first run -export DOTNET_NOLOGO=1 # .NET: suppress startup banner -export BOOTSTRAP_HASKELL_NONINTERACTIVE=1 # GHCup: never prompt -export BOOTSTRAP_HASKELL_INSTALL_NO_STACK_HOOK=1 # GHCup: skip shell hook -``` - -**Why:** - -Many developer tools have "first run" experiences — welcome messages, telemetry opt-ins, interactive setup wizards. Each of these would either waste time or block waiting for input. These environment variables disable all such behavior globally. - ---- - -### `brew_smart_install` — Resilient Homebrew Installation - -**Relevant file:** - -- `images/macos/scripts/helpers/utils.sh` (lines 93–135) - -**What it does:** - -A custom wrapper around `brew install` that: -1. Resolves all dependencies first (`brew deps`) -2. Pre-caches every dependency bottle (`brew --cache`) -3. Attempts installation with up to 10 retries, sleeping 60 seconds between attempts - -```bash -brew_smart_install() { - local tool_name=$1 - # Pre-cache dependencies - for dep in $(cat /tmp/$tool_name) $tool_name; do - for i in {1..10}; do - brew --cache $dep >/dev/null && failed=false || sleep 60 - done - done - # Install with retries - for i in {1..10}; do - brew install $tool_name && failed=false || sleep 60 - done -} -``` - -**Why:** - -Homebrew relies on GitHub and CDN infrastructure that can have transient failures. A single failed download would abort the entire multi-hour image build. By pre-caching dependencies and retrying aggressively, the build is resilient to temporary network issues. - ---- - -### UTC Timezone and Multiple NTP Servers - -**Relevant file:** - -- `images/macos/scripts/build/configure-ntpconf.sh` - -```bash -# Multiple NTP sources for reliability -server 0.pool.ntp.org -server 1.pool.ntp.org -server 2.pool.ntp.org -server 3.pool.ntp.org -server time.apple.com -server time.windows.com - -# Force UTC -ln -sf /usr/share/zoneinfo/UTC /etc/localtime -``` - -**Why:** - -CI jobs must have consistent, accurate timestamps for: -- Cache invalidation and artifact signing -- Certificate validation -- Log correlation across distributed systems -- Reproducible builds - -UTC avoids daylight saving time surprises. Multiple NTP servers ensure the clock stays accurate even if one server is unreachable. - ---- - -### Actions Cache Pre-population - -**Relevant file:** - -- `images/macos/scripts/build/install-actions-cache.sh` - -**What it does:** - -Downloads the latest release of `actions/action-versions` (a tarball of common GitHub Actions at specific versions) and unpacks it to `$ACTIONS_RUNNER_ACTION_ARCHIVE_CACHE`. - -**Why:** - -When a workflow uses `actions/checkout@v4`, the runner normally downloads that action at job start. By pre-caching popular actions in the image, jobs start faster — the runner finds the action locally instead of fetching from GitHub. - ---- - -### Pinning Deprecated Homebrew Formulae by Git Commit - -**Relevant files:** - -- `images/macos/scripts/build/install-openssl.sh` -- `images/macos/scripts/build/install-rust.sh` - -**What it does:** - -When a formula has been deprecated/removed from Homebrew (like `openssl@1.1`) or needs pinning to a specific version (like `rustup`), the scripts download the formula file from a specific Git commit and install it with API fetching disabled: - -```bash -COMMIT=d91dabd087cb0b906c92a825df9e5e5e1a4f59f8 -FORMULA_URL="https://raw.githubusercontent.com/Homebrew/homebrew-core/$COMMIT/Formula/o/openssl@1.1.rb" -FORMULA_PATH="$(brew --repository)/Library/Taps/homebrew/homebrew-core/Formula/o/openssl@1.1.rb" -mkdir -p "$(dirname $FORMULA_PATH)" -curl -fsSL $FORMULA_URL -o $FORMULA_PATH -HOMEBREW_NO_AUTO_UPDATE=1 HOMEBREW_NO_INSTALL_FROM_API=1 brew install openssl@1.1 -``` - -**Why:** - -Homebrew aggressively deprecates and removes formulae. Users still depend on these packages (openssl@1.1 for legacy compatibility, specific rustup versions to avoid regressions). By pinning to a known-good commit of the formula and bypassing the API (`HOMEBREW_NO_INSTALL_FROM_API=1`), the image can install software that Homebrew no longer officially supports. - ---- - -### Quarantine Removal for `.pkg` Installers - -**Relevant file:** - -- `images/macos/scripts/build/install-powershell.sh` (line 26) - -```bash -sudo xattr -rd com.apple.quarantine $pkg_path -``` - -**Why:** - -On macOS Big Sur 11.5+, the `installer` command can refuse to open `.pkg` files that have the quarantine extended attribute (downloaded from the internet). Stripping `com.apple.quarantine` before running `sudo installer -pkg` prevents the "can't be opened because Apple cannot check it for malicious software" error. This is separate from the Homebrew `--no-quarantine` flag — it applies to manually downloaded packages. - ---- - -### Git `safe.directory` Wildcard - -**Relevant file:** - -- `images/macos/scripts/build/install-git.sh` (line 12) - -```bash -git config --global --add safe.directory "*" -``` - -**Why:** - -Git 2.35.2+ introduced ownership checks — it refuses to operate in directories owned by a different user (CVE-2022-24765). In CI, runners frequently check out repos into directories with mismatched ownership (e.g., root-owned workspace, runner user executing git). The wildcard `"*"` disables this check globally, preventing confusing "dubious ownership" errors during jobs. - ---- - -### Suppressing All Git Advice Messages - -**Relevant file:** - -- `images/macos/scripts/build/install-git.sh` (lines 23–36) - -```bash -git config --global advice.pushUpdateRejected false -git config --global advice.pushNonFFCurrent false -git config --global advice.pushNonFFMatching false -git config --global advice.pushAlreadyExists false -git config --global advice.pushFetchFirst false -git config --global advice.pushNeedsForce false -git config --global advice.statusHints false -git config --global advice.statusUoption false -git config --global advice.commitBeforeMerge false -git config --global advice.resolveConflict false -git config --global advice.implicitIdentity false -git config --global advice.detachedHead false -git config --global advice.amWorkDir false -git config --global advice.rmHints false -``` - -**Why:** - -Git's advice messages (e.g., "hint: Updates were rejected because the tip of your current branch is behind") add noise to CI logs and can confuse log parsing. Disabling them all makes output cleaner and easier to parse programmatically. - ---- - -### Toolcache Convention with `.complete` Marker Files - -**Relevant files:** - -- `images/macos/scripts/build/install-openjdk.sh` (lines 69–73) -- `images/macos/scripts/build/install-ruby.sh` (lines 54–58) -- `images/macos/scripts/build/install-codeql-bundle.sh` (lines 43–44) - -**What it does:** - -After extracting a tool to the toolcache directory, a zero-byte `.complete` file is created: - -```bash -# Java -touch ${javaToolcacheVersionPath}/x64.complete - -# Ruby -touch $complete_file_path # e.g., Ruby/3.2.0/arm64.complete - -# CodeQL -touch "$codeql_toolcache_path/pinned-version" -touch "$codeql_toolcache_path.complete" -``` - -**Why:** - -The Actions runner uses these marker files to determine whether a tool version is fully installed. Without the `.complete` file, `setup-java`, `setup-ruby`, etc. would consider the tool missing and attempt to re-download it. This is a contract between the image and the `actions/setup-*` family of actions — they check for `/.complete` before installing. - ---- - -### Browser Auto-Update Prevention - -**Relevant file:** - -- `images/macos/scripts/build/install-edge.sh` (lines 44–63) - -**What it does:** - -Creates a managed preferences plist to disable Microsoft Edge auto-updates: - -```bash -cat < /dev/null - - - updatePolicies - - global - - UpdateDefault - 3 - - - - -EOF -``` - -**Why:** - -Browser auto-updates in CI are catastrophic — they can change the browser version mid-workflow, breaking Selenium/WebDriver compatibility. The `UpdateDefault: 3` policy means "updates disabled." Edge uses its own updater (EdgeUpdater) separate from macOS software update, requiring this separate managed preference. - ---- - -### Matched ChromeDriver and "Chrome for Testing" Versions - -**Relevant file:** - -- `images/macos/scripts/build/install-chrome.sh` - -**What it does:** - -After installing Google Chrome via Homebrew cask, the script: -1. Parses Chrome's exact version -2. Queries the Chrome for Testing API to find the matching ChromeDriver version -3. Installs both ChromeDriver AND a separate "Google Chrome for Testing" app - -```bash -full_chrome_version=$("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --version) -chrome_version=${full_chrome_version%.*} # Strip patch version -chromedriver_url=$(cat $chrome_versions_json | jq -r '.builds["'"$chrome_version"'"].downloads.chromedriver[]...') -``` - -**Why:** - -ChromeDriver must match the installed Chrome version exactly (major version at minimum). If they're mismatched, Selenium tests fail with cryptic version errors. "Chrome for Testing" is a separate, automation-optimized build that doesn't auto-update — giving users a stable target for their test suites. - ---- - -### Duplicate Simulator Cleanup - -**Relevant file:** - -- `images/macos/scripts/build/Configure-Xcode-Simulators.ps1` - -**What it does:** - -Iterates through every Xcode version's simulators and removes duplicates (keeping the older-created one): - -```powershell -if ($sameRuntimeDevices[$i].DeviceName -eq $sameRuntimeDevices[$i+1].DeviceName) { - if ($sameRuntimeDevices[$i].DeviceCreationTime -lt $sameRuntimeDevices[$i+1].DeviceCreationTime) { - xcrun simctl delete $sameRuntimeDevices[$i+1].DeviceId - } -} -``` - -**Why:** - -When multiple Xcode versions share simulator runtimes, the same device type can get created multiple times. Duplicate simulators waste disk space and can cause ambiguity when tests target a device by name. This script ensures exactly one simulator per device type per runtime. - ---- - -### `.bashrc` as the Central Environment Configuration - -**Relevant file:** - -- `images/macos/assets/bashrc` -- `images/macos/assets/bashprofile` (just sources `.bashrc`) - -**What it does:** - -All environment configuration lives in `.bashrc`, with `.bash_profile` being a one-liner: - -```bash -# .bash_profile -[ -f $HOME/.bashrc ] && source $HOME/.bashrc -``` - -Throughout the build, scripts append to `.bashrc`: -```bash -echo "export JAVA_HOME_11_X64=..." >> ${HOME}/.bashrc -echo "export ANDROID_NDK_HOME=..." >> ${HOME}/.bashrc -echo "export CHROMEWEBDRIVER=..." >> ${HOME}/.bashrc -``` - -**Why:** - -On macOS, login shells source `.bash_profile` while non-login shells source `.bashrc`. SSH sessions (how Packer connects) use login shells, but scripts spawned within jobs may use non-login shells. By putting everything in `.bashrc` and sourcing it from `.bash_profile`, environment variables are available regardless of how the shell is invoked. - ---- - -### Symlink for Java Discovery via `/usr/libexec/java_home` - -**Relevant file:** - -- `images/macos/scripts/build/install-openjdk.sh` (line 77) - -```bash -sudo ln -sf ${javaToolcacheVersionArchPath} /Library/Java/JavaVirtualMachines/Temurin-Hotspot-${JAVA_VERSION}.jdk -``` - -**Why:** - -macOS's built-in `/usr/libexec/java_home` tool discovers JDKs by scanning `/Library/Java/JavaVirtualMachines/`. The toolcache stores JDKs in a different location (`$HOME/hostedtoolcache/Java_Temurin-Hotspot_jdk/...`). The symlink makes the toolcache-installed JDKs visible to `java_home`, so tools like Gradle and Maven that rely on `java_home` can find them without extra configuration. - ---- - -### Initializing Az PowerShell Module Cache - -**Relevant file:** - -- `images/macos/scripts/build/install-powershell.sh` (line 62) - -```bash -pwsh -command "& {Import-Module Az}" -``` - -**Why:** - -The comment says "A dummy call to initialize .IdentityService directory." Azure PowerShell modules create credential cache directories on first import. If this happens during a user's job, it may fail due to race conditions or permission issues. Running it once at image build time ensures the directory structure exists and has correct permissions. - ---- - -### `close_finder_window` Called Before Python Installation - -**Relevant file:** - -- `images/macos/scripts/build/install-python.sh` (line 12) - -```bash -# Close Finder window -close_finder_window -``` - -**Why:** - -The Python installer (and some Homebrew cask operations) can trigger Finder windows to open (e.g., showing the Applications folder or mounted DMG volumes). If these windows are left open during subsequent steps, they can interfere with the UI-window-validation in `configure-windows.sh` which fails the build if unexpected windows are detected. Proactively closing Finder windows before known-noisy installs prevents this. - ---- - -### `download_with_retry` — IPv4-Forced Downloads with Extensive Retries - -**Relevant file:** - -- `images/macos/scripts/helpers/utils.sh` (lines 3–42) - -```bash -download_with_retry() { - for ((retries=20; retries>0; retries--)); do - if http_code=$(curl -4sSLo "$download_path" "$url" -w '%{http_code}'); then - ... - fi - sleep $interval # 30 seconds - done -} -``` - -Key details: -- **`-4` flag**: Forces IPv4 connections -- **20 retries × 30 second intervals**: Up to 10 minutes of retry time -- **HTTP status code checking**: Treats non-200 responses as failures even if `curl` succeeds - -**Why:** - -The `-4` (IPv4-only) flag is notable — some CI environments have flaky IPv6 connectivity or DNS resolution issues with AAAA records. Forcing IPv4 avoids a common class of transient network failures. The aggressive retry pattern (20 attempts) reflects the reality that large downloads from CDNs, GitHub Releases, and Azure Blob Storage can fail intermittently at scale. diff --git a/hk.pkl b/hk.pkl index bf99ffd..32323e1 100644 --- a/hk.pkl +++ b/hk.pkl @@ -1,68 +1,58 @@ -amends "package://github.com/jdx/hk/releases/download/v2.1.0/hk@2.1.0#/Config.pkl" +amends "package://github.com/jdx/hk/releases/download/v2.3.0/hk@2.3.0#/Config.pkl" -import "package://github.com/jdx/hk/releases/download/v2.1.0/hk@2.1.0#/Builtins.pkl" +import "package://github.com/jdx/hk/releases/download/v2.3.0/hk@2.3.0#/Builtins.pkl" fail_fast = false env { - ["HK_MISE"] = "true" + ["HK_MISE"] = "1" } -local custom_linters = new Mapping { - ["ansible-lint"] { - glob = - List( - "playbooks/**/*.yml", - "roles/**/*.yml", - "inventory/**/*.yml", - "ansible.cfg", - ".ansible-lint", - ) - check = "ansible-lint" - fix = "ansible-lint --fix" +steps { + ["packer"] = new Step { + glob = "*.pkr.hcl" + check = "packer fmt -check {{ files }}" + fix = "packer fmt {{ files }}" } -} -local builtin_linters = new Mapping { + // Builtins + ["actionlint"] = Builtins.actionlint + ["editorconfig-checker"] = Builtins.editorconfig_checker ["mise"] = Builtins.mise ["pkl"] = Builtins.pkl ["pkl-format"] = Builtins.pkl_format - ["ruff"] = Builtins.ruff + ["ryl"] = Builtins.ryl ["shellcheck"] = Builtins.shellcheck ["shfmt"] = Builtins.shfmt ["tombi"] = Builtins.tombi -} -local utility_linters = new Mapping { + ["ls-lint"] = (Builtins.ls_lint) { + check { + command { + argv = Builtins.ls_lint.check.command.argv + List("-config", ".config/ls-lint.yml") + } + } + } + ["lychee"] = (Builtins.lychee) { + exclude = "mise.lock" + check { + command { + argv = Builtins.lychee.check.command.argv + List("--config", ".config/lychee.toml") + } + } + } + + // Utilities ["byte-order-marker"] = Builtins.byte_order_marker ["check-added-large-files"] = Builtins.check_added_large_files ["check-case-conflict"] = Builtins.check_case_conflict ["check-executables-have-shebangs"] = Builtins.check_executables_have_shebangs ["check-merge-conflict"] = Builtins.check_merge_conflict ["check-symlinks"] = Builtins.check_symlinks + ["destroyed_symlinks"] = Builtins.destroyed_symlinks ["detect-private-key"] = Builtins.detect_private_key ["fix-smart-quotes"] = Builtins.fix_smart_quotes + ["forbid-submodules"] = Builtins.forbid_submodules ["mixed-line-ending"] = Builtins.mixed_line_ending ["newlines"] = Builtins.newlines ["trailing-whitespace"] = Builtins.trailing_whitespace } - -local all_linters = new Mapping { - ...custom_linters - ...builtin_linters - ...utility_linters -} - -hooks { - ["pre-commit"] { - fix = true - stash = "git" - steps = all_linters - } - ["fix"] { - fix = true - steps = all_linters - } - ["check"] { - steps = all_linters - } -} diff --git a/inventory/group_vars/macos_15_agents.yml b/inventory/group_vars/macos_15_agents.yml deleted file mode 100644 index 5140f2d..0000000 --- a/inventory/group_vars/macos_15_agents.yml +++ /dev/null @@ -1,22 +0,0 @@ ---- -# Preset for hosts in inventory group macos_15_agents. - -# Xcode - -# Xcode .xip files must be pre-staged in the admin user's Downloads folder before provisioning. -xcode_default_version: "26.0.1" -xcode_simruntime_downloads: - - build_version: "18.2" - - build_version: "18.6" - - build_version: "26.0.1" - architecture_variant: arm64 -xcode_simulators: - - name: "iPhone 16" - device_type: "iPhone 16" - runtime: "com.apple.CoreSimulator.SimRuntime.iOS-18-2" - - name: "iPhone 16" - device_type: "iPhone 16" - runtime: "com.apple.CoreSimulator.SimRuntime.iOS-18-6" - - name: "iPhone 17" - device_type: "iPhone 17" - runtime: "com.apple.CoreSimulator.SimRuntime.iOS-26-0" diff --git a/inventory/group_vars/macos_26_agents.yml b/inventory/group_vars/macos_26_agents.yml deleted file mode 100644 index a3bf2ea..0000000 --- a/inventory/group_vars/macos_26_agents.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -# Preset for hosts in inventory group macos_26_agents. - -# Xcode - -# Xcode .xip files must be pre-staged in the admin user's Downloads folder before provisioning. -xcode_default_version: "26.5.0" -xcode_simruntime_downloads: - - build_version: "26.0.1" - architecture_variant: arm64 - - build_version: "26.5" - architecture_variant: arm64 -xcode_simulators: - - name: "iPhone 17" - device_type: "iPhone 17" - runtime: "com.apple.CoreSimulator.SimRuntime.iOS-26-0" - - name: "iPhone 17" - device_type: "iPhone 17" - runtime: "com.apple.CoreSimulator.SimRuntime.iOS-26-5" diff --git a/inventory/group_vars/macos_agents.yml b/inventory/group_vars/macos_agents.yml deleted file mode 100644 index 5d9337d..0000000 --- a/inventory/group_vars/macos_agents.yml +++ /dev/null @@ -1,43 +0,0 @@ ---- -macos_admin_user: admin -macos_admin_password: admin - -ansible_become_password: "{{ macos_admin_password }}" -ansible_connection: ssh -ansible_user: "{{ macos_admin_user }}" -ansible_password: "{{ macos_admin_password }}" -ansible_ssh_password_mechanism: ssh_askpass - -xcode_install_enabled: true -macos_update_enabled: true - -# Homebrew - -homebrew_upgrade_all_packages: true - -homebrew_installed_packages: - - bash - - curl - - dockutil - - git - - git-lfs - - mise - - python - - unxip - - xcodes - -# Dock - -dockitems_apps: - - name: Safari - path: /Applications/Safari.app/ - - name: Terminal - path: /System/Applications/Utilities/Terminal.app/ - - name: System Settings - path: /System/Applications/System Settings.app/ - -dockitems_folders: - - name: Applications - path: /Applications/ - - name: Downloads - path: ~/Downloads diff --git a/inventory/group_vars/orka_agents.yml b/inventory/group_vars/orka_agents.yml deleted file mode 100644 index d672398..0000000 --- a/inventory/group_vars/orka_agents.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -homebrew_installed_packages_additional: - - orka-vm-tools - -macos_update_enabled: true - -system_config_hostname_prefix: orka diff --git a/inventory/group_vars/tart_agents.yml b/inventory/group_vars/tart_agents.yml deleted file mode 100644 index 296468d..0000000 --- a/inventory/group_vars/tart_agents.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -homebrew_taps_additional: - - cirruslabs/cli - -homebrew_installed_packages_additional: - - tart-guest-agent - -system_config_hostname_prefix: tart diff --git a/inventory/macos_inventory.py b/inventory/macos_inventory.py deleted file mode 100755 index 4bb1e98..0000000 --- a/inventory/macos_inventory.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env python3 -""" -Dynamic inventory script for macOS VMs (Tart or Orka). - -Set VM_PROVIDER to 'tart' or 'orka', and VM_NAME to the VM name. - -Usage (Ansible calls these automatically): - VM_PROVIDER=tart VM_NAME=macos:26 ./macos_inventory.py --list - VM_PROVIDER=orka VM_NAME=orka-agent-thmpm ./macos_inventory.py --list - VM_PROVIDER=tart VM_NAME=macos:26 ./macos_inventory.py --host -""" - -import json -import os -import subprocess -import sys - - -def get_tart_hostvars(vm_name: str) -> dict | None: - result = subprocess.run( - ["tart", "ip", vm_name], - capture_output=True, - text=True, - check=False, - ) - if result.returncode != 0: - return None - ip = result.stdout.strip() - return {"ansible_host": ip} if ip else None - - -def get_orka_hostvars(vm_name: str) -> dict | None: - result = subprocess.run( - ["orka3", "vm", "list", "-o", "json"], - capture_output=True, - text=True, - check=False, - ) - if result.returncode != 0: - print(f"Error: orka3 vm list failed: {result.stderr}", file=sys.stderr) - return None - for vm in json.loads(result.stdout): - if vm.get("name") == vm_name and vm.get("status") == "Running": - return {"ansible_host": vm["ip"], "ansible_port": vm["ssh"]} - return None - - -def list_inventory() -> dict: - provider = os.environ.get("VM_PROVIDER", "").strip().lower() - vm_name = os.environ.get("VM_NAME", "").strip() - - if not provider: - print("Error: VM_PROVIDER environment variable is not set (tart or orka)", file=sys.stderr) - sys.exit(1) - if provider not in ("tart", "orka"): - print(f"Error: VM_PROVIDER must be 'tart' or 'orka', got '{provider}'", file=sys.stderr) - sys.exit(1) - if not vm_name: - print("Error: VM_NAME environment variable is not set", file=sys.stderr) - sys.exit(1) - - get_hostvars = get_tart_hostvars if provider == "tart" else get_orka_hostvars - hostvars = get_hostvars(vm_name) - if not hostvars: - print(f"Error: could not find running VM '{vm_name}'", file=sys.stderr) - sys.exit(1) - - provider_group = f"{provider}_agents" - return { - "macos_agents": {"children": [provider_group]}, - provider_group: {"hosts": [vm_name]}, - "_meta": {"hostvars": {vm_name: hostvars}}, - } - - -def host_vars(vm_name: str) -> dict: - provider = os.environ.get("VM_PROVIDER", "").strip().lower() - get_hostvars = get_tart_hostvars if provider == "tart" else get_orka_hostvars - return get_hostvars(vm_name) or {} - - -if __name__ == "__main__": - if "--list" in sys.argv: - print(json.dumps(list_inventory(), indent=2)) - elif "--host" in sys.argv: - idx = sys.argv.index("--host") - print(json.dumps(host_vars(sys.argv[idx + 1]))) - else: - print( - "Usage: VM_PROVIDER= VM_NAME= macos_inventory.py [--list | --host ]", - file=sys.stderr, - ) - sys.exit(1) diff --git a/mise.lock b/mise.lock index 6271492..60d83f2 100644 --- a/mise.lock +++ b/mise.lock @@ -1,94 +1,256 @@ -# @generated - this file is auto-generated by `mise lock` https://mise.en.dev/dev-tools/mise-lock.html +# @generated - this file is auto-generated by `mise lock` https://mise.jdx.dev/dev-tools/mise-lock.html lockfile_version = 2 +[[tools.actionlint]] +version = "1.7.12" +backend = "aqua:rhysd/actionlint" +specifiers = ["latest"] + +[tools.actionlint."platforms.linux-arm64"] +checksum = "sha256:325e971b6ba9bfa504672e29be93c24981eeb1c07576d730e9f7c8805afff0c6" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.12/actionlint_1.7.12_linux_arm64.tar.gz" +url_api = "https://api.github.com/repos/rhysd/actionlint/releases/assets/384924897" +provenance = "github-attestations" + +[tools.actionlint."platforms.linux-arm64-musl"] +checksum = "sha256:325e971b6ba9bfa504672e29be93c24981eeb1c07576d730e9f7c8805afff0c6" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.12/actionlint_1.7.12_linux_arm64.tar.gz" +url_api = "https://api.github.com/repos/rhysd/actionlint/releases/assets/384924897" +provenance = "github-attestations" + +[tools.actionlint."platforms.linux-x64"] +checksum = "sha256:8aca8db96f1b94770f1b0d72b6dddcb1ebb8123cb3712530b08cc387b349a3d8" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.12/actionlint_1.7.12_linux_amd64.tar.gz" +url_api = "https://api.github.com/repos/rhysd/actionlint/releases/assets/384924896" +provenance = "github-attestations" + +[tools.actionlint."platforms.linux-x64-musl"] +checksum = "sha256:8aca8db96f1b94770f1b0d72b6dddcb1ebb8123cb3712530b08cc387b349a3d8" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.12/actionlint_1.7.12_linux_amd64.tar.gz" +url_api = "https://api.github.com/repos/rhysd/actionlint/releases/assets/384924896" +provenance = "github-attestations" + +[tools.actionlint."platforms.macos-arm64"] +checksum = "sha256:aba9ced2dee8d27fecca3dc7feb1a7f9a52caefa1eb46f3271ea66b6e0e6953f" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.12/actionlint_1.7.12_darwin_arm64.tar.gz" +url_api = "https://api.github.com/repos/rhysd/actionlint/releases/assets/384924893" +provenance = "github-attestations" + +[tools.actionlint."platforms.macos-x64"] +checksum = "sha256:5b44c3bc2255115c9b69e30efc0fecdf498fdb63c5d58e17084fd5f16324c644" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.12/actionlint_1.7.12_darwin_amd64.tar.gz" +url_api = "https://api.github.com/repos/rhysd/actionlint/releases/assets/384924880" +provenance = "github-attestations" + +[tools.actionlint."platforms.windows-x64"] +checksum = "sha256:6e7241b51e6817ea6a047693d8e6fed13b31819c9a0dd6c5a726e1592d22f6e9" +url = "https://github.com/rhysd/actionlint/releases/download/v1.7.12/actionlint_1.7.12_windows_amd64.zip" +url_api = "https://api.github.com/repos/rhysd/actionlint/releases/assets/384924919" +provenance = "github-attestations" + +[[tools."aqua:owenlamont/ryl"]] +version = "0.22.0" +backend = "aqua:owenlamont/ryl" +specifiers = ["latest"] + +[tools."aqua:owenlamont/ryl"."platforms.linux-arm64"] +checksum = "sha256:1045ea5807ae274c0812f63f73469018b58f822c8987e22b71f9995be971a6dd" +url = "https://github.com/owenlamont/ryl/releases/download/v0.22.0/ryl-aarch64-unknown-linux-gnu.tar.gz" +url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/547221094" +provenance = "github-attestations" + +[tools."aqua:owenlamont/ryl"."platforms.linux-arm64-musl"] +checksum = "sha256:e2756acb29fac8a1963ef6477f557d31bd9b6a1fb0d745dcb2c5c24714e20910" +url = "https://github.com/owenlamont/ryl/releases/download/v0.22.0/ryl-aarch64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/547221095" +provenance = "github-attestations" + +[tools."aqua:owenlamont/ryl"."platforms.linux-x64"] +checksum = "sha256:e51be237168ff44c8e28caca87db35c15ac5c943bba5edba0e72465b51add524" +url = "https://github.com/owenlamont/ryl/releases/download/v0.22.0/ryl-x86_64-unknown-linux-gnu.tar.gz" +url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/547221116" +provenance = "github-attestations" + +[tools."aqua:owenlamont/ryl"."platforms.linux-x64-musl"] +checksum = "sha256:43625dd5c968b2c08e875a8121b2c441bd5059414d8d1fbe8d791cf6bfde402c" +url = "https://github.com/owenlamont/ryl/releases/download/v0.22.0/ryl-x86_64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/547221117" +provenance = "github-attestations" + +[tools."aqua:owenlamont/ryl"."platforms.macos-arm64"] +checksum = "sha256:512051556cc92b3bfcb21c434072dcb3de7088af4982439ff0cce7888819f501" +url = "https://github.com/owenlamont/ryl/releases/download/v0.22.0/ryl-aarch64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/547221097" +provenance = "github-attestations" + +[tools."aqua:owenlamont/ryl"."platforms.windows-x64"] +checksum = "sha256:c0b3c8520b0d749d5df974e9638110a7169cde1d8febd6a4e68e802c5de7a70d" +url = "https://github.com/owenlamont/ryl/releases/download/v0.22.0/ryl-x86_64-pc-windows-msvc.zip" +url_api = "https://api.github.com/repos/owenlamont/ryl/releases/assets/547221108" +provenance = "github-attestations" + +[[tools.editorconfig-checker]] +version = "4.0.2" +backend = "github:editorconfig-checker/editorconfig-checker" +specifiers = ["latest"] + +[tools.editorconfig-checker."platforms.linux-arm64"] +checksum = "sha256:abad76da8c9950fdc2a314bcd66969172aa823e9c595fa7e3a389a91e34d025e" +url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v4.0.2/editorconfig-checker-linux-arm64.tar.gz" +url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/574675779" +provenance = "github-attestations" + +[tools.editorconfig-checker."platforms.linux-arm64-musl"] +checksum = "sha256:abad76da8c9950fdc2a314bcd66969172aa823e9c595fa7e3a389a91e34d025e" +url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v4.0.2/editorconfig-checker-linux-arm64.tar.gz" +url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/574675779" +provenance = "github-attestations" + +[tools.editorconfig-checker."platforms.linux-x64"] +checksum = "sha256:44efaef3ed14c6ab52eb87481d78e5e5c204796dccf26e2f4598a61ba17f8003" +url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v4.0.2/editorconfig-checker-linux-amd64.tar.gz" +url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/574675771" +provenance = "github-attestations" + +[tools.editorconfig-checker."platforms.linux-x64-musl"] +checksum = "sha256:44efaef3ed14c6ab52eb87481d78e5e5c204796dccf26e2f4598a61ba17f8003" +url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v4.0.2/editorconfig-checker-linux-amd64.tar.gz" +url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/574675771" +provenance = "github-attestations" + +[tools.editorconfig-checker."platforms.macos-arm64"] +checksum = "sha256:ff59f57717d95fc62b8e372c8051dbbb766f7d660942409a85d027b0feb2422c" +url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v4.0.2/editorconfig-checker-darwin-all.tar.gz" +url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/574675773" +provenance = "github-attestations" + +[tools.editorconfig-checker."platforms.macos-x64"] +checksum = "sha256:ff59f57717d95fc62b8e372c8051dbbb766f7d660942409a85d027b0feb2422c" +url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v4.0.2/editorconfig-checker-darwin-all.tar.gz" +url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/574675773" +provenance = "github-attestations" + +[tools.editorconfig-checker."platforms.windows-x64"] +checksum = "sha256:857f8f74dfc259d73dac93573e37cf3ce01150787d7b139bf839549cc6b5beb9" +url = "https://github.com/editorconfig-checker/editorconfig-checker/releases/download/v4.0.2/editorconfig-checker-windows-amd64.zip" +url_api = "https://api.github.com/repos/editorconfig-checker/editorconfig-checker/releases/assets/574675794" +provenance = "github-attestations" + [[tools.hk]] -version = "2.1.0" -backend = "aqua:jdx/hk" +version = "2.3.0" +backend = "packslip:github.com/jdx/hk" specifiers = ["latest"] [tools.hk."platforms.linux-arm64"] -checksum = "sha256:7ffb155147a8a9dae1b571fb31a5d19a35d0175afb5fe3e5b2c652ebf67feb9f" -url = "https://github.com/jdx/hk/releases/download/v2.1.0/hk-aarch64-unknown-linux-gnu.tar.gz" -url_api = "https://api.github.com/repos/jdx/hk/releases/assets/583539437" +checksum = "sha256:d0311080598527289f2d98cb9d4c1ec287ca595542b842ddecd8a6264ef18cf5" +url = "https://github.com/jdx/hk/releases/download/v2.3.0/hk-aarch64-unknown-linux-gnu.tar.gz" signer = "sigstore-oidc:https://github.com/jdx/hk/.github/workflows/release.yml" [tools.hk."platforms.linux-arm64-musl"] -checksum = "sha256:8417655fd02f8311bcad9efab7594d4b6d7cca1c4d00cd1576f12ad5e40dac06" -url = "https://github.com/jdx/hk/releases/download/v2.1.0/hk-aarch64-unknown-linux-musl.tar.gz" -url_api = "https://api.github.com/repos/jdx/hk/releases/assets/583539440" +checksum = "sha256:477ce79246e62b29db95c034461f108d5019262bfeba14a4307e82689824687d" +url = "https://github.com/jdx/hk/releases/download/v2.3.0/hk-aarch64-unknown-linux-musl.tar.gz" signer = "sigstore-oidc:https://github.com/jdx/hk/.github/workflows/release.yml" [tools.hk."platforms.linux-x64"] -checksum = "sha256:7a7b28741d16f777d8be90fbcd8523996ee95c2d5222d5b173652d9b37e31969" -url = "https://github.com/jdx/hk/releases/download/v2.1.0/hk-x86_64-unknown-linux-gnu.tar.gz" -url_api = "https://api.github.com/repos/jdx/hk/releases/assets/583539481" +checksum = "sha256:79cabdccba39e1eef4e443e11713c923381f697b03c00ef4a12dfcd1ca5380b0" +url = "https://github.com/jdx/hk/releases/download/v2.3.0/hk-x86_64-unknown-linux-gnu.tar.gz" signer = "sigstore-oidc:https://github.com/jdx/hk/.github/workflows/release.yml" [tools.hk."platforms.linux-x64-musl"] -checksum = "sha256:ab5a8fa2819fe3a1762576ac557b9797e1fe587b41a1f93c50e4dfa9f5b89e76" -url = "https://github.com/jdx/hk/releases/download/v2.1.0/hk-x86_64-unknown-linux-musl.tar.gz" -url_api = "https://api.github.com/repos/jdx/hk/releases/assets/583539492" +checksum = "sha256:307f760266af8a393c47a8039e2c966c78361eae33949865e9ab4cc163f517b4" +url = "https://github.com/jdx/hk/releases/download/v2.3.0/hk-x86_64-unknown-linux-musl.tar.gz" signer = "sigstore-oidc:https://github.com/jdx/hk/.github/workflows/release.yml" [tools.hk."platforms.macos-arm64"] -checksum = "sha256:b30c6fb4447b5a9c24f9f80d165dca2d2e682907b8acb8222391e0527fea1ebe" -url = "https://github.com/jdx/hk/releases/download/v2.1.0/hk-aarch64-apple-darwin.tar.gz" -url_api = "https://api.github.com/repos/jdx/hk/releases/assets/583539442" +checksum = "sha256:45e83c2e891bb29280f7e816b244b960e1758f185802c7e0a21d25ff7bbebbde" +url = "https://github.com/jdx/hk/releases/download/v2.3.0/hk-aarch64-apple-darwin.tar.gz" signer = "sigstore-oidc:https://github.com/jdx/hk/.github/workflows/release.yml" [tools.hk."platforms.windows-x64"] -checksum = "sha256:c0344c09c76f7e25985c4770148130881b19313393d238949e5512ec3691fac3" -url = "https://github.com/jdx/hk/releases/download/v2.1.0/hk-x86_64-pc-windows-msvc.zip" -url_api = "https://api.github.com/repos/jdx/hk/releases/assets/583539446" +checksum = "sha256:7df559b349a2bfd60cf5cab32b92b689d862445c08b3dd54777550f9057956fb" +url = "https://github.com/jdx/hk/releases/download/v2.3.0/hk-x86_64-pc-windows-msvc.zip" signer = "sigstore-oidc:https://github.com/jdx/hk/.github/workflows/release.yml" -[[tools.jq]] -version = "1.8.2" -backend = "aqua:jqlang/jq" +[[tools.ls-lint]] +version = "2.3.1" +backend = "aqua:loeffel-io/ls-lint" specifiers = ["latest"] -[tools.jq."platforms.linux-arm64"] -checksum = "sha256:8b85c817833814ddca00a144c33705546355afccf0cf39b188f3cdb48b852309" -url = "https://github.com/jqlang/jq/releases/download/jq-1.8.2/jq-linux-arm64" -url_api = "https://api.github.com/repos/jqlang/jq/releases/assets/453012756" -provenance = "github-attestations" - -[tools.jq."platforms.linux-arm64-musl"] -checksum = "sha256:8b85c817833814ddca00a144c33705546355afccf0cf39b188f3cdb48b852309" -url = "https://github.com/jqlang/jq/releases/download/jq-1.8.2/jq-linux-arm64" -url_api = "https://api.github.com/repos/jqlang/jq/releases/assets/453012756" -provenance = "github-attestations" - -[tools.jq."platforms.linux-x64"] -checksum = "sha256:b1c22172dd303f3be49e935aa56aa48a8b7a46e0bc838b4997d3bb451495870f" -url = "https://github.com/jqlang/jq/releases/download/jq-1.8.2/jq-linux-amd64" -url_api = "https://api.github.com/repos/jqlang/jq/releases/assets/453012752" -provenance = "github-attestations" - -[tools.jq."platforms.linux-x64-musl"] -checksum = "sha256:b1c22172dd303f3be49e935aa56aa48a8b7a46e0bc838b4997d3bb451495870f" -url = "https://github.com/jqlang/jq/releases/download/jq-1.8.2/jq-linux-amd64" -url_api = "https://api.github.com/repos/jqlang/jq/releases/assets/453012752" -provenance = "github-attestations" - -[tools.jq."platforms.macos-arm64"] -checksum = "sha256:2d75340ba57a4b4b4c8708a21c2dc8e958a48aaa8bba13b27f77f6e4c0eca07e" -url = "https://github.com/jqlang/jq/releases/download/jq-1.8.2/jq-macos-arm64" -url_api = "https://api.github.com/repos/jqlang/jq/releases/assets/453012783" -provenance = "github-attestations" +[tools.ls-lint."platforms.linux-arm64"] +checksum = "sha256:2abdb71243c619f0bb29587be5c228bec84c107985f2c066139ef0ec35fd3a99" +url = "https://github.com/loeffel-io/ls-lint/releases/download/v2.3.1/ls-lint-linux-arm64" +url_api = "https://api.github.com/repos/loeffel-io/ls-lint/releases/assets/260857550" + +[tools.ls-lint."platforms.linux-arm64-musl"] +checksum = "sha256:2abdb71243c619f0bb29587be5c228bec84c107985f2c066139ef0ec35fd3a99" +url = "https://github.com/loeffel-io/ls-lint/releases/download/v2.3.1/ls-lint-linux-arm64" +url_api = "https://api.github.com/repos/loeffel-io/ls-lint/releases/assets/260857550" + +[tools.ls-lint."platforms.linux-x64"] +checksum = "sha256:b5a0d2e4427ad039fbc574551f17679f38f142b25d15e0e538769f8cf15af397" +url = "https://github.com/loeffel-io/ls-lint/releases/download/v2.3.1/ls-lint-linux-amd64" +url_api = "https://api.github.com/repos/loeffel-io/ls-lint/releases/assets/260857547" + +[tools.ls-lint."platforms.linux-x64-musl"] +checksum = "sha256:b5a0d2e4427ad039fbc574551f17679f38f142b25d15e0e538769f8cf15af397" +url = "https://github.com/loeffel-io/ls-lint/releases/download/v2.3.1/ls-lint-linux-amd64" +url_api = "https://api.github.com/repos/loeffel-io/ls-lint/releases/assets/260857547" + +[tools.ls-lint."platforms.macos-arm64"] +checksum = "sha256:e4ed2ce2b7b61d6685769e34c6375ccecb14a3f00ee59438cf82d01d6236a3c4" +url = "https://github.com/loeffel-io/ls-lint/releases/download/v2.3.1/ls-lint-darwin-arm64" +url_api = "https://api.github.com/repos/loeffel-io/ls-lint/releases/assets/260857541" + +[tools.ls-lint."platforms.macos-x64"] +checksum = "sha256:fc17fc642e95fd8bf7030ed661e86758bee654f6e11f1e31a5f21887f47f73ae" +url = "https://github.com/loeffel-io/ls-lint/releases/download/v2.3.1/ls-lint-darwin-amd64" +url_api = "https://api.github.com/repos/loeffel-io/ls-lint/releases/assets/260857543" + +[tools.ls-lint."platforms.windows-x64"] +checksum = "sha256:94e5cfb9468e597cb513fb7a8bf26499c9315ebd505d960c74e2d4849167bd31" +url = "https://github.com/loeffel-io/ls-lint/releases/download/v2.3.1/ls-lint-windows-amd64.exe" +url_api = "https://api.github.com/repos/loeffel-io/ls-lint/releases/assets/260857557" + +[[tools.lychee]] +version = "0.24.2" +backend = "aqua:lycheeverse/lychee" +specifiers = ["latest"] -[tools.jq."platforms.macos-x64"] -checksum = "sha256:e94b266e3c26690550006abe63152b782280f4e14374accdf04cbde844f00bc0" -url = "https://github.com/jqlang/jq/releases/download/jq-1.8.2/jq-macos-amd64" -url_api = "https://api.github.com/repos/jqlang/jq/releases/assets/453012782" -provenance = "github-attestations" - -[tools.jq."platforms.windows-x64"] -checksum = "sha256:a6fc67fedaf9128a3309a1e2ebb8b986aeccf70122ee46d2cb4849e423f0c627" -url = "https://github.com/jqlang/jq/releases/download/jq-1.8.2/jq-windows-amd64.exe" -url_api = "https://api.github.com/repos/jqlang/jq/releases/assets/453012788" -provenance = "github-attestations" +[tools.lychee."platforms.linux-arm64"] +checksum = "sha256:91a7bd65685da41b90ccb9bc867a3d649a7818042dae04ff405e55a25bddee4c" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-aarch64-unknown-linux-gnu.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409959442" + +[tools.lychee."platforms.linux-arm64-musl"] +checksum = "sha256:5d0b0e3aeab240f41920c633a6eaf97599be6eedda034b36e858ede7dba5e535" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-aarch64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409958602" + +[tools.lychee."platforms.linux-x64"] +checksum = "sha256:1f4e0ef7f6554a6ed33dd7ac144fb2e1bbed98598e7af973042fc5cd43951c9a" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-x86_64-unknown-linux-gnu.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409959156" + +[tools.lychee."platforms.linux-x64-musl"] +checksum = "sha256:73657a111819a30c47c08352896796f23d64e4eb2b3ed39b6d32149241566fc5" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-x86_64-unknown-linux-musl.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409959271" + +[tools.lychee."platforms.macos-arm64"] +checksum = "sha256:c9d3740ea2d891854d37116c9fba840f37b6e7c89d330e7db84ac333631c4977" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-aarch64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409957951" + +[tools.lychee."platforms.macos-x64"] +checksum = "sha256:887503a9cff667d322b8d0892b40bf49976eb9507af8483220a3706cdad55978" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-x86_64-apple-darwin.tar.gz" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409957687" + +[tools.lychee."platforms.windows-x64"] +checksum = "sha256:32975d1493ee1a975d6bb41e4fb56fe419cb442ded628bb772ba2e614acfacad" +url = "https://github.com/lycheeverse/lychee/releases/download/lychee-v0.24.2/lychee-x86_64-pc-windows-msvc.zip" +url_api = "https://api.github.com/repos/lycheeverse/lychee/releases/assets/409959491" [[tools.packer]] version = "1.16.1" @@ -123,18 +285,6 @@ url = "https://releases.hashicorp.com/packer/1.16.1/packer_1.16.1_darwin_amd64.z checksum = "sha256:48e9b25ecf807959a1dcb9aa9b074e6fcd08c7b7ed89803538647c5873dbc95b" url = "https://releases.hashicorp.com/packer/1.16.1/packer_1.16.1_windows_amd64.zip" -[[tools."pipx:ansible-core"]] -version = "2.21.4" -backend = "pipx:ansible-core" -specifiers = ["latest"] -uv = { path = ".mise/locks/pipx-ansible-core/2.21.4", digest = "sha256:bfd084bc86bf45f1601eb5e84dbb56c8240f9ca6179c238897f114a4d962f27b" } - -[[tools."pipx:ansible-lint"]] -version = "26.9.0" -backend = "pipx:ansible-lint" -specifiers = ["latest"] -uv = { path = ".mise/locks/pipx-ansible-lint/26.9.0", digest = "sha256:ae939316cabb7f61bf28b37d68071326192c98ce26d9a1769af9bdf642b3fb2a" } - [[tools.pkl]] version = "0.32.1" backend = "aqua:apple/pkl" @@ -175,93 +325,6 @@ checksum = "sha256:8550a00fcf027335e42c5e2cd553b88e98845408cb1880b3e3d1860caf46d url = "https://github.com/apple/pkl/releases/download/0.32.1/pkl-windows-amd64.exe" url_api = "https://api.github.com/repos/apple/pkl/releases/assets/487426668" -[[tools.python]] -version = "3.14.7" -backend = "core:python" -specifiers = ["latest"] - -[tools.python."platforms.linux-arm64"] -checksum = "sha256:8a0798baa8a2c27b5751d590aced543eaa85e20b3f73d93c1af049688acdc9c5" -url = "https://github.com/astral-sh/python-build-standalone/releases/download/20260901/cpython-3.14.7+20260901-aarch64-unknown-linux-gnu-install_only_stripped.tar.gz" -provenance = "github-attestations" - -[tools.python."platforms.linux-arm64-musl"] -checksum = "sha256:701c31d72187242302922a29f3bc6023ceb68b6b68fb8d4ed7568d1e6ef34548" -url = "https://github.com/astral-sh/python-build-standalone/releases/download/20260901/cpython-3.14.7+20260901-aarch64-unknown-linux-musl-install_only_stripped.tar.gz" -provenance = "github-attestations" - -[tools.python."platforms.linux-x64"] -checksum = "sha256:3959f92825141e04adf44982d3a83ee57af0877e893b0796e04c1468749d9b04" -url = "https://github.com/astral-sh/python-build-standalone/releases/download/20260901/cpython-3.14.7+20260901-x86_64-unknown-linux-gnu-install_only_stripped.tar.gz" -provenance = "github-attestations" - -[tools.python."platforms.linux-x64-musl"] -checksum = "sha256:c773f8a7357c0d1a29e208a14bc16386731ca9c0d2e51f1b6741967fb0632cdc" -url = "https://github.com/astral-sh/python-build-standalone/releases/download/20260901/cpython-3.14.7+20260901-x86_64-unknown-linux-musl-install_only_stripped.tar.gz" -provenance = "github-attestations" - -[tools.python."platforms.macos-arm64"] -checksum = "sha256:4632cb1a6edad9e73d3c81b6d2e69131637d995173e3e85005df14102b0592ba" -url = "https://github.com/astral-sh/python-build-standalone/releases/download/20260901/cpython-3.14.7+20260901-aarch64-apple-darwin-install_only_stripped.tar.gz" -provenance = "github-attestations" - -[tools.python."platforms.macos-x64"] -checksum = "sha256:7e151a7c9028855b61a7d6e78381f2020a1ef185281399f3b1aafc5e1c9a1a64" -url = "https://github.com/astral-sh/python-build-standalone/releases/download/20260901/cpython-3.14.7+20260901-x86_64-apple-darwin-install_only_stripped.tar.gz" -provenance = "github-attestations" - -[tools.python."platforms.windows-x64"] -checksum = "sha256:ca3c33ca924dfcab3b74205a7a58a88b0255135c53f95497b26b5e60700fd66d" -url = "https://github.com/astral-sh/python-build-standalone/releases/download/20260901/cpython-3.14.7+20260901-x86_64-pc-windows-msvc-install_only_stripped.tar.gz" -provenance = "github-attestations" - -[[tools.ruff]] -version = "0.16.8" -backend = "aqua:astral-sh/ruff" -specifiers = ["latest"] - -[tools.ruff."platforms.linux-arm64"] -checksum = "sha256:8ff18ee07d6ed3cfbd05fdc9012646a79482c00045dbcbf32416ef8f14ab1f7e" -url = "https://github.com/astral-sh/ruff/releases/download/0.16.8/ruff-aarch64-unknown-linux-gnu.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/568294361" -provenance = "github-attestations" - -[tools.ruff."platforms.linux-arm64-musl"] -checksum = "sha256:57a4e072b6b74a4dd0036b7b253e056bdb70e02c68504ca6f2bfca2707d03fb6" -url = "https://github.com/astral-sh/ruff/releases/download/0.16.8/ruff-aarch64-unknown-linux-musl.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/568294370" -provenance = "github-attestations" - -[tools.ruff."platforms.linux-x64"] -checksum = "sha256:c4a8c7c152532bcb7e7ede4bd6ccd440dcacddffcdcdd79b90090ac6021f41c2" -url = "https://github.com/astral-sh/ruff/releases/download/0.16.8/ruff-x86_64-unknown-linux-gnu.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/568294510" -provenance = "github-attestations" - -[tools.ruff."platforms.linux-x64-musl"] -checksum = "sha256:e56aa612121de356f37d05f3284cd806081fb72d5dbd4814b3810c5a23c562cc" -url = "https://github.com/astral-sh/ruff/releases/download/0.16.8/ruff-x86_64-unknown-linux-musl.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/568294522" -provenance = "github-attestations" - -[tools.ruff."platforms.macos-arm64"] -checksum = "sha256:0ffa53899f2970d24f14fbed8d8265c87180b159b7100794d97a1527dc60fa79" -url = "https://github.com/astral-sh/ruff/releases/download/0.16.8/ruff-aarch64-apple-darwin.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/568294350" -provenance = "github-attestations" - -[tools.ruff."platforms.macos-x64"] -checksum = "sha256:bccb4d49c5c9f7e69fd42df2475730a08a641af31b8e0ee5e775e3dd829c4686" -url = "https://github.com/astral-sh/ruff/releases/download/0.16.8/ruff-x86_64-apple-darwin.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/568294476" -provenance = "github-attestations" - -[tools.ruff."platforms.windows-x64"] -checksum = "sha256:7985e06caf14b0077cb68da41edbf812e1d9654fe4c144d72b71138e96350129" -url = "https://github.com/astral-sh/ruff/releases/download/0.16.8/ruff-x86_64-pc-windows-msvc.zip" -url_api = "https://api.github.com/repos/astral-sh/ruff/releases/assets/568294490" -provenance = "github-attestations" - [[tools.shellcheck]] version = "0.11.0" backend = "aqua:koalaman/shellcheck" @@ -343,19 +406,19 @@ url = "https://github.com/mvdan/sh/releases/download/v3.14.1/shfmt_v3.14.1_windo url_api = "https://api.github.com/repos/mvdan/sh/releases/assets/547320827" [[tools.tart]] -version = "2.37.0" -backend = "aqua:cirruslabs/tart" +version = "2.39.0" +backend = "aqua:openai/tart" specifiers = ["latest"] [tools.tart."platforms.macos-arm64"] -checksum = "sha256:d531752c4dad5d4214ac7ff540cefc2647df1fca2338d413d3c01754f54b356b" -url = "https://github.com/openai/tart/releases/download/2.37.0/tart.tar.gz" -url_api = "https://api.github.com/repos/openai/tart/releases/assets/553688930" +checksum = "sha256:cd17a1cb48fbdb72972a4f4cd467c0ed681f1225b3c0ce3c318c41c229e0dd42" +url = "https://github.com/openai/tart/releases/download/2.39.0/tart.tar.gz" +url_api = "https://api.github.com/repos/openai/tart/releases/assets/589769308" [tools.tart."platforms.macos-x64"] -checksum = "sha256:d531752c4dad5d4214ac7ff540cefc2647df1fca2338d413d3c01754f54b356b" -url = "https://github.com/openai/tart/releases/download/2.37.0/tart.tar.gz" -url_api = "https://api.github.com/repos/openai/tart/releases/assets/553688930" +checksum = "sha256:cd17a1cb48fbdb72972a4f4cd467c0ed681f1225b3c0ce3c318c41c229e0dd42" +url = "https://github.com/openai/tart/releases/download/2.39.0/tart.tar.gz" +url_api = "https://api.github.com/repos/openai/tart/releases/assets/589769308" [[tools.tombi]] version = "1.5.5" @@ -406,109 +469,40 @@ provenance = "github-attestations" [[tools.usage]] version = "6.11.1" -backend = "aqua:jdx/usage" +backend = "packslip:github.com/jdx/usage" specifiers = ["latest"] [tools.usage."platforms.linux-arm64"] checksum = "sha256:90622145566409da24d282190ad17cc786c85d498d751543824ab62931705018" url = "https://github.com/jdx/usage/releases/download/v6.11.1/usage-aarch64-unknown-linux-gnu.tar.gz" -url_api = "https://api.github.com/repos/jdx/usage/releases/assets/584024322" signer = "sigstore-oidc:https://github.com/jdx/usage/.github/workflows/publish-cli.yml" [tools.usage."platforms.linux-arm64-musl"] checksum = "sha256:b8903edb0accb76576a9a454900388d629dff9a35186e653c4e5b48e622e62c0" url = "https://github.com/jdx/usage/releases/download/v6.11.1/usage-aarch64-unknown-linux-musl.tar.gz" -url_api = "https://api.github.com/repos/jdx/usage/releases/assets/584023288" signer = "sigstore-oidc:https://github.com/jdx/usage/.github/workflows/publish-cli.yml" [tools.usage."platforms.linux-x64"] checksum = "sha256:afa6cb0e76f88cc6392aeecf21bbcd869747d4eeb60ab84c98d6e6178edc359a" url = "https://github.com/jdx/usage/releases/download/v6.11.1/usage-x86_64-unknown-linux-gnu.tar.gz" -url_api = "https://api.github.com/repos/jdx/usage/releases/assets/584024165" signer = "sigstore-oidc:https://github.com/jdx/usage/.github/workflows/publish-cli.yml" [tools.usage."platforms.linux-x64-musl"] checksum = "sha256:7b37d1d36b310857908e508802db6c6b670555cf25cd0b990f09ee40cb11247b" url = "https://github.com/jdx/usage/releases/download/v6.11.1/usage-x86_64-unknown-linux-musl.tar.gz" -url_api = "https://api.github.com/repos/jdx/usage/releases/assets/584024113" signer = "sigstore-oidc:https://github.com/jdx/usage/.github/workflows/publish-cli.yml" [tools.usage."platforms.macos-arm64"] checksum = "sha256:e3a20b948f2665862dcbaddfc50d62ac741654e3cdd815130a6fae00b3d088ff" url = "https://github.com/jdx/usage/releases/download/v6.11.1/usage-universal-apple-darwin.tar.gz" -url_api = "https://api.github.com/repos/jdx/usage/releases/assets/584026303" signer = "sigstore-oidc:https://github.com/jdx/usage/.github/workflows/publish-cli.yml" [tools.usage."platforms.macos-x64"] checksum = "sha256:e3a20b948f2665862dcbaddfc50d62ac741654e3cdd815130a6fae00b3d088ff" url = "https://github.com/jdx/usage/releases/download/v6.11.1/usage-universal-apple-darwin.tar.gz" -url_api = "https://api.github.com/repos/jdx/usage/releases/assets/584026303" signer = "sigstore-oidc:https://github.com/jdx/usage/.github/workflows/publish-cli.yml" [tools.usage."platforms.windows-x64"] checksum = "sha256:783ce7539b1145f1860054352067e5da70bfac1ceeba3c9f3cb912477068f99d" url = "https://github.com/jdx/usage/releases/download/v6.11.1/usage-x86_64-pc-windows-msvc.zip" -url_api = "https://api.github.com/repos/jdx/usage/releases/assets/584027860" signer = "sigstore-oidc:https://github.com/jdx/usage/.github/workflows/publish-cli.yml" - -[[tools.uv]] -version = "0.12.18" -backend = "aqua:astral-sh/uv" -specifiers = ["latest"] - -[tools.uv."platforms.linux-arm64"] -checksum = "sha256:afb6291f3f0a6b4521fc67b947822506c41dde5b60d2189dd8f3695b2ac8c9e7" -url = "https://github.com/astral-sh/uv/releases/download/0.12.18/uv-aarch64-unknown-linux-gnu.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/582430569" -provenance = "github-attestations" - -[tools.uv."platforms.linux-arm64-musl"] -checksum = "sha256:0796973fb3eea8095078c3d0659bd17a5f6789a71b8dd85caff2483178f78ac3" -url = "https://github.com/astral-sh/uv/releases/download/0.12.18/uv-aarch64-unknown-linux-musl.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/582430577" -provenance = "github-attestations" - -[tools.uv."platforms.linux-x64"] -checksum = "sha256:89eadd7c76fc063887959510d5ba0ab1264dfd5f1143b925ddb73021a40acf16" -url = "https://github.com/astral-sh/uv/releases/download/0.12.18/uv-x86_64-unknown-linux-gnu.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/582430671" -provenance = "github-attestations" - -[tools.uv."platforms.linux-x64-musl"] -checksum = "sha256:e38d97460b98ebfd31b197de0fe9fa578add4bc8ba0179b203dd3f87b99f98e6" -url = "https://github.com/astral-sh/uv/releases/download/0.12.18/uv-x86_64-unknown-linux-musl.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/582430675" -provenance = "github-attestations" - -[tools.uv."platforms.macos-arm64"] -checksum = "sha256:cf40e0c6a202190ccd9e0406dcfdd5b2d6668a9a5c779b17948963df32aafe5b" -url = "https://github.com/astral-sh/uv/releases/download/0.12.18/uv-aarch64-apple-darwin.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/582430554" -provenance = "github-attestations" - -[tools.uv."platforms.macos-x64"] -checksum = "sha256:2e4108f5395397c8bc5d43bf83d3bdbb2d0e92b90d0efa607756be704905fa33" -url = "https://github.com/astral-sh/uv/releases/download/0.12.18/uv-x86_64-apple-darwin.tar.gz" -url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/582430660" -provenance = "github-attestations" - -[tools.uv."platforms.windows-x64"] -checksum = "sha256:cae6a3bc25239f83dffb467a4b180508d9da23986c04639ebfa44e43e6a84bff" -url = "https://github.com/astral-sh/uv/releases/download/0.12.18/uv-x86_64-pc-windows-msvc.zip" -url_api = "https://api.github.com/repos/astral-sh/uv/releases/assets/582430665" -provenance = "github-attestations" - -[[tools.xcodes]] -version = "2.1.0" -backend = "aqua:XcodesOrg/xcodes" -specifiers = ["latest"] - -[tools.xcodes."platforms.macos-arm64"] -checksum = "sha256:f1519afe934a513e85dd9b32fc872394becbbb6a41db15d9ac3926a09a891888" -url = "https://github.com/XcodesOrg/xcodes/releases/download/2.1.0/xcodes.zip" -url_api = "https://api.github.com/repos/XcodesOrg/xcodes/releases/assets/563562943" - -[tools.xcodes."platforms.macos-x64"] -checksum = "sha256:f1519afe934a513e85dd9b32fc872394becbbb6a41db15d9ac3926a09a891888" -url = "https://github.com/XcodesOrg/xcodes/releases/download/2.1.0/xcodes.zip" -url_api = "https://api.github.com/repos/XcodesOrg/xcodes/releases/assets/563562943" diff --git a/mise.toml b/mise.toml index 5a35c24..2af1c31 100644 --- a/mise.toml +++ b/mise.toml @@ -2,37 +2,22 @@ activate_aggressive = true experimental = true lockfile = true -python.uv_venv_auto = "create|source" - -[env] -_.python.venv = { path = ".venv", create = true } - -[vars] -xcodes_cache_dir = "{{ config_root }}/.cache/xcodes" -simruntimes_cache_dir = "{{ config_root }}/.cache/runtime" +minimum_release_age = "0" [tools] +actionlint = "latest" +"aqua:owenlamont/ryl" = "latest" +editorconfig-checker = "latest" hk = "latest" -jq = "latest" +ls-lint = "latest" +lychee = "latest" packer = "latest" -"pipx:ansible-core" = "latest" -"pipx:ansible-lint" = "latest" pkl = "latest" -python = { version = "latest", uv = true } -ruff = "latest" shellcheck = "latest" shfmt = "latest" tart = "latest" tombi = "latest" usage = "latest" -uv = "latest" -xcodes = "latest" - -[deps.ansible-galaxy] -auto = true -run = "ansible-galaxy install -r requirements.yml" -sources = ["ansible.cfg", "requirements.yml"] -outputs = ["galaxy_collections", "galaxy_roles"] [hooks] postinstall = "mise run bootstrap" @@ -50,52 +35,43 @@ run = "hk check --all" alias = ["fmt", "format"] run = "hk fix --all" -[tasks.warm-cache] -run = "scripts/cache-xcodes.bash" - -[tasks.run-tart-vm] -usage = 'arg "" help="Specific Tart VM to start (e.g. macos:15). Starts all VMs if omitted." default=""' -run = ''' -nohup tart run "$vm" > /dev/null 2>&1 & -echo "Waiting for $vm to have an IP..." -until tart ip "$vm" &>/dev/null; do sleep 2; done -ip=$(tart ip "$vm") -echo "Waiting for $vm SSH to be ready..." -until nc -z "$ip" 22 &>/dev/null; do sleep 2; done -echo "$vm is ready" -''' +[tasks."build:base"] +env = { PACKER_LOG = "1", PACKER_LOG_PATH = "packer-base.log" } +run = [ + "packer init src/templates/macos-27-01-base.pkr.hcl", + "packer validate src/templates/macos-27-01-base.pkr.hcl", + "packer build -on-error=ask src/templates/macos-27-01-base.pkr.hcl", +] -[tasks.refresh-orka-vm] -usage = ''' -arg "" help="Name of the Orka VM to delete and recreate" -arg "" help="Name of the VM Config to recreate the VM with" -''' +[tasks."build:ci-gui"] +env = { PACKER_LOG = "1", PACKER_LOG_PATH = "packer-boot.log" } run = [ - "orka3 vm delete {{ usage.vm }} || true", - "orka3 vm deploy {{ usage.vm }} --config {{ usage.vm_config }}", + "packer init src/templates/macos-27-02-ci-gui.pkr.hcl", + "packer validate src/templates/macos-27-02-ci-gui.pkr.hcl", + "packer build -on-error=ask src/templates/macos-27-02-ci-gui.pkr.hcl", ] -[tasks.provision-orka] -usage = 'arg "" help="Name of the Orka VM to provision"' -env = { VM_PROVIDER = "orka" } -run = 'VM_NAME="{{ usage.vm }}" ansible-playbook playbooks/provision.yml -i inventory/macos_inventory.py' +[tasks."build:ci-recovery"] +env = { PACKER_LOG = "1", PACKER_LOG_PATH = "packer-recovery.log" } +run = [ + "packer init src/templates/macos-27-03-ci-recovery.pkr.hcl", + "packer validate src/templates/macos-27-03-ci-recovery.pkr.hcl", + "packer build -on-error=ask src/templates/macos-27-03-ci-recovery.pkr.hcl", +] -[tasks.provision-tart] -usage = 'arg "" help="Name of the Tart VM to provision"' -depends = ["run-tart-vm {{ usage.vm }}"] -env = { VM_PROVIDER = "tart" } -run = 'VM_NAME="{{ usage.vm }}" ansible-playbook playbooks/provision.yml -i inventory/macos_inventory.py' +[tasks."build:ci-ssh"] +env = { PACKER_LOG = "1", PACKER_LOG_PATH = "packer-ssh.log" } +run = [ + "packer init src/templates/macos-27-04-ci-ssh.pkr.hcl", + "packer validate src/templates/macos-27-04-ci-ssh.pkr.hcl", + "packer build -on-error=ask src/templates/macos-27-04-ci-ssh.pkr.hcl", +] [tasks.upd] run = ["mise upgrade", "mise lock"] [tasks.upg] -run = [ - "mise upgrade --bump", - "mise lock", - "ansible-galaxy role install -r requirements.yml --force", - "ansible-galaxy collection install -r requirements.yml --upgrade", -] +run = ["mise upgrade --bump", "mise lock"] # Hidden Tasks diff --git a/playbooks/install-xcode-clt.yml b/playbooks/install-xcode-clt.yml deleted file mode 100644 index 94e4c3d..0000000 --- a/playbooks/install-xcode-clt.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -- name: Install Xcode Command Line Tools - hosts: macos_agents - gather_facts: false - tags: [xcode_clt] - roles: - - role: xcode_clt diff --git a/playbooks/provision.yml b/playbooks/provision.yml deleted file mode 100644 index c83a9f9..0000000 --- a/playbooks/provision.yml +++ /dev/null @@ -1,331 +0,0 @@ ---- -- name: Wait for system to settle - hosts: macos_agents - gather_facts: false - tasks: - - name: Wait for GUI subsystem to be ready - ansible.builtin.raw: pgrep -x loginwindow - register: _loginwindow_check - until: _loginwindow_check.rc == 0 - retries: 30 - delay: 5 - changed_when: false - -- name: Install Xcode Command Line Tools - ansible.builtin.import_playbook: install-xcode-clt.yml - -- name: Update Xcode Command Line Tools - hosts: macos_agents - gather_facts: false - tags: [xcode_clt] - tasks: - - name: Get available Command Line Tools update label - ansible.builtin.command: - cmd: softwareupdate --list - register: xcode_clt_update_label_raw - become: true - changed_when: false - failed_when: false - - - name: Parse Command Line Tools update label - ansible.builtin.set_fact: - xcode_clt_update_label: >- - {{ - xcode_clt_update_label_raw.stdout - | regex_findall('\* Label: (Command Line Tools[^\n]*)') - | last - | default('') - }} - - - name: No Command Line Tools update available - ansible.builtin.debug: - msg: No Command Line Tools update found in catalog — already up to date. - when: xcode_clt_update_label == '' - - - name: Update Command Line Tools - ansible.builtin.command: - argv: - - softwareupdate - - --install - - --no-scan - - --verbose - - "{{ xcode_clt_update_label }}" - become: true - when: xcode_clt_update_label != '' - changed_when: true - - - name: Reset Xcode developer directory - ansible.builtin.command: - argv: - - xcrun - - xcode-select - - --reset - become: true - when: xcode_clt_update_label != '' - changed_when: true - -- name: Load macOS version-specific configuration - hosts: macos_agents - gather_facts: true - tasks: - - name: Load macOS version vars - ansible.builtin.include_vars: - file: "{{ playbook_dir }}/../inventory/group_vars/macos_{{ ansible_facts['distribution_major_version'] }}_agents.yml" - failed_when: false - -- name: Install macOS updates - hosts: macos_agents - tags: [macos_updates] - roles: - - role: macos_updates - -- name: Install Rosetta 2 - hosts: macos_agents - tags: [rosetta] - roles: - - role: rosetta - -- name: Configure SSH known hosts - hosts: macos_agents - tags: [ssh_config] - roles: - - role: ssh_config - -- name: Configure system settings - hosts: macos_agents - tags: [system_config] - roles: - - role: system_config - -- name: Configure authentication - hosts: macos_agents - tags: [auth_config] - roles: - - role: auth_config - -- name: Install Homebrew and packages - hosts: macos_agents - tags: [homebrew] - roles: - - role: homebrew - -- name: Configure git - hosts: macos_agents - tags: [homebrew] - environment: - PATH: /opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin - tasks: - - name: Activate git-lfs globally - ansible.builtin.command: - argv: - - git - - lfs - - install - changed_when: false - - # Prevent "dubious ownership" errors in CI checkouts where repo directories - # may be owned by a different user than the runner (CVE-2022-24765 mitigation). - # Inspired by: - # https://github.com/actions/runner-images/blob/main/images/macos/scripts/build/install-git.sh - - name: Allow git operations in any directory (safe.directory wildcard) - community.general.git_config: - name: safe.directory - value: "*" - scope: global - - # Suppress git "hint:" messages that add noise to CI logs. - # Inspired by: - # https://github.com/actions/runner-images/blob/main/images/macos/scripts/build/install-git.sh - - name: Suppress git advice messages - community.general.git_config: - name: "{{ item }}" - value: "false" - scope: global - loop: - - advice.pushUpdateRejected - - advice.pushNonFFCurrent - - advice.pushNonFFMatching - - advice.pushAlreadyExists - - advice.pushFetchFirst - - advice.pushNeedsForce - - advice.statusHints - - advice.statusUoption - - advice.commitBeforeMerge - - advice.resolveConflict - - advice.implicitIdentity - - advice.detachedHead - - advice.amWorkDir - - advice.rmHints - -- name: Configure and install Xcode - hosts: macos_agents - tags: [xcode] - roles: - - role: xcode - when: xcode_install_enabled | default(true) | bool - -- name: Configure Dock - hosts: macos_agents - tags: [dock] - environment: - PATH: /opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin - tasks: - - name: Find Xcode apps in /Applications - ansible.builtin.find: - paths: /Applications - patterns: "Xcode-*.app" - file_type: any - recurse: false - register: _xcode_dock_apps - - - name: Build Dock app list with Xcode versions after Terminal - ansible.builtin.set_fact: - _dock_apps: >- - {{ - dockitems_apps[: (_terminal_idx | int) + 1] - + _xcode_entries - + dockitems_apps[(_terminal_idx | int) + 1 :] - }} - vars: - _terminal_idx: "{{ (dockitems_apps | map(attribute='name') | list).index('Terminal') }}" - _xcode_entries: >- - {{ - _xcode_dock_apps.files - | sort(attribute='path') - | map(attribute='path') - | map('regex_replace', '^(.+)/([^/]+)\.app$', '{"name": "\2", "path": "\1/\2.app/"}') - | map('from_json') - | list - }} - - - name: Remove all Dock items - ansible.builtin.command: - argv: - - dockutil - - --remove - - all - - --no-restart - changed_when: true - - - name: Add app items to Dock - ansible.builtin.command: - argv: - - dockutil - - --add - - "{{ item.path }}" - - --section - - apps - - --no-restart - loop: "{{ _dock_apps }}" - loop_control: - label: "{{ item.name }}" - changed_when: true - - - name: Add folder items to Dock - ansible.builtin.command: - argv: - - dockutil - - --add - - "{{ item.path }}" - - --section - - others - - --no-restart - loop: "{{ dockitems_folders }}" - loop_control: - label: "{{ item.name }}" - changed_when: true - - - name: Restart Dock - ansible.builtin.command: - argv: - - killall - - Dock - changed_when: true - failed_when: false - -# Close stray windows so they don't appear on every VM boot from the saved image. -# Inspired by: -# https://github.com/actions/runner-images/blob/main/images/macos/scripts/build/configure-windows.sh -- name: Clean up stray windows before image finalization - hosts: macos_agents - tags: [cleanup] - tasks: - - name: Kill Setup Assistant if running - ansible.builtin.command: - argv: - - pkill - - -x - - Setup Assistant - failed_when: false - changed_when: true - - - name: Check if sshd-keygen-wrapper has AppleEvents TCC permission - ansible.builtin.shell: - cmd: | - sqlite3 "/Library/Application Support/com.apple.TCC/TCC.db" \ - "SELECT auth_value FROM access \ - WHERE service = 'kTCCServiceAppleEvents' \ - AND client = '/usr/libexec/sshd-keygen-wrapper' \ - AND auth_value = 2;" 2>/dev/null - executable: /bin/bash - become: true - register: _tcc_appleevent_check - changed_when: false - failed_when: false - - # These osascript tasks require TCC permissions for sshd-keygen-wrapper - # (see roles/system_config/tasks/tcc.yml). Only run if the grant exists. - - name: Quit System Settings - ansible.builtin.command: - argv: - - osascript - - -e - - quit app "System Settings" - failed_when: false - changed_when: false - when: _tcc_appleevent_check.stdout | trim == '2' - - - name: Close all Finder windows - ansible.builtin.command: - argv: - - osascript - - -e - - tell application "Finder" to close every window - failed_when: false - changed_when: false - when: _tcc_appleevent_check.stdout | trim == '2' - -- name: Clean up caches before image finalization - hosts: macos_agents - tags: [cleanup] - tasks: - - name: Delete local Time Machine snapshots - ansible.builtin.shell: - cmd: tmutil deletelocalsnapshots / 2>/dev/null || true - executable: /bin/bash - become: true - changed_when: true - - - name: Clear software update catalog cache - ansible.builtin.command: - cmd: softwareupdate --clear-catalog - become: true - changed_when: true - failed_when: false - -- name: Re-index Spotlight - hosts: macos_agents - tags: [spotlight] - tasks: - - name: Clean up Spotlight index - ansible.builtin.import_tasks: "{{ playbook_dir }}/../roles/system_config/tasks/spotlight.yml" - -- name: Restart macOS hosts - hosts: macos_agents - tags: [restart] - tasks: - - name: Reboot after provisioning completes - ansible.builtin.reboot: - reboot_timeout: 900 - become: true - changed_when: false diff --git a/requirements.yml b/requirements.yml deleted file mode 100644 index 9bb5e4d..0000000 --- a/requirements.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -roles: - - name: elliotweiser.osx-command-line-tools - -collections: - - name: community.general - - name: geerlingguy.mac - - name: ansible.posix diff --git a/roles/auth_config/files/kcpassword.py b/roles/auth_config/files/kcpassword.py deleted file mode 100755 index d274cbb..0000000 --- a/roles/auth_config/files/kcpassword.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python3 - -# Port of Gavin Brock's Perl kcpassword generator to Python, by Tom Taylor -# . -# Perl version: https://www.brock-family.org/gavin/perl/kcpassword.html -# This script was taken from https://github.com/timsutton/osx-vm-templates/blob/master/scripts/support/set_kcpassword.py -# Distributed by MIT license, license can be found at the bottom of this script - -import os -import sys - - -def encode_data(passwd): - # The magic 11 bytes - these are just repeated - # 0x7D 0x89 0x52 0x23 0xD2 0xBC 0xDD 0xEA 0xA3 0xB9 0x1F - key = [125,137,82,35,210,188,221,234,163,185,31] - key_len = len(key) - - passwd = [ord(x) for x in list(passwd)] - # pad passwd length out to an even multiple of key length - r = len(passwd) % key_len - if len(passwd) == 11: - passwd += [0] - elif (r > 0): - passwd = passwd + [0] * (key_len - r) - - for j in range(len(passwd)): - passwd[j] = passwd[j] ^ key[j % key_len] - - return bytearray(passwd) - -if __name__ == "__main__": - runner_pwd_encoded = encode_data(sys.argv[1]) - fd = os.open('/etc/kcpassword', os.O_WRONLY | os.O_CREAT, 0o600) - file = os.fdopen(fd, 'wb') - file.truncate(0) - file.write(runner_pwd_encoded) - file.close() - -""" -The MIT License (MIT) -Copyright (c) 2013-2017 Timothy Sutton -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -""" diff --git a/roles/auth_config/tasks/auto_login.yml b/roles/auth_config/tasks/auto_login.yml deleted file mode 100644 index 9091d0d..0000000 --- a/roles/auth_config/tasks/auto_login.yml +++ /dev/null @@ -1,48 +0,0 @@ ---- -- name: Check configured auto-login user - ansible.builtin.command: - cmd: defaults read /Library/Preferences/com.apple.loginwindow autoLoginUser - become: true - register: auth_config_auto_login_user - changed_when: false - failed_when: false - -- name: Check auto-login password file - ansible.builtin.stat: - path: /private/etc/kcpassword - become: true - register: auth_config_auto_login_password_file - -# kcpassword.py is copied from: -# https://github.com/actions/runner-images/blob/main/images/macos/assets/bootstrap-provisioner/kcpassword.py -- name: Enable auto-login for admin user - ansible.builtin.script: kcpassword.py {{ macos_admin_password }} - args: - executable: python3 - become: true - no_log: true - changed_when: true - when: >- - (not auth_config_auto_login_password_file.stat.exists) or ((auth_config_auto_login_user.stdout | default('') | trim) != macos_admin_user) - -- name: Set auto-login user - community.general.osx_defaults: - domain: /Library/Preferences/com.apple.loginwindow - key: autoLoginUser - type: string - value: "{{ macos_admin_user }}" - become: true - changed_when: true - when: >- - (not auth_config_auto_login_password_file.stat.exists) or ((auth_config_auto_login_user.stdout | default('') | trim) != macos_admin_user) - -- name: Disable auto-login lock screen - community.general.osx_defaults: - domain: /Library/Preferences/com.apple.loginwindow - key: autoLoginUserScreenLocked - type: bool - value: false - become: true - changed_when: true - when: >- - (not auth_config_auto_login_password_file.stat.exists) or ((auth_config_auto_login_user.stdout | default('') | trim) != macos_admin_user) diff --git a/roles/auth_config/tasks/main.yml b/roles/auth_config/tasks/main.yml deleted file mode 100644 index 0ff84df..0000000 --- a/roles/auth_config/tasks/main.yml +++ /dev/null @@ -1,11 +0,0 @@ ---- -- name: Configure passwordless sudo - ansible.builtin.import_tasks: sudo.yml - -- name: Enable auto-login - ansible.builtin.import_tasks: auto_login.yml - -# Not currently working using sysadminctl. -# See note in `screen_lock.yml` for more details. -- name: Disable screen lock - ansible.builtin.import_tasks: screen_lock.yml diff --git a/roles/auth_config/tasks/screen_lock.yml b/roles/auth_config/tasks/screen_lock.yml deleted file mode 100644 index c359831..0000000 --- a/roles/auth_config/tasks/screen_lock.yml +++ /dev/null @@ -1,78 +0,0 @@ ---- -# ───────────────────────────────────────────────────────────────────────────── -# Screen lock config — why `defaults` and not `sysadminctl -screenLock` -# ───────────────────────────────────────────────────────────────────────────── -# -# `sysadminctl -screenLock off` is the obvious approach but unreliable in CI -# VMs. It calls MobileKeyBag (MKB), which writes the grace period into the -# user's keychain rather than a plist. That imposes three constraints we -# can't reliably satisfy in provisioning: -# -# 1. Must run in the user's GUI session context, not root or bare SSH -# (failure: MKBDeviceSetGracePeriod error -14). Workaround: -# `launchctl asuser sudo -u sysadminctl ...` -# -# 2. The user's keybag must be unlocked, which only happens when the user -# types their password at loginwindow. SSH, sudo, and auto-login all -# bypass this (failure: MKBDeviceSetGracePeriod error -3). -# -# 3. The user must have a Secure Token (check with -# `sysadminctl -secureTokenStatus `). -# -# Even when the write succeeds, `-screenLock status` after reboot may report -# "immediate" — MKB can't read the value back through a locked keybag and -# returns the secure default. For a rebooting CI VM, this path is a dead end. -# -# The `defaults` approach below sidesteps MKB entirely. The screensaver keys -# live in the per-user ByHost scope (hence `host: currentHost`), don't touch -# the keychain, and persist across reboots like normal prefs. -# `loginWindowIdleTime` is the exception: it controls pre-login behavior, so -# it lives in the system domain and needs `become: true`. -# -# Refs: -# - https://www.kolide.com/blog/how-kolide-built-its-macos-screenlock-check -# - https://discussions.apple.com/thread/7610386 -# -# Fallback ladder if `defaults` stops working: -# 1. Wrap CI commands in `caffeinate -dimsu` -# 2. Ship a com.apple.screensaver configuration profile in the base image -# 3. Run `sysadminctl -screenLock off` during interactive base-image build -# (keybag is unlocked there) and let the snapshot carry the setting -# ───────────────────────────────────────────────────────────────────────────── - -# - name: Disable screen lock -# ansible.builtin.command: -# cmd: sysadminctl -screenLock off -password {{ macos_admin_password }} -# changed_when: true - -- name: Disable screensaver for current user - community.general.osx_defaults: - domain: com.apple.screensaver - key: idleTime - type: string - value: "0" - host: currentHost - -- name: Disable asking for password after screensaver for current user - community.general.osx_defaults: - domain: com.apple.screensaver - key: askForPassword - type: bool - value: false - host: currentHost - -- name: Disable the asking for password delay for current user - community.general.osx_defaults: - domain: com.apple.screensaver - key: askForPasswordDelay - type: int - value: 0 - host: currentHost - -- name: Disable screensaver at login window - community.general.osx_defaults: - domain: /Library/Preferences/com.apple.screensaver - key: loginWindowIdleTime - type: int - value: 0 - become: true diff --git a/roles/auth_config/tasks/sudo.yml b/roles/auth_config/tasks/sudo.yml deleted file mode 100644 index d94532d..0000000 --- a/roles/auth_config/tasks/sudo.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -# todo: add idempotency -- name: Ensure /etc/sudoers.d directory exists - ansible.builtin.file: - path: /etc/sudoers.d - state: directory - mode: "0755" - owner: root - group: wheel - become: true - -- name: Configure passwordless sudo for admin user - ansible.builtin.template: - src: sudoers.j2 - dest: /etc/sudoers.d/{{ macos_admin_user }}-nopasswd - mode: "0440" - owner: root - group: wheel - validate: /usr/sbin/visudo -cf %s - become: true diff --git a/roles/auth_config/templates/sudoers.j2 b/roles/auth_config/templates/sudoers.j2 deleted file mode 100644 index 880dae1..0000000 --- a/roles/auth_config/templates/sudoers.j2 +++ /dev/null @@ -1 +0,0 @@ -{{ macos_admin_user }} ALL=(ALL) NOPASSWD: ALL diff --git a/roles/homebrew/defaults/main.yml b/roles/homebrew/defaults/main.yml deleted file mode 100644 index 7909b04..0000000 --- a/roles/homebrew/defaults/main.yml +++ /dev/null @@ -1,3 +0,0 @@ ---- -homebrew_installed_packages_additional: [] -homebrew_taps_additional: [] diff --git a/roles/homebrew/tasks/main.yml b/roles/homebrew/tasks/main.yml deleted file mode 100644 index 15610f6..0000000 --- a/roles/homebrew/tasks/main.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -- name: Append additional packages to installed list - ansible.builtin.set_fact: - homebrew_installed_packages: "{{ homebrew_installed_packages + homebrew_installed_packages_additional }}" - homebrew_taps: "{{ homebrew_taps + homebrew_taps_additional }}" - -- name: Install Homebrew and packages - ansible.builtin.import_role: - name: geerlingguy.mac.homebrew diff --git a/roles/macos_updates/tasks/main.yml b/roles/macos_updates/tasks/main.yml deleted file mode 100644 index 503aecb..0000000 --- a/roles/macos_updates/tasks/main.yml +++ /dev/null @@ -1,7 +0,0 @@ ---- -- name: Prepare system for macOS update - ansible.builtin.import_tasks: prepare.yml - -- name: Install macOS updates - ansible.builtin.import_tasks: update.yml - when: macos_update_enabled | default(true) | bool diff --git a/roles/macos_updates/tasks/prepare.yml b/roles/macos_updates/tasks/prepare.yml deleted file mode 100644 index fb5978e..0000000 --- a/roles/macos_updates/tasks/prepare.yml +++ /dev/null @@ -1,152 +0,0 @@ ---- -# Marker files - checked by Setup Assistant on boot - -- name: Check if Setup Assistant marker exists - ansible.builtin.stat: - path: /private/var/db/.AppleSetupDone - register: macos_updates_setup_assistant_marker - become: true - -- name: Mark Setup Assistant as completed at system level - ansible.builtin.file: - path: /private/var/db/.AppleSetupDone - state: touch - owner: root - mode: "0400" - become: true - when: not macos_updates_setup_assistant_marker.stat.exists - -- name: Check if legacy setup registration marker exists - ansible.builtin.stat: - path: /Library/Receipts/.SetupRegComplete - register: macos_updates_setup_reg_complete_marker - become: true - -- name: Create legacy setup registration complete marker - ansible.builtin.file: - path: /Library/Receipts/.SetupRegComplete - state: touch - owner: root - mode: "0644" - become: true - when: not macos_updates_setup_reg_complete_marker.stat.exists - -- name: Check if .skipbuddy marker exists - ansible.builtin.stat: - path: "/Users/{{ macos_admin_user }}/.skipbuddy" - register: macos_updates_skipbuddy_marker - become: true - -- name: Create .skipbuddy marker in admin user home directory - ansible.builtin.file: - path: "/Users/{{ macos_admin_user }}/.skipbuddy" - state: touch - owner: "{{ macos_admin_user }}" - mode: "0644" - become: true - when: not macos_updates_skipbuddy_marker.stat.exists - -# System Setup Assistant preferences - -- name: Skip welcome/setup panes via managed preferences - community.general.osx_defaults: - domain: /Library/Preferences/com.apple.SetupAssistant.managed - key: "{{ item }}" - type: bool - value: true - become: true - loop: - - SkipAppearance - - SkipCloudSetup - - SkipiCloudStorageSetup - - SkipPrivacySetup - - SkipScreenTime - - SkipSiriSetup - - SkipTouchIDSetup - - SkipTrueTone - -- name: Set system-wide Setup Assistant bool gates as completed - community.general.osx_defaults: - domain: /Library/Preferences/com.apple.SetupAssistant - key: "{{ item }}" - type: bool - value: true - become: true - loop: "{{ macos_updates_setup_assistant_bool_keys }}" - -# Per-user Setup Assistant preferences - -- name: Mark per-user Setup Assistant bool gates as completed - community.general.osx_defaults: - domain: com.apple.SetupAssistant - key: "{{ item }}" - type: bool - value: true - become: true - become_user: "{{ macos_admin_user }}" - loop: "{{ macos_updates_setup_assistant_bool_keys }}" - -- name: Set per-user Setup Assistant version markers to sentinel values - community.general.osx_defaults: - domain: com.apple.SetupAssistant - key: "{{ item.key }}" - type: string - value: "{{ item.value }}" - become: true - become_user: "{{ macos_admin_user }}" - loop: - - key: LastPrivacyBundleVersion - value: "999999" - - key: LastSeenAgeRangeSelectionProductVersion - value: "99.99.99" - - key: LastSeenBuddyBuildVersion - value: "99Z999" - - key: LastSeenCloudProductVersion - value: "99.99.99" - - key: LastSeenDiagnosticsProductVersion - value: "99.99.99" - - key: LastSeenSiriProductVersion - value: "99.99.99" - -# Software Update preferences - -- name: Disable automatic software updates - community.general.osx_defaults: - domain: com.apple.SoftwareUpdate - key: "{{ item }}" - type: bool - value: false - become: true - loop: - - AutomaticCheckEnabled - - AutomaticDownload - - AllowPreReleaseInstallation - -- name: Suppress macOS upgrade notification - community.general.osx_defaults: - domain: com.apple.SoftwareUpdate - key: DoNotOfferNewVersion - type: bool - value: true - become: true - -- name: Suppress major OS upgrade notification date prompt - # MajorOSUserNotificationDate controls when macOS next nags about a major - # upgrade. Setting it to a far-future sentinel prevents the notification. - # osx_defaults doesn't support date type, so use defaults write directly. - ansible.builtin.command: - cmd: defaults write com.apple.SoftwareUpdate MajorOSUserNotificationDate -date "2099-01-01 00:00:00 +0000" - changed_when: false - -# Belt-and-suspenders: disable the background schedule in addition to the -# preference keys above. Prevents softwareupdated from waking up at all. -# Inspired by: -# https://github.com/actions/runner-images/blob/main/images/macos/scripts/build/configure-auto-updates.sh -- name: Disable softwareupdate automatic check schedule - ansible.builtin.command: - argv: - - softwareupdate - - --schedule - - "off" - become: true - changed_when: true diff --git a/roles/macos_updates/tasks/update.yml b/roles/macos_updates/tasks/update.yml deleted file mode 100644 index 869cb58..0000000 --- a/roles/macos_updates/tasks/update.yml +++ /dev/null @@ -1,52 +0,0 @@ ---- -- name: Check for available updates - ansible.builtin.command: softwareupdate --all --list --no-scan - register: macos_updates_swupdate_list - changed_when: false - failed_when: false - -- name: Parse available updates - ansible.builtin.set_fact: - macos_updates_available_updates: >- - {{ macos_updates_swupdate_list.stdout - | regex_findall('\* Label: (.*)\n\tTitle: (.*), Version: (.*), Size: (.*), Recommended: (.*), Action: (.*),') - | map('zip', ['label', 'title', 'version', 'size', 'recommended', 'action']) - | map('map', 'reverse') - | map('community.general.dict') - | list }} - changed_when: false - -- name: Print available updates - ansible.builtin.debug: - var: macos_updates_available_updates - -- name: Print macOS update install notice - ansible.builtin.debug: - msg: >- - Installing {{ macos_updates_available_updates | length }} macOS update(s) — this may take a long time... - when: macos_updates_available_updates | length > 0 - -- name: Install available updates - ansible.builtin.command: - cmd: "softwareupdate --install --agree-to-license --force --user {{ macos_admin_user }} --stdinpass '{{ item.label }}'" - stdin: "{{ macos_admin_password }}" - changed_when: macos_updates_swupdate_install.rc == 0 - become: true - register: macos_updates_swupdate_install - ignore_errors: true - loop: "{{ macos_updates_available_updates }}" - async: 1800 - poll: 30 - when: >- - not item.label.startswith('macOS') or item.version.split('.')[0] == ansible_facts['distribution_version'].split('.')[0] - -- name: Check if any updates were actually installed - ansible.builtin.set_fact: - macos_updates_installed: "{{ (macos_updates_swupdate_install.results | default([])) | selectattr('changed') | list | length > 0 }}" - changed_when: false - -- name: Reboot after macOS updates - ansible.builtin.reboot: - reboot_timeout: 1800 - become: true - when: macos_updates_installed | default(false) diff --git a/roles/macos_updates/vars/main.yml b/roles/macos_updates/vars/main.yml deleted file mode 100644 index a14b130..0000000 --- a/roles/macos_updates/vars/main.yml +++ /dev/null @@ -1,20 +0,0 @@ ---- -macos_updates_setup_assistant_bool_keys: - - DidSeeAccessibility - - DidSeeActivationLock - - DidSeeAppearanceSetup - - DidSeeApplePaySetup - - DidSeeAppStore - - DidSeeCloudSetup - - DidSeeiCloudLoginForStorageServices - - DidSeeLockdownMode - - DidSeePrivacy - - DidSeeScreenTime - - DidSeeSiriSetup - - DidSeeSyncSetup - - DidSeeSyncSetup2 - - DidSeeTermsOfAddress - - DidSeeTouchIDSetup - - DidSeeTrueTonePrivacy - - InitialAccountOnMac - - MiniBuddyLaunchedPostMigration diff --git a/roles/rosetta/tasks/main.yml b/roles/rosetta/tasks/main.yml deleted file mode 100644 index 8f9d16b..0000000 --- a/roles/rosetta/tasks/main.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -- name: Check if Rosetta 2 is installed - ansible.builtin.command: - cmd: arch -arch x86_64 /usr/bin/true - register: rosetta_check - changed_when: false - failed_when: false - when: ansible_facts['architecture'] == 'arm64' - -# On macOS Sonoma (14.0) a benign "Package Authoring Error" may appear in output but installation succeeds. -- name: Install Rosetta 2 - ansible.builtin.command: - cmd: softwareupdate --install-rosetta --agree-to-license - become: true - changed_when: true - when: - - ansible_facts['architecture'] == 'arm64' - - rosetta_check.rc is defined - - rosetta_check.rc != 0 diff --git a/roles/ssh_config/tasks/main.yml b/roles/ssh_config/tasks/main.yml deleted file mode 100644 index 5254052..0000000 --- a/roles/ssh_config/tasks/main.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -- name: Ensure ~/.ssh directory exists - ansible.builtin.file: - path: "~/.ssh" - state: directory - mode: "0700" - -- name: Add GitHub SSH host keys to known_hosts - ansible.builtin.known_hosts: - name: github.com - key: "{{ item }}" - path: "~/.ssh/known_hosts" - state: present - loop: "{{ ssh_config_github_known_hosts }}" diff --git a/roles/ssh_config/vars/main.yml b/roles/ssh_config/vars/main.yml deleted file mode 100644 index bfeed6c..0000000 --- a/roles/ssh_config/vars/main.yml +++ /dev/null @@ -1,10 +0,0 @@ ---- -# https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints -ssh_config_github_known_hosts: - # yamllint disable rule:line-length - - github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl - - github.com ecdsa-sha2-nistp256 - AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg= - - github.com ssh-rsa - AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk= - # yamllint enable rule:line-length diff --git a/roles/system_config/defaults/main.yml b/roles/system_config/defaults/main.yml deleted file mode 100644 index 0d3a1be..0000000 --- a/roles/system_config/defaults/main.yml +++ /dev/null @@ -1,2 +0,0 @@ ---- -system_config_hostname_prefix: Mac diff --git a/roles/system_config/files/hostname/com.ci.set-dynamic-hostname.plist b/roles/system_config/files/hostname/com.ci.set-dynamic-hostname.plist deleted file mode 100644 index dff73d2..0000000 --- a/roles/system_config/files/hostname/com.ci.set-dynamic-hostname.plist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - Label - com.ci.set-dynamic-hostname - ProgramArguments - - /usr/local/bin/set-dynamic-hostname.sh - - RunAtLoad - - - diff --git a/roles/system_config/files/shell_profile/.bash_profile b/roles/system_config/files/shell_profile/.bash_profile deleted file mode 100644 index 8f5baab..0000000 --- a/roles/system_config/files/shell_profile/.bash_profile +++ /dev/null @@ -1,2 +0,0 @@ -# shellcheck shell=bash -[ -f "${HOME}/.profile" ] && source "${HOME}/.profile" diff --git a/roles/system_config/files/shell_profile/.bashrc b/roles/system_config/files/shell_profile/.bashrc deleted file mode 100644 index 8f5baab..0000000 --- a/roles/system_config/files/shell_profile/.bashrc +++ /dev/null @@ -1,2 +0,0 @@ -# shellcheck shell=bash -[ -f "${HOME}/.profile" ] && source "${HOME}/.profile" diff --git a/roles/system_config/files/shell_profile/.profile b/roles/system_config/files/shell_profile/.profile deleted file mode 100644 index 5850df3..0000000 --- a/roles/system_config/files/shell_profile/.profile +++ /dev/null @@ -1,20 +0,0 @@ -# shellcheck shell=sh - -# Guard against double-loading -if [ -n "$__PROFILE_LOADED" ]; then - return 2>/dev/null || exit 0 -fi -export __PROFILE_LOADED=1 - -export LANG=en_US.UTF-8 - -# Don't restore shell sessions -export SHELL_SESSIONS_DISABLE=1 - -# Set up Homebrew environment -if [ -f "/opt/homebrew/bin/brew" ]; then - eval "$(/opt/homebrew/bin/brew shellenv)" - export HOMEBREW_NO_AUTO_UPDATE=1 - export HOMEBREW_NO_INSTALL_CLEANUP=1 - export HOMEBREW_CASK_OPTS="--no-quarantine" -fi diff --git a/roles/system_config/files/shell_profile/.zprofile b/roles/system_config/files/shell_profile/.zprofile deleted file mode 100644 index 59df8a5..0000000 --- a/roles/system_config/files/shell_profile/.zprofile +++ /dev/null @@ -1,2 +0,0 @@ -# shellcheck shell=zsh -[ -f "${HOME}/.profile" ] && . "${HOME}/.profile" diff --git a/roles/system_config/files/shell_profile/.zshrc b/roles/system_config/files/shell_profile/.zshrc deleted file mode 100644 index 59df8a5..0000000 --- a/roles/system_config/files/shell_profile/.zshrc +++ /dev/null @@ -1,2 +0,0 @@ -# shellcheck shell=zsh -[ -f "${HOME}/.profile" ] && . "${HOME}/.profile" diff --git a/roles/system_config/tasks/automation.yml b/roles/system_config/tasks/automation.yml deleted file mode 100644 index 69c5ef3..0000000 --- a/roles/system_config/tasks/automation.yml +++ /dev/null @@ -1,40 +0,0 @@ ---- -# Enables XCTest UI automation to run without triggering authentication prompts. -# Uses /usr/bin/expect (ships with macOS) to provide the user password non-interactively. -# -# Inspired by: -# https://github.com/actions/runner-images/blob/main/images/macos/scripts/build/configure-machine.sh - -- name: Check if automation mode is already enabled - ansible.builtin.command: - argv: - - automationmodetool - register: system_config_automationmode_status - changed_when: false - failed_when: false - -- name: Enable automation mode without authentication - ansible.builtin.shell: - cmd: | - /usr/bin/expect << 'EOF' - spawn automationmodetool enable-automationmode-without-authentication - expect "assword" - send "{{ macos_admin_password }}\r" - expect { - "succeeded." { exit 0 } - eof - } - EOF - executable: /bin/bash - when: "'DOES NOT REQUIRE' not in system_config_automationmode_status.stdout" - changed_when: true - no_log: true - -- name: Verify automation mode is enabled - ansible.builtin.command: - argv: - - automationmodetool - register: system_config_automationmode_verify - changed_when: false - failed_when: "'DOES NOT REQUIRE' not in system_config_automationmode_verify.stdout" - when: "'DOES NOT REQUIRE' not in system_config_automationmode_status.stdout" diff --git a/roles/system_config/tasks/gatekeeper.yml b/roles/system_config/tasks/gatekeeper.yml deleted file mode 100644 index 4138371..0000000 --- a/roles/system_config/tasks/gatekeeper.yml +++ /dev/null @@ -1,36 +0,0 @@ ---- -# Note: These tasks require SIP to be disabled on the target system. - -# Note: On macOS 26+, spctl --master-disable requires GUI interaction in -# System Settings to fully take effect. This command alone is insufficient -# but is kept for reference and for older macOS versions. -- name: Disable Gatekeeper - ansible.builtin.command: - cmd: spctl --master-disable - become: true - changed_when: true - failed_when: false - -- name: Enable Developer Mode for Terminal - ansible.builtin.command: - cmd: spctl developer-mode enable-terminal - become: true - changed_when: true - -# Enable VoiceOver AppleScript control for accessibility testing. -# Writing to this protected path requires SIP disabled. -# Inspired by: -# https://github.com/actions/runner-images/blob/main/images/macos/scripts/build/configure-machine.sh -- name: Enable VoiceOver AppleScript control - ansible.builtin.shell: - cmd: echo -n "a" > /private/var/db/Accessibility/.VoiceOverAppleScriptEnabled - executable: /bin/bash - become: true - changed_when: true - -- name: Enable VoiceOver AppleScript in user preferences - community.general.osx_defaults: - domain: com.apple.VoiceOver4/default - key: SCREnableAppleScript - type: bool - value: true diff --git a/roles/system_config/tasks/hostname.yml b/roles/system_config/tasks/hostname.yml deleted file mode 100644 index c3a50ed..0000000 --- a/roles/system_config/tasks/hostname.yml +++ /dev/null @@ -1,31 +0,0 @@ ---- -# Install a LaunchDaemon that generates a unique hostname on each boot. -# Since many VMs are cloned from the same base image and run simultaneously, -# they'd all share the same hostname causing Bonjour/mDNS conflicts. -# A millisecond-precision timestamp ensures uniqueness without external coordination. -# -# Inspired by: -# https://github.com/actions/runner-images/blob/main/images/macos/scripts/build/configure-hostname.sh - -- name: Ensure /usr/local/bin exists - ansible.builtin.file: - path: /usr/local/bin - state: directory - mode: "0755" - become: true - -- name: Install dynamic hostname script - ansible.builtin.template: - src: hostname/set-dynamic-hostname.sh.j2 - dest: /usr/local/bin/set-dynamic-hostname.sh - owner: root - mode: "0755" - become: true - -- name: Install dynamic hostname LaunchDaemon - ansible.builtin.copy: - src: hostname/com.ci.set-dynamic-hostname.plist - dest: /Library/LaunchDaemons/com.ci.set-dynamic-hostname.plist - owner: root - mode: "0644" - become: true diff --git a/roles/system_config/tasks/main.yml b/roles/system_config/tasks/main.yml deleted file mode 100644 index b6d415a..0000000 --- a/roles/system_config/tasks/main.yml +++ /dev/null @@ -1,41 +0,0 @@ ---- -- name: Configure system preferences - ansible.builtin.import_tasks: preferences.yml - -- name: Configure power management - ansible.builtin.import_tasks: power.yml - -- name: Configure user shell - ansible.builtin.import_tasks: shell.yml - -- name: Update Safari - ansible.builtin.import_tasks: safari.yml - -- name: Check SIP status - ansible.builtin.command: - cmd: csrutil status - register: system_config_csrutil_status - changed_when: false - -- name: Set SIP disabled fact - ansible.builtin.set_fact: - system_config_sip_disabled: "{{ 'disabled' in system_config_csrutil_status.stdout }}" - changed_when: false - -- name: Disable protected services - ansible.builtin.include_tasks: services.yml - when: system_config_sip_disabled - -- name: Configure Gatekeeper - ansible.builtin.include_tasks: gatekeeper.yml - when: system_config_sip_disabled - -- name: Pre-grant TCC permissions - ansible.builtin.include_tasks: tcc.yml - when: system_config_sip_disabled - -- name: Configure automation mode - ansible.builtin.import_tasks: automation.yml - -- name: Configure dynamic hostname - ansible.builtin.import_tasks: hostname.yml diff --git a/roles/system_config/tasks/power.yml b/roles/system_config/tasks/power.yml deleted file mode 100644 index 791f9cd..0000000 --- a/roles/system_config/tasks/power.yml +++ /dev/null @@ -1,130 +0,0 @@ ---- -- name: Check system sleep state - ansible.builtin.command: - cmd: systemsetup -getsleep - become: true - register: system_config_sleep_state - changed_when: false - -- name: Disable system sleep - ansible.builtin.command: - cmd: systemsetup -setsleep Off - become: true - changed_when: true - when: "'Never' not in system_config_sleep_state.stdout" - -- name: Check pmset settings - ansible.builtin.shell: - cmd: set -o pipefail && pmset -g custom | awk '$1 == "{{ item.key }}" && $2 != "{{ item.value }}" { exit 1 }' - executable: /bin/bash - become: true - register: system_config_pmset_setting_checks - changed_when: false - failed_when: false - loop: - - key: sleep - value: "0" - command: pmset -a sleep 0 - - key: displaysleep - value: "0" - command: pmset -a displaysleep 0 - - key: disksleep - value: "0" - command: pmset -a disksleep 0 - - key: hibernatemode - value: "0" - command: pmset -a hibernatemode 0 - - key: powernap - value: "0" - command: pmset -a powernap 0 - - key: networkoversleep - value: "1" - command: pmset -a networkoversleep 1 - - key: ttyskeepawake - value: "1" - command: pmset -a ttyskeepawake 1 - - key: tcpkeepalive - value: "1" - command: pmset -a tcpkeepalive 1 - - key: standby - value: "0" - command: pmset -a standby 0 - -- name: Apply pmset settings - ansible.builtin.command: - cmd: "{{ item.item.command }}" - become: true - changed_when: true - loop: "{{ system_config_pmset_setting_checks.results }}" - when: item.rc != 0 - -- name: Check AC power mode - ansible.builtin.shell: - cmd: set -o pipefail && pmset -g custom | awk '/^AC Power:/{f=1;next} /^[^[:space:]]/{f=0} f && $1=="powermode" && $2!="2"{exit 1}' - executable: /bin/bash - become: true - register: system_config_pmset_ac_powermode_check - changed_when: false - failed_when: false - -- name: Check AC Wake-on-LAN setting - ansible.builtin.shell: - cmd: set -o pipefail && pmset -g custom | awk '/^AC Power:/{f=1;next} /^[^[:space:]]/{f=0} f && $1=="womp" && $2!="1"{exit 1}' - executable: /bin/bash - become: true - register: system_config_pmset_ac_womp_check - changed_when: false - failed_when: false - -- name: Enable Wake-on-LAN on AC power - ansible.builtin.command: - cmd: pmset -c womp 1 - become: true - changed_when: true - when: system_config_pmset_ac_womp_check.rc != 0 - -- name: Check AC auto-restart setting - ansible.builtin.shell: - cmd: set -o pipefail && pmset -g custom | awk '/^AC Power:/{f=1;next} /^[^[:space:]]/{f=0} f && $1=="autorestart" && $2!="1"{exit 1}' - executable: /bin/bash - become: true - register: system_config_pmset_ac_autorestart_check - changed_when: false - failed_when: false - -- name: Enable auto-restart after power failure on AC power - ansible.builtin.command: - cmd: pmset -c autorestart 1 - become: true - changed_when: true - when: system_config_pmset_ac_autorestart_check.rc != 0 - -- name: Attempt to set AC power mode to high performance - ansible.builtin.command: - cmd: pmset -c powermode 2 - become: true - changed_when: true - failed_when: false - when: system_config_pmset_ac_powermode_check.rc != 0 - -- name: Delete sleep image file - ansible.builtin.file: - path: /var/vm/sleepimage - state: absent - become: true - -- name: Check if Time Machine automatic backups are disabled - ansible.builtin.shell: - cmd: set -o pipefail && defaults read /Library/Preferences/com.apple.TimeMachine AutoBackup 2>/dev/null | grep -qx '0' - executable: /bin/bash - become: true - register: system_config_time_machine_disabled - changed_when: false - failed_when: false - -- name: Disable Time Machine - ansible.builtin.command: - cmd: tmutil disable - become: true - changed_when: true - when: system_config_time_machine_disabled.rc != 0 diff --git a/roles/system_config/tasks/preferences.yml b/roles/system_config/tasks/preferences.yml deleted file mode 100644 index aa264db..0000000 --- a/roles/system_config/tasks/preferences.yml +++ /dev/null @@ -1,248 +0,0 @@ ---- -# Dock - -- name: Disable recent apps in Dock - community.general.osx_defaults: - domain: com.apple.dock - key: show-recents - type: bool - value: false - -# Window Manager - -- name: Disable Click to Show Desktop - community.general.osx_defaults: - domain: com.apple.WindowManager - key: EnableStandardClickToShowDesktop - type: bool - value: false - -- name: Hide widgets on Desktop and in Stage Manager - community.general.osx_defaults: - domain: com.apple.WindowManager - key: "{{ item }}" - type: bool - value: true - loop: - - StandardHideWidgets - - StageManagerHideWidgets - -# Tips - -- name: Disable Tips feature and notifications - community.general.osx_defaults: - domain: com.apple.tipsd - key: "{{ item }}" - type: bool - value: true - loop: - - SiriTipsDisabled - - TipsDisabled - -# Login window - -- name: Disable reopening of apps on login - community.general.osx_defaults: - domain: com.apple.loginwindow - key: "{{ item }}" - type: bool - value: false - loop: - - TALLogoutSavesState - - LoginwindowLaunchesRelaunchApps - -# Finder - -- name: Set Finder default view to column view - community.general.osx_defaults: - domain: com.apple.finder - key: FXPreferredViewStyle - type: string - value: clmv - -- name: Set Finder default search scope to current folder - community.general.osx_defaults: - domain: com.apple.finder - key: FXDefaultSearchScope - type: string - value: SCcf - -- name: Set Finder default new window to OS volume - community.general.osx_defaults: - domain: com.apple.finder - key: NewWindowTarget - type: string - value: OS volume - -- name: Enable Finder boolean preferences - community.general.osx_defaults: - domain: com.apple.finder - key: "{{ item }}" - type: bool - value: true - loop: - - _FXShowPosixPathInTitle - - _FXSortFoldersFirst - - _FXSortFoldersFirstOnDesktop - - AppleShowAllFiles - - ShowExternalHardDrivesOnDesktop - - ShowHardDrivesOnDesktop - - ShowMountedServersOnDesktop - - ShowPathbar - - ShowRemovableMediaOnDesktop - - ShowStatusBar - -- name: Disable Finder extension change warning - community.general.osx_defaults: - domain: com.apple.finder - key: FXEnableExtensionChangeWarning - type: bool - value: false - -# Global domain - -- name: Force Light appearance - community.general.osx_defaults: - domain: NSGlobalDomain - key: AppleInterfaceStyleSwitchesAutomatically - type: bool - value: false - -- name: Remove Dark mode key to ensure Light appearance - community.general.osx_defaults: - domain: NSGlobalDomain - key: AppleInterfaceStyle - state: absent - -- name: Show all filename extensions - community.general.osx_defaults: - domain: NSGlobalDomain - key: AppleShowAllExtensions - type: bool - value: true - -- name: Disable App Nap - community.general.osx_defaults: - domain: NSGlobalDomain - key: NSAppSleepDisabled - type: bool - value: true - -# Handoff - -- name: Disable Handoff and Continuity - community.general.osx_defaults: - domain: com.apple.coreservices.useractivityd - key: "{{ item }}" - type: bool - value: false - loop: - - ActivityReceivingEnabled - - ActivityAdvertisingAllowed - -# Universal Access - -- name: Disable graphic effects - community.general.osx_defaults: - domain: com.apple.universalaccess - key: "{{ item }}" - type: bool - value: true - loop: - - reduceMotion - - reduceTransparency - -# Screensaver - -- name: Disable screensaver for current user - community.general.osx_defaults: - domain: com.apple.screensaver - key: idleTime - type: string - value: "0" - host: currentHost - -- name: Disable asking for password after screensaver for current user - community.general.osx_defaults: - domain: com.apple.screensaver - key: askForPassword - type: bool - value: false - host: currentHost - -- name: Disable the asking for password delay for current user - community.general.osx_defaults: - domain: com.apple.screensaver - key: askForPasswordDelay - type: int - value: 0 - host: currentHost - -- name: Disable screensaver at login window - community.general.osx_defaults: - domain: /Library/Preferences/com.apple.screensaver - key: loginWindowIdleTime - type: int - value: 0 - become: true - -# Keyboard - -- name: Check Keyboard Setup Assistant preference - ansible.builtin.shell: - cmd: set -o pipefail && defaults read /Library/Preferences/com.apple.keyboardtype keyboardtype 2>/dev/null | grep -q '"3-7582-0" = 40;' - executable: /bin/bash - become: true - register: system_config_keyboard_setup_assistant_check - changed_when: false - failed_when: false - -- name: Disable Keyboard Setup Assistant - ansible.builtin.command: - cmd: defaults write /Library/Preferences/com.apple.keyboardtype keyboardtype -dict-add "3-7582-0" -int 40 - become: true - changed_when: true - when: system_config_keyboard_setup_assistant_check.rc != 0 - -# Filesystem visibility - -- name: Check ~/Library hidden flag - ansible.builtin.command: - cmd: stat -f %Sf /Users/{{ macos_admin_user }}/Library - register: system_config_admin_library_flags - changed_when: false - -- name: Unhide ~/Library folder - ansible.builtin.command: - cmd: chflags nohidden /Users/{{ macos_admin_user }}/Library - changed_when: true - when: "'hidden' in system_config_admin_library_flags.stdout" - -- name: Check /Volumes hidden flag - ansible.builtin.command: - cmd: stat -f %Sf /Volumes - become: true - register: system_config_volumes_flags - changed_when: false - -- name: Unhide /Volumes folder - ansible.builtin.command: - cmd: chflags nohidden /Volumes - become: true - changed_when: true - when: "'hidden' in system_config_volumes_flags.stdout" - -# Timezone -# Set UTC to ensure consistent timestamps for cache invalidation, code signing, -# certificate validation, and log correlation across distributed CI agents. -# Inspired by: -# https://github.com/actions/runner-images/blob/main/images/macos/scripts/build/configure-ntpconf.sh - -- name: Set timezone to UTC - ansible.builtin.command: - argv: - - systemsetup - - -settimezone - - GMT - become: true - changed_when: true diff --git a/roles/system_config/tasks/safari.yml b/roles/system_config/tasks/safari.yml deleted file mode 100644 index 9ce9c9c..0000000 --- a/roles/system_config/tasks/safari.yml +++ /dev/null @@ -1,24 +0,0 @@ ---- -- name: Check for available Safari updates - ansible.builtin.command: - cmd: softwareupdate --list --no-scan - become: true - register: system_config_safari_updates - changed_when: false - failed_when: false - -- name: Print Safari update notice - ansible.builtin.debug: - msg: Installing Safari update — this may take several minutes... - when: >- - 'Safari' in ((system_config_safari_updates.stdout | default('')) + (system_config_safari_updates.stderr | default(''))) -- name: Install Safari update - ansible.builtin.command: - cmd: softwareupdate --install --safari-only --verbose - become: true - changed_when: true - failed_when: false - async: 1800 - poll: 30 - when: >- - 'Safari' in ((system_config_safari_updates.stdout | default('')) + (system_config_safari_updates.stderr | default(''))) diff --git a/roles/system_config/tasks/services.yml b/roles/system_config/tasks/services.yml deleted file mode 100644 index b914a3f..0000000 --- a/roles/system_config/tasks/services.yml +++ /dev/null @@ -1,33 +0,0 @@ ---- -# Note: These tasks require SIP to be disabled on the target system. -# launchctl bootout returns non-zero if the service is not running; failed_when: false handles that. - -- name: Get current user UID - ansible.builtin.command: - cmd: id -u - register: _system_config_user_uid - changed_when: false - -- name: Disable GUI-level launch agents - ansible.builtin.command: - cmd: launchctl bootout "gui/{{ _system_config_user_uid.stdout | trim }}" {{ item }} - loop: - - /System/Library/LaunchAgents/com.apple.notificationcenterui.plist - - /System/Library/LaunchAgents/com.apple.tipsd.plist - failed_when: false - changed_when: true - -- name: Disable system-level launch daemons - ansible.builtin.command: - cmd: launchctl bootout system {{ item }} - become: true - loop: - - /System/Library/LaunchDaemons/com.apple.backupd.plist - - /System/Library/LaunchDaemons/com.apple.backupd-helper.plist - - /System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist - - /System/Library/LaunchDaemons/com.apple.apsd.plist - # CPU overhead service with no CI value. Inspired by: - # https://github.com/actions/runner-images/blob/main/images/macos/scripts/build/configure-system.sh - - /System/Library/LaunchDaemons/com.apple.PerfPowerServices.plist - failed_when: false - changed_when: true diff --git a/roles/system_config/tasks/shell.yml b/roles/system_config/tasks/shell.yml deleted file mode 100644 index 603a336..0000000 --- a/roles/system_config/tasks/shell.yml +++ /dev/null @@ -1,14 +0,0 @@ ---- -- name: Install shell profile files for admin user - ansible.builtin.copy: - src: "shell_profile/{{ item }}" - dest: "/Users/{{ macos_admin_user }}/{{ item }}" - owner: "{{ macos_admin_user }}" - mode: "0644" - loop: - - .bash_profile - - .bashrc - - .profile - - .zprofile - - .zshrc - become: true diff --git a/roles/system_config/tasks/spotlight.yml b/roles/system_config/tasks/spotlight.yml deleted file mode 100644 index 81eea52..0000000 --- a/roles/system_config/tasks/spotlight.yml +++ /dev/null @@ -1,25 +0,0 @@ ---- -- name: Erase Spotlight MDS indexes - ansible.builtin.command: - cmd: mdutil -E / - become: true - changed_when: true - -# Give mds time to begin re-indexing before we start polling for completion. -# Without this, the log query can match stale entries from a prior mds cycle. -- name: Wait for Spotlight re-indexing to start - ansible.builtin.pause: - seconds: 60 - -# Indexing typically takes 3-6 minutes. Poll every 30 seconds for up to 6 minutes. -- name: Wait for Spotlight indexing to complete - ansible.builtin.command: - cmd: >- - log show --last 1m --style compact --predicate 'process == "mds" && eventMessage CONTAINS "Released" && eventMessage CONTAINS "BackgroundTask"' - become: true - register: system_config_spotlight_log - changed_when: false - retries: 12 - delay: 30 - until: >- - system_config_spotlight_log.stdout | length > 0 diff --git a/roles/system_config/tasks/tcc.yml b/roles/system_config/tasks/tcc.yml deleted file mode 100644 index 538f432..0000000 --- a/roles/system_config/tasks/tcc.yml +++ /dev/null @@ -1,81 +0,0 @@ ---- -# Pre-populate macOS TCC (Transparency, Consent, and Control) database to prevent -# consent dialogs during automated XCUITest runs, simulator operations, and SSH-based scripting. -# -# Note: These tasks require SIP to be disabled on the target system. -# -# Inspired by: -# https://github.com/actions/runner-images/blob/main/images/macos/scripts/build/configure-tccdb-macos.sh - -- name: Grant system-wide TCC permissions (path-based clients) - ansible.builtin.shell: - cmd: | - sqlite3 "/Library/Application Support/com.apple.TCC/TCC.db" \ - "INSERT OR IGNORE INTO access (service, client, client_type, auth_value, auth_reason, auth_version, flags) \ - VALUES ('{{ item.service }}', '{{ item.client }}', 1, 2, 4, 1, 0);" - executable: /bin/bash - become: true - loop: - - { service: kTCCServiceAccessibility, client: /bin/bash } - - { service: kTCCServiceAccessibility, client: /bin/zsh } - - { service: kTCCServiceAccessibility, client: /usr/bin/osascript } - - { service: kTCCServiceAccessibility, client: /usr/sbin/sshd } - - { service: kTCCServiceScreenCapture, client: /bin/bash } - - { service: kTCCServiceScreenCapture, client: /bin/zsh } - - { service: kTCCServiceScreenCapture, client: /usr/sbin/sshd } - - { service: kTCCServiceAppleEvents, client: /bin/bash } - - { service: kTCCServiceAppleEvents, client: /bin/zsh } - - { service: kTCCServiceAppleEvents, client: /usr/bin/osascript } - - { service: kTCCServiceAppleEvents, client: /usr/sbin/sshd } - - { service: kTCCServiceAppleEvents, client: /usr/libexec/sshd-keygen-wrapper } - - { service: kTCCServiceSystemPolicyAllFiles, client: /bin/bash } - - { service: kTCCServiceSystemPolicyAllFiles, client: /bin/zsh } - - { service: kTCCServiceSystemPolicyAllFiles, client: /usr/sbin/sshd } - changed_when: true - -- name: Grant system-wide TCC permissions (bundle ID clients) - ansible.builtin.shell: - cmd: | - sqlite3 "/Library/Application Support/com.apple.TCC/TCC.db" \ - "INSERT OR IGNORE INTO access (service, client, client_type, auth_value, auth_reason, auth_version, flags) \ - VALUES ('{{ item.service }}', '{{ item.client }}', 0, 2, 4, 1, 0);" - executable: /bin/bash - become: true - loop: - - { service: kTCCServiceAccessibility, client: com.apple.dt.Xcode } - - { service: kTCCServiceScreenCapture, client: com.apple.dt.Xcode } - - { service: kTCCServiceAccessibility, client: com.apple.iphonesimulator } - - { service: kTCCServiceScreenCapture, client: com.apple.iphonesimulator } - - { service: kTCCServiceMicrophone, client: com.apple.iphonesimulator } - - { service: kTCCServiceScreenCapture, client: com.apple.Terminal } - - { service: kTCCServiceAccessibility, client: com.apple.Terminal } - changed_when: true - -- name: Grant user-level TCC permissions (path-based clients) - ansible.builtin.shell: - cmd: | - sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db \ - "INSERT OR IGNORE INTO access (service, client, client_type, auth_value, auth_reason, auth_version, flags) \ - VALUES ('{{ item.service }}', '{{ item.client }}', 1, 2, 4, 1, 0);" - executable: /bin/bash - loop: - - { service: kTCCServiceAccessibility, client: /bin/bash } - - { service: kTCCServiceAccessibility, client: /bin/zsh } - - { service: kTCCServiceAccessibility, client: /usr/bin/osascript } - - { service: kTCCServiceAppleEvents, client: /bin/bash } - - { service: kTCCServiceAppleEvents, client: /bin/zsh } - - { service: kTCCServiceAppleEvents, client: /usr/bin/osascript } - changed_when: true - -- name: Grant user-level TCC permissions (bundle ID clients) - ansible.builtin.shell: - cmd: | - sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db \ - "INSERT OR IGNORE INTO access (service, client, client_type, auth_value, auth_reason, auth_version, flags) \ - VALUES ('{{ item.service }}', '{{ item.client }}', 0, 2, 4, 1, 0);" - executable: /bin/bash - loop: - - { service: kTCCServiceScreenCapture, client: com.apple.Terminal } - - { service: kTCCServiceAccessibility, client: com.apple.Terminal } - - { service: kTCCServiceMicrophone, client: com.apple.iphonesimulator } - changed_when: true diff --git a/roles/system_config/templates/hostname/set-dynamic-hostname.sh.j2 b/roles/system_config/templates/hostname/set-dynamic-hostname.sh.j2 deleted file mode 100644 index 1ea046a..0000000 --- a/roles/system_config/templates/hostname/set-dynamic-hostname.sh.j2 +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# Generate a unique hostname on each boot to prevent Bonjour/mDNS conflicts -# when multiple VMs are cloned from the same base image. -# Inspired by: -# https://github.com/actions/runner-images/blob/main/images/macos/scripts/build/configure-hostname.sh - -prefix="{{ system_config_hostname_prefix | default('Mac') }}" -name="${prefix}-$(python3 -c 'from time import time; print(int(round(time() * 1000)))')" -scutil --set HostName "${name}.local" -scutil --set LocalHostName "${name}" -scutil --set ComputerName "${name}.local" diff --git a/roles/xcode/defaults/main.yml b/roles/xcode/defaults/main.yml deleted file mode 100644 index 4d158b3..0000000 --- a/roles/xcode/defaults/main.yml +++ /dev/null @@ -1,4 +0,0 @@ ---- -xcode_default_version: "" -xcode_simruntime_downloads: [] -xcode_simulators: [] diff --git a/roles/xcode/tasks/certificates.yml b/roles/xcode/tasks/certificates.yml deleted file mode 100644 index 32e18b1..0000000 --- a/roles/xcode/tasks/certificates.yml +++ /dev/null @@ -1,52 +0,0 @@ ---- -# Installs the Apple intermediate CA certificates required for codesigning into the system keychain. - -- name: Check for Apple WWDR certificate in system keychain - ansible.builtin.command: - cmd: security find-certificate -a -c 'Apple Worldwide Developer Relations Certification Authority' /Library/Keychains/System.keychain - become: true - register: xcode_wwdr_certificate_check - changed_when: false - failed_when: false - -- name: Check for Developer ID certificate in system keychain - ansible.builtin.command: - cmd: security find-certificate -a -c 'Developer ID Certification Authority' /Library/Keychains/System.keychain - become: true - register: xcode_developer_id_certificate_check - changed_when: false - failed_when: false - -- name: Install missing Apple certificates into system keychain - # when: xcode_wwdr_certificate_check.rc != 0 or xcode_developer_id_certificate_check.rc != 0 - block: - - name: Create temp directory for certificates - ansible.builtin.tempfile: - state: directory - suffix: certs - register: xcode_cert_tmpdir - - - name: Download Apple WWDR CA certificates - ansible.builtin.get_url: - url: "{{ item.url }}" - dest: "{{ xcode_cert_tmpdir.path }}/{{ item.filename }}" - mode: "0644" - loop: - - { url: "https://www.apple.com/certificateauthority/AppleWWDRCAG3.cer", filename: "AppleWWDRCAG3.cer" } - - { url: "https://www.apple.com/certificateauthority/DeveloperIDG2CA.cer", filename: "DeveloperIDG2CA.cer" } - - - name: Import Apple certificates into system keychain - ansible.builtin.command: - cmd: security import {{ item }} -k /Library/Keychains/System.keychain - become: true - register: xcode_certificate_import - changed_when: xcode_certificate_import.rc == 0 - failed_when: xcode_certificate_import.rc != 0 and 'The specified item already exists in the keychain.' not in xcode_certificate_import.stderr - loop: - - "{{ xcode_cert_tmpdir.path }}/AppleWWDRCAG3.cer" - - "{{ xcode_cert_tmpdir.path }}/DeveloperIDG2CA.cer" - - - name: Remove certificate temp directory - ansible.builtin.file: - path: "{{ xcode_cert_tmpdir.path }}" - state: absent diff --git a/roles/xcode/tasks/configure.yml b/roles/xcode/tasks/configure.yml deleted file mode 100644 index 43a4f91..0000000 --- a/roles/xcode/tasks/configure.yml +++ /dev/null @@ -1,59 +0,0 @@ ---- -- name: Configure Xcode preferences - community.general.osx_defaults: - domain: com.apple.dt.Xcode - key: "{{ item.key }}" - type: "{{ item.type }}" - value: "{{ item.value }}" - loop: - - key: XcodeCloudUpsellPromptEnabled - type: bool - value: false - - key: DVTWelcomeWindowLastShownVersion - type: string - value: "9999.0" - - key: IDEDisableCrashReporting - type: bool - value: true - - key: IDENeverShowSVNConversionWarning - type: bool - value: true - - key: IDESkipPackagePluginFingerprintValidation - type: bool - value: true - - key: IDETrustAllCertificates - type: bool - value: true - - key: IDEProvisioningStyle - type: string - value: Manual - -- name: Configure Xcode test preferences - community.general.osx_defaults: - domain: com.apple.dt.XCTest - key: AutomaticallyCollectTestResults - type: bool - value: false - -- name: Configure iOS Simulator preferences - community.general.osx_defaults: - domain: com.apple.iphonesimulator - key: "{{ item.key }}" - type: bool - value: "{{ item.value }}" - loop: - - key: AutomaticMinimizedWindowShowingEnabled - value: false - - key: CleanLaunchesEnabled - value: true - - key: DeviceDiscoveryDisabled - value: true - - key: StartLastDeviceOnLaunch - value: false - -- name: Disable automatic simulator creation on runtime install - community.general.osx_defaults: - domain: com.apple.CoreSimulator - key: EnableDefaultSetCreation - type: bool - value: false diff --git a/roles/xcode/tasks/install.yml b/roles/xcode/tasks/install.yml deleted file mode 100644 index d15693a..0000000 --- a/roles/xcode/tasks/install.yml +++ /dev/null @@ -1,159 +0,0 @@ ---- -- name: Find Xcode .xip files in Downloads - ansible.builtin.find: - paths: "/Users/{{ macos_admin_user }}/Downloads" - patterns: "*.xip" - register: xcode_xip_files - -- name: Initialize Xcode install plan - ansible.builtin.set_fact: - xcode_install_plan: [] - changed_when: false - -- name: Build Xcode install plan - ansible.builtin.set_fact: - xcode_install_plan: "{{ xcode_install_plan + [xcode_install_item] }}" - vars: - _version: "{{ item.path | basename | regex_search('[0-9]+(\\.[0-9]+){1,2}') }}" - xcode_install_item: - version: "{{ _version }}" - normalized_version: "{{ (_version.split('.') + ['0', '0'])[:3] | join('.') }}" - source_path: "{{ item.path }}" - filename: "{{ item.path | basename }}" - loop: "{{ xcode_xip_files.files }}" - changed_when: false - -- name: Check standard xcodes install paths - ansible.builtin.stat: - path: "{{ item }}" - loop: - - /opt/homebrew/bin/xcodes - - /usr/local/bin/xcodes - register: xcode_xcodes_candidates - -- name: Set xcodes binary path - ansible.builtin.set_fact: - xcode_xcodes_path: "{{ (xcode_xcodes_candidates.results | selectattr('stat.exists') | map(attribute='item') | list | first) | default('') }}" - changed_when: false - -- name: Ensure xcodes is installed on remote host - ansible.builtin.assert: - that: - - xcode_xcodes_path | length > 0 - fail_msg: xcodes binary not found in /opt/homebrew/bin or /usr/local/bin on remote host. - -- name: Check whether planned Xcode versions are already installed - ansible.builtin.stat: - path: "/Applications/Xcode-{{ item.normalized_version }}.app" - loop: "{{ xcode_install_plan }}" - register: xcode_installed_apps - -- name: Initialize missing Xcode install plan - ansible.builtin.set_fact: - xcode_missing_install_plan: [] - changed_when: false - -- name: Build missing Xcode install plan - ansible.builtin.set_fact: - xcode_missing_install_plan: "{{ xcode_missing_install_plan + [item.1] }}" - loop: "{{ xcode_installed_apps.results | zip(xcode_install_plan) | list }}" - when: not item.0.stat.exists - changed_when: false - -- name: Check current Xcode selection - ansible.builtin.command: - argv: - - /usr/bin/xcode-select - - --print-path - register: xcode_current_selection - changed_when: false - failed_when: false - -- name: Install missing Xcode versions - when: xcode_missing_install_plan | length > 0 - block: - - name: Print Xcode install plan - ansible.builtin.debug: - msg: >- - Installing {{ xcode_missing_install_plan | length }} Xcode version(s): {{ xcode_missing_install_plan | map(attribute='version') | join(', ') }} - - - name: Install Xcode versions with xcodes - ansible.builtin.command: - argv: - - "{{ xcode_xcodes_path }}" - - install - - "{{ item.version }}" - - --path - - "{{ item.source_path }}" - - --directory - - /Applications - - --experimental-unxip - become: true - changed_when: true - loop: "{{ xcode_missing_install_plan }}" - async: 3600 - poll: 30 - -- name: Remove Xcode .xip files from Downloads - ansible.builtin.file: - path: "{{ item.path }}" - state: absent - loop: "{{ xcode_xip_files.files }}" - when: xcode_xip_files.files | length > 0 - -- name: Run first launch and check for newer components for each Xcode version - ansible.builtin.command: - argv: - - xcodebuild - - -runFirstLaunch - - -checkForNewerComponents - environment: - DEVELOPER_DIR: "/Applications/Xcode-{{ item.normalized_version }}.app/Contents/Developer" - loop: "{{ xcode_install_plan }}" - changed_when: true - -# Register all .app bundles inside each Xcode install with Launch Services so that -# 'open -a', file type associations, and Spotlight work immediately without waiting -# for background indexing. -# Inspired by: -# https://github.com/actions/runner-images/blob/main/images/macos/scripts/helpers/Xcode.Installer.psm1 -- name: Register Xcode app bundles with Launch Services - ansible.builtin.shell: - cmd: >- - set -o pipefail && - find /Applications/Xcode-{{ item.normalized_version }}.app -name "*.app" -maxdepth 5 -print0 | - xargs -0 -I{} /System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f {} - executable: /bin/bash - loop: "{{ xcode_install_plan }}" - changed_when: true - -- name: Check if default Xcode version app is present - ansible.builtin.stat: - path: "/Applications/Xcode-{{ (xcode_default_version.split('.') + ['0', '0'])[:3] | join('.') }}.app" - register: xcode_default_app - when: xcode_default_version | length > 0 - -- name: Select default Xcode version - ansible.builtin.command: - argv: - - /usr/bin/xcode-select - - --switch - - "/Applications/Xcode-{{ (xcode_default_version.split('.') + ['0', '0'])[:3] | join('.') }}.app" - become: true - changed_when: true - when: - - xcode_default_version | length > 0 - - xcode_default_app.stat.exists | default(false) - - xcode_current_selection.stdout | default('') | trim != '/Applications/Xcode-' ~ ((xcode_default_version.split('.') + ['0', '0'])[:3] | join('.')) ~ - '.app/Contents/Developer' - -- name: Reset Xcode selection when no default is configured - ansible.builtin.command: - argv: - - /usr/bin/xcode-select - - --reset - become: true - changed_when: true - when: - - xcode_default_version | length == 0 - - (xcode_current_selection.stdout | default('') | trim) != '/Library/Developer/CommandLineTools' diff --git a/roles/xcode/tasks/main.yml b/roles/xcode/tasks/main.yml deleted file mode 100644 index 25a1b5e..0000000 --- a/roles/xcode/tasks/main.yml +++ /dev/null @@ -1,18 +0,0 @@ ---- -- name: Configure Xcode preferences - ansible.builtin.import_tasks: configure.yml - -- name: Install developer certificates - ansible.builtin.import_tasks: certificates.yml - -- name: Install cached Xcode versions - ansible.builtin.import_tasks: install.yml - -- name: Install simulator runtimes - ansible.builtin.import_tasks: simruntimes.yml - -- name: Create simulators - ansible.builtin.import_tasks: simulators.yml - -- name: Prewarm simulators - ansible.builtin.import_tasks: prewarm.yml diff --git a/roles/xcode/tasks/prewarm.yml b/roles/xcode/tasks/prewarm.yml deleted file mode 100644 index 52c6249..0000000 --- a/roles/xcode/tasks/prewarm.yml +++ /dev/null @@ -1,98 +0,0 @@ ---- -# Prewarm simulators and rebuild dyld shared cache so that the first simulator -# launch in a CI job starts instantly rather than spending minutes building caches. - -- name: Prewarm configured simulators - when: xcode_simulators | length > 0 - block: - - name: Get simulator list for prewarming - ansible.builtin.command: - argv: - - xcrun - - simctl - - list - - devices - - --json - register: xcode_prewarm_simctl_list - changed_when: false - - - name: Build simulator UDID list for prewarming - ansible.builtin.set_fact: - xcode_prewarm_udids: >- - {{ - xcode_prewarm_udids | default([]) + [ - (xcode_prewarm_simctl_list.stdout | from_json)['devices'] - | dict2items - | map(attribute='value') - | flatten - | selectattr('name', 'equalto', item.name) - | map(attribute='udid') - | first - ] - }} - loop: "{{ xcode_simulators }}" - - - name: Ensure simulators are shut down before prewarming - ansible.builtin.command: - argv: - - xcrun - - simctl - - shutdown - - "{{ item }}" - loop: "{{ xcode_prewarm_udids }}" - changed_when: true - failed_when: false - - - name: Boot simulators and wait for migration to complete - ansible.builtin.command: - argv: - - xcrun - - simctl - - bootstatus - - "{{ item }}" - - -b - loop: "{{ xcode_prewarm_udids }}" - changed_when: true - - - name: Shut down simulators after prewarming - ansible.builtin.command: - argv: - - xcrun - - simctl - - shutdown - - "{{ item }}" - loop: "{{ xcode_prewarm_udids }}" - changed_when: true - failed_when: false - -# Rebuild the dyld shared cache for all simulator runtimes. Without this, -# the first simulator launch in a CI job triggers an expensive cache build -# (potentially minutes of CPU time). Doing it at image bake time means -# every job starts with a ready-to-use simulator. -# -# Inspired by: -# https://github.com/actions/runner-images/blob/main/images/macos/scripts/helpers/Xcode.Installer.psm1 -- name: Update dyld shared cache for all simulator runtimes - ansible.builtin.command: - argv: - - xcrun - - simctl - - runtime - - dyld_shared_cache - - update - - --all - changed_when: true - -# Erase all simulator content and settings so no leftover app data from -# the build/prewarm process gets baked into the image. Each CI job starts -# with pristine simulators. -# Inspired by: -# https://github.com/actions/runner-images/blob/main/images/macos/scripts/build/configure-xcode.sh -- name: Erase all simulator content and settings - ansible.builtin.command: - argv: - - xcrun - - simctl - - erase - - all - changed_when: true diff --git a/roles/xcode/tasks/simruntimes.yml b/roles/xcode/tasks/simruntimes.yml deleted file mode 100644 index 5c54ac1..0000000 --- a/roles/xcode/tasks/simruntimes.yml +++ /dev/null @@ -1,66 +0,0 @@ ---- -- name: List installed simulator runtimes - ansible.builtin.command: - argv: [xcrun, simctl, runtime, list, --json] - become: true - register: xcode_installed_simruntimes_raw - changed_when: false - -- name: Set simulator runtime facts - ansible.builtin.set_fact: - xcode_installed_simruntimes: "{{ xcode_installed_simruntimes_raw.stdout | from_json }}" - xcode_installed_simruntime_versions: >- - {{ - (xcode_installed_simruntimes_raw.stdout | from_json).values() - | map(attribute='version') - | map('regex_replace', '(\\.0)+$', '') - | unique - | list - }} - xcode_desired_simruntime_versions: >- - {{ xcode_simruntime_downloads | map(attribute='build_version') | list }} - changed_when: false - -# ── Install missing runtimes ────────────────────────────────────────────────── - -- name: Download and install missing simulator runtimes - vars: - _argv_base: - - xcrun - - xcodebuild - - -downloadPlatform - - iOS - - -buildVersion - - "{{ item.build_version }}" - _argv_arch: "{{ ['-architectureVariant', item.architecture_variant] if 'architecture_variant' in item else [] }}" - ansible.builtin.command: - argv: "{{ _argv_base + _argv_arch }}" - become: true - loop: "{{ xcode_simruntime_downloads }}" - when: - - xcode_simruntime_downloads | length > 0 - - item.build_version not in xcode_installed_simruntime_versions - changed_when: true - async: 3600 - poll: 30 - -# ── Delete unneeded runtimes ────────────────────────────────────────────────── - -- name: Print unneeded simulator runtimes to be deleted - ansible.builtin.debug: - msg: "Deleting unneeded simulator runtime: {{ item.key }} ({{ item.value.version }})" - loop: "{{ xcode_installed_simruntimes | dict2items }}" - when: (item.value.version | regex_replace('(\\.0)+$', '')) not in xcode_desired_simruntime_versions - -- name: Delete unneeded simulator runtimes - ansible.builtin.command: - argv: - - xcrun - - simctl - - runtime - - delete - - "{{ item.value.identifier }}" - become: true - loop: "{{ xcode_installed_simruntimes | dict2items }}" - when: (item.value.version | regex_replace('(\\.0)+$', '')) not in xcode_desired_simruntime_versions - changed_when: true diff --git a/roles/xcode/tasks/simulators.yml b/roles/xcode/tasks/simulators.yml deleted file mode 100644 index e7c75c6..0000000 --- a/roles/xcode/tasks/simulators.yml +++ /dev/null @@ -1,71 +0,0 @@ ---- -- name: Create configured simulators - when: xcode_simulators | length > 0 - block: - - name: Get existing simulator names - ansible.builtin.command: - argv: - - xcrun - - simctl - - list - - devices - - --json - register: xcode_existing_simulators_raw - changed_when: false - - - name: Create simulators - ansible.builtin.command: - argv: - - xcrun - - simctl - - create - - "{{ item.name }}" - - "{{ item.device_type }}" - - "{{ item.runtime }}" - loop: "{{ xcode_simulators }}" - vars: - existing_names_for_runtime: >- - {{ - (xcode_existing_simulators_raw.stdout | from_json)['devices'] - | dict2items - | selectattr('key', 'equalto', item.runtime) - | map(attribute='value') - | flatten - | map(attribute='name') - | list - }} - when: item.name not in existing_names_for_runtime - changed_when: true - -# Delete duplicate simulators (same device name within the same runtime). -# This can happen when multiple Xcode versions share runtimes or from prior -# provisioning runs. Duplicates waste disk space and cause ambiguity when -# tests target a simulator by name. -# Inspired by: -# https://github.com/actions/runner-images/blob/main/images/macos/scripts/build/Configure-Xcode-Simulators.ps1 -- name: Remove duplicate simulators (same name within same runtime) - when: xcode_simulators | length > 0 - ansible.builtin.shell: - cmd: | - python3 << 'PYEOF' - import json, subprocess - result = subprocess.run( - ['xcrun', 'simctl', 'list', 'devices', '--json'], - capture_output=True, text=True, check=True) - data = json.loads(result.stdout) - deleted = 0 - for runtime, devices in data['devices'].items(): - seen = {} - for device in sorted(devices, key=lambda d: d['udid']): - if device['name'] in seen: - subprocess.run( - ['xcrun', 'simctl', 'delete', device['udid']], - check=True) - deleted += 1 - else: - seen[device['name']] = device['udid'] - print(deleted) - PYEOF - executable: /bin/bash - register: xcode_dedup_result - changed_when: (xcode_dedup_result.stdout | trim | int) > 0 diff --git a/roles/xcode_clt/tasks/main.yml b/roles/xcode_clt/tasks/main.yml deleted file mode 100644 index 7a983ad..0000000 --- a/roles/xcode_clt/tasks/main.yml +++ /dev/null @@ -1,83 +0,0 @@ ---- -- name: Determine CLT installation state - block: - - name: Probe CLT install directory - ansible.builtin.raw: test -d /Library/Developer/CommandLineTools - register: xcode_clt_check - changed_when: false - failed_when: false - - - name: Set CLT installed fact - ansible.builtin.set_fact: - xcode_clt_installed: "{{ xcode_clt_check.rc == 0 }}" - -- name: Command Line Tools already installed - ansible.builtin.debug: - msg: Command Line Tools are already installed — skipping. - when: xcode_clt_installed - -- name: Detect and install Command Line Tools - when: not xcode_clt_installed - block: - - name: Print software update cache notice - ansible.builtin.debug: - msg: Fetching software update catalog — this may take a minute... - - - name: Create Command Line Tools installation trigger file - ansible.builtin.raw: touch /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress - become: true - changed_when: false - - - name: Cache software update catalog - ansible.builtin.raw: softwareupdate --list --include-config-data - become: true - changed_when: false - timeout: 300 - - - name: Get available Command Line Tools label - ansible.builtin.raw: >- - softwareupdate --list --no-scan 2>&1 | - grep '\* Label: Command Line Tools' | - sed 's/.*\* Label: //' | - tail -n1 - register: xcode_clt_label_raw - become: true - changed_when: false - - - name: Parse Command Line Tools label - ansible.builtin.set_fact: - xcode_clt_label: "{{ xcode_clt_label_raw.stdout | trim }}" - - - name: Command Line Tools label not found in catalog - ansible.builtin.debug: - msg: No Command Line Tools package found in software update catalog. - when: xcode_clt_label == '' - - - name: Print CLT install plan - ansible.builtin.debug: - msg: "Installing {{ xcode_clt_label }} — this may take 10–20 minutes..." - when: xcode_clt_label != '' - - - name: Print log stream tip - ansible.builtin.debug: - msg: >- - Tip: on the target host, run: log stream --predicate 'process == "softwareupdate"' - to watch real-time progress. - when: xcode_clt_label != '' - - - name: Install Command Line Tools - ansible.builtin.raw: "softwareupdate --install --no-scan --verbose '{{ xcode_clt_label }}'" - become: true - when: xcode_clt_label != '' - changed_when: true - - - name: Reset Xcode developer directory - ansible.builtin.raw: xcrun xcode-select --reset - become: true - when: xcode_clt_label != '' - changed_when: true - - - name: Remove Command Line Tools installation trigger file - ansible.builtin.raw: rm -f /tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress - become: true - changed_when: false diff --git a/scripts/cache-xcodes.bash b/scripts/cache-xcodes.bash deleted file mode 100755 index c911d01..0000000 --- a/scripts/cache-xcodes.bash +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash - -source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/lib/common.bash" || exit 1 - -function main() { - local -r temp_dir=$(mktemp --directory) - local -r xcodes_cache_dir="${CACHE_DIR}/xcodes" - mkdir -p "${xcodes_cache_dir}" - - local -ra xcode_versions=( - "16.2.0" - "16.4.0" - "26.0.1" - "26.5.0" - ) - - for version in "${xcode_versions[@]}"; do - xcodes download "${version}" --directory "${temp_dir}" - local xip_path - xip_path=$(find "${temp_dir}" -type f -name "*.xip" | head -1) - if [[ -z "${xip_path}" ]]; then - log_error "No .xip file found for version ${version}" - continue - fi - mv "${xip_path}" "${xcodes_cache_dir}/xcode-${version}.xip" - done - - rm -rf "${temp_dir}" -} - -main "$@" diff --git a/src/templates/data/.bash_profile b/src/templates/data/.bash_profile new file mode 100644 index 0000000..d8871df --- /dev/null +++ b/src/templates/data/.bash_profile @@ -0,0 +1 @@ +[ -r "$HOME/.profile" ] && . "$HOME/.profile" diff --git a/src/templates/data/.bashrc b/src/templates/data/.bashrc new file mode 100644 index 0000000..d8871df --- /dev/null +++ b/src/templates/data/.bashrc @@ -0,0 +1 @@ +[ -r "$HOME/.profile" ] && . "$HOME/.profile" diff --git a/src/templates/data/.profile b/src/templates/data/.profile new file mode 100644 index 0000000..1b18458 --- /dev/null +++ b/src/templates/data/.profile @@ -0,0 +1,47 @@ +# Login and interactive startup files may both source this in the same shell. +if [ "${_profile_pid-}" = "$$" ]; then + return +fi + +export LANG=en_US.UTF-8 + +# Disable macOS Terminal session restoration +export SHELL_SESSIONS_DISABLE=1 + +current_shell="sh" +if [ -n "${ZSH_VERSION-}" ]; then + current_shell="zsh" +elif [ -n "${BASH_VERSION-}" ]; then + # macOS's `sh` is just Bash in compatibility mode, without Bash interactive hooks. + # `shopt` is safe here because this branch only runs under Bash. + # shellcheck disable=SC3044 + if [ "${0##*/}" != "sh" ] && [ "${0##*/}" != "-sh" ] && ! shopt -oq posix; then + current_shell="bash" + fi +fi + +# Set up Homebrew environment +brew_path=$(command -v brew 2>/dev/null) || brew_path="/opt/homebrew/bin/brew" +if [ -x "$brew_path" ]; then + export HOMEBREW_NO_AUTO_UPDATE=1 + export HOMEBREW_NO_INSTALL_CLEANUP=1 + eval "$("$brew_path" shellenv "$current_shell")" +fi +unset brew_path + +# Set up mise environment +mise_path=$(command -v mise 2>/dev/null) || mise_path="$HOME/.local/bin/mise" +if [ -x "$mise_path" ]; then + export MISE_NOT_FOUND_AUTO_INSTALL=0 + # Interactive shells that are either bash or zsh use mise's built-in activation command. + # `sh` and all other shells have the shims directory added to the `$PATH` manually. + if [ "${-#*i}" != "$-" ] && { [ "$current_shell" = "bash" ] || [ "$current_shell" = "zsh" ]; }; then + eval "$("$mise_path" activate "$current_shell")" + else + export PATH="${MISE_DATA_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/mise}/shims:${mise_path%/*}:$PATH" + fi +fi +unset mise_path + +unset current_shell +_profile_pid=$$ diff --git a/src/templates/data/.zprofile b/src/templates/data/.zprofile new file mode 100644 index 0000000..d8871df --- /dev/null +++ b/src/templates/data/.zprofile @@ -0,0 +1 @@ +[ -r "$HOME/.profile" ] && . "$HOME/.profile" diff --git a/src/templates/data/.zshenv b/src/templates/data/.zshenv new file mode 100644 index 0000000..11b7a20 --- /dev/null +++ b/src/templates/data/.zshenv @@ -0,0 +1,2 @@ +# Disable macOS Terminal session restoration before /etc/zshrc runs. +export SHELL_SESSIONS_DISABLE=1 diff --git a/src/templates/data/.zshrc b/src/templates/data/.zshrc new file mode 100644 index 0000000..d8871df --- /dev/null +++ b/src/templates/data/.zshrc @@ -0,0 +1 @@ +[ -r "$HOME/.profile" ] && . "$HOME/.profile" diff --git a/src/templates/macos-27-01-base.pkr.hcl b/src/templates/macos-27-01-base.pkr.hcl new file mode 100644 index 0000000..44a57d3 --- /dev/null +++ b/src/templates/macos-27-01-base.pkr.hcl @@ -0,0 +1,77 @@ +packer { + required_plugins { + ipsw = { + version = ">= 0.1.10" + source = "github.com/torarnv/ipsw" + } + + tart = { + version = ">= 1.21.0" + source = "github.com/cirruslabs/tart" + } + } +} + +variable "macos_version" { + type = string + default = "27" +} + +variable "vm_name" { + type = string + default = "macos-27-01-base" +} + +variable "vm_username" { + type = string + sensitive = true + default = "admin" +} + +variable "vm_password" { + type = string + sensitive = true + default = "admin" +} + +data "ipsw" "macos" { + os = "macOS" + version = var.macos_version + device = "VirtualMac2,1" +} + +source "tart-cli" "base" { + from_ipsw = data.ipsw.macos.url + vm_name = var.vm_name + cpu_count = 4 + memory_gb = 8 + disk_size_gb = 100 + disk_format = "asif" + ssh_password = var.vm_password + ssh_username = var.vm_username + ssh_timeout = "180s" + recovery_partition = "keep" + run_extra_args = [ + "--no-audio", + "--vnc-experimental", + "--provisioning-opts=${join(",", [ + "fullName=${var.vm_username}", + "username=${var.vm_username}", + "password=${var.vm_password}", + "logsInAutomatically=true", + "enablesRemoteLogin=true", + ])}", + ] + + // A (hopefully) temporary workaround for Virtualization.Framework's + // installation process not fully finishing in a timely manner + create_grace_time = "30s" +} + +build { + sources = ["source.tart-cli.base"] + + provisioner "shell" { + script = "${path.root}/scripts/system_config/wait-for-spotlight.bash" + } +} diff --git a/src/templates/macos-27-02-ci-gui.pkr.hcl b/src/templates/macos-27-02-ci-gui.pkr.hcl new file mode 100644 index 0000000..50a18a7 --- /dev/null +++ b/src/templates/macos-27-02-ci-gui.pkr.hcl @@ -0,0 +1,100 @@ +# For reference, it is possible to enable the on-screen keyboard to allow for improved debugability +# of these workflows that require GUI interaction. Here is how you'd do that: +# +# "open 'x-apple.systempreferences:com.apple.preference.universalaccess?Keyboard'", +# "", +# +# And to disable: +# +# "open 'x-apple.systempreferences:com.apple.preference.universalaccess?Keyboard'", +# "", +# "", + +packer { + required_plugins { + tart = { + version = ">= 1.21.0" + source = "github.com/cirruslabs/tart" + } + } +} + +variable "vm_base_name" { + type = string + default = "macos-27-01-base" +} + +variable "vm_name" { + type = string + default = "macos-27-02-ci-gui" +} + +variable "vm_username" { + type = string + sensitive = true + default = "admin" +} + +variable "vm_password" { + type = string + sensitive = true + default = "admin" +} + +source "tart-cli" "ci-gui" { + # Clone the installed base so each boot-command attempt starts clean. + vm_base_name = var.vm_base_name + vm_name = var.vm_name + ssh_password = var.vm_password + ssh_username = var.vm_username + ssh_timeout = "180s" + run_extra_args = [ + "--no-audio", + "--vnc-experimental", + ] + + boot_command = [ + # Give the OS a bit to settle + "", + + # Open System Settings to give it time to settle + "System Settings", + + # Enable Keyboard Navigation so we can navigate System Settings using the keyboard + "Terminal", + "defaults write NSGlobalDomain AppleKeyboardUIMode -int 3", + + # Disable Gatekeeper (1/2) + "sudo spctl --global-disable", + "admin", + # Disable Gatekeeper (2/2) + "open 'x-apple.systempreferences:com.apple.settings.PrivacySecurity.extension'", + "", + "", + "admin", + "", + + # Enable Screen Sharing through the UI to grant the required TCC permissions + "Terminal", + "open 'x-apple.systempreferences:com.apple.Sharing-Settings.extension'", + "", + "admin", + ] +} + +build { + sources = ["source.tart-cli.ci-gui"] + + provisioner "shell" { + inline = [ + # Quit System Settings and Terminal + "killall 'System Settings' 'Terminal'", + # Return Keyboard Navigation to its default state + "defaults delete NSGlobalDomain AppleKeyboardUIMode", + # Ensure that Gatekeeper is disabled. + "spctl --status | grep -q 'assessments disabled'", + # Ensure that Screen Sharing's service is loaded. + "echo '${var.vm_password}' | sudo -S -p '' launchctl print system/com.apple.screensharing > /dev/null", + ] + } +} diff --git a/src/templates/macos-27-03-ci-recovery.pkr.hcl b/src/templates/macos-27-03-ci-recovery.pkr.hcl new file mode 100644 index 0000000..8c2f761 --- /dev/null +++ b/src/templates/macos-27-03-ci-recovery.pkr.hcl @@ -0,0 +1,52 @@ +packer { + required_plugins { + tart = { + version = ">= 1.21.0" + source = "github.com/cirruslabs/tart" + } + } +} + +variable "vm_base_name" { + type = string + default = "macos-27-02-ci-gui" +} + +variable "vm_name" { + type = string + default = "macos-27-03-ci-recovery" +} + +variable "vm_password" { + type = string + sensitive = true + default = "admin" +} + +source "tart-cli" "ci-recovery" { + # Clone the preceding stage so each attempt starts clean. + vm_base_name = var.vm_base_name + vm_name = var.vm_name + communicator = "none" + recovery = true + run_extra_args = [ + "--no-audio", + "--vnc-experimental", + ] + boot_command = [ + # Skip over "Macintosh" and select "Options" to boot into macOS Recovery + "", + # Open Terminal + "T", + # Disable SIP + "csrutil disable", + "y", + "${var.vm_password}", + # Shutdown + "halt" + ] +} + +build { + sources = ["source.tart-cli.ci-recovery"] +} diff --git a/src/templates/macos-27-04-ci-ssh.pkr.hcl b/src/templates/macos-27-04-ci-ssh.pkr.hcl new file mode 100644 index 0000000..dcb4e53 --- /dev/null +++ b/src/templates/macos-27-04-ci-ssh.pkr.hcl @@ -0,0 +1,92 @@ +packer { + required_plugins { + tart = { + version = ">= 1.21.0" + source = "github.com/cirruslabs/tart" + } + } +} + +variable "vm_base_name" { + type = string + default = "macos-27-03-ci-recovery" +} + +variable "vm_name" { + type = string + default = "macos-27-04-ci-ssh" +} + +variable "vm_username" { + type = string + sensitive = true + default = "admin" +} + +variable "vm_password" { + type = string + sensitive = true + default = "admin" +} + +source "tart-cli" "ci-ssh" { + # Clone the preceding stage so each attempt starts clean. + vm_base_name = var.vm_base_name + vm_name = var.vm_name + ssh_password = var.vm_password + ssh_username = var.vm_username + ssh_timeout = "180s" + run_extra_args = [ + "--no-audio", + "--vnc-experimental", + ] + +} + +build { + sources = ["source.tart-cli.ci-ssh"] + + provisioner "shell" { + script = "${path.root}/scripts/auth_config/enable-passwordless-sudo.bash" + use_env_var_file = true + environment_vars = ["USERNAME=${var.vm_username}", "PASSWORD=${var.vm_password}"] + } + + provisioner "shell" { + script = "${path.root}/scripts/xcode_clt/install-xcode-command-line-tools.bash" + execute_command = "{{ .Vars }} sudo -n /bin/bash -euo pipefail '{{ .Path }}'" + } + + provisioner "shell" { + script = "${path.root}/scripts/homebrew/install-homebrew.bash" + use_env_var_file = true + environment_vars = ["NONINTERACTIVE=1"] + } + + provisioner "shell" { + script = "${path.root}/scripts/mise/install-mise.bash" + } + + provisioner "shell" { + inline = ["mkdir -p /tmp/hisaac-ci-shell-config"] + } + + provisioner "file" { + source = "${path.root}/data/" + destination = "/tmp/hisaac-ci-shell-config/" + } + + provisioner "shell" { + script = "${path.root}/scripts/system_config/install-shell-config.bash" + execute_command = "{{ .Vars }} /bin/bash -euo pipefail '{{ .Path }}' /tmp/hisaac-ci-shell-config" + } + + provisioner "shell" { + inline = [ + "rm -rf /tmp/hisaac-ci-shell-config", + "xcode-select --print-path", + "/bin/zsh -lc 'brew --version && mise --version'", + "/bin/bash -lc 'brew --version && mise --version'", + ] + } +} diff --git a/scripts/auth_config/disable-screen-lock.bash b/src/templates/scripts/auth_config/disable-screen-lock.bash similarity index 100% rename from scripts/auth_config/disable-screen-lock.bash rename to src/templates/scripts/auth_config/disable-screen-lock.bash diff --git a/scripts/auth_config/enable-passwordless-sudo.bash b/src/templates/scripts/auth_config/enable-passwordless-sudo.bash similarity index 72% rename from scripts/auth_config/enable-passwordless-sudo.bash rename to src/templates/scripts/auth_config/enable-passwordless-sudo.bash index 3e72d68..e8ef872 100755 --- a/scripts/auth_config/enable-passwordless-sudo.bash +++ b/src/templates/scripts/auth_config/enable-passwordless-sudo.bash @@ -6,16 +6,19 @@ function main() { echo "Enabling passwordless sudo for ${username}..." - mkdir -p /etc/sudoers.d/ - # Cache the password to avoid prompting for it later - echo "${password}" | sudo --stdin --validate + printf '%s\n' "${password}" | sudo --stdin --validate + + sudo mkdir -p /etc/sudoers.d/ # Add the user to the sudoers file with NOPASSWD option echo "${username} ALL=(ALL) NOPASSWD: ALL" | sudo SUDO_EDITOR="tee" visudo "/etc/sudoers.d/${username}-nopasswd" # Clear the cached password to ensure no lingering sudo access sudo --remove-timestamp + + # Verify the new rule works without cached credentials or a password prompt. + sudo --non-interactive true } main "$@" diff --git a/scripts/homebrew/install-homebrew-casks.bash b/src/templates/scripts/homebrew/install-homebrew-casks.bash similarity index 62% rename from scripts/homebrew/install-homebrew-casks.bash rename to src/templates/scripts/homebrew/install-homebrew-casks.bash index df97f25..20c06c0 100755 --- a/scripts/homebrew/install-homebrew-casks.bash +++ b/src/templates/scripts/homebrew/install-homebrew-casks.bash @@ -1,8 +1,5 @@ #!/bin/bash -euo pipefail -# shellcheck source=../../roles/system_config/files/shell_profile/.profile -source "${HOME}/.profile" - function main() { local -r casks="${1:-${BREW_CASKS}}" diff --git a/scripts/homebrew/install-homebrew-formulae.bash b/src/templates/scripts/homebrew/install-homebrew-formulae.bash similarity index 63% rename from scripts/homebrew/install-homebrew-formulae.bash rename to src/templates/scripts/homebrew/install-homebrew-formulae.bash index 4691aee..fb694d1 100755 --- a/scripts/homebrew/install-homebrew-formulae.bash +++ b/src/templates/scripts/homebrew/install-homebrew-formulae.bash @@ -1,8 +1,5 @@ #!/bin/bash -euo pipefail -# shellcheck source=../../roles/system_config/files/shell_profile/.profile -source "${HOME}/.profile" - function main() { local -r formulae="${1:-${BREW_FORMULAE}}" diff --git a/scripts/homebrew/install-homebrew.bash b/src/templates/scripts/homebrew/install-homebrew.bash similarity index 100% rename from scripts/homebrew/install-homebrew.bash rename to src/templates/scripts/homebrew/install-homebrew.bash diff --git a/scripts/macos_updates/update-macos.bash b/src/templates/scripts/macos_updates/update-macos.bash similarity index 100% rename from scripts/macos_updates/update-macos.bash rename to src/templates/scripts/macos_updates/update-macos.bash diff --git a/src/templates/scripts/mise/install-mise.bash b/src/templates/scripts/mise/install-mise.bash new file mode 100755 index 0000000..7d38ebd --- /dev/null +++ b/src/templates/scripts/mise/install-mise.bash @@ -0,0 +1,9 @@ +#!/bin/bash -euo pipefail + +function main() { + echo "Installing mise..." + curl -fsSL https://mise.run | sh + "${HOME}/.local/bin/mise" --version +} + +main "$@" diff --git a/scripts/rosetta/install-rosetta-2.bash b/src/templates/scripts/rosetta/install-rosetta-2.bash similarity index 100% rename from scripts/rosetta/install-rosetta-2.bash rename to src/templates/scripts/rosetta/install-rosetta-2.bash diff --git a/scripts/ssh_config/configure-ssh-known-hosts.bash b/src/templates/scripts/ssh_config/configure-ssh-known-hosts.bash similarity index 100% rename from scripts/ssh_config/configure-ssh-known-hosts.bash rename to src/templates/scripts/ssh_config/configure-ssh-known-hosts.bash diff --git a/scripts/system_config/cleanup-spotlight-index.bash b/src/templates/scripts/system_config/cleanup-spotlight-index.bash similarity index 100% rename from scripts/system_config/cleanup-spotlight-index.bash rename to src/templates/scripts/system_config/cleanup-spotlight-index.bash diff --git a/scripts/system_config/configure-shell.bash b/src/templates/scripts/system_config/configure-shell.bash similarity index 100% rename from scripts/system_config/configure-shell.bash rename to src/templates/scripts/system_config/configure-shell.bash diff --git a/scripts/system_config/configure-system.bash b/src/templates/scripts/system_config/configure-system.bash similarity index 100% rename from scripts/system_config/configure-system.bash rename to src/templates/scripts/system_config/configure-system.bash diff --git a/scripts/system_config/disable-protected-services.bash b/src/templates/scripts/system_config/disable-protected-services.bash similarity index 100% rename from scripts/system_config/disable-protected-services.bash rename to src/templates/scripts/system_config/disable-protected-services.bash diff --git a/scripts/system_config/disable-spctl.bash b/src/templates/scripts/system_config/disable-spctl.bash similarity index 100% rename from scripts/system_config/disable-spctl.bash rename to src/templates/scripts/system_config/disable-spctl.bash diff --git a/src/templates/scripts/system_config/install-shell-config.bash b/src/templates/scripts/system_config/install-shell-config.bash new file mode 100755 index 0000000..a596d2e --- /dev/null +++ b/src/templates/scripts/system_config/install-shell-config.bash @@ -0,0 +1,10 @@ +#!/bin/bash -euo pipefail + +function main() { + local -r data_dir="${1:?Usage: install-shell-config.bash DATA_DIRECTORY}" + + echo "Installing shell configuration..." + install -m 644 "${data_dir}"/{.profile,.bash_profile,.bashrc,.zprofile,.zshenv,.zshrc} "${HOME}/" +} + +main "$@" diff --git a/scripts/system_config/update-safari.bash b/src/templates/scripts/system_config/update-safari.bash similarity index 100% rename from scripts/system_config/update-safari.bash rename to src/templates/scripts/system_config/update-safari.bash diff --git a/scripts/system_config/wait-for-finder.bash b/src/templates/scripts/system_config/wait-for-finder.bash similarity index 100% rename from scripts/system_config/wait-for-finder.bash rename to src/templates/scripts/system_config/wait-for-finder.bash diff --git a/src/templates/scripts/system_config/wait-for-spotlight.bash b/src/templates/scripts/system_config/wait-for-spotlight.bash new file mode 100644 index 0000000..d76cfe5 --- /dev/null +++ b/src/templates/scripts/system_config/wait-for-spotlight.bash @@ -0,0 +1,49 @@ +#!/bin/bash -euo pipefail + +# Power assertions indicate activity, not guaranteed index completeness. +# Require a sustained quiet period rather than accepting one released task. +function main() { + local -r timeout=900 + local -r quiet_seconds=60 + local -r poll_interval=5 + local quiet_since=-1 + local saw_activity=false + local assertions active + + SECONDS=0 + echo "Waiting for Spotlight metadata assertions to stay absent for ${quiet_seconds}s (timeout: ${timeout}s)." + + while ((SECONDS < timeout)); do + if ! assertions=$(pmset -g assertions); then + echo "Could not read power assertions; cannot determine Spotlight activity." >&2 + return 1 + fi + active=$(printf '%s\n' "$assertions" | grep -E 'com\.apple\.metadata\.(mds|mds_stores)(\.power)?"' || true) + + if [[ -n "$active" ]]; then + saw_activity=true + quiet_since=-1 + echo "[${SECONDS}s] Spotlight assertions active; resetting quiet period:" + printf '%s\n' "$active" + else + if ((quiet_since < 0)); then + quiet_since=$SECONDS + fi + echo "[${SECONDS}s] No Spotlight metadata assertions; quiet for $((SECONDS - quiet_since))/${quiet_seconds}s." + if ((SECONDS - quiet_since >= quiet_seconds)); then + if [[ "$saw_activity" == false ]]; then + echo "No matching activity was observed during this check; an indexing-to-idle transition was not verified." + fi + echo "Spotlight appears idle based on power assertions; this does not prove the index is complete." + return 0 + fi + fi + + sleep "$poll_interval" + done + + echo "Timed out waiting for Spotlight to settle after ${timeout}s." >&2 + return 1 +} + +main "$@" diff --git a/scripts/xcode/configure-xcode.bash b/src/templates/scripts/xcode/configure-xcode.bash similarity index 100% rename from scripts/xcode/configure-xcode.bash rename to src/templates/scripts/xcode/configure-xcode.bash diff --git a/scripts/xcode/install-cached-xcode-versions.bash b/src/templates/scripts/xcode/install-cached-xcode-versions.bash similarity index 100% rename from scripts/xcode/install-cached-xcode-versions.bash rename to src/templates/scripts/xcode/install-cached-xcode-versions.bash diff --git a/scripts/xcode/install-developer-certificates.bash b/src/templates/scripts/xcode/install-developer-certificates.bash similarity index 100% rename from scripts/xcode/install-developer-certificates.bash rename to src/templates/scripts/xcode/install-developer-certificates.bash diff --git a/scripts/xcode/lib/xcode-utils.bash b/src/templates/scripts/xcode/lib/xcode-utils.bash similarity index 98% rename from scripts/xcode/lib/xcode-utils.bash rename to src/templates/scripts/xcode/lib/xcode-utils.bash index f6110da..3db5240 100755 --- a/scripts/xcode/lib/xcode-utils.bash +++ b/src/templates/scripts/xcode/lib/xcode-utils.bash @@ -120,10 +120,10 @@ function prewarm_simulators() { # Wait for the "update_dyld_sim_shared_cache" process to finish to avoid wasting CPU cycles after boot # sources: - # - https://github.com/cirruslabs/macos-image-templates/blob/5b17f4e2644723b2124c5cf1c1def4ba81fc6db7/templates/xcode.pkr.hcl#L243-L252 # - https://apple.stackexchange.com/questions/412101/update-dyld-sim-shared-cache-is-taking-up-a-lot-of-memory + # - https://github.com/cirruslabs/macos-image-templates/blob/5b17f4e2644723b2124c5cf1c1def4ba81fc6db7/templates/xcode.pkr.hcl#L243-L252 # - https://github.com/cirruslabs/macos-image-templates/issues/236 - # - https://stackoverflow.com/a/68394101/9316533 + # - https://stackoverflow.com/questions/27564160/what-does-com-apple-coresimulator-coresimulatorservice-do/68394101#68394101 echo "Waiting for simulator shared cache to update..." local -r selected_xcode_version="$(get_selected_xcode_version)" diff --git a/scripts/xcode/tests/test_xcode-utils.bash b/src/templates/scripts/xcode/tests/test_xcode-utils.bash similarity index 100% rename from scripts/xcode/tests/test_xcode-utils.bash rename to src/templates/scripts/xcode/tests/test_xcode-utils.bash diff --git a/scripts/xcode_clt/install-xcode-command-line-tools.bash b/src/templates/scripts/xcode_clt/install-xcode-command-line-tools.bash similarity index 51% rename from scripts/xcode_clt/install-xcode-command-line-tools.bash rename to src/templates/scripts/xcode_clt/install-xcode-command-line-tools.bash index 9d844a4..7273bbe 100755 --- a/scripts/xcode_clt/install-xcode-command-line-tools.bash +++ b/src/templates/scripts/xcode_clt/install-xcode-command-line-tools.bash @@ -4,14 +4,18 @@ function main() { local -r placeholder_file="/tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress" touch "${placeholder_file}" - local -r command_line_tools_label="$( + local command_line_tools_label + if ! command_line_tools_label="$( softwareupdate --list | - grep --extended-regexp --only-matching 'Label: Command Line Tools for Xcode-[0-9.]+' | - sort --key=2 --field-separator=- --version-sort --reverse | - head --lines=1 | - cut -d':' -f2 | - sed 's/^ //' - )" + grep -B 1 -E 'Command Line Tools' | + awk -F'*' '/^ *\*/ {print $2}' | + sed -e 's/^ *Label: //' -e 's/^ *//' | + sort -V | + tail -n 1 + )" || [[ -z "${command_line_tools_label}" ]]; then + echo "Could not find a Command Line Tools update." >&2 + return 1 + fi echo "Installing ${command_line_tools_label}..."