From d291a5b3eb7fc644424a4e90829683ce8d7889b1 Mon Sep 17 00:00:00 2001 From: Frank Portman Date: Mon, 12 Oct 2026 18:42:29 -0400 Subject: [PATCH 1/6] feat(rules): describe runfiles groups for rules_runfiles_group Give py_library, py_binary and py_test runfiles group describers, so packaging rules that use rules_runfiles_group (e.g. rules_img's image_from_binary) can split a binary's runfiles into layers: the runtime, one group per PyPI package, one per library and per rule target in data, and the binary's own files. Groups are collected on demand by a packager's aspect, so nothing runs otherwise. The runtime group comes from a singleton target resolving the same toolchain as the binary, so a packager builds it once per configuration. A binary whose pyc_collection differs from the configuration's, or that generates legacy __init__.py files, keeps its dependencies in its own group. Describers only see providers, so this adds PyInfo.direct_implicit_pyc_files and PyExecutableInfo.venv_runfiles. Fixes #3757 --- .bazelrc | 4 + MODULE.bazel | 1 + news/3757-provider-fields.added.md | 2 + news/3757.added.md | 5 + python/private/BUILD.bazel | 48 ++++ python/private/common.bzl | 23 ++ python/private/py_executable.bzl | 83 +++--- python/private/py_executable_info.bzl | 10 + python/private/py_info.bzl | 19 ++ python/private/py_library.bzl | 17 +- python/private/py_repositories.bzl | 6 + python/private/runfiles_groups.bzl | 256 ++++++++++++++++++ .../integration/whl_library/test_contents.py | 1 + tests/runfiles_groups/BUILD.bazel | 159 +++++++++++ tests/runfiles_groups/bin.txt | 1 + tests/runfiles_groups/data.txt | 1 + tests/runfiles_groups/fg.txt | 1 + tests/runfiles_groups/liba.py | 0 tests/runfiles_groups/libb.py | 0 tests/runfiles_groups/libc.py | 0 tests/runfiles_groups/main.py | 1 + tests/runfiles_groups/outer.py | 1 + .../foo_pkg-1.0.dist-info/METADATA | 3 + .../runfiles_groups/site-packages/foo_pkg.py | 0 tests/runfiles_groups/srcs_data.txt | 1 + tests/runfiles_groups/test_rules.bzl | 20 ++ 26 files changed, 627 insertions(+), 36 deletions(-) create mode 100644 news/3757-provider-fields.added.md create mode 100644 news/3757.added.md create mode 100644 python/private/runfiles_groups.bzl create mode 100644 tests/runfiles_groups/BUILD.bazel create mode 100644 tests/runfiles_groups/bin.txt create mode 100644 tests/runfiles_groups/data.txt create mode 100644 tests/runfiles_groups/fg.txt create mode 100644 tests/runfiles_groups/liba.py create mode 100644 tests/runfiles_groups/libb.py create mode 100644 tests/runfiles_groups/libc.py create mode 100644 tests/runfiles_groups/main.py create mode 100644 tests/runfiles_groups/outer.py create mode 100644 tests/runfiles_groups/site-packages/foo_pkg-1.0.dist-info/METADATA create mode 100644 tests/runfiles_groups/site-packages/foo_pkg.py create mode 100644 tests/runfiles_groups/srcs_data.txt create mode 100644 tests/runfiles_groups/test_rules.bzl diff --git a/.bazelrc b/.bazelrc index 12d1b33865..95262f5227 100644 --- a/.bazelrc +++ b/.bazelrc @@ -84,3 +84,7 @@ build:macos --host_copt=-Wno-sign-compare import %workspace%/specialized_configs.bazelrc try-import user.bazelrc + +# TODO: Delete before merging. rules_runfiles_group's describer API isn't in the +# BCR yet; see https://github.com/bazelbuild/rules_java/pull/368. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/MODULE.bazel b/MODULE.bazel index 532c0c1832..3db3b8f635 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -9,6 +9,7 @@ bazel_dep(name = "bazel_skylib", version = "1.8.2") bazel_dep(name = "package_metadata", version = "0.0.7") bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "rules_cc", version = "0.2.17") +bazel_dep(name = "rules_runfiles_group", version = "99.0.0-dev.20261009.1.f6acddf") bazel_dep(name = "toml.bzl", version = "0.4.1") # Those are loaded only when using py_proto_library diff --git a/news/3757-provider-fields.added.md b/news/3757-provider-fields.added.md new file mode 100644 index 0000000000..f854306a4e --- /dev/null +++ b/news/3757-provider-fields.added.md @@ -0,0 +1,2 @@ +(rules) Added {obj}`PyInfo.direct_implicit_pyc_files` and +{obj}`PyExecutableInfo.venv_runfiles`. diff --git a/news/3757.added.md b/news/3757.added.md new file mode 100644 index 0000000000..d9629703ca --- /dev/null +++ b/news/3757.added.md @@ -0,0 +1,5 @@ +(rules) `py_binary` and `py_test` describe their runfiles groups for +[rules_runfiles_group](https://github.com/bazel-contrib/rules_runfiles_group), +so packaging rules like rules_img's `image_from_binary` can put the runtime, +each PyPI package and each library in a layer of its own +([#3757](https://github.com/bazel-contrib/rules_python/issues/3757)). diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index d13e13ad73..09e9f8ad26 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -20,6 +20,13 @@ load(":bazel_config_mode.bzl", "bazel_config_mode") load(":distribution_filegroup.bzl", "distribution_filegroup") load(":py_exec_tools_toolchain.bzl", "current_interpreter_executable") load(":py_interpreter_program.bzl", "py_interpreter_program") +load( + ":runfiles_groups.bzl", + "py_executable_runfiles_group_describer", + "py_library_runfiles_group_describer", + "python_runtime_runfiles", + "python_runtime_runfiles_group_describer", +) load(":sentinel_impl.bzl", "sentinel") load(":stamp_impl.bzl", "stamp_build_setting") load(":uncachable_version_file.bzl", "define_uncachable_version_file") @@ -843,6 +850,24 @@ bzl_library( ], ) +bzl_library( + name = "runfiles_groups", + srcs = ["runfiles_groups.bzl"], + deps = [ + ":attributes", + ":common", + ":flags", + ":py_executable", + ":py_executable_info", + ":py_info", + ":py_internal", + ":py_library", + ":reexports", + ":toolchain_types", + "@rules_runfiles_group//runfiles_group:lib", + ], +) + bzl_library( name = "runtime_env_repo", srcs = ["runtime_env_repo.bzl"], @@ -1038,3 +1063,26 @@ bzl_library( name = "visibility", srcs = ["visibility.bzl"], ) + +# Runfiles group describers of the Python rules (see runfiles_groups.bzl), the +# defaults of their _runfiles_group_describer attributes. Not actually public; +# only public because they're implicit dependencies of rules built via the rule +# builders. +py_library_runfiles_group_describer( + name = "py_library_runfiles_group_describer", + visibility = ["//visibility:public"], +) + +py_executable_runfiles_group_describer( + name = "py_executable_runfiles_group_describer", + visibility = ["//visibility:public"], +) + +python_runtime_runfiles_group_describer(name = "python_runtime_runfiles_group_describer") + +# The interpreter and standard library as one runfiles group, merged in by every +# py_binary and py_test. +python_runtime_runfiles( + name = "python_runtime_runfiles", + visibility = ["//visibility:public"], +) diff --git a/python/private/common.bzl b/python/private/common.bzl index 0a2d8a115b..df689ec4fd 100644 --- a/python/private/common.bzl +++ b/python/private/common.bzl @@ -283,6 +283,28 @@ def get_imports(ctx): result.append(import_path) return result +def py_info_runfiles_files(info, pyc_collection_enabled): + """The files a binary puts into its runfiles for a dependency's PyInfo. + + Args: + info: PyInfo or BuiltinPyInfo of a dependency. + pyc_collection_enabled: bool; whether the binary includes implicit pyc + files instead of their sources. + + Returns: + list of depset[File] + """ + files = [info.transitive_sources] + + # BuiltinPyInfo doesn't have the pyc fields + if hasattr(info, "transitive_pyc_files"): + files.append(info.transitive_pyc_files) + if pyc_collection_enabled: + files.append(info.transitive_implicit_pyc_files) + else: + files.append(info.transitive_implicit_pyc_source_files) + return files + def collect_runfiles(ctx, files = depset()): """Collects the necessary files from the rule's context. @@ -392,6 +414,7 @@ def create_py_info( py_info.transitive_original_sources.add(original_sources) py_info.transitive_pyc_files.add(required_pyc_files) py_info.transitive_pyi_files.add(ctx.files.pyi_srcs) + py_info.direct_implicit_pyc_files.add(implicit_pyc_files) py_info.transitive_implicit_pyc_files.add(implicit_pyc_files) py_info.transitive_implicit_pyc_source_files.add(implicit_pyc_source_files) py_info.imports.add(imports) diff --git a/python/private/py_executable.bzl b/python/private/py_executable.bzl index 1ee926edde..04ba32f0b3 100644 --- a/python/private/py_executable.bzl +++ b/python/private/py_executable.bzl @@ -55,6 +55,7 @@ load( "is_bool", "is_windows_platform", "maybe_create_repo_mapping", + "py_info_runfiles_files", "relative_path", "runfiles_root_path", ) @@ -96,6 +97,16 @@ EXECUTABLE_ATTRS = dicts.add( "_default_to_explicit_init_py_flag": attr.label(default = "//python/config_settings:incompatible_default_to_explicit_init_py"), "_python_import_all_repositories_flag": attr.label(default = "//python/config_settings:experimental_python_import_all_repositories"), "_python_path_flag": attr.label(default = "//python/config_settings:python_path"), + # Read by rules_runfiles_group's packaging aspects; see runfiles_groups.bzl. + "_runfiles_group_attrs": attr.string_list(default = [ + "_debugger_flag", + "_runfiles_group_python_runtime", + "data", + "deps", + "srcs", + ]), + "_runfiles_group_describer": attr.label(default = "//python/private:py_executable_runfiles_group_describer"), + "_runfiles_group_python_runtime": attr.label(default = "//python/private:python_runtime_runfiles"), }, { "interpreter_args": lambda: attrb.StringList( @@ -364,11 +375,8 @@ def _create_executable( venv = venv, build_data_file = runfiles_details.build_data_file, ) - extra_runfiles = ctx.runfiles( - [stage2_bootstrap] + ( - venv.files_without_interpreter if venv else [] - ), - ).merge(venv.lib_runfiles) + venv_runfiles = ctx.runfiles(venv.files_without_interpreter).merge(venv.lib_runfiles) + extra_runfiles = ctx.runfiles([stage2_bootstrap]).merge(venv_runfiles) zip_main = _create_zip_main( ctx, stage2_bootstrap = stage2_bootstrap, @@ -377,6 +385,7 @@ def _create_executable( ) else: stage2_bootstrap = None + venv_runfiles = None extra_runfiles = ctx.runfiles() zip_main = ctx.actions.declare_file(base_executable_name + ".temp", sibling = executable) _create_stage1_bootstrap( @@ -495,9 +504,8 @@ WARNING: Target: {} app_runfiles = builders.RunfilesBuilder() app_runfiles.add(runfiles_details.app_runfiles) - if venv: - app_runfiles.add(venv.files_without_interpreter) - app_runfiles.add(venv.lib_runfiles) + if venv_runfiles: + app_runfiles.add(venv_runfiles) # The interpreter is added this late in the process so that it isn't # added to the zipped files. @@ -524,6 +532,8 @@ WARNING: Target: {} venv_python_exe = venv.interpreter if venv else None, # runfiles|None; runfiles in the venv for the interpreter venv_interpreter_runfiles = venv.interpreter_runfiles if venv else None, + # runfiles|None; runfiles in the venv for the application + venv_runfiles = venv_runfiles, # depset[ExplicitSymlink]|None; symlinks that should be created venv_interpreter_symlinks = venv.interpreter_symlinks if venv else None, ) @@ -1317,6 +1327,7 @@ def py_executable_base_impl(ctx, *, semantics, is_test, inherited_environment = venv_interpreter_runfiles = exec_result.venv_interpreter_runfiles, venv_interpreter_symlinks = exec_result.venv_interpreter_symlinks, venv_python_exe = exec_result.venv_python_exe, + venv_runfiles = exec_result.venv_runfiles, ) _add_provider_py_runtime_info(providers, runtime_details) _add_provider_py_cc_link_params_info(providers, cc_details.cc_info_for_propagating) @@ -1444,19 +1455,7 @@ def _get_runtime_details(ctx): fail("'python_path' must be an absolute path or a name to be resolved from the system PATH (e.g., 'python', 'python3').") effective_runtime = _maybe_get_runtime_from_ctx(ctx) - - direct = [] # List of files - transitive = [] # List of depsets - if effective_runtime.interpreter: - direct.append(effective_runtime.interpreter) - transitive.append(effective_runtime.files) - - if ctx.configuration.coverage_enabled: - if effective_runtime.coverage_tool: - direct.append(effective_runtime.coverage_tool) - if effective_runtime.coverage_files: - transitive.append(effective_runtime.coverage_files) - runtime_files = depset(direct = direct, transitive = transitive) + runtime_files = _get_runtime_files(ctx, effective_runtime) executable_interpreter_path = _get_interpreter_path( ctx, @@ -1478,6 +1477,31 @@ def _get_runtime_details(ctx): runfiles = ctx.runfiles(transitive_files = runtime_files), ) +def get_runtime_files(ctx): + """Returns the runtime files an executable puts into its runfiles. + + Args: + ctx: The rule ctx. The rule must use the target Python toolchain. + + Returns: + depset[File] + """ + return _get_runtime_files(ctx, _maybe_get_runtime_from_ctx(ctx)) + +def _get_runtime_files(ctx, runtime): + direct = [] # List of files + transitive = [] # List of depsets + if runtime.interpreter: + direct.append(runtime.interpreter) + transitive.append(runtime.files) + + if ctx.configuration.coverage_enabled: + if runtime.coverage_tool: + direct.append(runtime.coverage_tool) + if runtime.coverage_files: + transitive.append(runtime.coverage_files) + return depset(direct = direct, transitive = transitive) + def _maybe_get_runtime_from_ctx(ctx): """Finds the PyRuntimeInfo from the toolchain or attribute, if available. @@ -1556,17 +1580,7 @@ def _get_base_runfiles_for_binary( if not (PyInfo in dep or (BuiltinPyInfo != None and BuiltinPyInfo in dep)): continue info = dep[PyInfo] if PyInfo in dep else dep[BuiltinPyInfo] - app_runfiles.files.add(info.transitive_sources) - - # Everything past this won't work with BuiltinPyInfo - if not hasattr(info, "transitive_pyc_files"): - continue - - app_runfiles.files.add(info.transitive_pyc_files) - if pyc_collection_enabled: - app_runfiles.files.add(info.transitive_implicit_pyc_files) - else: - app_runfiles.files.add(info.transitive_implicit_pyc_source_files) + app_runfiles.files.add(py_info_runfiles_files(info, pyc_collection_enabled)) app_runfiles.runfiles.append(collect_runfiles(ctx)) if extra_deps: @@ -2017,7 +2031,8 @@ def _add_provider_py_executable_info( venv_app_symlinks, venv_interpreter_runfiles, venv_interpreter_symlinks, - venv_python_exe): + venv_python_exe, + venv_runfiles): """Adds the PyExecutableInfo provider. Args: @@ -2034,6 +2049,7 @@ def _add_provider_py_executable_info( venv_interpreter_runfiles: runfiles; runfiles specific to the interpreter for the venv. venv_interpreter_symlinks: depset[ExplicitSymlink]; interpreter-specific symlinks to create for the venv. venv_python_exe: File; the python executable in the venv. + venv_runfiles: runfiles; the venv's files for the application. """ providers.append(PyExecutableInfo( app_runfiles = app_runfiles, @@ -2047,6 +2063,7 @@ def _add_provider_py_executable_info( venv_interpreter_runfiles = venv_interpreter_runfiles, venv_interpreter_symlinks = venv_interpreter_symlinks, venv_python_exe = venv_python_exe, + venv_runfiles = venv_runfiles, )) def _add_provider_py_runtime_info(providers, runtime_details): diff --git a/python/private/py_executable_info.bzl b/python/private/py_executable_info.bzl index 7693fa950f..2a6ccfe2a4 100644 --- a/python/private/py_executable_info.bzl +++ b/python/private/py_executable_info.bzl @@ -119,6 +119,16 @@ mode is not enabled. :::{versionadded} 1.9.0 ::: +""", + "venv_runfiles": """ +:type: runfiles | None + +Runfiles that are specific to the application within the venv: its `site-packages` +files and the symlinks to the application's dependencies. A subset of +{obj}`app_runfiles`. May be None if venv mode is not enabled. + +:::{versionadded} VERSION_NEXT_FEATURE +::: """, }, ) diff --git a/python/private/py_info.bzl b/python/private/py_info.bzl index 79483ab2f5..4bda5601ef 100644 --- a/python/private/py_info.bzl +++ b/python/private/py_info.bzl @@ -369,6 +369,7 @@ def _PyInfo_init( has_py3_only_sources = False, direct_pyc_files = depset(), transitive_pyc_files = depset(), + direct_implicit_pyc_files = depset(), transitive_implicit_pyc_files = depset(), transitive_implicit_pyc_source_files = depset(), direct_original_sources = depset(), @@ -389,6 +390,7 @@ def _PyInfo_init( _check_arg_type("direct_pyc_files", "depset", direct_pyc_files) _check_arg_type("transitive_pyc_files", "depset", transitive_pyc_files) + _check_arg_type("direct_implicit_pyc_files", "depset", direct_implicit_pyc_files) _check_arg_type("transitive_implicit_pyc_files", "depset", transitive_pyc_files) _check_arg_type("transitive_implicit_pyc_source_files", "depset", transitive_pyc_files) @@ -400,6 +402,7 @@ def _PyInfo_init( if type_checking_info != None: _check_arg_type("type_checking_info", "struct", type_checking_info) return { + "direct_implicit_pyc_files": direct_implicit_pyc_files, "direct_original_sources": direct_original_sources, "direct_pyc_files": direct_pyc_files, "direct_pyi_files": direct_pyi_files, @@ -425,6 +428,15 @@ the {obj}`PyCommonApi` utilities. """, init = _PyInfo_init, fields = { + "direct_implicit_pyc_files": """ +:type: depset[File] + +The automatically generated pyc files that are directly provided by the target. +The direct counterpart of {obj}`transitive_implicit_pyc_files`. + +::::{versionadded} VERSION_NEXT_FEATURE +:::: +""", "direct_original_sources": """ :type: depset[File] @@ -602,6 +614,10 @@ def _PyInfoBuilder_typedef(): To create an instance, use {obj}`py_common.get()` and call `PyInfoBuilder()` + :::{field} direct_implicit_pyc_files + :type: DepsetBuilder[File] + ::: + :::{field} direct_original_sources :type: DepsetBuilder[File] ::: @@ -666,6 +682,7 @@ def _new_raw_py_info_builder(type_checking_info = None): add_venv_symlink = lambda *a, **k: _PyInfoBuilder_add_venv_symlink(self, *a, **k), build = lambda *a, **k: _PyInfoBuilder_build(self, *a, **k), build_builtin_py_info = lambda *a, **k: _PyInfoBuilder_build_builtin_py_info(self, *a, **k), + direct_implicit_pyc_files = builders.DepsetBuilder(), direct_original_sources = builders.DepsetBuilder(), direct_pyc_files = builders.DepsetBuilder(), direct_pyi_files = builders.DepsetBuilder(), @@ -854,6 +871,7 @@ def _merge_py_info_fields(self, transitive, *, direct = []): # BuiltinPyInfo doesn't have this field if hasattr(info, "direct_pyc_files"): self.direct_original_sources.add(info.direct_original_sources) + self.direct_implicit_pyc_files.add(info.direct_implicit_pyc_files) self.direct_pyc_files.add(info.direct_pyc_files) self.direct_pyi_files.add(info.direct_pyi_files) @@ -993,6 +1011,7 @@ def _build_py_info_fields(self, type_checking_info = None): imports = self.imports.build(), transitive_sources = self.transitive_sources.build(), uses_shared_libraries = self._uses_shared_libraries[0], + direct_implicit_pyc_files = self.direct_implicit_pyc_files.build(), direct_original_sources = self.direct_original_sources.build(), direct_pyc_files = self.direct_pyc_files.build(), direct_pyi_files = self.direct_pyi_files.build(), diff --git a/python/private/py_library.bzl b/python/private/py_library.bzl index 6282b71ee1..b8e9548e85 100644 --- a/python/private/py_library.bzl +++ b/python/private/py_library.bzl @@ -116,6 +116,11 @@ This allows optimizing the generation of symlinks to be cheaper at analysis time "_add_srcs_to_runfiles_flag": lambda: attrb.Label( default = labels.ADD_SRCS_TO_RUNFILES, ), + # Read by rules_runfiles_group's packaging aspects; see runfiles_groups.bzl. + "_runfiles_group_attrs": lambda: attrb.StringList(default = ["data", "deps", "srcs"]), + "_runfiles_group_describer": lambda: attrb.Label( + default = "//python/private:py_library_runfiles_group_describer", + ), }, ) @@ -223,14 +228,20 @@ Source files are no longer added to the runfiles directly. ::: """ -def _get_package_and_version(ctx): +def get_package_and_version(data_files): """Return package name and version If the package comes from PyPI then it will have a `.dist-info` as part of `data`, which allows us to get the name of the package and its version. + + Args: + data_files: list of File; the files in the library's `data` attribute. + + Returns: + tuple of the normalized package name and version, or `(None, None)`. """ dist_info_metadata = None - for d in ctx.files.data: + for d in data_files: # work on case insensitive FSes if d.basename.lower() != "metadata": continue @@ -257,7 +268,7 @@ def _get_imports_and_venv_symlinks(ctx): imports = depset() venv_symlinks = [] if VenvsSitePackages.is_enabled(ctx): - package, version_str = _get_package_and_version(ctx) + package, version_str = get_package_and_version(ctx.files.data) # NOTE: Already a list, but buildifier thinks its a depset and # adds to_list() calls later. diff --git a/python/private/py_repositories.bzl b/python/private/py_repositories.bzl index 3489613a6c..45b883047b 100644 --- a/python/private/py_repositories.bzl +++ b/python/private/py_repositories.bzl @@ -72,6 +72,12 @@ def py_repositories(transition_settings = []): strip_prefix = "rules_cc-0.1.5", urls = ["https://github.com/bazelbuild/rules_cc/releases/download/0.1.5/rules_cc-0.1.5.tar.gz"], ) + http_archive( + name = "rules_runfiles_group", + sha256 = "bf618b9b065dc5ef7fba23e4e6b1a6d48c375a36810cba842660caa8bd18267a", + strip_prefix = "rules_runfiles_group-f6acddf050e3a0703a62ad272ff637fca26cd91c", + url = "https://github.com/bazel-contrib/rules_runfiles_group/archive/f6acddf050e3a0703a62ad272ff637fca26cd91c.tar.gz", + ) http_archive( name = "toml.bzl", sha256 = "63633c762bdb4d836add5a9a81deeeae93c4b2edbd62ac032733020b5652b90a", diff --git a/python/private/runfiles_groups.bzl b/python/private/runfiles_groups.bzl new file mode 100644 index 0000000000..61d68a984b --- /dev/null +++ b/python/private/runfiles_groups.bzl @@ -0,0 +1,256 @@ +# Copyright 2026 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""Runfiles group describers of the Python rules, for rules_runfiles_group. + +A packaging rule (a container image rule, say) walks a binary with an aspect and +asks each target's describer which runfiles it adds and which attributes it +merges runfiles in from. The Python rules point their `_runfiles_group_describer` +attribute at the describers below. + +Only `//python/private:BUILD.bazel` loads this file; the rules refer to the +describers by label. With Bazel 8's autoloads, rules_python loading +rules_runfiles_group from the files that define the rules is a load cycle. + +A library's group holds what it contributes to a consuming binary: the files the +binary takes from its PyInfo, plus its plain data files. +""" + +load("@rules_runfiles_group//runfiles_group:lib.bzl", "runfiles_groups") +load(":attributes.bzl", "PycCollectionAttr") +load(":common.bzl", "is_py_source", "py_info_runfiles_files") +load(":flags.bzl", "PyiDepsToRunfilesFlag") +load(":py_executable.bzl", "get_runtime_files") +load(":py_executable_info.bzl", "PyExecutableInfo") +load(":py_info.bzl", "PyInfo") +load(":py_internal.bzl", "py_internal") +load(":py_library.bzl", "get_package_and_version") +load(":reexports.bzl", "BuiltinPyInfo") +load(":toolchain_types.bzl", TOOLCHAIN_TYPE = "TARGET_TOOLCHAIN_TYPE") + +# Stamped on every group, so Python groups stay together when a packager has to +# merge groups to fit a layer limit. +_MERGE_AFFINITY = "rules_python" + +# The interpreter and standard library, shared by every binary in a configuration. +_RUNTIME_GROUP = "rules_python#runtime" + +# Libraries from PyPI are named by package: whl_library's repository names are an +# implementation detail. +_PYPI_GROUP_PREFIX = "rules_python#pypi/" + +def _pyc_collection_enabled(ctx, pyc_collection = PycCollectionAttr.INHERIT): + # PycCollectionAttr only reads these two attributes. + return PycCollectionAttr.is_pyc_collection_enabled(struct(attr = struct( + pyc_collection = pyc_collection, + _precompile_flag = ctx.rule.attr._precompile_flag, + ))) + +def _is_file(target): + # A source file owns itself, a generated file is owned by the rule that + # generates it, and a rule target owns its own outputs. + files = target[DefaultInfo].files + if not py_internal.is_singleton_depset(files): + return False + file = files.to_list()[0] + return (file.owner == target.label) == file.is_source + +def _is_empty(runfiles): + return not (runfiles.files or runfiles.symlinks or runfiles.root_symlinks) + +def _py_info_files(target, pyc_collection_enabled): + if PyInfo in target: + return py_info_runfiles_files(target[PyInfo], pyc_collection_enabled) + if BuiltinPyInfo != None and BuiltinPyInfo in target: + return py_info_runfiles_files(target[BuiltinPyInfo], pyc_collection_enabled) + return [] + +def _kind(label): + return "first_party" if label.repo_name == "" else "third_party" + +def _own_files(target, ctx, pyc_collection_enabled): + """The files a target itself puts into a consuming binary's runfiles.""" + info = target[PyInfo] + + # Sources that aren't .py files (directories, .pyc files) are outputs, but + # never runfiles. + sources = {f: None for f in info.direct_original_sources.to_list()} + direct = [ + f + for f in target[DefaultInfo].files.to_list() + if f not in sources or is_py_source(f) + ] + transitive = [] + if pyc_collection_enabled: + transitive.append(info.direct_implicit_pyc_files) + else: + direct.extend([f for f in sources if is_py_source(f)]) + + # Plain files in `data` belong to the target's own group (and so to each + # target listing them); rule targets get groups of their own. + for dep in ctx.rule.attr.data: + if _is_file(dep): + direct.append(dep[DefaultInfo].files.to_list()[0]) + return depset(direct, transitive = transitive) + +def _dep_fallback(ctx, dep, py_outputs): + content = _py_info_files(dep, _pyc_collection_enabled(ctx)) + if py_outputs and not content: + content.append(depset([f for f in dep[DefaultInfo].files.to_list() if is_py_source(f)])) + runfiles = dep[DefaultInfo].default_runfiles + if not _is_empty(runfiles): + content.append(runfiles) + if not content: + return None + return runfiles_groups.entry(name = dep.label, content = runfiles_groups.union(ctx, content)) + +def _library_dep_fallback(ctx, dep): + # py_library adds the .py outputs of a dep without PyInfo to its own PyInfo. + return _dep_fallback(ctx, dep, py_outputs = True) + +def _executable_dep_fallback(ctx, dep): + return _dep_fallback(ctx, dep, py_outputs = False) + +def _data_fallback(ctx, dep): + # Plain files are in the merging target's own group. + default_info = dep[DefaultInfo] + if _is_file(dep) or (not default_info.files and _is_empty(default_info.data_runfiles)): + return None + content = runfiles_groups.union(ctx, [default_info.files, default_info.data_runfiles]) + return runfiles_groups.entry(name = dep.label, content = content) + +def _srcs_fallback(_ctx, dep): + runfiles = dep[DefaultInfo].default_runfiles + if _is_file(dep) or _is_empty(runfiles): + return None + return runfiles_groups.entry(name = dep.label, content = runfiles) + +def _describe_py_library(target, ctx): + pyc_collection_enabled = _pyc_collection_enabled(ctx) + content = _own_files(target, ctx, pyc_collection_enabled) + + # With pyi_deps_to_runfiles, a binary takes the files of pyi_deps from + # this target's PyInfo, but not their runfiles. + if PyiDepsToRunfilesFlag.is_enabled(struct(attr = ctx.rule.attr, var = ctx.var)): + content = depset(transitive = [content] + [ + files + for dep in ctx.rule.attr.pyi_deps + for files in _py_info_files(dep, pyc_collection_enabled) + ]) + + package, _ = get_package_and_version(ctx.rule.files.data) + if package: + name = _PYPI_GROUP_PREFIX + package + kind = "third_party" + else: + name = ctx.label + kind = _kind(ctx.label) + return runfiles_groups.node( + add = [runfiles_groups.entry( + name = name, + content = content, + kind = kind, + rank = runfiles_groups.RANK_SHARED_DEPS if kind == "third_party" else runfiles_groups.RANK_EXECUTABLE, + weight = len(ctx.rule.files.srcs) + len(ctx.rule.files.data), + merge_affinity = _MERGE_AFFINITY, + )] if content else [], + merge_from = [ + runfiles_groups.merge_from("data", fallback = _data_fallback), + runfiles_groups.merge_from("deps", fallback = _library_dep_fallback), + runfiles_groups.merge_from("srcs", fallback = _srcs_fallback), + ], + ) + +py_library_runfiles_group_describer = runfiles_groups.make_describer_rule( + describe = _describe_py_library, +) + +def _describe_py_executable(target, ctx): + info = target[PyExecutableInfo] + pyc_collection_enabled = _pyc_collection_enabled(ctx, ctx.rule.attr.pyc_collection) + content = [ + _own_files(target, ctx, pyc_collection_enabled), + depset([f for f in (info.build_data_file, info.stage2_bootstrap) if f]), + ] + content.extend([rf for rf in (info.venv_runfiles, info.venv_interpreter_runfiles) if rf]) + + # Two cases where the binary's group takes its dependencies: + # * The legacy __init__.py files: they're generated for every directory in + # the runfiles, the runtime's included. Checking for them is cheap unless + # they exist. + # * A pyc selection that differs from the configuration's, which is the one + # dependencies describe their files with. + if info.app_runfiles.empty_filenames: + content.append(info.runfiles_without_exe) + merge_from = [] + elif pyc_collection_enabled != _pyc_collection_enabled(ctx): + content.append(info.app_runfiles) + merge_from = ["_runfiles_group_python_runtime"] + else: + merge_from = [ + "_runfiles_group_python_runtime", + runfiles_groups.merge_from("_debugger_flag", fallback = _executable_dep_fallback), + runfiles_groups.merge_from("data", fallback = _data_fallback), + runfiles_groups.merge_from("deps", fallback = _executable_dep_fallback), + runfiles_groups.merge_from("srcs", fallback = _srcs_fallback), + ] + + return runfiles_groups.node( + add = [runfiles_groups.entry( + name = ctx.label, + content = runfiles_groups.union(ctx, content), + kind = _kind(ctx.label), + merge_affinity = _MERGE_AFFINITY, + )], + merge_from = merge_from, + executable_group = ctx.label, + ) + +py_executable_runfiles_group_describer = runfiles_groups.make_describer_rule( + describe = _describe_py_executable, +) + +def _describe_python_runtime(target, _ctx): + files = target[DefaultInfo].files + return runfiles_groups.node(add = [runfiles_groups.entry( + name = _RUNTIME_GROUP, + content = files, + kind = "foundation", + rank = runfiles_groups.RANK_FOUNDATION, + do_not_merge = True, + merge_affinity = _MERGE_AFFINITY, + )] if files else []) + +python_runtime_runfiles_group_describer = runfiles_groups.make_describer_rule( + describe = _describe_python_runtime, +) + +def _python_runtime_runfiles_impl(ctx): + return [DefaultInfo(files = get_runtime_files(ctx))] + +python_runtime_runfiles = rule( + implementation = _python_runtime_runfiles_impl, + doc = """\ +The runtime files a binary puts into its runfiles, as one runfiles group. + +Every binary merges in the same target, so a packager builds the group once per +configuration rather than once per binary. +""", + attrs = { + "_runfiles_group_attrs": attr.string_list(default = []), + "_runfiles_group_describer": attr.label( + default = ":python_runtime_runfiles_group_describer", + ), + }, + toolchains = [TOOLCHAIN_TYPE], +) diff --git a/tests/integration/whl_library/test_contents.py b/tests/integration/whl_library/test_contents.py index 58f13354e3..587cb48ed1 100644 --- a/tests/integration/whl_library/test_contents.py +++ b/tests/integration/whl_library/test_contents.py @@ -171,6 +171,7 @@ def test_whl_deps_ar_the_same(self): "@rules_python//python/config_settings:precompile_source_retention", "@rules_python//python/config_settings:pyi_deps_to_runfiles", "@rules_python//python/config_settings:venvs_site_packages", + "@rules_python//python/private:py_library_runfiles_group_describer", "@rules_python//python/private:sentinel", }, ) diff --git a/tests/runfiles_groups/BUILD.bazel b/tests/runfiles_groups/BUILD.bazel new file mode 100644 index 0000000000..fd27d891ac --- /dev/null +++ b/tests/runfiles_groups/BUILD.bazel @@ -0,0 +1,159 @@ +load("@rules_runfiles_group//runfiles_group:runfiles_group_analysis_test.bzl", "runfiles_group_analysis_test") +load("//python:py_binary.bzl", "py_binary") +load("//python:py_library.bzl", "py_library") +load("//python:py_test.bzl", "py_test") +load("//tests/support:py_reconfig.bzl", "py_reconfig_binary") +load(":test_rules.bzl", "outputs_and_runfiles", "outputs_only") + +outputs_only(name = "outputs_only") + +outputs_and_runfiles(name = "outputs_and_runfiles") + +genrule( + name = "generated", + outs = ["generated.txt"], + cmd = "touch $@", +) + +genrule( + name = "generated_file", + outs = ["generated_file.txt"], + cmd = "touch $@", +) + +filegroup( + name = "files", + srcs = ["fg.txt"], +) + +py_library( + name = "lib_a", + srcs = ["liba.py"], + data = [ + "data.txt", + "generated_file.txt", + ":outputs_only", + ], +) + +filegroup( + name = "srcs_with_runfiles", + srcs = ["libc.py"], + data = ["srcs_data.txt"], +) + +py_library( + name = "lib_b", + srcs = [ + "libb.py", + ":srcs_with_runfiles", + ], + data = [":outputs_and_runfiles"], + deps = [":lib_a"], +) + +# Looks like a library from a wheel: grouped by package name. +py_library( + name = "foo_pkg", + srcs = ["site-packages/foo_pkg.py"], + data = ["site-packages/foo_pkg-1.0.dist-info/METADATA"], + imports = ["site-packages"], +) + +_DATA = [ + ":files", + ":generated", + ":outputs_and_runfiles", + ":outputs_only", + "bin.txt", +] + +py_binary( + name = "bin", + srcs = ["main.py"], + data = _DATA, + main = "main.py", + deps = [ + ":foo_pkg", + ":lib_b", + ], +) + +py_test( + name = "test", + srcs = ["main.py"], + data = _DATA, + main = "main.py", + tags = ["manual"], + deps = [":lib_b"], +) + +py_binary( + name = "bin_in_data", + srcs = ["outer.py"], + data = [":bin"], + main = "outer.py", + deps = [":lib_a"], +) + +# Libraries describe their implicit pyc files. +py_reconfig_binary( + name = "bin_precompiled", + srcs = ["main.py"], + config_settings = { + "//python/config_settings:precompile": "enabled", + }, + main = "main.py", + deps = [":lib_b"], +) + +# Falls back to one group for itself and its deps, because its pyc selection +# differs from what its deps describe. +py_binary( + name = "bin_pyc_collection", + srcs = ["main.py"], + main = "main.py", + pyc_collection = "include_pyc", + deps = [":lib_b"], +) + +# Falls back to one group for itself and its deps, because the generated +# __init__.py files only exist in its own runfiles. +py_binary( + name = "bin_legacy_init", + srcs = ["main.py"], + legacy_create_init = 1, + main = "main.py", + deps = [":lib_b"], +) + +runfiles_group_analysis_test( + name = "runfiles_group_test", + binaries = [ + ":bin", + ":bin_in_data", + ":bin_legacy_init", + ":bin_precompiled", + ":bin_pyc_collection", + ":test", + ], + overlapping_group_behavior = "error", +) + +runfiles_group_analysis_test( + name = "bin_groups_test", + binaries = [":bin"], + expected_executable_group = "@@//tests/runfiles_groups:bin", + expected_group_names = [ + "rules_python#runtime", + "rules_python#pypi/foo_pkg", + "@@//tests/runfiles_groups:files", + "@@//tests/runfiles_groups:generated", + "@@//tests/runfiles_groups:lib_a", + "@@//tests/runfiles_groups:lib_b", + "@@//tests/runfiles_groups:outputs_and_runfiles", + "@@//tests/runfiles_groups:outputs_only", + "@@//tests/runfiles_groups:srcs_with_runfiles", + "@@//tests/runfiles_groups:bin", + ], +) diff --git a/tests/runfiles_groups/bin.txt b/tests/runfiles_groups/bin.txt new file mode 100644 index 0000000000..ba077a4031 --- /dev/null +++ b/tests/runfiles_groups/bin.txt @@ -0,0 +1 @@ +bin diff --git a/tests/runfiles_groups/data.txt b/tests/runfiles_groups/data.txt new file mode 100644 index 0000000000..1269488f7f --- /dev/null +++ b/tests/runfiles_groups/data.txt @@ -0,0 +1 @@ +data diff --git a/tests/runfiles_groups/fg.txt b/tests/runfiles_groups/fg.txt new file mode 100644 index 0000000000..0da04c7866 --- /dev/null +++ b/tests/runfiles_groups/fg.txt @@ -0,0 +1 @@ +fg diff --git a/tests/runfiles_groups/liba.py b/tests/runfiles_groups/liba.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/runfiles_groups/libb.py b/tests/runfiles_groups/libb.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/runfiles_groups/libc.py b/tests/runfiles_groups/libc.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/runfiles_groups/main.py b/tests/runfiles_groups/main.py new file mode 100644 index 0000000000..11b15b1a45 --- /dev/null +++ b/tests/runfiles_groups/main.py @@ -0,0 +1 @@ +print("hello") diff --git a/tests/runfiles_groups/outer.py b/tests/runfiles_groups/outer.py new file mode 100644 index 0000000000..11b15b1a45 --- /dev/null +++ b/tests/runfiles_groups/outer.py @@ -0,0 +1 @@ +print("hello") diff --git a/tests/runfiles_groups/site-packages/foo_pkg-1.0.dist-info/METADATA b/tests/runfiles_groups/site-packages/foo_pkg-1.0.dist-info/METADATA new file mode 100644 index 0000000000..a7a47b1539 --- /dev/null +++ b/tests/runfiles_groups/site-packages/foo_pkg-1.0.dist-info/METADATA @@ -0,0 +1,3 @@ +Metadata-Version: 2.1 +Name: foo-pkg +Version: 1.0 diff --git a/tests/runfiles_groups/site-packages/foo_pkg.py b/tests/runfiles_groups/site-packages/foo_pkg.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/runfiles_groups/srcs_data.txt b/tests/runfiles_groups/srcs_data.txt new file mode 100644 index 0000000000..587be6b4c3 --- /dev/null +++ b/tests/runfiles_groups/srcs_data.txt @@ -0,0 +1 @@ +x diff --git a/tests/runfiles_groups/test_rules.bzl b/tests/runfiles_groups/test_rules.bzl new file mode 100644 index 0000000000..f5e55046f4 --- /dev/null +++ b/tests/runfiles_groups/test_rules.bzl @@ -0,0 +1,20 @@ +"""Rules with shapes of `data` that the runfiles group describers must cover.""" + +def _outputs_only_impl(ctx): + files = [ctx.actions.declare_file(ctx.label.name + suffix) for suffix in (".a", ".b")] + for f in files: + ctx.actions.write(f, "") + return [DefaultInfo(files = depset(files))] + +# Default outputs, no runfiles. +outputs_only = rule(implementation = _outputs_only_impl) + +def _outputs_and_runfiles_impl(ctx): + output = ctx.actions.declare_file(ctx.label.name + ".out") + runfile = ctx.actions.declare_file(ctx.label.name + ".runfile") + ctx.actions.write(output, "") + ctx.actions.write(runfile, "") + return [DefaultInfo(files = depset([output]), runfiles = ctx.runfiles([runfile]))] + +# Default outputs and runfiles that differ. +outputs_and_runfiles = rule(implementation = _outputs_and_runfiles_impl) From 03397060d50b256a674786056a5a399ef95ee943 Mon Sep 17 00:00:00 2001 From: Frank Portman Date: Mon, 19 Oct 2026 09:40:54 -0400 Subject: [PATCH 2/6] feat(rules): move runfiles groups to the toolchain-walking describer API Port to rules_runfiles_group's current API: the describers are held by _aspect_rule_hints, and the runtime group is merged in from the Python toolchain, described by py_runtime_pair. This drops the singleton python_runtime_runfiles target. Also fix two issues found testing against a real image: * A Python target in srcs (whl_library's :pkg wraps its :srcs) describes its own files, so the wrapper no longer claims them too. * With venvs_site_packages=yes, the venv's links to a wheel's files (shared libraries) go into that wheel's group instead of the binary's, so packagers keep them next to the files they point to. --- MODULE.bazel | 2 +- news/3757.added.md | 4 +- python/private/BUILD.bazel | 19 +-- python/private/py_executable.bzl | 23 ++- python/private/py_library.bzl | 6 +- python/private/py_repositories.bzl | 6 +- python/private/py_runtime_pair_rule.bzl | 5 + python/private/runfiles_groups.bzl | 138 ++++++++++++------ tests/runfiles_groups/BUILD.bazel | 33 ++++- .../site-packages/_foo_native.so | 0 10 files changed, 153 insertions(+), 83 deletions(-) create mode 100644 tests/runfiles_groups/site-packages/_foo_native.so diff --git a/MODULE.bazel b/MODULE.bazel index 2291aa9c50..2481d377f9 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -9,7 +9,7 @@ bazel_dep(name = "bazel_skylib", version = "1.8.2") bazel_dep(name = "package_metadata", version = "0.0.7") bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "rules_cc", version = "0.2.17") -bazel_dep(name = "rules_runfiles_group", version = "99.0.0-dev.20261009.1.f6acddf") +bazel_dep(name = "rules_runfiles_group", version = "99.0.0-dev.20261016.1.41d2544") bazel_dep(name = "toml.bzl", version = "0.4.1") # Those are loaded only when using py_proto_library diff --git a/news/3757.added.md b/news/3757.added.md index d9629703ca..dc8758af62 100644 --- a/news/3757.added.md +++ b/news/3757.added.md @@ -1,5 +1,5 @@ (rules) `py_binary` and `py_test` describe their runfiles groups for [rules_runfiles_group](https://github.com/bazel-contrib/rules_runfiles_group), so packaging rules like rules_img's `image_from_binary` can put the runtime, -each PyPI package and each library in a layer of its own -([#3757](https://github.com/bazel-contrib/rules_python/issues/3757)). +each PyPI package and each library in a layer of its own. Needs Bazel 8.8 or +later ([#3757](https://github.com/bazel-contrib/rules_python/issues/3757)). diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 48d34cff99..15b283f0de 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -24,8 +24,7 @@ load( ":runfiles_groups.bzl", "py_executable_runfiles_group_describer", "py_library_runfiles_group_describer", - "python_runtime_runfiles", - "python_runtime_runfiles_group_describer", + "py_runtime_pair_runfiles_group_describer", ) load(":sentinel_impl.bzl", "sentinel") load(":stamp_impl.bzl", "stamp_build_setting") @@ -865,7 +864,6 @@ bzl_library( ":py_internal", ":py_library", ":reexports", - ":toolchain_types", "@rules_runfiles_group//runfiles_group:lib", ], ) @@ -1066,10 +1064,9 @@ bzl_library( srcs = ["visibility.bzl"], ) -# Runfiles group describers of the Python rules (see runfiles_groups.bzl), the -# defaults of their _runfiles_group_describer attributes. Not actually public; -# only public because they're implicit dependencies of rules built via the rule -# builders. +# Runfiles group describers of the Python rules (see runfiles_groups.bzl), held +# by their _aspect_rule_hints attributes. Not actually public; only public +# because they're implicit dependencies of rules built via the rule builders. py_library_runfiles_group_describer( name = "py_library_runfiles_group_describer", visibility = ["//visibility:public"], @@ -1080,11 +1077,7 @@ py_executable_runfiles_group_describer( visibility = ["//visibility:public"], ) -python_runtime_runfiles_group_describer(name = "python_runtime_runfiles_group_describer") - -# The interpreter and standard library as one runfiles group, merged in by every -# py_binary and py_test. -python_runtime_runfiles( - name = "python_runtime_runfiles", +py_runtime_pair_runfiles_group_describer( + name = "py_runtime_pair_runfiles_group_describer", visibility = ["//visibility:public"], ) diff --git a/python/private/py_executable.bzl b/python/private/py_executable.bzl index 04ba32f0b3..b2f8a4fa6d 100644 --- a/python/private/py_executable.bzl +++ b/python/private/py_executable.bzl @@ -98,15 +98,12 @@ EXECUTABLE_ATTRS = dicts.add( "_python_import_all_repositories_flag": attr.label(default = "//python/config_settings:experimental_python_import_all_repositories"), "_python_path_flag": attr.label(default = "//python/config_settings:python_path"), # Read by rules_runfiles_group's packaging aspects; see runfiles_groups.bzl. - "_runfiles_group_attrs": attr.string_list(default = [ - "_debugger_flag", - "_runfiles_group_python_runtime", - "data", - "deps", - "srcs", + "_aspect_rule_hints": attr.label_list(default = [ + "//python/private:py_executable_runfiles_group_describer", + # What //python:toolchain_type is an alias of. + "@bazel_tools//tools/python:toolchain_type", ]), - "_runfiles_group_describer": attr.label(default = "//python/private:py_executable_runfiles_group_describer"), - "_runfiles_group_python_runtime": attr.label(default = "//python/private:python_runtime_runfiles"), + "_runfiles_group_attrs": attr.string_list(default = ["_debugger_flag", "data", "deps", "srcs"]), }, { "interpreter_args": lambda: attrb.StringList( @@ -1455,7 +1452,7 @@ def _get_runtime_details(ctx): fail("'python_path' must be an absolute path or a name to be resolved from the system PATH (e.g., 'python', 'python3').") effective_runtime = _maybe_get_runtime_from_ctx(ctx) - runtime_files = _get_runtime_files(ctx, effective_runtime) + runtime_files = get_runtime_files(ctx, effective_runtime) executable_interpreter_path = _get_interpreter_path( ctx, @@ -1477,18 +1474,16 @@ def _get_runtime_details(ctx): runfiles = ctx.runfiles(transitive_files = runtime_files), ) -def get_runtime_files(ctx): +def get_runtime_files(ctx, runtime): """Returns the runtime files an executable puts into its runfiles. Args: - ctx: The rule ctx. The rule must use the target Python toolchain. + ctx: The rule or aspect ctx. + runtime: PyRuntimeInfo; the runtime of the executable. Returns: depset[File] """ - return _get_runtime_files(ctx, _maybe_get_runtime_from_ctx(ctx)) - -def _get_runtime_files(ctx, runtime): direct = [] # List of files transitive = [] # List of depsets if runtime.interpreter: diff --git a/python/private/py_library.bzl b/python/private/py_library.bzl index b8e9548e85..0eb9f07b42 100644 --- a/python/private/py_library.bzl +++ b/python/private/py_library.bzl @@ -117,10 +117,10 @@ This allows optimizing the generation of symlinks to be cheaper at analysis time default = labels.ADD_SRCS_TO_RUNFILES, ), # Read by rules_runfiles_group's packaging aspects; see runfiles_groups.bzl. - "_runfiles_group_attrs": lambda: attrb.StringList(default = ["data", "deps", "srcs"]), - "_runfiles_group_describer": lambda: attrb.Label( - default = "//python/private:py_library_runfiles_group_describer", + "_aspect_rule_hints": lambda: attrb.LabelList( + default = ["//python/private:py_library_runfiles_group_describer"], ), + "_runfiles_group_attrs": lambda: attrb.StringList(default = ["data", "deps", "srcs"]), }, ) diff --git a/python/private/py_repositories.bzl b/python/private/py_repositories.bzl index 45b883047b..6b8148e406 100644 --- a/python/private/py_repositories.bzl +++ b/python/private/py_repositories.bzl @@ -74,9 +74,9 @@ def py_repositories(transition_settings = []): ) http_archive( name = "rules_runfiles_group", - sha256 = "bf618b9b065dc5ef7fba23e4e6b1a6d48c375a36810cba842660caa8bd18267a", - strip_prefix = "rules_runfiles_group-f6acddf050e3a0703a62ad272ff637fca26cd91c", - url = "https://github.com/bazel-contrib/rules_runfiles_group/archive/f6acddf050e3a0703a62ad272ff637fca26cd91c.tar.gz", + sha256 = "2da2befdf87d85eafe8b77a9aa0dca0a700cf7ba929866f6c1b505e3389fbaf8", + strip_prefix = "rules_runfiles_group-41d2544bab5c1eee0117c9e8a992631be8e0d9d1", + url = "https://github.com/bazel-contrib/rules_runfiles_group/archive/41d2544bab5c1eee0117c9e8a992631be8e0d9d1.tar.gz", ) http_archive( name = "toml.bzl", diff --git a/python/private/py_runtime_pair_rule.bzl b/python/private/py_runtime_pair_rule.bzl index c339e0bd67..a648bbdca9 100644 --- a/python/private/py_runtime_pair_rule.bzl +++ b/python/private/py_runtime_pair_rule.bzl @@ -136,6 +136,11 @@ The runtime to use for Python 3 targets. Must have `python_version` set to "_visible_for_testing": attr.label( default = labels.VISIBLE_FOR_TESTING, ), + # Read by rules_runfiles_group's packaging aspects; see runfiles_groups.bzl. + "_aspect_rule_hints": attr.label_list( + default = ["//python/private:py_runtime_pair_runfiles_group_describer"], + ), + "_runfiles_group_attrs": attr.string_list(default = []), }, fragments = ["py"], doc = """ diff --git a/python/private/runfiles_groups.bzl b/python/private/runfiles_groups.bzl index 61d68a984b..bcca0f183c 100644 --- a/python/private/runfiles_groups.bzl +++ b/python/private/runfiles_groups.bzl @@ -15,8 +15,9 @@ A packaging rule (a container image rule, say) walks a binary with an aspect and asks each target's describer which runfiles it adds and which attributes it -merges runfiles in from. The Python rules point their `_runfiles_group_describer` -attribute at the describers below. +merges runfiles in from. The Python rules list the describers below in their +`_aspect_rule_hints` attribute. The runtime comes from the Python toolchain, +which the aspect only walks on Bazel 8.8 or later. Only `//python/private:BUILD.bazel` loads this file; the rules refer to the describers by label. With Bazel 8's autoloads, rules_python loading @@ -36,7 +37,6 @@ load(":py_info.bzl", "PyInfo") load(":py_internal.bzl", "py_internal") load(":py_library.bzl", "get_package_and_version") load(":reexports.bzl", "BuiltinPyInfo") -load(":toolchain_types.bzl", TOOLCHAIN_TYPE = "TARGET_TOOLCHAIN_TYPE") # Stamped on every group, so Python groups stay together when a packager has to # merge groups to fit a layer limit. @@ -49,6 +49,12 @@ _RUNTIME_GROUP = "rules_python#runtime" # implementation detail. _PYPI_GROUP_PREFIX = "rules_python#pypi/" +# The toolchain type //python:toolchain_type is an alias of; the aspect matches +# toolchains by the actual label. +_RUNTIME_MERGE_FROM = runfiles_groups.merge_from( + toolchain = Label("@bazel_tools//tools/python:toolchain_type"), +) + def _pyc_collection_enabled(ctx, pyc_collection = PycCollectionAttr.INHERIT): # PycCollectionAttr only reads these two attributes. return PycCollectionAttr.is_pyc_collection_enabled(struct(attr = struct( @@ -68,6 +74,9 @@ def _is_file(target): def _is_empty(runfiles): return not (runfiles.files or runfiles.symlinks or runfiles.root_symlinks) +def _has_py_info(target): + return PyInfo in target or (BuiltinPyInfo != None and BuiltinPyInfo in target) + def _py_info_files(target, pyc_collection_enabled): if PyInfo in target: return py_info_runfiles_files(target[PyInfo], pyc_collection_enabled) @@ -78,17 +87,36 @@ def _py_info_files(target, pyc_collection_enabled): def _kind(label): return "first_party" if label.repo_name == "" else "third_party" +def _pypi_entry(package, content, weight = None): + return runfiles_groups.entry( + name = _PYPI_GROUP_PREFIX + package, + content = content, + kind = "third_party", + rank = runfiles_groups.RANK_SHARED_DEPS, + weight = weight, + merge_affinity = _MERGE_AFFINITY, + ) + def _own_files(target, ctx, pyc_collection_enabled): """The files a target itself puts into a consuming binary's runfiles.""" info = target[PyInfo] + # A Python target in srcs (a wheel's :pkg wraps its :srcs) describes its + # own files. + foreign = { + f: None + for dep in ctx.rule.attr.srcs + if _has_py_info(dep) + for f in dep[DefaultInfo].files.to_list() + } + # Sources that aren't .py files (directories, .pyc files) are outputs, but # never runfiles. - sources = {f: None for f in info.direct_original_sources.to_list()} + sources = {f: None for f in info.direct_original_sources.to_list() if f not in foreign} direct = [ f for f in target[DefaultInfo].files.to_list() - if f not in sources or is_py_source(f) + if f not in foreign and (f not in sources or is_py_source(f)) ] transitive = [] if pyc_collection_enabled: @@ -129,11 +157,11 @@ def _data_fallback(ctx, dep): content = runfiles_groups.union(ctx, [default_info.files, default_info.data_runfiles]) return runfiles_groups.entry(name = dep.label, content = content) -def _srcs_fallback(_ctx, dep): - runfiles = dep[DefaultInfo].default_runfiles - if _is_file(dep) or _is_empty(runfiles): +def _srcs_fallback(ctx, dep): + # Plain files are in the merging target's own group. + if _is_file(dep): return None - return runfiles_groups.entry(name = dep.label, content = runfiles) + return _dep_fallback(ctx, dep, py_outputs = False) def _describe_py_library(target, ctx): pyc_collection_enabled = _pyc_collection_enabled(ctx) @@ -148,22 +176,22 @@ def _describe_py_library(target, ctx): for files in _py_info_files(dep, pyc_collection_enabled) ]) + weight = len(ctx.rule.files.srcs) + len(ctx.rule.files.data) package, _ = get_package_and_version(ctx.rule.files.data) if package: - name = _PYPI_GROUP_PREFIX + package - kind = "third_party" + entry = _pypi_entry(package, content, weight) else: - name = ctx.label kind = _kind(ctx.label) - return runfiles_groups.node( - add = [runfiles_groups.entry( - name = name, + entry = runfiles_groups.entry( + name = ctx.label, content = content, kind = kind, rank = runfiles_groups.RANK_SHARED_DEPS if kind == "third_party" else runfiles_groups.RANK_EXECUTABLE, - weight = len(ctx.rule.files.srcs) + len(ctx.rule.files.data), + weight = weight, merge_affinity = _MERGE_AFFINITY, - )] if content else [], + ) + return runfiles_groups.node( + add = [entry] if content else [], merge_from = [ runfiles_groups.merge_from("data", fallback = _data_fallback), runfiles_groups.merge_from("deps", fallback = _library_dep_fallback), @@ -175,6 +203,41 @@ py_library_runfiles_group_describer = runfiles_groups.make_describer_rule( describe = _describe_py_library, ) +def _venv_entries(ctx, venv_runfiles): + """Splits the venv's links to PyPI package files into those packages' groups. + + A packager that copies symlinked files can then keep each link with the + file it points to, instead of copying shared libraries into the binary's + group. + + Args: + ctx: The aspect ctx of the binary. + venv_runfiles: runfiles; PyExecutableInfo.venv_runfiles. + + Returns: + tuple of the PyPI entries and the venv runfiles left for the binary. + """ + packages = { + entry.link_to_file: entry.package + for entry in depset(transitive = [ + dep[PyInfo].venv_symlinks + for dep in ctx.rule.attr.deps + if PyInfo in dep + ]).to_list() + if entry.link_to_file and entry.package + } + by_package = {} + own_links = {} + for link in venv_runfiles.root_symlinks.to_list(): + package = packages.get(link.target_file) + links = by_package.setdefault(package, {}) if package else own_links + links[link.path] = link.target_file + entries = [ + _pypi_entry(package, ctx.runfiles(root_symlinks = links)) + for package, links in by_package.items() + ] + return entries, ctx.runfiles(transitive_files = venv_runfiles.files, root_symlinks = own_links) + def _describe_py_executable(target, ctx): info = target[PyExecutableInfo] pyc_collection_enabled = _pyc_collection_enabled(ctx, ctx.rule.attr.pyc_collection) @@ -182,7 +245,8 @@ def _describe_py_executable(target, ctx): _own_files(target, ctx, pyc_collection_enabled), depset([f for f in (info.build_data_file, info.stage2_bootstrap) if f]), ] - content.extend([rf for rf in (info.venv_runfiles, info.venv_interpreter_runfiles) if rf]) + venv_runfiles = info.venv_runfiles + add = [] # Two cases where the binary's group takes its dependencies: # * The legacy __init__.py files: they're generated for every directory in @@ -195,15 +259,18 @@ def _describe_py_executable(target, ctx): merge_from = [] elif pyc_collection_enabled != _pyc_collection_enabled(ctx): content.append(info.app_runfiles) - merge_from = ["_runfiles_group_python_runtime"] + merge_from = [_RUNTIME_MERGE_FROM] else: + if venv_runfiles: + add, venv_runfiles = _venv_entries(ctx, venv_runfiles) merge_from = [ - "_runfiles_group_python_runtime", + _RUNTIME_MERGE_FROM, runfiles_groups.merge_from("_debugger_flag", fallback = _executable_dep_fallback), runfiles_groups.merge_from("data", fallback = _data_fallback), runfiles_groups.merge_from("deps", fallback = _executable_dep_fallback), runfiles_groups.merge_from("srcs", fallback = _srcs_fallback), ] + content.extend([rf for rf in (venv_runfiles, info.venv_interpreter_runfiles) if rf]) return runfiles_groups.node( add = [runfiles_groups.entry( @@ -211,7 +278,7 @@ def _describe_py_executable(target, ctx): content = runfiles_groups.union(ctx, content), kind = _kind(ctx.label), merge_affinity = _MERGE_AFFINITY, - )], + )] + add, merge_from = merge_from, executable_group = ctx.label, ) @@ -220,8 +287,9 @@ py_executable_runfiles_group_describer = runfiles_groups.make_describer_rule( describe = _describe_py_executable, ) -def _describe_python_runtime(target, _ctx): - files = target[DefaultInfo].files +def _describe_py_runtime_pair(target, ctx): + runtime = target[platform_common.ToolchainInfo].py3_runtime + files = get_runtime_files(ctx, runtime) if runtime else depset() return runfiles_groups.node(add = [runfiles_groups.entry( name = _RUNTIME_GROUP, content = files, @@ -231,26 +299,6 @@ def _describe_python_runtime(target, _ctx): merge_affinity = _MERGE_AFFINITY, )] if files else []) -python_runtime_runfiles_group_describer = runfiles_groups.make_describer_rule( - describe = _describe_python_runtime, -) - -def _python_runtime_runfiles_impl(ctx): - return [DefaultInfo(files = get_runtime_files(ctx))] - -python_runtime_runfiles = rule( - implementation = _python_runtime_runfiles_impl, - doc = """\ -The runtime files a binary puts into its runfiles, as one runfiles group. - -Every binary merges in the same target, so a packager builds the group once per -configuration rather than once per binary. -""", - attrs = { - "_runfiles_group_attrs": attr.string_list(default = []), - "_runfiles_group_describer": attr.label( - default = ":python_runtime_runfiles_group_describer", - ), - }, - toolchains = [TOOLCHAIN_TYPE], +py_runtime_pair_runfiles_group_describer = runfiles_groups.make_describer_rule( + describe = _describe_py_runtime_pair, ) diff --git a/tests/runfiles_groups/BUILD.bazel b/tests/runfiles_groups/BUILD.bazel index fd27d891ac..f1d7a04d35 100644 --- a/tests/runfiles_groups/BUILD.bazel +++ b/tests/runfiles_groups/BUILD.bazel @@ -56,10 +56,22 @@ py_library( py_library( name = "foo_pkg", srcs = ["site-packages/foo_pkg.py"], - data = ["site-packages/foo_pkg-1.0.dist-info/METADATA"], + data = [ + "site-packages/_foo_native.so", + "site-packages/foo_pkg-1.0.dist-info/METADATA", + ], + experimental_venvs_site_packages = "//python/config_settings:venvs_site_packages", imports = ["site-packages"], ) +# Wraps foo_pkg like whl_library's :pkg wraps its :srcs; adds no group. +py_library( + name = "foo_pkg_wrapper", + srcs = [":foo_pkg"], + precompile = "disabled", + deps = [":foo_pkg"], +) + _DATA = [ ":files", ":generated", @@ -74,7 +86,7 @@ py_binary( data = _DATA, main = "main.py", deps = [ - ":foo_pkg", + ":foo_pkg_wrapper", ":lib_b", ], ) @@ -107,6 +119,22 @@ py_reconfig_binary( deps = [":lib_b"], ) +# The venv's links to foo_pkg's files go into foo_pkg's group. +py_binary( + name = "bin_venv", + srcs = ["main.py"], + config_settings = { + "//python/config_settings:venvs_site_packages": "yes", + } | select({ + "@platforms//os:windows": {}, + "//conditions:default": { + "//python/config_settings:bootstrap_impl": "script", + }, + }), + main = "main.py", + deps = [":foo_pkg_wrapper"], +) + # Falls back to one group for itself and its deps, because its pyc selection # differs from what its deps describe. py_binary( @@ -135,6 +163,7 @@ runfiles_group_analysis_test( ":bin_legacy_init", ":bin_precompiled", ":bin_pyc_collection", + ":bin_venv", ":test", ], overlapping_group_behavior = "error", diff --git a/tests/runfiles_groups/site-packages/_foo_native.so b/tests/runfiles_groups/site-packages/_foo_native.so new file mode 100644 index 0000000000..e69de29bb2 From b43012bd79d08b707f64b1331ffd856bfc95a6cd Mon Sep 17 00:00:00 2001 From: Frank Portman Date: Mon, 19 Oct 2026 09:40:54 -0400 Subject: [PATCH 3/6] DO NOT MERGE: use the rules_runfiles_group dev registry in nested workspaces Revert once rules_runfiles_group is released. --- examples/bzlmod/.bazelrc | 3 + examples/multi_python_versions/.bazelrc | 3 + examples/pip_parse/.bazelrc | 3 + gazelle/.bazelrc | 3 + .../bzlmod_build_file_generation/.bazelrc | 3 + sphinxdocs/.bazelrc | 3 + .../persistent_worker/workspace/.bazelrc | 3 + tests/integration/bzlmod_lockfile/.bazelrc | 3 + .../bzlmod_lockfile/MODULE.bazel.lock | 677 +++++++++++------- .../compile_pip_requirements/.bazelrc | 3 + .../.bazelrc | 3 + tests/integration/custom_commands/.bazelrc | 2 + tests/integration/local_toolchains/.bazelrc | 3 + tests/integration/pip_parse/.bazelrc | 3 + tests/integration/pip_parse_isolated/.bazelrc | 3 + .../py_cc_toolchain_registered/.bazelrc | 3 + tests/integration/runtime_manifests/.bazelrc | 3 + .../toolchain_target_settings/.bazelrc | 3 + tests/integration/unified_pypi/.bazelrc | 3 + tests/integration/uv_lock/.bazelrc | 3 + tests/integration/validate_test_main/.bazelrc | 2 + tests/integration/whl_library/.bazelrc | 3 + 22 files changed, 479 insertions(+), 259 deletions(-) create mode 100644 tests/integration/custom_commands/.bazelrc create mode 100644 tests/integration/validate_test_main/.bazelrc diff --git a/examples/bzlmod/.bazelrc b/examples/bzlmod/.bazelrc index 28a44a7523..aaeaa7befe 100644 --- a/examples/bzlmod/.bazelrc +++ b/examples/bzlmod/.bazelrc @@ -24,3 +24,6 @@ test --test_output=errors --enable_runfiles # Windows requires these for multi-python support: build --enable_runfiles common:bazel7.x --incompatible_python_disallow_native_rules + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/examples/multi_python_versions/.bazelrc b/examples/multi_python_versions/.bazelrc index 97a973bd85..e019fc2592 100644 --- a/examples/multi_python_versions/.bazelrc +++ b/examples/multi_python_versions/.bazelrc @@ -5,3 +5,6 @@ build --enable_runfiles coverage --java_runtime_version=remotejdk_11 common:bazel7.x --incompatible_python_disallow_native_rules + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/examples/pip_parse/.bazelrc b/examples/pip_parse/.bazelrc index f263a1744d..4796c06451 100644 --- a/examples/pip_parse/.bazelrc +++ b/examples/pip_parse/.bazelrc @@ -1,3 +1,6 @@ # https://docs.bazel.build/versions/main/best-practices.html#using-the-bazelrc-file try-import %workspace%/user.bazelrc common --incompatible_python_disallow_native_rules + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/gazelle/.bazelrc b/gazelle/.bazelrc index e30216814a..64a5e7f93f 100644 --- a/gazelle/.bazelrc +++ b/gazelle/.bazelrc @@ -20,3 +20,6 @@ build --@rules_python//python/config_settings:incompatible_default_to_explicit_i build --enable_runfiles common:bazel7.x --incompatible_python_disallow_native_rules + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/gazelle/examples/bzlmod_build_file_generation/.bazelrc b/gazelle/examples/bzlmod_build_file_generation/.bazelrc index 31097b41de..4192d2cbfa 100644 --- a/gazelle/examples/bzlmod_build_file_generation/.bazelrc +++ b/gazelle/examples/bzlmod_build_file_generation/.bazelrc @@ -14,3 +14,6 @@ common:bazel7.x --incompatible_python_disallow_native_rules # rules_python code. In the BCR presubmits, this override is removed # and the bazel_dep version of rules_python is used. common --override_module=rules_python=../../../ + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/sphinxdocs/.bazelrc b/sphinxdocs/.bazelrc index 6989c2656a..094382a169 100644 --- a/sphinxdocs/.bazelrc +++ b/sphinxdocs/.bazelrc @@ -35,3 +35,6 @@ common:fast-tests --test_tag_filters=-large,-enormous,-integration-test build --config=pyrefly build:pyrefly --aspects=//tests/support/pyrefly:pyrefly.bzl%pyrefly_aspect build:pyrefly --output_groups=+pyrefly + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/sphinxdocs/integration_tests/persistent_worker/workspace/.bazelrc b/sphinxdocs/integration_tests/persistent_worker/workspace/.bazelrc index f3162b9547..d0ac68f7cb 100644 --- a/sphinxdocs/integration_tests/persistent_worker/workspace/.bazelrc +++ b/sphinxdocs/integration_tests/persistent_worker/workspace/.bazelrc @@ -6,3 +6,6 @@ common --http_timeout_scaling=10.0 common --experimental_repository_downloader_retries=10 common --experimental_downloader_config=downloader_config.cfg common --lockfile_mode=off + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/tests/integration/bzlmod_lockfile/.bazelrc b/tests/integration/bzlmod_lockfile/.bazelrc index 3687a11fae..1c624e47cc 100644 --- a/tests/integration/bzlmod_lockfile/.bazelrc +++ b/tests/integration/bzlmod_lockfile/.bazelrc @@ -7,3 +7,6 @@ common --experimental_isolated_extension_usages # https://docs.bazel.build/versions/main/best-practices.html#using-the-bazelrc-file try-import %workspace%/user.bazelrc + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/tests/integration/bzlmod_lockfile/MODULE.bazel.lock b/tests/integration/bzlmod_lockfile/MODULE.bazel.lock index b06891f154..8d37f1ef55 100644 --- a/tests/integration/bzlmod_lockfile/MODULE.bazel.lock +++ b/tests/integration/bzlmod_lockfile/MODULE.bazel.lock @@ -1,6 +1,149 @@ { "lockFileVersion": 26, "registryFileHashes": { + "https://bazel-contrib.github.io/rules_runfiles_group/bazel_registry.json": "ca3d163bab055381827226140568f3bef7eaac187cebd76878e0b63e9e442356", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/abseil-cpp/20210324.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/abseil-cpp/20211102.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/abseil-cpp/20230125.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/abseil-cpp/20230802.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/abseil-cpp/20230802.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/abseil-cpp/20240116.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/abseil-cpp/20240116.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/abseil-cpp/20250127.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/abseil-cpp/20250512.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/abseil-cpp/20250814.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/apple_support/1.11.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/apple_support/1.15.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/apple_support/1.21.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/apple_support/1.21.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/apple_support/1.24.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.10.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.11.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.15.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.17.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.18.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.19.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.21.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.23.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.27.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.28.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.3.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.30.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.33.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.4.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.42.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_features/1.51.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_skylib/1.0.3/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_skylib/1.1.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_skylib/1.2.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_skylib/1.2.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_skylib/1.3.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_skylib/1.4.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_skylib/1.4.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_skylib/1.5.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_skylib/1.6.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_skylib/1.7.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_skylib/1.7.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_skylib/1.8.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/bazel_skylib/1.8.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/buildozer/8.5.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/google_benchmark/1.8.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/googletest/1.11.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/googletest/1.14.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/googletest/1.15.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/googletest/1.17.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/jsoncpp/1.9.5/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/jsoncpp/1.9.6/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/libpfm/4.11.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/nlohmann_json/3.6.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/package_metadata/0.0.7/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/platforms/0.0.10/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/platforms/0.0.11/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/platforms/0.0.4/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/platforms/0.0.5/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/platforms/0.0.6/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/platforms/0.0.7/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/platforms/0.0.8/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/platforms/0.0.9/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/platforms/1.0.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/protobuf/21.7/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/protobuf/27.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/protobuf/29.0-rc2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/protobuf/29.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/protobuf/3.19.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/protobuf/32.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/protobuf/33.4/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/pybind11_bazel/2.11.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/pybind11_bazel/2.12.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/re2/2023-09-01/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/re2/2024-07-02/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_android/0.1.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_apple/3.16.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_apple/4.1.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.0.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.0.10/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.0.13/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.0.15/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.0.16/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.0.17/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.0.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.0.6/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.0.8/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.0.9/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.1.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.1.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.2.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.2.13/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.2.17/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_cc/0.2.8/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_fuzzing/0.5.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_java/4.0.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_java/5.3.5/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_java/6.5.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_java/7.10.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_java/7.12.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_java/7.2.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_java/7.6.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_java/8.6.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_java/9.1.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_jvm_external/4.4.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_jvm_external/5.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_jvm_external/5.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_jvm_external/6.3/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_jvm_external/6.7/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_kotlin/1.9.6/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_license/0.0.3/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_license/0.0.7/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_license/1.0.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_pkg/0.7.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_pkg/1.0.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_proto/4.0.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_proto/6.0.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_proto/7.1.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_runfiles_group/99.0.0-dev.20261016.1.41d2544/MODULE.bazel": "e35f5260f613c7cd7b29a398cd34191db239ec138ba357dbfe81c3f2ce19de70", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_runfiles_group/99.0.0-dev.20261016.1.41d2544/source.json": "801750c105fd41f3ca2818e93a6cbaa55b8236ea505394adfe3596e1bfc44967", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_shell/0.2.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_shell/0.3.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_shell/0.6.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_swift/1.16.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_swift/2.1.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_swift/2.4.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_swift/3.1.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/stardoc/0.5.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/stardoc/0.5.3/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/stardoc/0.7.0/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/swift_argument_parser/1.3.1.2/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/toml.bzl/0.4.1/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/zlib/1.2.11/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "not found", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/zlib/1.3.1/MODULE.bazel": "not found", "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", @@ -35,7 +178,8 @@ "https://bcr.bazel.build/modules/bazel_features/1.33.0/MODULE.bazel": "8b8dc9d2a4c88609409c3191165bccec0e4cb044cd7a72ccbe826583303459f6", "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7", "https://bcr.bazel.build/modules/bazel_features/1.42.1/MODULE.bazel": "275a59b5406ff18c01739860aa70ad7ccb3cfb474579411decca11c93b951080", - "https://bcr.bazel.build/modules/bazel_features/1.42.1/source.json": "fcd4396b2df85f64f2b3bb436ad870793ecf39180f1d796f913cc9276d355309", + "https://bcr.bazel.build/modules/bazel_features/1.51.0/MODULE.bazel": "8e1310d09db6ee2e4f19f9994e360aca941ddc32083edc8d9bdc19c83c94cee4", + "https://bcr.bazel.build/modules/bazel_features/1.51.0/source.json": "d5af1f1748d2b4ace5f04087030c0a1cfd93f5be6bdf0b5c1beb24ed0fd24955", "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e", "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686", @@ -252,8 +396,8 @@ }, "@@rules_python+//python/uv:uv.bzl%uv": { "general": { - "bzlTransitiveDigest": "DafUArm1CsjJZcemT0FvUq9rUch+pq38+JqfOBJCpm8=", - "usagesDigest": "6yXGw7XDyXjOfqBL0SBu1YBEMMYPQzCE3jTzUCkxPgg=", + "bzlTransitiveDigest": "mkSJjS3IKYKgnN+NNEXte2ylbT3HbgQHO3Wb0v1mHPU=", + "usagesDigest": "4oeBVCEzXt49RrVnpRaNDbydAxQ9Yw+5jX6Xm82siGM=", "recordedInputs": [ "REPO_MAPPING:rules_python+,bazel_tools bazel_tools", "REPO_MAPPING:rules_python+,platforms platforms" @@ -396,226 +540,239 @@ "https://files.pythonhosted.org/packages/ff/69/844bad3ece306c4782c2ecb93597035b6690d48704b803914c199da1e8b3/cffi-2.1.1-cp315-cp315-ios_13_0_arm64_iphonesimulator.whl": "sha256:da0e573f9f97159390c89d9f1a9e41908b66d408cc5b58d08cf3847d844c531b" }, "charset-normalizer": { - "https://files.pythonhosted.org/packages/01/65/d43b714731bb2f40d4053dfa00ecfc1c5a301f8e3316c5db3a09af59fe94/charset_normalizer-3.5.1-cp37-abi3-win32.whl": "sha256:dd732602a7009217f658d5863d12d79d373a4de0eebc111094bcdd3bb8e0a6cc", - "https://files.pythonhosted.org/packages/02/fc/0d9ab98fa7a61394353e8acd0f5f60fc6e94a4615f574af8be0eca14a7ef/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_riscv64.whl": "sha256:433c5a81eade63b47e522303bad236f59dba55ea6951746f5558355eeed8c75d", - "https://files.pythonhosted.org/packages/03/3b/0cc9a26777334ab2f2e3089b948bbf4e4fe72ea70b897715ef6415043ec8/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:baf3775a2635e5a11fbd5e4e64ee69c7e86875d224a5c72aca4c141064589a90", - "https://files.pythonhosted.org/packages/03/6d/439231dfc3ccfa6f8c06477b7da2219cbd41a2de3d49084df8ec7b5100f2/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:e9fbdce1e47394b09bc9f26ab117dfc8d6491977a11d86f592bb42c779db2fda", - "https://files.pythonhosted.org/packages/06/ae/7ae8807410dfa33f8e6f1715740adeaafa8a816cc4cb33508f54b1f7c896/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:7ac76cf9afd34929d76eb7fcb63be476a4853d8a96f0dcf2d0db68a0cbdf9885", - "https://files.pythonhosted.org/packages/09/0a/d3646670292ce8d8f8cc11ac067d44885e697a5591f57a9221128da5e7b3/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphoneos.whl": "sha256:9362dd90aa7dab48c0054a21187791ccf05473f7dba5d92b8033ae62164675e7", - "https://files.pythonhosted.org/packages/09/53/27923ce5cc6cbccb832037b27dca98882d9c53e9b69e866bbbef4aae7fc8/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:d59b75732e9b6f27388e10c14b0259cc5f2e48c78627d185e6a177b58ad3cffe", - "https://files.pythonhosted.org/packages/0d/35/731ac04aa0a097fc1c97f0994c375bdb230c6c96619db794208fe664e9ce/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:c7b742bf31c88566b4bb6335a7f393bb322e580b6bb98df7bd0c25e6e3519ce8", - "https://files.pythonhosted.org/packages/10/4c/dc48409274a1817ff349711d26c62aa0c597df865d4d69ef79160c859193/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_riscv64.whl": "sha256:77efcff2b23071c349402ac1066667a3d011f62398d81408c9b88ad991747c9e", - "https://files.pythonhosted.org/packages/17/d4/b65c433fc521e58b5f54293982a5e51c05cb5f2dd3f1c7a6acb65b75324e/charset_normalizer-3.5.1-cp311-cp311-win_arm64.whl": "sha256:ae31a1a1db2ee6cc2942fccaf695c934bc7f3db9f2133a3fef1f367cf1a4ab10", - "https://files.pythonhosted.org/packages/18/57/a305c968be1ca13f3dd1b32f445877e97addf55d80b65c7cb35fac82b777/charset_normalizer-3.5.1-cp313-cp313-android_24_x86_64.whl": "sha256:88ca277405c2d3b71c4e1c2ee0e7966e807bcba86a69d11e19ba199d18ae4491", - "https://files.pythonhosted.org/packages/18/96/2b3a21492d9f65171ac75d872f5018260013d00bfa0ff70ec9f179148cbd/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_ppc64le.whl": "sha256:4c4fb141a727957c93edfe5c32a26ceb6b5f6461d67146e2d39f51e16170bea8", - "https://files.pythonhosted.org/packages/1b/ee/e4e10a94d51cd1ee638aa7e00b65399e6b2a4e8376ab6d2eac9f95586671/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:58d4aa13a59c969dbfdf9e6a9560e242cbfd9e8a8f50c2747714df1a423adf65", - "https://files.pythonhosted.org/packages/1c/6c/c73fa9d5a85f6ab05395de61c5f6984e0a9ff40bb5ff888d46dff02526c6/charset_normalizer-3.5.1-cp314-cp314t-macosx_10_15_universal2.whl": "sha256:fbc597639158fd7c14d55e808718848319540f51b0e6746e3eefa59723a4a348", - "https://files.pythonhosted.org/packages/1c/a5/cbe418bbc6ecdfc3e05a0116002897c4b403a5e838d697e64c78e9f0190d/charset_normalizer-3.5.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:823f82903d189af463d7df250ef1f7f696f3cee08cc8d91deb565e8d425f6506", - "https://files.pythonhosted.org/packages/1e/25/ed3f9919c5aef8cc818be1f972f565f7610d7b2076b8ebb98839516ffc3c/charset_normalizer-3.5.1-cp315-cp315t-win32.whl": "sha256:ac13b004224fb341e1e25a1ed5e19d32f57cdb2a403e01f003b46f051a550f6f", - "https://files.pythonhosted.org/packages/20/c8/c36f6e0b2dfec351bd38cbc05362697e58bcd073d7dbd95154290c9714ce/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_ppc64le.whl": "sha256:07ffd07412fc5d5e84cd8952acf9ff7e4ed7a708e69d1bada19d8ba91711353f", - "https://files.pythonhosted.org/packages/22/95/b4618ce912e6db0b1aae89ba788e38e8a7eba0f3025cc66e8c0699f977b2/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:6b7430cf5728e68f6c462254009a6ef4086e1bea43cf2f57aa9c55fb4f50ff96", - "https://files.pythonhosted.org/packages/26/de/d8e48c135ae480879539cdb179c8d3b50c7879497d75dd899b5763b69cee/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_armv7l.whl": "sha256:838648accb3a7fd9803fd45c87bce8509648eb0c11bc34e216141300977244f2", - "https://files.pythonhosted.org/packages/27/e9/61c01fb8b804692569c036b3fc50495814502dcf13a60649c6055390b02c/charset_normalizer-3.5.1-cp314-cp314t-win_arm64.whl": "sha256:fdb8a068947befafba9952162645dc2fecaeb400e64584829ed5e9b2fbe21a7f", - "https://files.pythonhosted.org/packages/28/53/a2d249ebddf47b889a100c0bdcb61a2f9dbb8bc24ef325cc062e4f476877/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:e4b018dc5a0eee4676e38fe84a47a427816c590b93b55d9025274ec4d6ffc2dc", - "https://files.pythonhosted.org/packages/28/f0/0c0ceec6d98b7daa62e361e418135d59685811d79ba11529aad5cdf15e84/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_aarch64.whl": "sha256:0722590aabf9dc6a6c0343d523c05458fa2b5047dbe6302fd526bb570600753f", - "https://files.pythonhosted.org/packages/29/cd/2b812ce5e888f1ce69a5350281e58aab07ae64a958ecae8912f30865718e/charset_normalizer-3.5.1-cp314-cp314-android_24_arm64_v8a.whl": "sha256:774d157f112367ff4abd29019f38f023c24e00e56edc7829c20e358a5a913ad8", - "https://files.pythonhosted.org/packages/2b/b8/11d4840bfc99330cc7fbcc2681ee5a044553a6e77655508d8f9b2bff7b34/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_armv7l.whl": "sha256:36047af20e17097c3bb9476c2b7655f2f7aa51322c0ba58c07695bedf755a950", - "https://files.pythonhosted.org/packages/2e/1d/0fc91aeaeb3c83b748f532399ce67cf84604b48297405d740000f7a9e786/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_x86_64.whl": "sha256:85d5855daafc240cc045c026d7a15fd198a09b0fc8ff6f5ecbb5297b509cb11e", - "https://files.pythonhosted.org/packages/2e/57/de221f1745a90d418199761967e2776bfe2c275a1194220985e8c1d37833/charset_normalizer-3.5.1-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:854066be00447fa8de2ccbbe893e2ffc4b123ef16d897af794c1e18bd4a714b0", - "https://files.pythonhosted.org/packages/30/27/78873dc8b6a56357517b74b6bb9568b80450e7bb4f6ef7e3fa9d22aa0bd7/charset_normalizer-3.5.1-cp312-cp312-macosx_10_13_universal2.whl": "sha256:5b6d1386bf0096d26d3a863dc0a487a5b4eb9aa93cf5ba69683d29dde6b9d60f", - "https://files.pythonhosted.org/packages/30/c7/63565f860921457feba93bae6c86fb7746deb4cffeed2f375cb845318146/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:e71c909f353863b2b89c83de2ebed71ea6d0df8a6ef65a128193c5e650766bef", - "https://files.pythonhosted.org/packages/31/e7/1d994be1b93d41e9502b8b0460eaa88a1dd8df335df415db87d6c3e91ab2/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:94d78ecec2605a8d0398b0f365d5f12a63248438516f5dac536a5eff7337df4a", - "https://files.pythonhosted.org/packages/32/90/fcc850bae791abd2e0c041847f13e270aa08692a79f3e00de6d2dce1cb50/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_x86_64.whl": "sha256:687c9ca3035544b113bea2055e180af96fb63c0c476e22a9180f51925186e7b7", - "https://files.pythonhosted.org/packages/32/cd/4f564b8f132de25db594efc706897069f016790cea63a5669c9df2675f64/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:96eefc178f8636b9c760c5829345307fd81cfae9ab1e80997dbddeb0f54ee9a3", - "https://files.pythonhosted.org/packages/34/17/672c251a888ed2aebcdd2fe830ad0104e25ff83c43f5c4f9c15e9fc6853c/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_armv7l.whl": "sha256:52ec005752a56ae79547a05c0139ca2501a0c866390b6115008456b9f0e7cde1", - "https://files.pythonhosted.org/packages/34/f7/b13b1ccae2c8ec63980d13be1890eb73f8aeabbfce02a24aabc0908788f5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_x86_64.whl": "sha256:4d26f14f041e83dd8edfd61f4cd4fa7285d31798b5bf1f28e70c367ba6c41d61", - "https://files.pythonhosted.org/packages/35/4f/b911ed898b26a09789eba9c9200c999aff6c61b4bafaf4838e56d1a1e1a3/charset_normalizer-3.5.1-cp37-abi3-win_amd64.whl": "sha256:70055ff39b97c99e7ae40ea3e393fb62aa2e44dbd9b29f8d14f42fb0025c3959", - "https://files.pythonhosted.org/packages/35/5a/337e4663a5eae6de99db940ee8066d4145caafb61327db62deda15313cce/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_riscv64.whl": "sha256:7235dc28fc6dd9d832ac7c7bce95367dedb85929f17368a0c2bee1e080b9acbf", - "https://files.pythonhosted.org/packages/35/8a/3d130aeabcaf3d2466af76b7b141c08d9e89c9016ab4b7cdd0f7dc2d1c62/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_s390x.whl": "sha256:3588e376b3ea2eea84976f67273d679f229e24c66dce7b82ae45aef04ff6e072", - "https://files.pythonhosted.org/packages/37/2e/651d910af6d0fba325eee1cda37ec5443462ed25360e666c144166eb6091/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_s390x.whl": "sha256:35fe081843b35aad20ffeccec3eeffbe637b15d14f3fb22cc1b59cd8ec17e93c", - "https://files.pythonhosted.org/packages/37/ab/4e4510e1e288478e2c8333131d1c1382382ba8cd2165053c79e39d1da961/charset_normalizer-3.5.1-cp311-cp311-win32.whl": "sha256:ac00177c4831ffa650f8609e4bdddd5fe09c03b1c0c47acece7e6ea20421598b", - "https://files.pythonhosted.org/packages/38/fe/341861ac118dae06f3ec0eb487488af52128f2ef2faf0b11003944d22259/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:7c0c10730342b0c9b35dd1d619beb8214e520bd96a1f870f452680b238aab3e0", - "https://files.pythonhosted.org/packages/3b/32/9b8929bf384061ee1fe5d9c27c6f9776d3d824039ad4e14c88ec00c7808e/charset_normalizer-3.5.1-cp315-cp315t-macosx_10_15_universal2.whl": "sha256:59171c6e45bf07d0d5cab3b0bf81d945035530f6873398b3b531c31184d46663", - "https://files.pythonhosted.org/packages/3d/bb/618749d70f792b44252a777bf89bfb86823b9bbc1ea13fe8ce759b07f38a/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_riscv64.whl": "sha256:fce8cbd4997efeb450bd298b54f755dcdff18d496f7a5ddbb4867c6d7c88fdc3", - "https://files.pythonhosted.org/packages/3e/11/e6f5b9a3d0e55b0ef7505cd3765cdd48f22db89994c947b316f52f801fd8/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:256dd4d85d9e4dc595e2bc983c980e73f62ddeb3165c58b4c3dfe78c5c8548c1", - "https://files.pythonhosted.org/packages/3f/fc/f6a85abebd42ce4da2f1db0aa56cc6a0df1995e318b3875d14401b8381d1/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_ppc64le.whl": "sha256:2bced4061f000f7187254a02ad3433ae17eaf991747ceea2f478422590a5bba9", - "https://files.pythonhosted.org/packages/42/85/f9e22af69af67c54cce42be9455d9c81294f918b4ccc454db01f66efcac2/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_ppc64le.whl": "sha256:bd6c173f04743d483881bffa1478d5a4624475b8cd1d2194956a75548e191c18", - "https://files.pythonhosted.org/packages/46/22/111e5be3b740d5c2a5bfcedb3d237b6591e5c2e82ae9d6ffcb121fe0909c/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_armv7l.whl": "sha256:5d8531a6569d025f68e2321e7638fb7978f23db58e5f69f56913837aae03816e", - "https://files.pythonhosted.org/packages/49/e0/716601f3cc69be7b198951150c75ead1ece33c3c8036ff6ffa46029659a0/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:343fb4f2821043bd87095f7b08a1a181febc8e36ac64212143bbfd0a0e1bc235", - "https://files.pythonhosted.org/packages/4a/4e/8544831ef59d8f27ce92c80871380fdacc8076a8a56ed62f82e54f991333/charset_normalizer-3.5.1-cp315-cp315-macosx_10_15_universal2.whl": "sha256:9085f87b0e38a2b92b8923059b4e8789fe40d9279712d15dcc670048d77079af", - "https://files.pythonhosted.org/packages/4d/66/70dfad64f15be09c15ccfee81330a7e515895dbe296dd23114e9a231268a/charset_normalizer-3.5.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:fa48b1b63d639f9483e0633e092f5851e2348c352f1f9bb6c8182f87884ef876", - "https://files.pythonhosted.org/packages/4d/81/ae557d3c44d1a1d688696d60563413a0866a91b7ebc50f20df838be3d8c8/charset_normalizer-3.5.1-cp314-cp314t-win_amd64.whl": "sha256:acaf604462bf330b0d07e7a07c1d6e4adac79e5fb13e9c5140590542cafacc00", - "https://files.pythonhosted.org/packages/4f/ab/74a55fd803916a35ac461daf002708191aac19b546b80dc8cabfedc63d98/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_x86_64.whl": "sha256:9ac4444d8d4fd4c4bd08bf451ed3167aa9e7ec6cdb41b648794f1d1103652e36", - "https://files.pythonhosted.org/packages/53/31/7f79c671d827080d6eecd697fbbeb4f0f6f8507bf4c5625b5f6398ec5876/charset_normalizer-3.5.1-cp39-cp39-win_amd64.whl": "sha256:012a22b88a77ca2e59b98ac5889b0deb604147666032f45e6d6e217634d2550d", - "https://files.pythonhosted.org/packages/55/53/7d819bd23a00ef45039146fa2cce1daa2f0771e758c5653ee1f6edac91ed/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:00668ebb0609751758682eb0b5857e7c35b9f00e84dfdef062e103244ec94d45", - "https://files.pythonhosted.org/packages/55/66/3bb56a47f7dcba014055b1a1d33c6f08bbe9c1e74dba154cfa25f90ae885/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:19a3dd5aa73cef1c99687c4fc57db016a9c17104ae1185da88ba566a5d3bebe4", - "https://files.pythonhosted.org/packages/58/67/62df6a907162461f372e95cbbc1bc64c7457e86abcc851feb84409a11eff/charset_normalizer-3.5.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:3e5e1224c0a6a90e05843e07adfec669edebec17801c67072f51e59561d63c0b", - "https://files.pythonhosted.org/packages/58/ad/b9aecf38d805cbcf84fa94f14c5d972a16561e20296a11dc799a5dcf3763/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_x86_64.whl": "sha256:494b70049a4d69aec6e8137c13af4cf8db8c9f9820a1392ac293b0dd2987a818", - "https://files.pythonhosted.org/packages/5b/75/5b20dd1e6573a01a08158fe104104fa2c8abf941745596954185726cd46c/charset_normalizer-3.5.1-cp313-cp313-win_arm64.whl": "sha256:fd0a274c0e5f9a21565cd9d3dd749b61f96b7aa1e20a93aa1ba4029518f2e5c0", - "https://files.pythonhosted.org/packages/5b/97/fb4e82231aba271ffd775a1b4993b0defc4e3059f286ae41d9433409fe85/charset_normalizer-3.5.1-cp37-abi3-macosx_10_9_universal2.whl": "sha256:41876ee62a3dddf48ff1121ad8f0798032aa03f2fd35f21f34a4cab14f18d8d2", - "https://files.pythonhosted.org/packages/5c/64/12b4c2a11ee8df4fcc518c78b0d93e3a92bd3d5253d1617ce74ff0e8c7ef/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_riscv64.whl": "sha256:90b7481fb62fbe172c558bc6fd1c4c98d82004a54a7551f20e11ac9bf0b8708c", - "https://files.pythonhosted.org/packages/5e/fa/40414471acf0aa0692ca77305aa00e434fcd8288f0941c93c30e9a5f8f2f/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_s390x.whl": "sha256:cc0329df4caaceb950d2f580b5ac716a377f7059624a0bafaeaf8a218c6ed774", - "https://files.pythonhosted.org/packages/62/16/46556278c2168d12df9da7fede5dc6fc70e60301b26a82bbeec238c9cfe3/charset_normalizer-3.5.1-cp312-cp312-win32.whl": "sha256:cfa1c0cc3a8f9f53f1243a5a99ac36fd003880199383b37672e86ddda9cb07e2", - "https://files.pythonhosted.org/packages/64/60/7c5469f455f4fa65d39da9f088dffc1a586560bfb9e3279441eed78bd469/charset_normalizer-3.5.1-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:994e883d17c559cdfd38c84003c8b27d25424a1077272a17e7cd27bfe0bf57b2", - "https://files.pythonhosted.org/packages/64/77/9ae101cb33bd9f681551e82a2b9e08eec99ff715458340931370f4228de9/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_x86_64.whl": "sha256:eb12fb2ba69ffa05f8695f61c69e591dc4b4a12ac3757ac8af8adb259bf56d17", - "https://files.pythonhosted.org/packages/67/c4/217755fd1abc50d326c252922cd642002758095a81ff45010337b8b3ef65/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_ppc64le.whl": "sha256:195ce897c6153c0700078142cf8efe3e6454ca4cf4357499e4078dfd83396626", - "https://files.pythonhosted.org/packages/69/2b/d8be3523ddf9f0b0f3e56d1359034aa10653a4d11564c697f802b4775766/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:ce854f5f478050ade5a238731c4ca985a7d3b3cb53ff600a9b5c3b689b5f0a7a", - "https://files.pythonhosted.org/packages/69/d5/43c2b3e9d8267092b913eb8b0603f0f71993c395632886bd37a7223f96cf/charset_normalizer-3.5.1-cp315-cp315t-win_amd64.whl": "sha256:35aea775dc2bd5f54cd84a1cd2696cc3207c479cb9cf0bd346f0d343e4300ddb", - "https://files.pythonhosted.org/packages/6a/b6/034f6802e9c3f6418966cfabb7db8c9252cc2429c5098f41cc43af804149/charset_normalizer-3.5.1-cp311-cp311-macosx_10_9_universal2.whl": "sha256:eda059b6bc8bc0812d626fd91a7ce01bf583df0a61296eff390fd94141a34e30", - "https://files.pythonhosted.org/packages/6f/89/bb5108dc6c3651dca963f2b0a3ba19bbcb370c94e1b6d3e0e844a58e6dca/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:b9af956078716df40d985fb0dfeb2c2120c5ca92ba4ff4b388acfd01cdc14d08", - "https://files.pythonhosted.org/packages/71/aa/554e2614f38fc34c58ff1d0911ae8535ad2516440d5482d76fe59f1088b0/charset_normalizer-3.5.1-cp310-cp310-macosx_10_9_universal2.whl": "sha256:d1ee1e296209fdce05b81b663250eefa02213a2da7b41bf26f7829b8ba3545aa", - "https://files.pythonhosted.org/packages/74/76/f2fc7380f056cc273a53af37f50d08ad54b2c59f61078f31432edcf1c2bd/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl": "sha256:4c9548dc78002099910abaebc0a72ac58b7d30931869e0351c09b507dff4ece3", - "https://files.pythonhosted.org/packages/75/9c/019fbb9f4834491a160951349b1a3714439376f66e5f7cf18b4f18f0c7aa/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_aarch64.whl": "sha256:a2028475ba855475b8b4d3cfeb4994269c967aea8b9892dfba907f4263a863a3", - "https://files.pythonhosted.org/packages/76/4e/362d4f9fdcdf5556fb2aa3ce7d4a58ebce03ed1ff03aa1d9aca8d02f13f3/charset_normalizer-3.5.1-cp313-cp313-pyemscripten_2025_0_wasm32.whl": "sha256:9d9a0dc7cbe9bec24c3f767c9122c41fe5a1bc43f47cd099d00d393e09769de4", - "https://files.pythonhosted.org/packages/76/84/6f1290fa07ae6978d3960caa3eb1b8019bf9284ab7c2297b00c099ef4250/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:1d1c7a53a6c2103925cdd6d7229f8c567379f211c869793df679f2e9f738c369", - "https://files.pythonhosted.org/packages/79/71/6ee3a48a21e844e5079d8e9b2e91c641da5a7912a748e9e94c9e3ab9ce1c/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_s390x.whl": "sha256:13e3afe97712e8887cd516e960c63f0b93122971e5b5e4b2622fe7701771e838", - "https://files.pythonhosted.org/packages/7a/7c/4938c329b6a9d446f6a59aa2092ff7118f274209b5ed0e26893d1d30a63c/charset_normalizer-3.5.1-cp314-cp314-win_amd64.whl": "sha256:c658c50ac0c98cd755a2dd50b7977d3bca7df401dcc47fbdfa87db53ef7d4e8b", - "https://files.pythonhosted.org/packages/7a/c2/071575791dcc88316c0a9a65ce38897a82e4cfe4a325f0f7fe1b1ac47bcf/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:394fea06235c8543390050ed5f529187074b029fb027213f6c46ac11ab5d950e", - "https://files.pythonhosted.org/packages/7c/c1/49a91fe7e97c8140094ca5c64161ab623a70d9f636bf834eace14048acb5/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_armv7l.whl": "sha256:252d099029bcbea642f2a06c4ed5046bdf8b5a8150b64afa5e027e88b106e5ee", - "https://files.pythonhosted.org/packages/7d/07/469f78af590f7d5cd48e20d8dbfa3d66deeff9ba37768c04d886b5afd45c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:ced3fdd71aaa83ce593746c2edb42b7a59cb4c19c8b5c407781c72e493aae55a", - "https://files.pythonhosted.org/packages/7e/3f/ffb64458527c7668031d5eb095d978de561958dc9f5b53f8e488a533e603/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_s390x.whl": "sha256:6c9cdde8becb25a7fde49924511aa2644d6f8081cc8df8e9452724303348d8e3", - "https://files.pythonhosted.org/packages/7f/a6/e3b46852424246065355644f4fb6dbccc0239a42a2eee27ecfc8957f0bcd/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:2679de311c7946dde5d3b6f44941844133ff5c7cb86099c0061ab1e8901c20a8", - "https://files.pythonhosted.org/packages/80/c2/a7379b840292d0c1ab9fbd17d1f3967aa81794dc95bc74be8999d7fedcf7/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_x86_64.whl": "sha256:e199fb99720074809a7720f1c0b4d919eea8b87e88713e0f8f602f7bef543d9d", - "https://files.pythonhosted.org/packages/81/58/d325912115caec62d6bdd77bbab5e0b7da5d234a9f20affdffcbcb530d0b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_s390x.whl": "sha256:a5cbd90ecf0fc62e64726917ad083b73001f0563657a87ec3c0b504e277dc90d", - "https://files.pythonhosted.org/packages/82/38/083a24028304bc85bb9e376fed801178423dcbb67495f73b6ea0624e1894/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:b54e7e13267d49ffbfe68e25b3cbd774dab38fa37238f71265e91b36146eb21c", - "https://files.pythonhosted.org/packages/84/79/a88c181e7f4a7579696fedb34fa63844ede2ff7caf44c5f321cec57d92fb/charset_normalizer-3.5.1-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:e06efa066f7dbadbc84ebc126a97c452a6451dfcf589d89d788484949e1cf795", - "https://files.pythonhosted.org/packages/85/54/46000450ada53bd9eac5429a2c8c54cd2d9b39c0c255f229aea9af0948a5/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_ppc64le.whl": "sha256:bb57753e36e4855b8ca375069482250a6246372331a3e4f3407eaebb007443f5", - "https://files.pythonhosted.org/packages/86/2e/b93135b5034b1157fb29554b0d06d4844ce62282f0e0a14036f93d7ee2e7/charset_normalizer-3.5.1-cp310-cp310-win_arm64.whl": "sha256:a6d095662e73e74f0a49988e0593373e243e3a52e27bfeea0a859e88acf4a0f5", - "https://files.pythonhosted.org/packages/86/d3/e367787febe4e74769dec0f406f2c3c8d1b955fce5aee1fd0f94e8367a45/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:8fe532b3c966d1fb794e0698e4589d0444017ae77fc0b31edea13c0e35bcc449", - "https://files.pythonhosted.org/packages/87/bd/fbc24d825c66f1c74f6ccdea3742c3d8354a4888e86d1315a197fee69061/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_aarch64.whl": "sha256:950f23cb393f85543777b0433f082cddd25b51ab398eac7971146495679efe5f", - "https://files.pythonhosted.org/packages/88/be/55127bfca72c0cff6c022488d140d7c5b04c771e3b72e9bdb4836d54979d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:f6f7deae3feb4edfa2efaf7c574fe88cbf055038a6abdb40188e4fff66d5699f", - "https://files.pythonhosted.org/packages/8a/33/56d97ade41c8db611e727168c52ae46c9224c362ec28d4b65d7e9869e8da/charset_normalizer-3.5.1-cp313-cp313-win_amd64.whl": "sha256:aea996a6aba25260827c9ea511d1addfde2da9eb686ac961838509086188b7e6", - "https://files.pythonhosted.org/packages/8a/76/c681192bbda3d55356db5dadd64381d5202b37c6b598fcda5282e88b5d3d/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:ab743e9bc90c1f73552ec33e10e3331315acd2c397b36065b591b0181de533cc", - "https://files.pythonhosted.org/packages/8c/c2/027335f0aa337a2a2e121bac1ad88c4f02ba6053ea0926802784f3db11af/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:8ac8c94b6539074e0f40899301273ac8402b9b3e01c7b7ba269ff30340aaaf20", - "https://files.pythonhosted.org/packages/90/c6/b09e05e6db7f64338e0dc067c79577b1138da86c1e38369096851d96be88/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_x86_64.whl": "sha256:fd0350afdc3aabd5576f60ea109228bd5538139713c7b094c5cd27c73a98bc6f", - "https://files.pythonhosted.org/packages/95/b5/a18d0dd1157ab655cc2cb14a545f4a4784bbad70ab3502412e36097502d9/charset_normalizer-3.5.1-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:04368edf83514385ffc3e1cfd4546e595f4f1272dd23ba437a93a9cc3741d47b", - "https://files.pythonhosted.org/packages/96/10/e9aa7923d3ddac652c99a1c5f7be494e737e151566a44abe018daf757f2c/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:9dbdd9205662134957cf0c324f639bdc5031c0ca056e2369e238db75187c0f11", - "https://files.pythonhosted.org/packages/98/66/7c42677e739ba66746b297e2046918d793078094dc239e1e72768cffccc6/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_riscv64.whl": "sha256:9eea3ab2597a5e65fe65296e2d6a84570845a6b55532d90333d740d48bbc850a", - "https://files.pythonhosted.org/packages/9a/4c/be49ada26b1f0232d57aa89bbebf997a5cc2332a5616b6eca26ff680044d/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:4582c27e8c889d64811987b5967fbd3ae0c823fe1fd933b543d55ac20bb475fa", - "https://files.pythonhosted.org/packages/9d/7a/4c6c298171e6b3e745633180ff59350fc0ca0db1ffd28df1e369e0579f71/charset_normalizer-3.5.1-cp312-cp312-win_amd64.whl": "sha256:3617ac3cfd8b9888f145ad89dd6e692285834b0201c6074a5eeaad3fd4d668c2", - "https://files.pythonhosted.org/packages/9e/4a/a6ee107430768a5334e6d63f31f148a04a1a491ef161a1ac9415a73f2fa8/charset_normalizer-3.5.1-cp314-cp314-android_24_x86_64.whl": "sha256:26422d45fd13551cf564c58932f7d72b4f58b93b0fcf18c35ba6be12b46bb102", - "https://files.pythonhosted.org/packages/9f/2f/fe3f187327aac18e2d54e9d2b08e15d27bf9b642d9e51c219f130fc34d1a/charset_normalizer-3.5.1-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl": "sha256:a6dac12ff6b846103483683f60c5f8fee205121adc58ffd87e90a90a3af69e99", - "https://files.pythonhosted.org/packages/9f/cf/7568d8c1c9100b7c8bab9035215a6b36b32b39bb50cabaee9389c4606887/charset_normalizer-3.5.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:789b8982559ae28dad2356519f841655756cdcd96616410590ae0b17454ee64f", - "https://files.pythonhosted.org/packages/a0/2a/6a9034b7d3c60b17499afb482df5878bf9fa20b50cc3887d5ef017a833db/charset_normalizer-3.5.1-cp314-cp314-pyemscripten_2026_0_wasm32.whl": "sha256:f03ac127268b43ef4fe9e6ab6794a6794b49485a0cc0c1db79876d2f33f75bc7", - "https://files.pythonhosted.org/packages/a1/5d/9ed554480eda8e447b673648628fdc29574d23dbad01fe11837adedd1cae/charset_normalizer-3.5.1-cp315-cp315-win_arm64.whl": "sha256:5fc45d653ea8c9a20479167e11d4a0f8cb2fa3470737ab6f9c827532313187b7", - "https://files.pythonhosted.org/packages/a4/2d/64a13610fd28c80f97aff0ea5cf31cf255d220a8243ac0c78c66fd3d874d/charset_normalizer-3.5.1-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:5e2d0e146dcb57034f8b97dc58d2d512cb90aba253960ce449f695fec6a82c6f", - "https://files.pythonhosted.org/packages/a4/a0/562247944386f7d4ef94467e84876600cc1e0f1b93239aaa9213d2bc3cbd/charset_normalizer-3.5.1-cp313-cp313-macosx_10_13_universal2.whl": "sha256:e90251c0c7bdd54a100a0dce3c07b7e637278c93af29dbf78ebb89a58c4bac7d", - "https://files.pythonhosted.org/packages/a4/c8/ab42b07cfd82e919f427fcfaa7c41abae8242833ad1aad66d42bae40b669/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:0b2b1b3fa5670c127b246df1d0c059defd41f689a868a3b9d79df9b1cac42d22", - "https://files.pythonhosted.org/packages/a5/e9/e925ca7569cf9fb9701fd82503fee73eea5268fdb856bdd64947092d3daa/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_aarch64.whl": "sha256:c010f5581d9c612804cc59fcf7b524b707fbcb72828551237ab545bb5c7034af", - "https://files.pythonhosted.org/packages/a8/76/9aad3e9c8865e5e0efa9a7f6f81c37a67635a985145ecd44528a81e088ee/charset_normalizer-3.5.1-cp315-cp315t-win_arm64.whl": "sha256:fb78f6e7fcd8ad785d28cd577168bc1aaee827b25bb8755638f694794ea98f0a", - "https://files.pythonhosted.org/packages/ac/33/eeb384dbd8dec570661354592f4f2e1b2fcc92585624d146a000caf53841/charset_normalizer-3.5.1-cp314-cp314-win_arm64.whl": "sha256:4bea7f8ebe90bbd7f0e4a2de42ca6924ba23e3e76418c408ff82f1d46fabd687", - "https://files.pythonhosted.org/packages/ad/c3/525f508cd1e58d0450ac55ed40ac75bc3a97482c59def5278456a5fbf03c/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_aarch64.whl": "sha256:9b5db6052055d34d41230fb78d7c439c23dc536a9896f6cb039e8dd92cfc1263", - "https://files.pythonhosted.org/packages/ae/10/3d8c777cf9024615295aa1b808324ad5b4a77855869c00824bad74ffaf8a/charset_normalizer-3.5.1-cp314-cp314t-win32.whl": "sha256:58d3e12c88e0950bca850ae1f7c256055c097639c2edb9eb123af9807d8b15e4", - "https://files.pythonhosted.org/packages/af/3d/391b193eb9f3e84b02f9314088c386debdc0debee843535aaea2e2c6715d/charset_normalizer-3.5.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:5c84bec0ab5ae0c64bfe73a7d2adcb5ce73b467523fc27fd6a28ab2aa6cbe35a", - "https://files.pythonhosted.org/packages/af/af/53afe99068b3c10b4cbae592a52ef72a7c92c0188440e83ee3a078fd8f75/charset_normalizer-3.5.1-cp315-cp315-win32.whl": "sha256:706bfd38730a5ac7a365793269a00f4e988178cec121391f4248d84ad8c972e9", - "https://files.pythonhosted.org/packages/b1/ba/ef83ae3aca816393decfa3530976f38a79812d707b80b580ac33b83f9877/charset_normalizer-3.5.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:f9f8405c2c758532c74fed975dbee57be1f31a6e865c031870c79a6ed3212ada", - "https://files.pythonhosted.org/packages/b2/2c/45847198c16f4b38090cc7423b2b6a9008e438704d8ab413211832498d31/charset_normalizer-3.5.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:ba2f37ee79e6338845261a3c5b1784e5d1acdff2c0785b284f1b633033d136ab", - "https://files.pythonhosted.org/packages/b2/e0/489aa2a33b944077d4c2c705c245d833dc12cd571a52fc67eaf273f5373a/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_aarch64.whl": "sha256:55261ac0d2941c42f196dd576f543d87a8ee03cd6f5e30dfb4d807b2e3b9121a", - "https://files.pythonhosted.org/packages/b4/d4/703be739b26acce318bd29eb3b25b7209e1b1f527f9eae3d1f1f01fdde2b/charset_normalizer-3.5.1-cp313-cp313-win32.whl": "sha256:d63600d620ad0064c3a748b950ac5ea38a80190e5498532efefa4b7b3f1da1f3", - "https://files.pythonhosted.org/packages/b7/23/b38a20598d5a825f85d9d7636860e56ff0db1479f86497a6e485aa9326f7/charset_normalizer-3.5.1-cp310-cp310-win32.whl": "sha256:94fbf1c0c6cc0d3d5e50f9a9313a8cdca90dd696d34b381cd1704f8c9e939f20", - "https://files.pythonhosted.org/packages/b7/52/643d11ffd60e9ac2fd1fb87e167a19285b9eefeff4a40e63c87cbfbeab36/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_x86_64.whl": "sha256:ba501e667c17d8411f98e67a022d9604ef179aff0e459b7e292c796837c13573", - "https://files.pythonhosted.org/packages/b8/d7/34d8e404e358d2adcc5a228c2134643af00104c8fb0bf525f3688d756f05/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_riscv64.whl": "sha256:978eab16f55b4ab2c2a745be9a0a840bf8f09a7f227d9c76eb30214d078865a5", - "https://files.pythonhosted.org/packages/b9/2d/918d0e98a0e679469ed05bb2d90c2088b4d315bb612969d8499f76fb5210/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_armv7l.whl": "sha256:c1dcc36dcb96abc02236e182d17e0f71430152a6c2c7447421da2d2dc144edea", - "https://files.pythonhosted.org/packages/b9/90/082cc45599c392f28c036a497f49e0634041a785fc3849c80ccf396d096f/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_s390x.whl": "sha256:a545775cfe815855ea32d7c27731d79da358ef2055b4a25830231b1622dd18aa", - "https://files.pythonhosted.org/packages/ba/ed/1dd7cfebb4e75812934c49ca3b79757d11948053f7937ab7070c151f3c55/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_s390x.whl": "sha256:6e2912d4babbc65196ac13c2f53468dc57fb8b9c25ef913e8c59ddf7c6dc0e1b", - "https://files.pythonhosted.org/packages/bc/61/2cb6ad133dbbb449fa2d37ccae973232f4827e799af258d15e589a3d1e9e/charset_normalizer-3.5.1-cp313-cp313-android_24_arm64_v8a.whl": "sha256:4f298bdadb8f0b9e5672877f647d1be9373ef5320c9e2f049795e26cad28b6a9", - "https://files.pythonhosted.org/packages/bd/67/0f40eaf8d1b6e7cf15e82382a2965efaca787fc1c2794b7021d37aaf5036/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_ppc64le.whl": "sha256:5c0ea61a470e070686aa30892fed79e297d2c8d0ab46b8bcdf027d38c51da591", - "https://files.pythonhosted.org/packages/bf/eb/239c84503cc9e3ba6eb34686a24bc66e84f3924efdd7e38e751a19f6bc10/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_x86_64.whl": "sha256:3d27167433c0d5f18dc850f07d0b3816221984fecdc405d6c157a6f0b8f8e9e6", - "https://files.pythonhosted.org/packages/c0/24/ef36367d38b9ddd4bccbf72888c342e8de1f5ae506fa0b2dcf970e2732a1/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_aarch64.whl": "sha256:c71fb0d56c920c269cd3e2e3fe7c610e3f1fdb21a6ce60efa6430ff63676cea6", - "https://files.pythonhosted.org/packages/c0/8c/58efc6393e405a8d52b241d31dd9118352c247e4017110c3edfdb4618f0d/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_ppc64le.whl": "sha256:2e9cf9253119d8e5d111f05d71626786fd3d6193817316eab1ca088cdb8593cf", - "https://files.pythonhosted.org/packages/c1/ce/9962938e179cf9f699d3f1e7b3114b5d7642dee6a893745229f9dd04f274/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_armv7l.whl": "sha256:329fc3ccb63ad22d867d84c2adea759a64079a37ba4a343433b02c7a2816871e", - "https://files.pythonhosted.org/packages/c3/92/de7e32ed05341e7a9c4c877c318418197b7f2d66a3b68d561bf2ac57ca3e/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:4b599739b93b2cbeded49645ae3c8d1405c29ddfbceac1545c87a3f9580a9e96", - "https://files.pythonhosted.org/packages/c3/d9/35ae3f64f29d0179c35c3baefe575904df2913dde519129c7f75995a2b1d/charset_normalizer-3.5.1-cp314-cp314-ios_13_0_arm64_iphoneos.whl": "sha256:09a7bba9f739468c8e78c36a75c33768e53cb1959fc638f510454c14683f00d5", - "https://files.pythonhosted.org/packages/c4/25/d5f4198819e6059735a84e8d0bfb72dc33976da67b97adcd3fb5a5e07ec6/charset_normalizer-3.5.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:0c6dfb5ca6723eeed15aa8e564a014d69fcb8812f94eef11fe3631e0508199f5", - "https://files.pythonhosted.org/packages/c4/58/c9295c61e3f826ba7d874f0fd1c5e335dbec928d7b9146b33b48d14a25f1/charset_normalizer-3.5.1-cp39-cp39-win_arm64.whl": "sha256:29880d17a8eb0b5cfdfd8944b468322928059aa35f1f5fa8ff22b149ec0b42f8", - "https://files.pythonhosted.org/packages/c8/e3/d119f86a01f9331e8186175f24873b1d74a7ee9e2e4b4d68f9947dae5afd/charset_normalizer-3.5.1-cp315-cp315-musllinux_1_2_aarch64.whl": "sha256:21b82d8082f6f5e7f456ef0bd16323d08de1266efbfeb476e64b2a91d1471a4e", - "https://files.pythonhosted.org/packages/c9/bc/f46a132041b29e4a8779ed712d3df1bf112e94ca8de58b66d7ec2c0cf8b9/charset_normalizer-3.5.1-cp315-cp315-win_amd64.whl": "sha256:92caef967d287a407085d61176fce4012b1dd62daed4eb6d5ceb26d3d2538712", - "https://files.pythonhosted.org/packages/ca/7b/311b3e02e8c4092400c449c850a760d8c45d900983c83a70cc07208c551d/charset_normalizer-3.5.1-cp310-cp310-musllinux_1_2_riscv64.whl": "sha256:f5542f9b941279d82d41eb0aa9f98eba36fe4df5c7086c651df7944935b37182", - "https://files.pythonhosted.org/packages/ca/85/f82f8a92e31c7519410e2e1afdc630f28ec47490ce2c09a11c1a43cbb459/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_s390x.whl": "sha256:4abdc5f9ad448c1ecbfae2974b820535d6bc6e7eef63babbab3d81cf46968c71", - "https://files.pythonhosted.org/packages/cc/61/d01fc49b8dea277640b55a9e15960dbca9fdc8c9fde18e572d39c59f4019/charset_normalizer-3.5.1-py3-none-any.whl": "sha256:6df0ec430f9a831772c23ca5a224cba36517a58a84bb32c32bb59a9fa67c47f6", - "https://files.pythonhosted.org/packages/cc/a4/689bb42e8e7cd492f3cb64907c6bc00ad247ec9a3628cd3f8eed126e8ae1/charset_normalizer-3.5.1-cp314-cp314-musllinux_1_2_aarch64.whl": "sha256:01e93745f7f219b703b60ba7afead36cfc4242782be5af484673fc500df12da5", - "https://files.pythonhosted.org/packages/cd/d7/eb95a042f0dd22e304b0b6472b154f3546a1a039a9ee89ccb2a7f61591fc/charset_normalizer-3.5.1-cp312-cp312-win_arm64.whl": "sha256:88e85ab89cb822c1e635f51d6d32e488f94e002e70e2f492bdb8b945543f345a", - "https://files.pythonhosted.org/packages/ce/48/5a97e84d63af1d55c07439cb80e56d99a8efb4295700eb4e18c0d1615d2c/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:0d929fc574b4d6fd9e7c0f5c2ede8716a41911923aa7fa5fce38e0818aa4a1ac", - "https://files.pythonhosted.org/packages/d0/91/bc145e42f93d6601b9a26f5421af2d7c3093ae6e6d03b8e583c9cebbf530/charset_normalizer-3.5.1-cp39-cp39-macosx_10_9_universal2.whl": "sha256:85de3134b5379856e323ba37c19c9256d39425f7b76a63af52b09fb4664c2e8f", - "https://files.pythonhosted.org/packages/d1/91/249943372195935ff7393eae5842c7dae6fd04401e512bbd69dab1aae40b/charset_normalizer-3.5.1-cp39-cp39-win32.whl": "sha256:56490c595a28b1bb27dfc583e816152a9767721ef58b2c03b13f954d2f707420", - "https://files.pythonhosted.org/packages/d2/21/83fffb77864408b8bf0fe1ca603926401d6f8775a8e150b39aacc9958f8a/charset_normalizer-3.5.1-cp310-cp310-win_amd64.whl": "sha256:be47f99644b208bff7766314013f9acf57b056b04191d570d68ad14022cf5b1d", - "https://files.pythonhosted.org/packages/d3/05/71bfc5caa0abcc45aea1f6a4d50ac68e59605ddc7666fe8494f4cd229665/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:ae4a097991662cd4fff0ddc74e0fe7874f82e00042fa0ea00855645ed0c79598", - "https://files.pythonhosted.org/packages/d3/58/56a48c296601274c4689b864a8e2dfb209b81dfcb39472753ce95eea662b/charset_normalizer-3.5.1-cp315-cp315t-musllinux_1_2_ppc64le.whl": "sha256:6199d5606e2bbf2b096cf64d03f8b6790c91081d5ac866b8e7bb6422738cc60c", - "https://files.pythonhosted.org/packages/d3/bc/f528dfb78d3bfdc8ee6aeea81eb22e6918d03e4442d373a79717f17de45e/charset_normalizer-3.5.1-cp39-cp39-musllinux_1_2_armv7l.whl": "sha256:5ca0555312ae2fe82715cada7fac375530c2f3349e1eaa1bcb33d0283ac79a18", - "https://files.pythonhosted.org/packages/d5/fa/6a7e2a7c4b5451912b8c417732df79574354443592a88d616de03da66ae5/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:aa2bb0b37202dca27175591f761108b5d34096ade1191ffe4808bdf6b1571488", - "https://files.pythonhosted.org/packages/d6/aa/a69a2028e8bd052476c245460ab19d7de595de084dd968f2d75cd50c3e25/charset_normalizer-3.5.1-cp37-abi3-musllinux_1_2_riscv64.whl": "sha256:2f293479cce755c75f1697e87c409b7ae4c555c7dfecb6e988ad13abba943031", - "https://files.pythonhosted.org/packages/d7/c7/9e48cee5c161fe24da823b61bf381921d77cb994a0a4de148e95018c1984/charset_normalizer-3.5.1-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:cee5dd7c6fb5dd52a0fe2a740f9bc6e3593f5f8b1788bde49de02086f30182b2", - "https://files.pythonhosted.org/packages/db/ab/55e683ba0fff2e43adafc10daa3001eac90fdaa419a97227d5a7067eedde/charset_normalizer-3.5.1-cp313-cp313-musllinux_1_2_armv7l.whl": "sha256:485a0d363cafefcd2538a73c7c838daa2035f09b2c9f9b5e3133f80c6aeb84c2", - "https://files.pythonhosted.org/packages/de/93/d51ec556e01042fed6f993ea859311bc7917b466684182fbbceb6ca24762/charset_normalizer-3.5.1-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl": "sha256:977cdbd483a9cff38179bea4fd754289a6f2195c7abd414aba85410b3e66cc5e", - "https://files.pythonhosted.org/packages/de/d8/a50b79237f417af10f8c2a501ce8d1ca87829a22e69117891ca4ba20a69e/charset_normalizer-3.5.1-cp314-cp314t-musllinux_1_2_s390x.whl": "sha256:496846868fea80e479324862fa877f02411f2fd0f83b79ccee2607aa68b2a032", - "https://files.pythonhosted.org/packages/e0/91/39c3af510b0aa32bbda03374259200f28430febfd1bf5e511fe765282ce5/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:15f024313246a4ed976c60f440bb8d257815513a681d212ff74fd46f7d715a90", - "https://files.pythonhosted.org/packages/e3/57/32f0ccea59e8612057c61d6fd22ef2cb63cca93c9fe594094919696ac170/charset_normalizer-3.5.1-cp311-cp311-win_amd64.whl": "sha256:f9b1e28d0e8dbfa858abdba91d6b547beaf2df1a59bec6da6faae7b96a4991a9", - "https://files.pythonhosted.org/packages/e5/3f/143b048436775b0f76ac3eec145c019e8173ccc2885c8f20319b996d5e83/charset_normalizer-3.5.1.tar.gz": "sha256:6117b84ea48435e5356dc737f5121485c30920ba43375fa7b434fd753df0eac3", - "https://files.pythonhosted.org/packages/e7/80/b9348b5d3041209f98b4cdad7655766369233f1d533f4f4f7558e9717bec/charset_normalizer-3.5.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:6e5e4d73d588ca5ed09df1b7dcd1b203d1df3c542e3f50d126c947d432b10731", - "https://files.pythonhosted.org/packages/e7/a0/47b18adeed31c8f16ba9700f32c1b18594cfa09f47eb672a488c273c22bf/charset_normalizer-3.5.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:e6621fb2a4988d6e53eedc455e5903e2679f3967b8acb3d639f1b63c14a2e893", - "https://files.pythonhosted.org/packages/e9/40/095ce62fa078483cccc1fa2b36e6bc9580b85422a20ee9f925341c50e44f/charset_normalizer-3.5.1-cp314-cp314-macosx_10_15_universal2.whl": "sha256:c428c6c31eb5f4277d7f8eccaf767fbd548ddd5ce3c8b4f4cbbfab3d96b5904c", - "https://files.pythonhosted.org/packages/e9/a3/887c1642f0da26000b0e0652d91071113c0e72cea33952e225cf589f49a9/charset_normalizer-3.5.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:a3a370082ce34d0612f421e15fe011c53bb1feff21a26d06ad4fb244dab5a375", - "https://files.pythonhosted.org/packages/f0/3e/48f4cd187b1c33189d86039e9cbe4f92c05454175504b44ff81806d4d1bf/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_armv7l.whl": "sha256:aa1099b956fb795e686d073568f6dc002a0bb89765ea6d5b055dd7d9bf1b116c", - "https://files.pythonhosted.org/packages/f0/a7/920baf467bfd9bf689f3b318340f37aee4572a71f162bd8db51da55ba4fa/charset_normalizer-3.5.1-cp37-abi3-win_arm64.whl": "sha256:87e4f41d375c0b9be2fb5251aee4b8a689169e134535aed81bf085c3b647451e", - "https://files.pythonhosted.org/packages/f1/5a/0e58b1c04a1596e0256f407274a92d5fb2ee21324409d1fab1da48a65b5b/charset_normalizer-3.5.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:2f06b7eae9dbe77fe1d644ca244dad508de8d302870a43f3c559b521270938a0", - "https://files.pythonhosted.org/packages/f3/46/1d362e1a00d035d66b9869e1281eee115907f7e390a16a07824ab5737360/charset_normalizer-3.5.1-cp314-cp314-win32.whl": "sha256:1f5883d77fd409a261abb5dc8ccbe335720d798b1de4abb3b1d47ccbbc76b53b", - "https://files.pythonhosted.org/packages/f5/28/c2028e7021fb89c6e56868ed0e387b8e9aa811abdd2ab3208d6578d2c930/charset_normalizer-3.5.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:6ba32c4d2abf1d2fe7cf27d280f4cca5664233b0f885549c7761719eb977f486", - "https://files.pythonhosted.org/packages/f5/7b/ade0a122600319dfa0b1000ab0f9731c94a817904cf3c5de408c73a4ede7/charset_normalizer-3.5.1-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:b39b69b347e5e47a3b5b8cfc005c68c1ba347474e3960236c4944a8ecd174962", - "https://files.pythonhosted.org/packages/f5/e3/38b975422534a608f98c360e79c2f07c763d66dd4272300d45fb1fee54b0/charset_normalizer-3.5.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:366ec70f5547c640d3ce1985722490f23faf4eb5216a7eeba78277490e78dacb", - "https://files.pythonhosted.org/packages/f6/0b/c5292a2462d69b7378ea89793bbb5b2b6fcf6f7dd6d1667f9619094ad553/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_aarch64.whl": "sha256:96fef3e886d6a9874b14f27fc193fbdc69d5d8035783d86aa4e1cea594e695f9", - "https://files.pythonhosted.org/packages/f9/d2/d2aad6fe0dbb44b194bf3becb60f5a0ac48446ade999a47fe7bb41eb09a7/charset_normalizer-3.5.1-cp312-cp312-musllinux_1_2_ppc64le.whl": "sha256:aae2ee51122d3ae968a3837d97dc24a0aeebb0dea23694422cd172bd30017cd6", - "https://files.pythonhosted.org/packages/fa/ec/3a616c3806ec3f957337e6bf874ae7d64693185039edfbbf87103b8c8631/charset_normalizer-3.5.1-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:a951ad59cad9145664a730d3036b40b844e74d2d3683da40111463cd3a83845d", - "https://files.pythonhosted.org/packages/fb/af/63240b0c0248c075c2535a1f1bd992821d8251b9f173abc13329661d09e4/charset_normalizer-3.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:62b55f6722735a6c472f88361cde6640608773d9443cebdbb51abf436a1fcdd3", - "https://files.pythonhosted.org/packages/fd/4c/9044135f42127630b6fa742feb51256353f6ab87a78f2fdd1de3de955a7f/charset_normalizer-3.5.1-cp311-cp311-musllinux_1_2_riscv64.whl": "sha256:f298e218441525d3794428b4c8b8fb8662c6d3ea79925d4807ee6b9a96a3bca5", - "https://files.pythonhosted.org/packages/ff/c1/2adc2800903fb013210349313b710a5376856578d9e33e6b9a1d8b36714a/charset_normalizer-3.5.1-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:cc5d36d96478aa9c60654bd932525bf32964c62a7281eafdf16d85003a8d6004" + "https://files.pythonhosted.org/packages/03/cf/4c66866fa9e2b1c78e3c911516d1de497a677b7ac60f1eceda74ce777ca3/charset_normalizer-3.5.2-cp37-abi3-win_arm64.whl": "sha256:40ab6bffa02ae10a0581e6c198be7d2d8ca5c2a0c64e4ed3465d766df457573e", + "https://files.pythonhosted.org/packages/04/3a/c00b50e94c964cf934c7899cd47c97952fc11dad71cc5884b3c61795b09b/charset_normalizer-3.5.2-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:65cd72beeeca9d3aaea1201e5923859f308f952f9c71de93f06063c79f0f7a3b", + "https://files.pythonhosted.org/packages/04/f3/859f74e7babc977705026b30593b3be04049632a522fb7000f83c033d747/charset_normalizer-3.5.2-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:0c951d5e6dd9c2ff60609476752bee49da4206adde960ebc247766937f72e718", + "https://files.pythonhosted.org/packages/05/22/6adc5456b690c7ec9316df39a7fe741c6d81ec91b9f9f8a798211e642784/charset_normalizer-3.5.2-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:fc14a032f813bf5fe624d991960ea83e9715adc27e4c1830a2361eb1d02ac341", + "https://files.pythonhosted.org/packages/09/54/ab9e89367076f6331bb6c65c4bf14a5361fa5191cb6561bf534f18504e1b/charset_normalizer-3.5.2-cp37-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:838dcc90063569a0448120554591a1d6c4a4ffe11babf048908793154ab86ade", + "https://files.pythonhosted.org/packages/09/e1/a3b06a10461b1b7628853c934c644e03bc28e42767116afb52f19a56519b/charset_normalizer-3.5.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:6bd128f206a7752ae1f2ab6c61bf8a24ba28913a10df8b14c2637b973ff97a80", + "https://files.pythonhosted.org/packages/0b/0d/363f78cacb70f58f15f4b083961bbd9d292f335d3f5c66fc4f1cfe69cb90/charset_normalizer-3.5.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:4495c5002a7b28557e7e222e77e0b661183e432b7d6d2e788101e3f240e05b8c", + "https://files.pythonhosted.org/packages/0b/f6/c57b072e0f764c29bc2bda17baaa01ea1a8d36874d9efbc0cfa2efb1b0e1/charset_normalizer-3.5.2-cp39-cp39-macosx_10_9_universal2.whl": "sha256:75a3ceed0724d625d64b86ca20aba182e4df462e04c2414fc941c0f523f06aac", + "https://files.pythonhosted.org/packages/12/c8/8379554b42e8368161d898476686947a0fdbd3e8865170d7909dcabfdee8/charset_normalizer-3.5.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:f0aa869112ef88429ae17820d99c3dd9504c9e9c671d3c246f3d7442cb051084", + "https://files.pythonhosted.org/packages/15/d8/f0a93a431d170e7ca681d4f6650fee3de934d18560e474e7267eb4b0f987/charset_normalizer-3.5.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:ef4fcbf3327382cd4c9f540babd61248208af7b93eec4de397b4d5f58a09e288", + "https://files.pythonhosted.org/packages/18/24/bad3ac4271589df29cf5ce2f5ae490518a5739358052bd0d61209e6fea54/charset_normalizer-3.5.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:34276fd796040bf0993ab33a369aa572e6979c7aab225a88893667ad8eac8f7a", + "https://files.pythonhosted.org/packages/19/aa/9955c7e93bba10a9c7e8f7a5031b7ced66f3a1883a55c00712b8d5850ff3/charset_normalizer-3.5.2-cp314-cp314t-musllinux_1_2_riscv64.whl": "sha256:31f3930700408d211f13378ccbe1c40845d8da54bd0681fac3a9b5aae81c7aa8", + "https://files.pythonhosted.org/packages/22/67/6a0b94a7960d5e1b5eacd2fb529f3fccc47db4644f7f0a7cfdcfc3be578a/charset_normalizer-3.5.2-cp311-cp311-macosx_10_9_universal2.whl": "sha256:3d21b8b13c7592db2ac5e544a6d83187b995257472b0c9e8351b6d507ae37ed6", + "https://files.pythonhosted.org/packages/23/b5/4459e08d45a679f903d50fea08bc52cfa728cca4d7bd02c757b5e5abda2e/charset_normalizer-3.5.2-cp315-cp315-win32.whl": "sha256:281cb91036248400f4cc957495cccd44c275c2e0c5854f7e45ac5cf7dc193847", + "https://files.pythonhosted.org/packages/24/0e/bb5dace3cc7e79068425386a6589c19b5a2ab5fefc2a46abea6919683332/charset_normalizer-3.5.2-cp314-cp314-musllinux_1_2_ppc64le.whl": "sha256:52aa6992700996af31f375de0c6bacd402b0097fe40b53c426b9f51a90ebabc7", + "https://files.pythonhosted.org/packages/26/19/1c1c9f75974adf523b87f34b8a2adc5a435cd65916812bcbd0dfa45f9a29/charset_normalizer-3.5.2-cp313-cp313-musllinux_1_2_riscv64.whl": "sha256:56bc200a365efb37383b7852e4cc5898d3b2da5987289b543956cf8cad71018a", + "https://files.pythonhosted.org/packages/26/79/e697f77464748a3ee3cf490c83d592459400d4898380d66c38366b03080c/charset_normalizer-3.5.2-cp315-cp315-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:498dc3188ca05a68231ac3fdbfc7f57eb67e1343c30e0fea17f8218c1599b253", + "https://files.pythonhosted.org/packages/26/9f/69e13ca3b18f43e0eafcd34c04a45b732ae22a43b54a5fc9e119103356eb/charset_normalizer-3.5.2-cp314-cp314t-musllinux_1_2_aarch64.whl": "sha256:fe9753dfee015c570d73df76f899f18444d41388bffcde097deba51c4fadbb9f", + "https://files.pythonhosted.org/packages/26/cd/6d52d3c7437cdcf2e310ce9f28f282e733d4ef60ed19105d1819c356255f/charset_normalizer-3.5.2-cp314-cp314-musllinux_1_2_x86_64.whl": "sha256:ddc7dacc8ece3a182e7f15cb862d1fd616b46d076cb1ae9dd232b2c38b655874", + "https://files.pythonhosted.org/packages/2b/9e/46f2fa4c431fc98c4ae76a8cb5bdca54e0341e3cfc3fcfd8e82740250818/charset_normalizer-3.5.2-cp37-abi3-musllinux_1_2_aarch64.whl": "sha256:1db38f4c5496827c1a501846d64d14c3b80c7e6714e406cd7dc36a9899fa1011", + "https://files.pythonhosted.org/packages/2d/8b/803b4d2a3f6e1740f63f1e87b04d14b42f3d4fdfe6ed7d4db2d34102b14f/charset_normalizer-3.5.2-cp312-cp312-musllinux_1_2_riscv64.whl": "sha256:d6734d2ef8a50fbf8445c139477da401f50d62a0606bf00e20ec6d87773fefb1", + "https://files.pythonhosted.org/packages/31/68/fdec18a343f5fb3f310588dd478b09ac4799e0b187dbade3a8cd776f03ef/charset_normalizer-3.5.2-cp37-abi3-win32.whl": "sha256:01b0c0d2262a9e28e8484a278c7e1b5d650e3ac8cf2683d2967e25899f208bdf", + "https://files.pythonhosted.org/packages/33/1c/f41d4e74c28ab327ff3acd36053f7ea506c55872d7a90b0fa71aa3ab0c89/charset_normalizer-3.5.2.tar.gz": "sha256:39de2a259fc954455c57274dc94c79d5842774e1247a016aff30bc0efed0f4ef", + "https://files.pythonhosted.org/packages/33/4f/aeadccd6d20882909eb2597ec40eccc05d505e2262f14dc76d7620700657/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_ppc64le.whl": "sha256:44bd4fbb29dfbeba60e7d2bd000c59e4b21ddb3cc53912b14048d37092706d7c", + "https://files.pythonhosted.org/packages/35/7e/578c702301ec036f01455f30744a08d2b42f6ab35b9b2d4bf8cae0ef2a80/charset_normalizer-3.5.2-cp311-cp311-win32.whl": "sha256:2625388c6c754520c37abaf3b41eb34d1cc4a373f457898f08606c8e362b891d", + "https://files.pythonhosted.org/packages/36/40/e270b74e0d3f583d78d902960845a149e80eb7c737ee5613ccc6efc7264b/charset_normalizer-3.5.2-cp310-cp310-win_arm64.whl": "sha256:c6708715abcf3c73b99508253e961a9967f02fe536532834149574eda6de0d1c", + "https://files.pythonhosted.org/packages/36/8c/71aafad23f971afc84c2b295bc0c560739ce1dac558aad9fec22e39f3639/charset_normalizer-3.5.2-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl": "sha256:d376bbd28b3a8999db1a103b3b388aee6f1ddeb3e51bc2172993efdcd86e064d", + "https://files.pythonhosted.org/packages/38/7a/81f1186c57e406233969ae96b5fd0c907254ab8b6e47da8ae24cd20fb9d7/charset_normalizer-3.5.2-cp310-cp310-win32.whl": "sha256:f5833ad231be5eb6553de524a70f48d71b2c8563101750531e0b80184e175cd4", + "https://files.pythonhosted.org/packages/3e/60/c647c6ae47480221e875ea5d743ff94946f7416e3c69415ab772928e8d32/charset_normalizer-3.5.2-cp313-cp313-win_arm64.whl": "sha256:11912e4bb14baae7c5d8791aa55ba0a3a03ec6729073307b0f57270abaa713d3", + "https://files.pythonhosted.org/packages/3e/b4/46b48f013dadfc0d0d33b375438e31bdf5a989dc68389c6bf627054d4df9/charset_normalizer-3.5.2-cp314-cp314t-win_arm64.whl": "sha256:d1befeed746d247c81127bb14de9dc3d30edb6e5976d34f83f86ed262b1d9105", + "https://files.pythonhosted.org/packages/3f/98/9d5f6ebc3aee9fef5d30b4aff11fb2ab7a1222b4064f8ef2c7c87cde217a/charset_normalizer-3.5.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:2e06a3a98f916dd41d27f3105e02e7a40181c98c94b9158733d03a6f80506c09", + "https://files.pythonhosted.org/packages/43/6f/c4fbae58febff71709c51bc7e18fdfa55341dc382704740f9f0cbf03817b/charset_normalizer-3.5.2-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:d19fbd981a488e22cd04883659ca6b08f50b5974f9fd7c95655ef6a043e5893f", + "https://files.pythonhosted.org/packages/49/1c/25d8415ec1c4f2f41f1680435e4c87cfb378ff2f677d950946f2a45d0632/charset_normalizer-3.5.2-cp314-cp314t-win_amd64.whl": "sha256:7fdde2c9fd9e3eca40631e024664cf2584272cc8f96308cbe5fdfc930f51d8bc", + "https://files.pythonhosted.org/packages/4a/24/2ecb4bde104322cd7859d6594fcfa74649f8d90b3221c9feecbef149875b/charset_normalizer-3.5.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:7dcd882da75ef9adf94903b1e3b9419e8aa8fb4c7396822b834b9ef7fb96954f", + "https://files.pythonhosted.org/packages/4a/41/e05e19578b7b87e7db2c3ecb884bd09d065274ab41e1f535542e8bae9b06/charset_normalizer-3.5.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:619799369eeef6366ed3e8755a5670f4f2f0fb6b30a0fd7264dc0fdc2357058e", + "https://files.pythonhosted.org/packages/4a/eb/2ddb1035d17320caa9f41682935123a9a250277b261c3efc86b2d2a21343/charset_normalizer-3.5.2-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:c0afc6800ba57ccc350374c5bd6150419915d95ce93cdbab2d783d75eaf30ecb", + "https://files.pythonhosted.org/packages/4b/85/41d27f234b82e47c167a5f6c0f62501dc0c640585ff4aba79e08a390336a/charset_normalizer-3.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:7218e8f32b0956cfcd048fd42d9d5779809745ca1d86113ca56f66e7ae1549c4", + "https://files.pythonhosted.org/packages/4d/2c/147169a041b747759f37405c0a97157e8e92de967968373101ff14915cba/charset_normalizer-3.5.2-cp315-cp315t-musllinux_1_2_ppc64le.whl": "sha256:1b4cbc7c3491ccb4aa17fcd8165649d01cf39f76de1696da8631b5f71b85401d", + "https://files.pythonhosted.org/packages/4d/34/38f3154785ce92e9f56eb226f4d35bdfae6b008480dd055f58837a89c810/charset_normalizer-3.5.2-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:a89012d6d5476ee112d20d998570ed58df2260a852afb1758809cd6900411d21", + "https://files.pythonhosted.org/packages/4e/88/7561d8a88d555e7df6623abe7c0070b4baf47549b9408783a2ae0a1a6cf7/charset_normalizer-3.5.2-cp311-cp311-musllinux_1_2_x86_64.whl": "sha256:114e4d0c92d618409ed82a99e22b5c5e768fe995f2973f78265f4524f49d4640", + "https://files.pythonhosted.org/packages/4f/de/6435e18d1aaa5d910b896d551411c96af1f42a0c56c29afc2016c61ccc2e/charset_normalizer-3.5.2-cp313-cp313-win32.whl": "sha256:2b7b3bbfb4fe8ef40600792d762fbaa9057559f9d3fad209525b7a22b99e91fd", + "https://files.pythonhosted.org/packages/50/27/d102dc880bbcffd0479ab64dfc1fb96777a854355a55e2bda72a71efadcb/charset_normalizer-3.5.2-cp315-cp315t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:b7fd005a73d9e657273b7a10dc71a9e03c8fb9ee6999798d6918ce095b81ac7f", + "https://files.pythonhosted.org/packages/52/4b/26dba4f3354ce6328c8cb13628b17202305f2172a352a32e10d677edb130/charset_normalizer-3.5.2-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:8b2bfab86aa71ae13aa41a6a26aab338e0db2b8bc75434b05aea89e011ff35a4", + "https://files.pythonhosted.org/packages/52/fc/e518013affcc43c9f919c3ba41bffe9b4ee4aceb0a6462a6243efcca5f2d/charset_normalizer-3.5.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:9373ad13ef0d2c0fb761e04e55bfdee5a08b52cef2c882c8fbe9935b1517152e", + "https://files.pythonhosted.org/packages/53/94/a3a7698e9b1a395e1eb99ccd9a324be9347973bff4e72db2a06496d7cd27/charset_normalizer-3.5.2-cp314-cp314-win_arm64.whl": "sha256:80d02b6f04e92601a081dd97b23d3128033098bff5d35d392ddcc0476ea11253", + "https://files.pythonhosted.org/packages/54/e2/77a8b09d5adc013ed07b95b01b8b8fa5441c4e810e83ee7e4aae2fa4d91a/charset_normalizer-3.5.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:ee21e28f0430bd6dc9086c6e525d5e818a44a5ad19720c8a0ef766792f3eb5e5", + "https://files.pythonhosted.org/packages/55/e2/06bad57dfdb49cad92c0ba85b6b4fa5827a67df37897287cfef0553843c2/charset_normalizer-3.5.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:28a15fdad492a99b6eccfaaed66ef3f74050680545ea61ec8b2f4c538f1f1320", + "https://files.pythonhosted.org/packages/56/5b/4970a2d154df502e133402906dd04e3ae7cada7b3011283c88d0479a2585/charset_normalizer-3.5.2-cp314-cp314-musllinux_1_2_aarch64.whl": "sha256:eff0ac9dbe711a4aee69bf04a83896aa9b85f19641264053a9f6d48573abb7dd", + "https://files.pythonhosted.org/packages/58/9d/e7b88e7b1bf403590c3b573277b5e1e488c68c7a6fbacca310a2c324e90c/charset_normalizer-3.5.2-cp312-cp312-win32.whl": "sha256:db19d07e2e0129e974a0e65d0064fc222a446cd5122c2fd4184d2af9fc734a9e", + "https://files.pythonhosted.org/packages/58/ca/5d1a997587febe5b26d8daffe363b5c1a091cece19828eec6502fd09c5ef/charset_normalizer-3.5.2-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:a19a731138fc27d5682277d3b9df22855cea1239bce7fcec5f78f42ef2d1f3c3", + "https://files.pythonhosted.org/packages/58/ca/7aa91362a2f77ac8e9e28a9b902a74f7d0e11a851ef0d27a74308da8cd90/charset_normalizer-3.5.2-cp314-cp314-android_24_arm64_v8a.whl": "sha256:1afb975bd5d68d5ce9f6b6d44fdf2f7e34b895a35e95708a7a91b20a3b51d187", + "https://files.pythonhosted.org/packages/59/72/263491ec1494a194b16fcbff88a0220f2af633738c79e92b4d7189226322/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_x86_64.whl": "sha256:b736353c0a625bbd5fcec108576e2385db3496f4f771f785ff32e108d3c3bc45", + "https://files.pythonhosted.org/packages/5d/3b/7bd36236e57d4266ffad810c62b40a08001622d95195e575d60e78201f69/charset_normalizer-3.5.2-cp39-cp39-musllinux_1_2_ppc64le.whl": "sha256:588461c2e8384d309bd63e5826019b6977bc66d629b99ac8737bb795d7b2cb5a", + "https://files.pythonhosted.org/packages/60/9f/a5d1c91c0263745e2cd344c5a4415d787c575501ab1d449f1148ac6b495d/charset_normalizer-3.5.2-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:9409a8bf35cf78353942504b24a57de3d75b708997a1e4bd8db71ac8633ce364", + "https://files.pythonhosted.org/packages/61/71/458c3f42164a07d0c5210798e9e704b39e540a6793b05aba67f3a35243a9/charset_normalizer-3.5.2-cp37-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:0fed1d06615f022ee3b13caf5e8b180cfea32bb2c5aded8a9d44277afc040f93", + "https://files.pythonhosted.org/packages/66/85/3b5358f60a13210f0b67d3755c168ef758701b021e655d88d4da28554467/charset_normalizer-3.5.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:c9790464842f85f437dbbb54417eda1e0e6bfc52dd8d22d6fd1c994b73b2dc74", + "https://files.pythonhosted.org/packages/66/89/dfa6dcb08c200b7830ab56439e8c1890f2971d51aafbb3937894a2e7fcfc/charset_normalizer-3.5.2-cp315-cp315t-win_arm64.whl": "sha256:749e97e1b32313717a565abbe321bc2190bc8b35f1a67e4cdbc7c56c8d8ffe58", + "https://files.pythonhosted.org/packages/6e/31/b1e0a89e6cd464adbb8ebc674635834746bb8fa22631a243676121fbaf60/charset_normalizer-3.5.2-cp39-cp39-musllinux_1_2_armv7l.whl": "sha256:3ddacd27458c45bdacd6bd6db644bfb730efbf9e830310186e3045c9c5be8fb2", + "https://files.pythonhosted.org/packages/6f/9f/bab04a5bcecc5c3fda3130b80131608e3f801de97753b2f1348b7c4ebdf7/charset_normalizer-3.5.2-cp39-cp39-musllinux_1_2_aarch64.whl": "sha256:d913de495d90407cd859d263bee2e5d1a4ed3eb6573c04e70d9ec619a7cbed7f", + "https://files.pythonhosted.org/packages/71/71/fb379e399b1013962716a059d551e03bd80b3e02f05d81246886af6c0958/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_armv7l.whl": "sha256:62588a277bfb59def052abd940703fa35107152bf479781a878617d60faf8fb5", + "https://files.pythonhosted.org/packages/71/7a/ff467301deef2089fad87f72df9e000a26a78fec7acbb18e1999371b8369/charset_normalizer-3.5.2-cp311-cp311-musllinux_1_2_ppc64le.whl": "sha256:59f63901b0031c3136cf64704dcb21de0bbae62ce2c9529bc39d27665463de37", + "https://files.pythonhosted.org/packages/73/a9/ace29806a0dae18939919c76ba526472d83214afa101105fabff2cf30625/charset_normalizer-3.5.2-cp314-cp314t-musllinux_1_2_armv7l.whl": "sha256:92888bb3187c5ba50500b00b3b310c9f2c651709d28036077680cb5255450a03", + "https://files.pythonhosted.org/packages/74/75/77c1c479b09ecd751d1e767b251ea5c14d4d50ff757bf404afab2692f600/charset_normalizer-3.5.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:4685902cf26edf013ed7a3da0f426ebba7a00ebb9541386d835afbf002c11cab", + "https://files.pythonhosted.org/packages/76/a5/cac540ab0fd61f3fec88ad3dbb64509e71424593d73cfdfff5ab3e4db279/charset_normalizer-3.5.2-cp311-cp311-musllinux_1_2_armv7l.whl": "sha256:fb9e68df06293761f9fe66ade60a9bc6d0f5e42b8acf2939a9158af86ab0e5bd", + "https://files.pythonhosted.org/packages/78/6e/60ce52a85a7fd631ae8482ae6d74521014ca2f255892679484dc04d7ef56/charset_normalizer-3.5.2-cp313-cp313-ios_13_0_arm64_iphoneos.whl": "sha256:d2374b62878abb00cd8309b32af6c0b715cd02dec0ca74ef12e5069bdc64144a", + "https://files.pythonhosted.org/packages/79/ba/57adc269824e8658f1a0f97a9e514c247445a9632b3419b97e0ba37f16dc/charset_normalizer-3.5.2-cp313-cp313-musllinux_1_2_x86_64.whl": "sha256:e243bd13217235fc7290c621941c3f5cc8b66e4872495be821d7436ba2fb838d", + "https://files.pythonhosted.org/packages/7a/44/a9ddc117221405ab41ba66653013f0e78e5c2cb9a5b22060ca1e7dccb1ea/charset_normalizer-3.5.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:0891b9d3903c5571c03771ca669a4b0ec5618ca722a5c957d3d29cd4e5062848", + "https://files.pythonhosted.org/packages/7c/8a/40db9aa9f5907bb0e6f8b6d64064bf8852fb33d4b813ff9414911df7647c/charset_normalizer-3.5.2-cp314-cp314-macosx_10_15_universal2.whl": "sha256:fcff63213e8e6e47770541a4607175404f47cbb3ebea7b6058cc82d524a0e424", + "https://files.pythonhosted.org/packages/7c/c1/061431ecc688d9d76602502cb57cc01e691e682c18f1beb45f9673b5bbd2/charset_normalizer-3.5.2-cp37-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:2ce45c6627b22c47e390bc91a41c3d13032192e699fa0bea96e9671b373d69b0", + "https://files.pythonhosted.org/packages/7d/dc/65a801b66ab4c197e22c433ab25e7ac24324ac6f45a2269aca42cce309bf/charset_normalizer-3.5.2-cp312-cp312-musllinux_1_2_armv7l.whl": "sha256:f7d486c83842422badd511868fd8a9a20e9407ace71564b6af47ce7e60a336c1", + "https://files.pythonhosted.org/packages/7e/24/76d2cefc25472531e4c5c7dfff68865eb1c39b78482f0fdc15b46f047830/charset_normalizer-3.5.2-cp312-cp312-musllinux_1_2_aarch64.whl": "sha256:ae4f5fea5b8b8ccff88238cc8569303e5ee95efae67fa62922a311397a71f346", + "https://files.pythonhosted.org/packages/7e/3e/53e12f2d5fda61dec0265e57b6abc17468381bfb77d78ad4b11cd1f5c45c/charset_normalizer-3.5.2-cp39-cp39-musllinux_1_2_s390x.whl": "sha256:d4a7319f304a774bed22115bc891618e45f85065ab44ea6acd07d274e750519a", + "https://files.pythonhosted.org/packages/7e/84/371eac6b30bdbcbf2d632a1a01809103459216fcaae61b8b8d922c1bfb8a/charset_normalizer-3.5.2-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl": "sha256:1c50fe28bbc2ced33386f298650d91218076c05420e6cbd790b913adc41659e7", + "https://files.pythonhosted.org/packages/7f/72/9c5e7707b57c8ddfa9ddf7b0b1d009d7fbab9e9e887d5b721060f37e307d/charset_normalizer-3.5.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:8d86d6fc60743dc916eb79e2eb1ec4818e21e427731543af40a3021851174a13", + "https://files.pythonhosted.org/packages/7f/c5/38806a25ab5e65fc178f39affeda20858efafede2fce1ffc2556cfc9fe73/charset_normalizer-3.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:3d31298449090ab8d47b7b1b2a555ff73cac7ed438a08b7ac160980c7ebed649", + "https://files.pythonhosted.org/packages/81/35/b761eb6d8c1eb218b9b42b9b4d5ac902afdc399fb6dac6f9a9aac7bda589/charset_normalizer-3.5.2-cp315-cp315t-musllinux_1_2_armv7l.whl": "sha256:58f361dcbab699cf8f42db3f47c8e7fd1036f138c23a5d08de9fde5f425a730c", + "https://files.pythonhosted.org/packages/81/84/9ebfc8ed6c8c4fcd8e726ff6bf220cc8deb3966e31dce9be8dd8aa017e64/charset_normalizer-3.5.2-cp314-cp314-win32.whl": "sha256:4f87960d57feabfb618e4e0af6e7371645fa26a277860739d6e5d6e0012c92f0", + "https://files.pythonhosted.org/packages/82/44/b0aa350280e6ff5a5492d17cf10460dd39d5ee848f872f7ba2df10607f60/charset_normalizer-3.5.2-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl": "sha256:4c2b5031f63e331e3839b40aed2dd6f191e9c07edbde303e7876846ea1946995", + "https://files.pythonhosted.org/packages/83/09/71e453691e927de4ddf792770cfaab3f49d494e222f66ea5e404bbd5e39c/charset_normalizer-3.5.2-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:7a881931aa470808df94a8c380eed2bbbc76cd9dc622310f99665658c821eb6d", + "https://files.pythonhosted.org/packages/83/1c/d8d8d7322a7c3eecdf3237a4a419cf41d2eaad8e006ce7dfdd9d4c8fa2eb/charset_normalizer-3.5.2-cp315-cp315t-musllinux_1_2_x86_64.whl": "sha256:51cf45226a9b588d0d2b4880c62d686934b63ab0bd79ca23ab0e9762eb27441b", + "https://files.pythonhosted.org/packages/86/bd/9b2bd1c5b7af02462c9752d33994834ff972a96b4c483eefde9e594488e2/charset_normalizer-3.5.2-cp311-cp311-musllinux_1_2_aarch64.whl": "sha256:bd16aabe4a02a297c23417aa17ac6299dbd8c49f673bcd645b4929b11f5a4400", + "https://files.pythonhosted.org/packages/88/8c/f1a91bddc8fb47c2889e29ea7ea49a194eb0d9868675d786806519c00d76/charset_normalizer-3.5.2-cp314-cp314-musllinux_1_2_armv7l.whl": "sha256:1503bccbeb36d5527790c3930327704c39af22de3112f1b1666a9f3ce15ee204", + "https://files.pythonhosted.org/packages/89/44/809913e2cfd279e635a9294fdbbfb1b1dc62a8189d473d561f649fce98d8/charset_normalizer-3.5.2-cp315-cp315-musllinux_1_2_riscv64.whl": "sha256:ca403d7e4798f525fdfc78e258820419cbbd0f0ecbab9de7840e3c017cf6b8cf", + "https://files.pythonhosted.org/packages/89/8c/75469d690cf47200bce8f6cad7655724fc23148e147abfc5ce78b5f65863/charset_normalizer-3.5.2-cp314-cp314-musllinux_1_2_s390x.whl": "sha256:c7c9ab723cde841fefb34efbad91e87f00a674b1fe1cd0784fde742bf2c154dc", + "https://files.pythonhosted.org/packages/8a/7b/ed341c66f69f688723501fac752be3d63c7159ca0d0d4174fc611e5710bb/charset_normalizer-3.5.2-cp315-cp315t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:58ca3755ee7ff7f59b57789ec9833c9de9ea275405cdd240eda1f193112e398a", + "https://files.pythonhosted.org/packages/8a/8e/b4a085fb47c9d3a7e43576a4784fdd8fe23f907514a972de8086edaf7a48/charset_normalizer-3.5.2-cp315-cp315t-musllinux_1_2_s390x.whl": "sha256:5e2b6b57e9733d39f0c9fd3185efa6b8e29652c4cd8fe94180272cf6ed9a78c4", + "https://files.pythonhosted.org/packages/8c/ab/176fbfd5b64939c55d652366aa5b9ef1d767af207a3aa6ebeb0d226c484d/charset_normalizer-3.5.2-cp37-abi3-macosx_10_9_universal2.whl": "sha256:4275811936e2f06feff5e598fb42a1b7ae852da8e39605211892b56b81a34efd", + "https://files.pythonhosted.org/packages/8d/1f/20c8949f0676f7ab811abdeb7f4d7f1cbc6e61ff20bef08b44edeb092bc8/charset_normalizer-3.5.2-cp37-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:0774bf9bf620249fee3e0b8b9fd3065de213be30f3aa94ce2494b3b638949e26", + "https://files.pythonhosted.org/packages/8d/44/94b15f1d938bc4b8411c483f947ba32952b71154c5550924be7031407d33/charset_normalizer-3.5.2-cp39-cp39-win_amd64.whl": "sha256:15bb4005af6320d259dc7593ca84a38d7fe06a421dbcf7b910ae23979101e787", + "https://files.pythonhosted.org/packages/8e/37/eba316edd4f0c4d3a5d945924c4eeeae59abac4056aa815d8a4268f863a2/charset_normalizer-3.5.2-cp313-cp313-musllinux_1_2_armv7l.whl": "sha256:b6856554c4f44d79fc2307d5768854310a8f0096e501c75637542c82292b0429", + "https://files.pythonhosted.org/packages/8e/cb/489a7ae61ca4603a813c0a297b3a0dfa891597cbaf6ca13e428ab3ce80d4/charset_normalizer-3.5.2-cp39-cp39-win32.whl": "sha256:93223adc95033dd47133a46ccfc316a0139176fd79085762e27202ec56018f03", + "https://files.pythonhosted.org/packages/90/8a/cee8e3024a1179723f9a96eafa6242e574527abc7e0492a2fa65fa988987/charset_normalizer-3.5.2-cp39-cp39-musllinux_1_2_riscv64.whl": "sha256:e80e6c2f55656b4824d72065abb4ddd6a525c74bd78a0aab5d9fc2cf4fb5af50", + "https://files.pythonhosted.org/packages/91/da/3c5a7798c046df7d2d68ad653cf5b6c5a8bfee225055a843c6f2f42aac1a/charset_normalizer-3.5.2-cp313-cp313-macosx_10_13_universal2.whl": "sha256:6045373d5a89a5ec71afde535db987ca28e76dfa276c2d4c818265b375d4b055", + "https://files.pythonhosted.org/packages/92/08/564955a4b5f2ccb410ab480bbe8c6a18063ff27f2d35458731c4a5335df9/charset_normalizer-3.5.2-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:4d48f2d08b9de5864e2c8744d4461b862fb149a18274abc8b698c45975573438", + "https://files.pythonhosted.org/packages/92/9f/181fd07e1bffea1d95cd80c84ac537354f50699c22cfc4d3c02b6fc16208/charset_normalizer-3.5.2-cp314-cp314t-win32.whl": "sha256:598a11a2c7ebaa5334bf698bf29568c9c390abac6a154d8170fedecd1cea38c5", + "https://files.pythonhosted.org/packages/93/ad/bd74a283940dc910c5b14f8e4f80a248082bc9c0fcbe1f54530cb6d9cc5e/charset_normalizer-3.5.2-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:28b4f0d66fb834ff90f28209ac7bce77868c45d8c93e26f906709d9b7c2e1af9", + "https://files.pythonhosted.org/packages/95/69/0dbd0e0b9b16cfa816cdfcb3e2e3854a1f680dc07fb1245ea125e7448060/charset_normalizer-3.5.2-cp312-cp312-musllinux_1_2_x86_64.whl": "sha256:23851fb4e1b85ed3f6c2a27b777cdfe2e19fb5b38429a8faf38c7542b7665869", + "https://files.pythonhosted.org/packages/96/92/1fdf015f09ef449f50d3ac4b67c90887c9c318b727daa95cc4f866e6521d/charset_normalizer-3.5.2-cp37-abi3-musllinux_1_2_riscv64.whl": "sha256:01077390b03f7988f11d700a2194e69b119741a86b1a638b1db88891e3eced8e", + "https://files.pythonhosted.org/packages/96/dd/dddf3848de54804e5543750f390fce1f9bc3fa5404f58f87be262199bf6e/charset_normalizer-3.5.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:55ea99acb17b9325618de155a0cd6a2e8f5d10be008113e1d433bbb58db543b2", + "https://files.pythonhosted.org/packages/97/66/3e45a506d8110b632541faf9a9470185aa9878f1ed44020f31346c1c5e5b/charset_normalizer-3.5.2-cp311-cp311-win_arm64.whl": "sha256:254eb48b9fa5ee9898a3c445825a1f340fe53712a098904b39b0bddba8ea3cb1", + "https://files.pythonhosted.org/packages/98/77/46e87bcfc45d25ab4db7cfc9bb544bfa3ffd302289ed31ae93f5433eb899/charset_normalizer-3.5.2-cp310-cp310-macosx_10_9_universal2.whl": "sha256:195c26fb65950f8fce54e26349852b7bdd7c5f120aeefbcc440b8a20faaed4a3", + "https://files.pythonhosted.org/packages/98/e8/55d5fd3935b4bce6da4fe0df61898e8c82653e317e677bd58aceb9c60f13/charset_normalizer-3.5.2-cp315-cp315-win_amd64.whl": "sha256:89b53f3cda69831909888e0494f4fa0bcd3537e3e138dabeb620bd6ad946bae8", + "https://files.pythonhosted.org/packages/9a/85/33abd4315c052d3d4f54c92b1ee49bfbc0dc7115a981e462a793b6d2ab87/charset_normalizer-3.5.2-cp313-cp313-pyemscripten_2025_0_wasm32.whl": "sha256:a090bb2c68df85450502e3e20d665e3a5af9c65a84d6508ed477badd49166fd3", + "https://files.pythonhosted.org/packages/9c/76/b8ec57f4e9ee3253541abf95e4a462c0175fe8032dcd070f1f2421240942/charset_normalizer-3.5.2-cp313-cp313-win_amd64.whl": "sha256:78456a747de8dc58360ffa581f30a002baf5aa28cb262536545e91f113ed7639", + "https://files.pythonhosted.org/packages/9d/79/b849ad523017ea9f5a45581bbebed91439e0cf42fd2860a6f64e358eb5a6/charset_normalizer-3.5.2-cp314-cp314-musllinux_1_2_riscv64.whl": "sha256:e09a3942ecbdee5cce73ea9d42da82b81b72ac1bf031ce069b93b5adf4eac8cd", + "https://files.pythonhosted.org/packages/9d/8a/b618149cc5207943a0242068d7a27897f56a62947b5a039085f2a22029f8/charset_normalizer-3.5.2-cp37-abi3-win_amd64.whl": "sha256:9f56f72050826f63dcee7a7f55b0a77168cb3bfc553fd405e7f8f9ece75a4036", + "https://files.pythonhosted.org/packages/9e/18/70d76670b13686237863a379928d60bd10e021f17d243ab3d7014c4a5f4e/charset_normalizer-3.5.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:355ad8011081dec5412240c087a9a0c9d4d5039f3ed11a3f13e18c2b29b56c51", + "https://files.pythonhosted.org/packages/9f/86/85c84e4da8b27dd409577d9437926ff581c5f9d3c66038dc68c1a526de51/charset_normalizer-3.5.2-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:8024d00c3faf3fc0c16e07a69f4405e8eac7cc0ab15f65fe6cf43827c4cf72b4", + "https://files.pythonhosted.org/packages/9f/de/21dd363e7ffac0f02caee93cc9bdb63b04adaf9bf7ce46dea742c9a51aad/charset_normalizer-3.5.2-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:68eb192d85ab8e5f6ec69c2bc6ac0179fbf04a5ac1569d12fbef74883fe102d0", + "https://files.pythonhosted.org/packages/a0/16/0e4c6ba9b44e97a2da150e52d331e8f9c968b21b358fbffa6c856cebcd89/charset_normalizer-3.5.2-cp315-cp315t-win32.whl": "sha256:5fb29fb8cd1a46c27a1bf9613ad5ec2599310d46b4025d9556404a6b6a292800", + "https://files.pythonhosted.org/packages/a0/a1/4fbf5d0f0f1b2a080474c1cf9a2f12c4c6531bb0e8ba591055e846d2b4e9/charset_normalizer-3.5.2-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:3df041de8887954562c9b261cba85ca0e9ded74048daf125f45edcfaa4832229", + "https://files.pythonhosted.org/packages/a2/22/80992720a0282cd39bba1db35868e6b9c22f41281160143a836544bc1d8a/charset_normalizer-3.5.2-cp314-cp314t-musllinux_1_2_x86_64.whl": "sha256:f5ec61164adcec446f8969a3358ec3f9b26bbda3b9213e5586d219afa8df2915", + "https://files.pythonhosted.org/packages/a5/4a/bf7ef45794dd293fab5f98a9309817977fbb845b9998f171b8cc5d8437a3/charset_normalizer-3.5.2-cp315-cp315t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:e54da4baf05720032d527874d40b65fa4d7e5c6c6a43d0c3adbeffcaf275a2b3", + "https://files.pythonhosted.org/packages/a5/57/50e3fed84e175f40349bd0da7a4fce94c87f0378f52d74f511d89e0bdc20/charset_normalizer-3.5.2-cp315-cp315-musllinux_1_2_aarch64.whl": "sha256:183b88127acdb4fabe59d951ab424faf1af7b63cdbb5f776186c1ea2ffcaed98", + "https://files.pythonhosted.org/packages/a7/95/ca9b5eabde673002c6f1e7ada1b223916fe18f6d661da7aabd4d643718f1/charset_normalizer-3.5.2-cp312-cp312-musllinux_1_2_ppc64le.whl": "sha256:11a4d68a6ecda3292cb1e50239e111543ba5d709bb62a6b4ea1afcfa729d8875", + "https://files.pythonhosted.org/packages/a8/9e/09efac30b937722f46d3110ba30b875b24b2e3a266ed746cc4e376a94d80/charset_normalizer-3.5.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:38a873987f3be698494da8b2e3085e29da02da7b633dce73e79c699a113d7bf0", + "https://files.pythonhosted.org/packages/a8/a1/b983b62df4aedd9a740d2ae1eee43d48e2dc7f68695a1fbed9b773ccea23/charset_normalizer-3.5.2-cp39-cp39-win_arm64.whl": "sha256:2cc961b171b3f3440f410489ab3573e86aea8736134ebbb40ea1338b7f0831bc", + "https://files.pythonhosted.org/packages/a8/cf/ac8878d0322cf88a1aad4c7b147db32ca0bd806eb0060957b2e31486dbe6/charset_normalizer-3.5.2-cp314-cp314-android_24_x86_64.whl": "sha256:bbbfc8e28816f19d7c0f1816664980c0a9875d01b27cdf8eedddb639d9e108ad", + "https://files.pythonhosted.org/packages/a9/55/93c0e5dbd085ae0471346026abbe7e0db9ea2d6fea74e51f0b5a46f233a7/charset_normalizer-3.5.2-cp312-cp312-musllinux_1_2_s390x.whl": "sha256:a815775b6c38d4e0ff7bcffbeba67feded90202bb6a226b8dd35f1c855217413", + "https://files.pythonhosted.org/packages/a9/5b/974423c2fd8e524c7a7f64318c1e02240ef954912fa2b4d70344107b9c68/charset_normalizer-3.5.2-cp315-cp315-win_arm64.whl": "sha256:6be488a102b8cf28d0391d8c4ba7748938ae28b78ad901f8585520fca33ead1a", + "https://files.pythonhosted.org/packages/ad/77/22d7e785d1e210afc2e2f58600dd1799d17a35665faf84383f002826c5f8/charset_normalizer-3.5.2-cp311-cp311-musllinux_1_2_riscv64.whl": "sha256:304d5463e65a35d7bb0850550e0780395395f6fcf452f04db7d5ca7cecc425ac", + "https://files.pythonhosted.org/packages/ae/8d/213565184708fdb263ae55e2c04ee1ff748129dd65d48ed0e3502da9c85a/charset_normalizer-3.5.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:5cde776b7cc66e4f6c99612cea4aa7269aa65863f7a15841b2c264f103822f4e", + "https://files.pythonhosted.org/packages/ae/91/e8e946267f1c2d9e2bd651726e2fbd2addf02c4d36cea5069e32ca9d7bb5/charset_normalizer-3.5.2-cp311-cp311-musllinux_1_2_s390x.whl": "sha256:9cf9b1a857e25c4baceeb3624e92a56df3668f398c4acba74e174d81fb4d1d3a", + "https://files.pythonhosted.org/packages/ae/ab/fb8b5178fdf7bf68efa61cbe892286bc9f73846f26147d4725fb89388475/charset_normalizer-3.5.2-cp310-cp310-win_amd64.whl": "sha256:1461ac396c4fdb983a675f20aa555624f0ee18ac83d832b9244ffff3d8055275", + "https://files.pythonhosted.org/packages/af/a2/f28400ab13359d91bd39179df8e149376b9bf36588e739a3a4f9de2b84b2/charset_normalizer-3.5.2-cp315-cp315-musllinux_1_2_s390x.whl": "sha256:df29a0a7107f7011e77f4eebdddec4c7331e24d787a0b21a46d63bdf7445da95", + "https://files.pythonhosted.org/packages/b3/1f/d1e78246f7ed60c8c8d606b4ac27f66ce49cc3e95f24893ccbeba9f77302/charset_normalizer-3.5.2-cp313-cp313-musllinux_1_2_aarch64.whl": "sha256:62603db9a7caa0802eaa28c1c46fecd7b3a263a774069c24c3c28c302448721c", + "https://files.pythonhosted.org/packages/b4/f0/45b579df5cabc1d5d53ea1cc35e8437d3ca768c0acccc7041517cb6fbb32/charset_normalizer-3.5.2-cp37-abi3-musllinux_1_2_x86_64.whl": "sha256:9cae88599c7219005d879f98e5ed53341e9a122af585e1091200358a3003d2a0", + "https://files.pythonhosted.org/packages/b9/7b/e8a92613236b257d3b75d532496eb21f68ad8231d7d56df94497e460112e/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_riscv64.whl": "sha256:30fcd120b732aa79317f08dee04d7de0847822e4cf7ee0e9f445bb958832252c", + "https://files.pythonhosted.org/packages/ba/a2/8b50aa320adb880ad579518e6f718f24944804b42a88b83d267d5d444125/charset_normalizer-3.5.2-cp315-cp315-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:04851f73ae72b8413dddadb16a49dfee95263553741fd42d546f7d66907e6be5", + "https://files.pythonhosted.org/packages/bb/33/2a6ae7fdc1b10cb581cef91addd8cdfc5f40d50abb5702309369d5834579/charset_normalizer-3.5.2-cp314-cp314t-musllinux_1_2_s390x.whl": "sha256:2a925889534b3748302dae5dead07cc13480de1dac3aea80a941b729b471ef93", + "https://files.pythonhosted.org/packages/bc/90/0660ef18e18df0a4d2a1a0edff7dfbba42d4e50ef2425557a5bb7051f77b/charset_normalizer-3.5.2-cp313-cp313-musllinux_1_2_s390x.whl": "sha256:2c9ad19a6cfcd5ea5c0d41161d22f9df1dcc277e9bef2751391334546a314c00", + "https://files.pythonhosted.org/packages/bd/39/559be29a0c0f086e0bba6922babd38916cc5e0b58ced4de13ee01ea05508/charset_normalizer-3.5.2-cp37-abi3-musllinux_1_2_armv7l.whl": "sha256:304d8e4d493af723536393eee0c689eb7813f4a474c8b479dee63f1fdd98f621", + "https://files.pythonhosted.org/packages/be/33/e90bc2b1374f7f36ef106f56620de5a783907e19ca857efe2277e31cac3e/charset_normalizer-3.5.2-cp315-cp315t-win_amd64.whl": "sha256:a192e2c40070d92c3ccf777e3a5c4ff515573cd2bb7ed0c537fdadbbec5bbf21", + "https://files.pythonhosted.org/packages/c1/48/c5dd00d5ef7791f02666de250a5bb6071e29b7e133cf4b835800b6d3bc27/charset_normalizer-3.5.2-cp314-cp314t-macosx_10_15_universal2.whl": "sha256:dca9ab98072a5a54ebacebdc45f53e645336b320c667410b061be1ca588ae709", + "https://files.pythonhosted.org/packages/c2/cd/fc7152414561ff78f9c61a4a627025f65fd244abaefc99ac4e75c6169b33/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_aarch64.whl": "sha256:447441e76ec720b15e64418d32e092297340387053047c7c694f579efb0ee1d9", + "https://files.pythonhosted.org/packages/c3/76/8a28136f3938ba9836f84280ce0c4d61ed1cf15a036b2034900c62634162/charset_normalizer-3.5.2-cp315-cp315-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:def79fa35ef0cef8d2accec024f4fdc7ead3012ff02f5215c783f39f03ef8cfc", + "https://files.pythonhosted.org/packages/c3/86/7b5cdf05e635c17c5a3f1e1b1ffc142b60e6f37b64af2e1979bd00ca8570/charset_normalizer-3.5.2-cp39-cp39-musllinux_1_2_x86_64.whl": "sha256:fd1fbe0f116b6e55da77aca2c6ddcddcfac2186cbf78bdebf40fc156efca389d", + "https://files.pythonhosted.org/packages/c4/9f/9f52d2886d52645987d603425482c63c5045a3005db1354a7097e5ed1ae9/charset_normalizer-3.5.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:8a893cc101149f80a653f82062ebc95b34525a2614382e1da5458fe7c6997249", + "https://files.pythonhosted.org/packages/c4/e3/017aea0911ada7405a825c7d937eb3a13009664e2f5b38e8c4bbf2abf894/charset_normalizer-3.5.2-cp312-cp312-win_arm64.whl": "sha256:e2af3aad578aa6bd1384bcf4750fc285e5a9de53f40b7d41e5a0bf748edeb2b3", + "https://files.pythonhosted.org/packages/c5/34/68292d68512768591aaff07c59bb53ee31341c87759433a859c4641a50c2/charset_normalizer-3.5.2-cp313-cp313-android_24_arm64_v8a.whl": "sha256:ed905975ab14056a2e5eb1c376cb2e1ebc5396baf84163939c518556fccde9f5", + "https://files.pythonhosted.org/packages/c8/8e/aaa037d40ca9ef045977f1a661048b1aa33f223adfce3452fe9be9f79d14/charset_normalizer-3.5.2-cp313-cp313-musllinux_1_2_ppc64le.whl": "sha256:1bc0baf5ef96b6ede57d47f4b8fe4d9d84019c3bfcbeb20a41edc6a6ee341f1f", + "https://files.pythonhosted.org/packages/c9/05/5d958bc8ea503e26be25ada5430fd409cfb45dc22ff33f9f96e649613c99/charset_normalizer-3.5.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:3d14b50de6bf4d0edf857a9386836846f982b8f524e188e2e68b96d702bcf4aa", + "https://files.pythonhosted.org/packages/c9/6d/9a08d7e0b29b7208e2c6c01dc56c8e0520e7c7beadbbfb024b58fd69c8a5/charset_normalizer-3.5.2-cp314-cp314-ios_13_0_arm64_iphoneos.whl": "sha256:7967d08cf06dee78443b874f98c98036f624f3a4e73e11f9f64f5be4d25393cf", + "https://files.pythonhosted.org/packages/c9/87/2fea8c13dc24b3ca9c6f803a5b2dfdeae73eb4f9e12c7885ed908ff0433c/charset_normalizer-3.5.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:b91363207bd9dc966a691e959bb47f64b30f7ac4b072be9968b366982f7db77c", + "https://files.pythonhosted.org/packages/ca/87/3d42a42e18ea066e2513936fd678a00696e77878b5ae04528976abdbcb83/charset_normalizer-3.5.2-cp315-cp315-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl": "sha256:e242bb1c5e76e97dfa9e7f209a71e93a01d7f19ffdd5cfbb2e2d55b4f08f8ab0", + "https://files.pythonhosted.org/packages/ca/e9/34e597dee616d0b8ee4b34d29399e85c2204ade174157a48505d42baa4ff/charset_normalizer-3.5.2-cp315-cp315-macosx_10_15_universal2.whl": "sha256:87475fabc8d9996fd9c27debb395e642e8c838d78a00b6e932227a0e06b81e26", + "https://files.pythonhosted.org/packages/cc/9d/e41588b777965e5031a43128a1e96173ebb35ac75fc53ec3b517e7c21cd4/charset_normalizer-3.5.2-cp315-cp315t-musllinux_1_2_aarch64.whl": "sha256:443eae2bf318abeaf6f15d785138f71fd6de770e99a92158b8b814265e079115", + "https://files.pythonhosted.org/packages/d1/78/5ed86f743d4bc350db307e7636419a0a5ee1d91806d30c7f667bd5c80dae/charset_normalizer-3.5.2-cp314-cp314-win_amd64.whl": "sha256:e4e81e09c1578b8df602e3db08b0b3ea0a6947ad612f52bf8dc5ea8d47691f0c", + "https://files.pythonhosted.org/packages/d5/ad/2a895c945ee61988dfd9ccee64f0b78dc09f29c9b34d1dd545246d78e0ad/charset_normalizer-3.5.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:ddf19c062bea7a0cc80f519243d2c01dd091be0cf952a0750d4ad576709559f5", + "https://files.pythonhosted.org/packages/d6/39/45c7439f5b63d24f7d5b2a1d760f34af7628782d7144b4cc8ded45c2d4bc/charset_normalizer-3.5.2-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl": "sha256:15c44f7edfd477b06f517a5cc317fc1707edb9de2c865f43d4b6513907473234", + "https://files.pythonhosted.org/packages/d6/3e/350d89ad49916b86554d6f5f2d03ec1152148f87e5ff735106c6a03b1a36/charset_normalizer-3.5.2-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:0521c5665880b33d603717defa76c094048900010897909952397feb3039da56", + "https://files.pythonhosted.org/packages/d6/54/f7fbb3493c9f49091213b9c2d6dd65800696f1ce1a3f196a4205f50417b1/charset_normalizer-3.5.2-cp315-cp315-musllinux_1_2_armv7l.whl": "sha256:16fa0eccf81304b79c5cd87f9271c3b85dd9dd99245e4422ae9c0dd45e0f99d3", + "https://files.pythonhosted.org/packages/d9/37/b3a6385acc5a1e45b39ae9c90bfb9cf838a09b9dd37ef2740ab4c6b4a2eb/charset_normalizer-3.5.2-cp315-cp315-musllinux_1_2_ppc64le.whl": "sha256:7441d755b7ab94f8d4eb3e43ec05482d760842fd263d003a99102d742cd835e2", + "https://files.pythonhosted.org/packages/dc/3c/8e7b8a5671ad5d433669fb2a76f1a0164df2d9b1718b0206bc2a16d840cc/charset_normalizer-3.5.2-cp37-abi3-musllinux_1_2_s390x.whl": "sha256:7e841fb9010836c992c9f12fcbd43a831de93a5f726fc1ccd8ca1d0268c5014c", + "https://files.pythonhosted.org/packages/e1/16/710ac3de2ee354e2bd1a9c94efe45a2d27b5c6ad39b2d6a905be2c094b6c/charset_normalizer-3.5.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:849df64e889b2e17230d58410a03dba311a65b163508fd33679b2b737d4b7858", + "https://files.pythonhosted.org/packages/e3/80/bee0b01b90ccd5322ae1d0abb33fab1bd95b7c2eadaf02aeccf22e04ee83/charset_normalizer-3.5.2-cp313-cp313-android_24_x86_64.whl": "sha256:a66c3bc5ab1f0ff2164fc9965ddd611ff0802173f4b9d24554c563f6ab7e1d6e", + "https://files.pythonhosted.org/packages/e4/ed/cf505d3011ffceb12c2067a7a5d3cfe92b875d4d44bb0ff0d69375e2c184/charset_normalizer-3.5.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl": "sha256:211d5a3eb6af8f513b8d4ca19a8c1b7accab1b5f0d3175f9826b03c1a920dc1f", + "https://files.pythonhosted.org/packages/e7/c8/693809898870237d82785a03f3b2b58fe4c9f14669f84a7d4e623c92a59e/charset_normalizer-3.5.2-cp312-cp312-macosx_10_13_universal2.whl": "sha256:ed2a239c0ea213acc1908150a3037257083c7c083128f1a4cec2ec4b97dca491", + "https://files.pythonhosted.org/packages/e8/6f/127c3697761666e246f44ab52d8c88ababf80c61fb70b3261b53a94c0d5c/charset_normalizer-3.5.2-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:9bde855991b7e362c146535e3136a50bfaffc0487d38b33ca7e5edefc6e23849", + "https://files.pythonhosted.org/packages/e8/ee/008a2837737991474c5754bb3191010007663860979701990982a502cbaf/charset_normalizer-3.5.2-cp315-cp315t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl": "sha256:124fbf1a8ff966d87ae05bb8bd45a71f966055ed8bba320d0c7cf450bc5f4d0e", + "https://files.pythonhosted.org/packages/e8/fc/fdf8cf52ff21cd5bf158f20978991cf985325842f74283eb6df26c8a39d8/charset_normalizer-3.5.2-cp311-cp311-win_amd64.whl": "sha256:87e50a3e7cb90af586b6c5faf23e302a970415ac73bd7bd90a515a04b427ef96", + "https://files.pythonhosted.org/packages/e9/89/9bab37955edf0adb3b66f8a3a6617d9f2f487e0d56f295a6a286cb640aa6/charset_normalizer-3.5.2-cp315-cp315-musllinux_1_2_x86_64.whl": "sha256:f3c96f633825733f735c5a9cf21d21a257d8e1edf0b1cee0a064b9c424ca0f7d", + "https://files.pythonhosted.org/packages/eb/e6/e6e083884cbcfd49c64865af05027fe7011be7b2d9179524f099a1b611f3/charset_normalizer-3.5.2-cp312-cp312-win_amd64.whl": "sha256:780fbe7cab297b81dad9fb8dc5eb003c0468ffb0d9e5f65068c53a34661a96bc", + "https://files.pythonhosted.org/packages/ee/f9/00ee0195db1013d8f7c416fd770fbeb560bb46eb2e36b054d05cb56f6cfa/charset_normalizer-3.5.2-cp315-cp315t-macosx_10_15_universal2.whl": "sha256:915563965d418f986e7e145accc592eae9e1a1be3566ff98a05d7a9ec42a76e1", + "https://files.pythonhosted.org/packages/f0/2d/0ff8db0d373ba8538db686db11cd7e8912031490b9e4f383b41912e8d594/charset_normalizer-3.5.2-cp315-cp315t-musllinux_1_2_riscv64.whl": "sha256:ba0b1d2620edf869789c3879223f52bf2afc5d31b3cb47cc57b3a12c05e2aa9d", + "https://files.pythonhosted.org/packages/f7/4c/070b38bdb5f49a70199fce923ec0726a49536a63ab262abbfcaaf351110b/charset_normalizer-3.5.2-cp314-cp314-pyemscripten_2026_0_wasm32.whl": "sha256:ee43c17b173d46a3212baa6ead3ae258eeabdae48c263a01ccf0218c366dd655", + "https://files.pythonhosted.org/packages/f8/c1/6116d52a2e3311ec80f21f5fb5e17b27405f10b9608af8f6e69516841a1b/charset_normalizer-3.5.2-cp314-cp314t-musllinux_1_2_ppc64le.whl": "sha256:d008d90a7f2471519aef0c90dfbe73b3e6e4d5e66ac48e19154c17e89e98b604", + "https://files.pythonhosted.org/packages/fb/94/01009e13b94041599004edf32e56e382c24e570f60f79bab8efe45cfe1eb/charset_normalizer-3.5.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl": "sha256:d760fe2a4d7c3b226cb9026d6a842868d52a7901bd98420e1baf14e80da85cf5", + "https://files.pythonhosted.org/packages/fc/ad/d07d7862a62ffa6d79d68074d14823243dd235a77c45262acbf6adeb28bf/charset_normalizer-3.5.2-py3-none-any.whl": "sha256:b6b751274acb69d77b3323d6b7dbaa3c7fdfc1eb829b7eb61d262f32e1af9685", + "https://files.pythonhosted.org/packages/fd/d3/6f561f74a296cf27d61775a1dc665ad13f3bff6a798810ca05907f37a7c4/charset_normalizer-3.5.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl": "sha256:c8f3d67aeaf55f017982b73683f0e7342ba2f6635a78f69ce89ebb26aa411e5c", + "https://files.pythonhosted.org/packages/ff/6c/387b0e4f756a282831c1d9fc6aeb6c51ca4507ca202767c8de15ce9b12e2/charset_normalizer-3.5.2-cp37-abi3-musllinux_1_2_ppc64le.whl": "sha256:9b7f416ff0978e2f2249330527f0ad6fa02f4932e6199692d3b52da2048c19e4", + "https://files.pythonhosted.org/packages/ff/ac/21d5c6b972285c5f095ff78afdc99f3539e3985dfcf7ff1cfbe9e772f529/charset_normalizer-3.5.2-cp310-cp310-musllinux_1_2_s390x.whl": "sha256:50e3adfb96fc189eb27b1cf62d3b598b89b4bb0420d93a3d3e42e137409011be" }, "cryptography": { - "https://files.pythonhosted.org/packages/01/77/2cf79bbfc4d12ca106437a6e170d6aaa01a373e93093118aaaef0e801bd4/cryptography-50.0.0-cp314-cp314t-manylinux_2_34_ppc64le.whl": "sha256:9aa87839c383bdbab6ef865787a1fb877af8dd03464c4400322726feaaadfc6d", - "https://files.pythonhosted.org/packages/01/b6/0b9e125e90f3d2dcf599a218a899cda7326a3158cfa258723f0b398b08f6/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl": "sha256:8eb5e1172eb569ea8a872796576e6a67c276351728b6455d5beb01242b027c6a", - "https://files.pythonhosted.org/packages/03/37/73d005be173aff344af30e9fd2a576575cb2391a7101d9cd3842e1fa8cce/cryptography-50.0.0-cp39-abi3-macosx_11_0_arm64.whl": "sha256:ccdc4a71a4dabae05de219404f9f4abc38e3b58422177ff93d0da05967dafa07", - "https://files.pythonhosted.org/packages/06/1e/63a1027cb7fec360a182208e1b7767d5aa1fe57be3d6aa856e69a321edc0/cryptography-50.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl": "sha256:8d89f3976b10b4ce31118de72329025f70d2c6ead14a8217c5514dd2c6d5a78f", - "https://files.pythonhosted.org/packages/15/37/36a9c479bbe49acea2636c7fd3360d20f7b7e079c300352011c44850b181/cryptography-50.0.0-cp311-abi3-manylinux_2_31_armv7l.whl": "sha256:900131fafd8aead39ac7dd3a7e833be754c17a95cfd91221636949fe4eb0aa8a", - "https://files.pythonhosted.org/packages/1a/28/b555a365adff1cca2fbe7b9e487d68a40de6bc67ff2cb587473eb43de0e7/cryptography-50.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl": "sha256:d58c3db7cd6eed54e6c06744db55456b65ebd7492ddeae9c1e93cfca7aa857d3", - "https://files.pythonhosted.org/packages/1d/dd/7c77d26285cc7f6991efce64a0f5b4f9383bfa5dd8c5033003eaf7db4cdb/cryptography-50.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl": "sha256:d764dcf130c428ef66786f866dd750f53182bc608813489915e9fc106bb0c82f", - "https://files.pythonhosted.org/packages/22/f6/ec13b470172126464a86bf54d2294a46d29837fc51ba3e45d4047946fb5e/cryptography-50.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl": "sha256:f89831ef99dd7dd169ab06d63a831adb9e20a87aac6d380266bbda5823349169", - "https://files.pythonhosted.org/packages/27/20/c930314a2ab476d15dec966ec87e2e9637bb02b06106b12c0396c57bb603/cryptography-50.0.0-cp311-abi3-musllinux_1_2_x86_64.whl": "sha256:7cec5b856506da6defb290f30c9ee687d5f5e8cb0bd3f6459dde43b0b4fa40ef", - "https://files.pythonhosted.org/packages/30/82/85f0f7425c856b9f96459411eb12e74ef72df9caf6f8f15bf23a33ff131f/cryptography-50.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl": "sha256:80b63928fa35083b33966ce1efb70e5b9607181e49dcd1c22c8c005e319f667f", - "https://files.pythonhosted.org/packages/32/2e/c9db68a0c4bfa28e310707527c0ee3a2bd254104d2e02e68f368e197aa4c/cryptography-50.0.0-cp311-abi3-win_amd64.whl": "sha256:bd1c592e4d5974f0d08d4888e432157adba757c66da0246918e43677fafa2d30", - "https://files.pythonhosted.org/packages/32/98/8a151d64367204cbc63ec65d37502f1d9c53cf4bfc6ec3c532614dbec60d/cryptography-50.0.0-cp311-abi3-manylinux_2_34_aarch64.whl": "sha256:07949c449a1abcf60d1ee6e88956d89404c7df3c8258f46589e912988e551987", - "https://files.pythonhosted.org/packages/38/14/6120e5bd7c5aa022ad15424ba4d5c5269d0d9448ed4d55e492ea91e3c1c4/cryptography-50.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl": "sha256:11b74db56cdbe3cdee6e3f6982ecb70334fa10dce99ed58bf7894aaaa3b2a037", - "https://files.pythonhosted.org/packages/3a/63/504ccfbbe61fd8aa983f7f146399cdf034c72c2fc55f5b2dfdcdcdb20c99/cryptography-50.0.0-cp314-cp314t-manylinux_2_34_aarch64.whl": "sha256:ecfed7367f965a0328cfbdd70da860f15441f002f613185668c6e6ebf5a0ac11", - "https://files.pythonhosted.org/packages/46/c9/f60aed34c013f317f92817b6c171c2d22a78270fa41109bd4b08af26b194/cryptography-50.0.0-cp39-abi3-manylinux_2_28_x86_64.whl": "sha256:105110f43a471dbd0060b9c9516cb8a6a79233631a04cc2ba16f28323ac6e025", - "https://files.pythonhosted.org/packages/53/c9/a5151588710785a96d7bc4de27d4cd62f263bbbcb203cfe29df537eb6505/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl": "sha256:910d11e1a385c654bf738bf3e6b8e6ed5de0f5610fcae2be9e5b398d8081d20e", - "https://files.pythonhosted.org/packages/57/30/4a22984d4f1bdfb8c054f07a92bc176b97a3134cc1d6c4b3bffb1f3688b4/cryptography-50.0.0-cp39-abi3-win_amd64.whl": "sha256:d24fead1d4d076e1bfb006dcec392074a3cd8d7b4fc8a595aa64073b2b7a96ba", - "https://files.pythonhosted.org/packages/57/ef/8f2df13c7216bcad3e1c74e07f6e193d93e998e114f524a53877c9af27ad/cryptography-50.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl": "sha256:fd9192b7b70c573d7f214eb1ae35e00d359f6f5e4b27c7e21e30de1fc6204645", - "https://files.pythonhosted.org/packages/62/15/219075012ab13e8905f3cd572204f4acb4b111df787104346b9bc0cea789/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl": "sha256:07479a1cb08219ab719147e742e76090c9c773321959bb94946fffdd397a6437", - "https://files.pythonhosted.org/packages/64/a2/4615c8f7d81a00b1d6e6afe19f694e1543582349fb5f4076f6cb5dc36485/cryptography-50.0.0-cp39-abi3-musllinux_1_2_aarch64.whl": "sha256:c87f62a3d3b9888ed0fdde100ec06aa61ca9cd44bad9057d1dff9a516b5f5bb9", - "https://files.pythonhosted.org/packages/6b/16/d3008eff98c764979865834c3d386d4fd041b5f52e7f34fc29ac1a5eb515/cryptography-50.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl": "sha256:6e7d61120573a7f2cd94cc095f9e81f6967c61ccdf194285aa143ecec8e0b708", - "https://files.pythonhosted.org/packages/6b/72/a1116d683a6d7ece94590013882515de087edf9ef0e6292aae615a44df73/cryptography-50.0.0-cp311-abi3-manylinux_2_28_x86_64.whl": "sha256:b42a28c1844fd9de8f3f7d540e36b66f3a9c83fceac7170ebc7a6a19edd9dcae", - "https://files.pythonhosted.org/packages/72/d8/f52538140cc719df62a01cf87d1c7142318d235817109d6f4054d7c352d6/cryptography-50.0.0-cp314-cp314t-manylinux_2_28_ppc64le.whl": "sha256:df2a58a472f332225671c35b0a830208b86d004f82baa8530fa3782c85646533", - "https://files.pythonhosted.org/packages/74/9a/02ffe35b2853d121689871eb5dce862092562b3a1ed5cc98f1aaed441506/cryptography-50.0.0-cp314-cp314t-win_amd64.whl": "sha256:12b9c6996425c76ea6c457ace4f3073e715b8c545add07cd1a8f3a4f90691269", - "https://files.pythonhosted.org/packages/7b/20/4fe50b619a48c2525cc46e2dbc1ac490708d704be5d467bdaac6dc955682/cryptography-50.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl": "sha256:3f5735ffe4996d28b809371756219f5354864902a3b9e7c0b9ee87041209fc9c", - "https://files.pythonhosted.org/packages/7d/ff/b6ce0954962e7f7b969f850a883744197bb3910bdfd7b6da162eab7d9f68/cryptography-50.0.0-cp311-abi3-manylinux_2_28_aarch64.whl": "sha256:a1b30560f2acc95aa8b2e06e716a13dbfc97314747b80d9707e307f77b40d6b3", - "https://files.pythonhosted.org/packages/85/4f/0fa8c2f4428198f15d9ff8d63400e27afbf94ce833f6108da1eb3753f945/cryptography-50.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl": "sha256:a91296cb61e8df6f86d0c19cc4068228da256bf59bf86049fbd821084565327f", - "https://files.pythonhosted.org/packages/8e/b5/c2c5fce26f0ee40d21bafe7f191d29a34b35a65ac4fe8a1191d1983612e9/cryptography-50.0.0-pp311-pypy311_pp73-win_amd64.whl": "sha256:c99c003e088647b8a5b7c145d6f78c335f6348332b62e142d411c4b63d1460b9", - "https://files.pythonhosted.org/packages/92/91/3a31366e183343d3703f8995c095f5734676bd6938118047e50fcf279eb4/cryptography-50.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl": "sha256:1b4a266766514614f8aa60416e71f2fc6e575d36e7bdc90f644fadb2f4b75b95", - "https://files.pythonhosted.org/packages/9c/f8/d97f9603efda3888187bfdb893f26c41be4735c10631d05d284ee6b047c4/cryptography-50.0.0-cp39-abi3-manylinux_2_34_x86_64.whl": "sha256:37fdb0d0111f1e2ff07139dfb79f1b49531f8e213c46f1163dd7642979b58c47", - "https://files.pythonhosted.org/packages/9d/3e/e54cde8c01631a5a8226ccd617eab9e57fd5cfdad90f1a9e6bb570794631/cryptography-50.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl": "sha256:5e34edd123674534acd70147f0ca331eaa2c74e6325fb2028c886aa26ba0b68c", - "https://files.pythonhosted.org/packages/be/f3/f9a0173b139372c3a48ed98154b45cc6b9de17c789d5ab552e621c293609/cryptography-50.0.0-cp39-abi3-manylinux_2_31_armv7l.whl": "sha256:828743d939e9629bc267b8e2d08d8bb67cd4319c771a33d4b18b22dd8fb7440a", - "https://files.pythonhosted.org/packages/c3/fb/951032a3bf22a5697c83183fb6294a4843772947a70e616c57b3ff5f522e/cryptography-50.0.0-cp314-cp314t-macosx_11_0_arm64.whl": "sha256:49e7d93abdbd2990caced757e5fade25302f719c3c8fb6e6fff2dde98999fc41", - "https://files.pythonhosted.org/packages/c5/5c/59086b4aac5e879d38ddbcf74e4be7ade89cebc3eb199a55da998c3bb46a/cryptography-50.0.0-cp311-abi3-macosx_11_0_arm64.whl": "sha256:031e2d5dd4bb9caa3ca9c82e5a197fd8ae680232cee62603d1a813f3f07e3d03", - "https://files.pythonhosted.org/packages/c7/1a/15b92b25eb6ce3089cd49377ae990a0f3ad485a510f968aed1f19dbdcdf2/cryptography-50.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl": "sha256:62598a8a57f815db4c6259a4e97d857dab56697e7de8e8ab02352ab74da1995d", - "https://files.pythonhosted.org/packages/ca/dc/bd72b26be8953f80625f63151efd38eee71c76ca6cf591c08ff34615a79e/cryptography-50.0.0-cp311-abi3-musllinux_1_2_aarch64.whl": "sha256:1489e263a8048bb8b6a8bac662eb2d402ea5d2b7b4699b72f385f1e2772db105", - "https://files.pythonhosted.org/packages/d1/63/54dd723490ba2dc09b299682c10b38db38f159728bcaae8c591b8af2f22d/cryptography-50.0.0-cp39-abi3-manylinux_2_28_aarch64.whl": "sha256:e722f16708d854fe924790e051061f6704a472c3bac347b6fd88033ea8dd0dc5", - "https://files.pythonhosted.org/packages/d2/1a/efcfb02f91407149a0dacffffab791f7e19bf6385f63b3666dc8b5e5c9c8/cryptography-50.0.0-cp39-abi3-musllinux_1_2_x86_64.whl": "sha256:65c2c3add92b45fd0709db8594536aea39c2a67af0e27ffcf049c498501140b7", - "https://files.pythonhosted.org/packages/d4/67/91eb047e69c5e845f2f14b8a2e4a1aab0f283cb885531e9e22c8adb176bc/cryptography-50.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl": "sha256:19736989797678c6af1e55cd49055cdbcb55d8f6b5583ac5335f933aba9101dc", - "https://files.pythonhosted.org/packages/d8/36/83bb81f6e569bc38e1e4a7bc80f29b46bb9601920bc455fc8e888f5d5742/cryptography-50.0.0-cp39-abi3-manylinux_2_34_aarch64.whl": "sha256:2a8183b489dc1f7f80f135780fadc1108f14b31b8a40411c7a5b17425f65f28b", - "https://files.pythonhosted.org/packages/d9/41/029086c34d91052fc3b88bcc8056f709a7c915c7a23b235a54eb800b1c97/cryptography-50.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl": "sha256:06a32a980526a6ab9a4b9bf8f7385800791e2bb960903cb6b530e4817509a3b7", - "https://files.pythonhosted.org/packages/da/3a/f05e32c99d440c9bb891ea0e36c9091891e36be5a9a87ab2ee6ea20729f6/cryptography-50.0.0-cp311-abi3-manylinux_2_34_x86_64.whl": "sha256:82148ec5bddac30b51a5b3c1945075f896fa022cb93f8e4a01e9f6ee95292c5f", - "https://files.pythonhosted.org/packages/de/41/6cbdcf9142d00fe82836fbb51e503e58088575cf7a0fe1dbff6695bf0840/cryptography-50.0.0.tar.gz": "sha256:eeac2acb5a20ed25e0ad6d1df9891a520b78b404266b6d11778f25d5d691a6c9", - "https://files.pythonhosted.org/packages/e5/45/8aae2972c520145377ea3559a605a899bebe227bf070b33cdb445929a9b9/cryptography-50.0.0-cp314-cp314t-manylinux_2_34_x86_64.whl": "sha256:6ba6a53445bd3cfa809ef3ef5f1589aa6ba08784a1d962bf47d0940e871dab1c", - "https://files.pythonhosted.org/packages/fa/71/190bf38c3ee2e0f8efc9860ae100c9df4169742eef274b91e7aa1cb133b9/cryptography-50.0.0-cp314-cp314t-manylinux_2_31_armv7l.whl": "sha256:f59e38625469987d7ef6d495323c55e7db6c212eaf6112267e0d3b565a2e9c9f", - "https://files.pythonhosted.org/packages/ff/c6/7a6202a534e32103a285b7834a120869557fe198d51d7cfe59754c8bda9c/cryptography-50.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl": "sha256:910e1d2668e7de9648f2bcee30e180db2a6b15c30f887d7c4c93ddf96e3992e3" + "https://files.pythonhosted.org/packages/02/a8/8df951850d6b31d2a00218f19e2b3f999523437ed7a819df7fa427942fca/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_28_x86_64.whl": "sha256:58a0c478eeca76fe5e07993c5a0703def34a6dc6a0cda4f5564639b33112ffe7", + "https://files.pythonhosted.org/packages/10/bf/8d6ebc7dded797bd0f0160d52188021211f011a2b164ef0ae1dac4587465/cryptography-50.0.2-cp39-abi3-musllinux_1_2_aarch64.whl": "sha256:7a8701d6b584d76e909e3d305b7d126b41439876a5aaf76cddc67fc230eafa2e", + "https://files.pythonhosted.org/packages/19/8e/aa1fc533d4546b127b45de8aa024eb5933d23eff9debfe25931e56861095/cryptography-50.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl": "sha256:0ecbc5652bdb6fc9eaf89a7d196e20941adfe812f43bc4ca05d9150496821047", + "https://files.pythonhosted.org/packages/1a/f1/b474e930c4d910328780e3940da76f5aa5cbc48ce1fc14e44d239d9ea9db/cryptography-50.0.2-cp311-abi3-manylinux_2_28_x86_64.whl": "sha256:4061c0079120205fb760c58acab6443e217307dcf05e3702cf970e0689972856", + "https://files.pythonhosted.org/packages/1d/7a/f08d34ce09d60f89ebd391e2ebc6ba2b995e6dd7552f41820f8085f94e53/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl": "sha256:92e665960f25fcdc73725b9cec7a3824f279ba97a98653afe9ffac2e43668f67", + "https://files.pythonhosted.org/packages/1d/de/66bcf9244d118663b2e1aaded8990f4640e3d7b7411870a5765f252074d2/cryptography-50.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl": "sha256:d8947001be83df1394050758ce0e745dd74fb134eef0a4b5124208dfc3a68c37", + "https://files.pythonhosted.org/packages/21/69/64cef1f702bf6657e0cc186ed1a2891d50d29fb41586b254e1c07adea261/cryptography-50.0.2-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl": "sha256:630ebfea3bf689d075f82316324ff7433dc447fe6bc1bfc76524b74b4a9567d2", + "https://files.pythonhosted.org/packages/22/f7/70fd7ae4d1dbfa7ba29b02e1b9068771519a86027756510b700ce81086a8/cryptography-50.0.2-cp315-abi3.abi3t-musllinux_1_2_aarch64.whl": "sha256:6f8700550aa1474a91e5dc07049c46f98b423b5b1ddd0483e0b51362eeeaf5be", + "https://files.pythonhosted.org/packages/23/ad/ac987755d00e1e64273760228d2635ae38dae2be83e3c6e0d3289d91dec3/cryptography-50.0.2-cp39-abi3-macosx_11_0_arm64.whl": "sha256:0ec5f09541743261e66e291b4a0cbf0fb2997aeaab6d9e9c740b9dba1b58d1c2", + "https://files.pythonhosted.org/packages/24/95/83378121ef3eaaaf71d4b781577ff794acb39b9e1b87a3f156898c8497ed/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_34_x86_64.whl": "sha256:e105ab60406787da31fccc883fc0f733af1efd78f0136a4599692c4083a73d0c", + "https://files.pythonhosted.org/packages/2d/49/93f6a6e7a87c9aa68d44d3e1cdb5fe8f60c90d5d2f46acae9a56892816b8/cryptography-50.0.2-cp315-abi3.abi3t-macosx_11_0_arm64.whl": "sha256:edc3342adf8f697fc5f59c887a304356f147b397809440ed64e2fa6af2f50f37", + "https://files.pythonhosted.org/packages/30/96/01546c7f69ea0e2ab790a2e4f0934a4052fb9b388147fbf83c2fd72f1e57/cryptography-50.0.2-cp314-cp314t-manylinux_2_34_ppc64le.whl": "sha256:84f964e537f916e2cc85199e5a88742e964939b575ac8598b3f9d6cc416cdaf1", + "https://files.pythonhosted.org/packages/36/8b/e6d153808bf353e152abd2fd4d8f09670d956ac78379ac46e60d7efbf04c/cryptography-50.0.2-pp311-pypy311_pp80-macosx_11_0_arm64.whl": "sha256:3dc4fd8058cea1644971207d530e1a03a184a805ffc8ebdddf0599d78a331b81", + "https://files.pythonhosted.org/packages/38/6b/61a3f8d8c5e1e49a6cddccafc4015cc1c0021360ab0acb4080e7a423644a/cryptography-50.0.2-cp311-abi3-manylinux_2_28_aarch64.whl": "sha256:f9f6143a8c75945eb960d9eb98905a441394abfa24afaae239d514ffb2586480", + "https://files.pythonhosted.org/packages/39/d1/55f8a3f2ef5d1529e16835ef10cf0fe3d559ce237b46dddc440c0bba3649/cryptography-50.0.2-cp315-abi3.abi3t-win_amd64.whl": "sha256:c423ab384a46c4dff7217b2ea5ba2e11cffdeab6441acd04cf65a369caf0366c", + "https://files.pythonhosted.org/packages/3c/3f/86ff33ce34cc0de6847fb96e035a1a760d81652e38643f617c02ad32ef7a/cryptography-50.0.2-cp39-abi3-manylinux_2_34_ppc64le.whl": "sha256:a6557e5f38e065ca9fbdaf7cfc7435ecb1d113aa81a022d1b51921ee7432e227", + "https://files.pythonhosted.org/packages/40/cf/6b5c8e2fd9202d98988ab7cb5cc5c991704c4ad55f492ff408e4969f83f1/cryptography-50.0.2-cp39-abi3-manylinux_2_34_x86_64.whl": "sha256:1981f1db4630889b9ef7803fadef12b056f428cb6b85c27ba57b774793b6093c", + "https://files.pythonhosted.org/packages/45/67/e18fb65592451a2acb76e9f2fbe14e0f47a8318b4c5430f1633851d03daa/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl": "sha256:eef4c2f3423810b3070ab391f85436d2f8bbfcb286ac15cbc73190b3563b1f1a", + "https://files.pythonhosted.org/packages/4e/c6/62c77550edfa5ca3f14bf44a1e6739b9fa09d6e998a11d97ed8213bccc98/cryptography-50.0.2-cp314-cp314t-manylinux_2_28_aarch64.whl": "sha256:a9f7355e6fab51f6c369b86fb7571cffa05edee2c2121e0380a37fb9ac1cd5c1", + "https://files.pythonhosted.org/packages/4f/87/ef344a9e616871f2519c22d6afcda79ddd5d35e9592d95eb6e677608d055/cryptography-50.0.2-cp39-abi3-manylinux_2_28_x86_64.whl": "sha256:f21e8a22c8605750c7af886bab299a363721264061b4ac0a30efb73cfd58efc5", + "https://files.pythonhosted.org/packages/54/44/e80651ecbf0e42b62e2bb5f5768916e07eea72e1297338956a61df361f88/cryptography-50.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl": "sha256:8c71ba2cd31fc93748c38e1b613200ff1c2665cbfd5341fe3a61cfde35a1430e", + "https://files.pythonhosted.org/packages/68/e3/f2298d3bb55e0c4a91841ec4d01b3f020ba8c5fbf15ccdcc6dcf03f97025/cryptography-50.0.2-cp311-abi3-musllinux_1_2_x86_64.whl": "sha256:85d0d9a31b9098e98534226d5686b47264b95e62ce459dc2e62fdfc809f9fe93", + "https://files.pythonhosted.org/packages/6a/64/72bc3f75176e7e406b748a3e3830432b8c51297b38368713df04dc04898a/cryptography-50.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl": "sha256:ab50ee449bf968271e820086f10a33d101dd060370abc10bcd22279be2656539", + "https://files.pythonhosted.org/packages/6c/01/03263395f74d50b071e9e66daace3f8bef80493e5d410726f2ba8554736b/cryptography-50.0.2-cp314-cp314t-manylinux_2_34_x86_64.whl": "sha256:828d49b0ff5a0e3975865571c5d91dbbdd0d38d8289b249a163e9425413a5e05", + "https://files.pythonhosted.org/packages/6c/5d/906970b83bbfc1f5bbfb677a143c181f2801f23b6a7204a3b47c42c97e65/cryptography-50.0.2-cp311-abi3-musllinux_1_2_aarch64.whl": "sha256:25784ce8b9621c90c643efb9e1e2162ab3b0224cae446ad5e70e7fcb1ce18b51", + "https://files.pythonhosted.org/packages/71/37/6202e488cc1eb625ea110c292c6bda92823176e023f427d8d5660ce8d632/cryptography-50.0.2-cp311-abi3-manylinux_2_34_aarch64.whl": "sha256:87e9ce85beb6b328ba370cc6e6aea483c92617b4c95b1d33a49297eb662bfb04", + "https://files.pythonhosted.org/packages/7b/2e/7212ca32fd43dc91f2f41db20160b268098874b4c9a0e7be94d6835f5b2e/cryptography-50.0.2-cp311-abi3-manylinux_2_28_ppc64le.whl": "sha256:a582ab2ae1d34f67112cadc86702774c9ea4374df6bca6afe672817203c99134", + "https://files.pythonhosted.org/packages/7c/52/9af10e80ac16b0fcc2123f9cbd5e7afbd0fd5075bb7a607c592258a39cda/cryptography-50.0.2-cp311-abi3-manylinux_2_31_armv7l.whl": "sha256:ac9ed99d81760c62fe89d5f0815cdfa1ba9a35141cf30f1c2d044f04b4803d2e", + "https://files.pythonhosted.org/packages/83/28/38fdce17e60f6b825e69fc3b7f75e70a6612759980704697e1de4cbfaf6e/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl": "sha256:7c6d0330c472d96f6a6afe24d80dfdf15176c33096f0a4397ae4c60f3dd3be48", + "https://files.pythonhosted.org/packages/8b/f9/36b3022218ce75b7cdf068fb95f809f9bd0d820e4955ef43b90c255cc7ac/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_31_armv7l.whl": "sha256:d38cdff612d06fa6a32840d5e1b1f7a27cee4a349aa9085d94a67789d6bfd408", + "https://files.pythonhosted.org/packages/8c/72/20f99a219f6af47cdd1cbd978c243b92d71496e168a746138af44ded4f29/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_34_aarch64.whl": "sha256:fdd28f912fccfec1846a94e2e1e8f9b0012f557f0c46fe4f3eb0d7a87afcf90b", + "https://files.pythonhosted.org/packages/8c/75/32ac2a56243d778805c16ca6a32b8f74fb757df7e28d7ecb560afafb59cf/cryptography-50.0.2-cp315-abi3.abi3t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl": "sha256:d370b8d1dfcdf7130178137f6fbee6140774a1acc6cacefc4b42643ec11d0a3a", + "https://files.pythonhosted.org/packages/8f/30/e86d7d518489b0ae2497091a35287abcb1a2ce4037837a34afbe9b1d6964/cryptography-50.0.2-cp311-abi3-manylinux_2_34_ppc64le.whl": "sha256:f265528741e048bce55c3463ed721fb0aa45a5888d8add8cfeccb3035451bbdc", + "https://files.pythonhosted.org/packages/90/5b/f2fdb13cd0b96f6f932c8627bb292a45f11c64d21620a8e120aee9a3b848/cryptography-50.0.2-cp39-abi3-manylinux_2_31_armv7l.whl": "sha256:9c8402a82ea0dc4ceeab793db05f0fafa8ca139ca34fcde5df0f596103c74107", + "https://files.pythonhosted.org/packages/92/20/9ded6d51ddd9897f6b6e81fb9ebea7951d7cc5d6c890b0ed8abf77a51a80/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_28_ppc64le.whl": "sha256:b13478603dcd0a2479ff8e87e2c19a7d525734686fe3c49542472293a204212d", + "https://files.pythonhosted.org/packages/9a/4f/adfc442765721292fff86d314ce385d3249d22db42295c0dd057727b60f3/cryptography-50.0.2-cp311-abi3-win_amd64.whl": "sha256:7afa5a6602a9f29af1f3a2965f831bae7c9d5d597b7cbb716d41ab3b7d89879c", + "https://files.pythonhosted.org/packages/9d/af/182eb91b0df3fe75c4d9f26fe70684569566745f6ba7e5c9c73a862c5252/cryptography-50.0.2.tar.gz": "sha256:7b46165bb56eb4704e2eaaf86f3c940d19154535d9b0ca7d6d590b04060e00d5", + "https://files.pythonhosted.org/packages/aa/9a/6f2f0304d634ceafdeaf23e84537336664ac419b5d07611675c2ad3f6b7a/cryptography-50.0.2-cp314-cp314t-manylinux_2_28_x86_64.whl": "sha256:241449bf940a5d27309bd317e6f9a2af6932113818bb2b8f5c59ddc7ef16da18", + "https://files.pythonhosted.org/packages/aa/a4/2c8d734e43d97f0842ee9f1b7b4bfb3d0cf5e19edebf43c2afe6675c2320/cryptography-50.0.2-cp315-abi3.abi3t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl": "sha256:f2f9bd7f90c64fe89253f0a2c05e3c4856072660429ce8831b4235bf29403a67", + "https://files.pythonhosted.org/packages/b6/b1/d9121a717e0f893c64bd6ca7702614778d7df2a5c309128a002421788516/cryptography-50.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl": "sha256:1ba34f04897fcdaa73f74145c25f3ec146fbd56593853e88adc2e811303c5f42", + "https://files.pythonhosted.org/packages/bc/ce/7e4f662b1e3c393513569e402cfc85ac7da0bd3d5435e122a3140219eb2d/cryptography-50.0.2-cp39-abi3-manylinux_2_34_aarch64.whl": "sha256:0ddc924c04591c2811ca024d62ecad4f7f6f08af8939c211438f48a16bd23602", + "https://files.pythonhosted.org/packages/bd/e6/db28a28c7b6c676addce89136de3d8db49ea825a8c863472e36e42ead4ad/cryptography-50.0.2-cp314-cp314t-manylinux_2_34_aarch64.whl": "sha256:4a20ce1e5cb4284a86692fdcba7cb8754185c6b2e5c56fcef3751cf451d3cdc2", + "https://files.pythonhosted.org/packages/bf/f1/1c1f6874e8550cfddd4b688ceb38cefb6ed15ceed224d56f133f3d88c214/cryptography-50.0.2-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl": "sha256:ee247f5c245c9a2fe7c8e2214e295918838e44e00a45a6718451e4004219e767", + "https://files.pythonhosted.org/packages/c1/63/61b15dc1a8de03fe0adbe3fd7608b3ad5c73bf50993bbcb1faaa930afe33/cryptography-50.0.2-cp39-abi3-manylinux_2_28_aarch64.whl": "sha256:dfe9763530994147d9af1def057a5b9658b00e8f8fe8743d144d1e0911c2e454", + "https://files.pythonhosted.org/packages/c2/58/ee288c829a6f41f6235ae9dd33d82fd19b45442b65b4c8a3da36963d9f7a/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_28_aarch64.whl": "sha256:e275096ea1e60cc595cda2836fd4a6c725d1125108b868be17f53684d164e2cc", + "https://files.pythonhosted.org/packages/ca/1d/1271f287ff7170ddafc2aad36260c4eec20ccd2fea70f38455e9d56d427b/cryptography-50.0.2-pp311-pypy311_pp80-win_amd64.whl": "sha256:7b75de3c8b3be1cdb1052747c929440c3eea46c1bc2cb8a6e3a48388e9b7b452", + "https://files.pythonhosted.org/packages/ce/cb/52eb3770c0d0be2702a98c6e96065ddc0a2877cf0845aa9c23397c142cd4/cryptography-50.0.2-cp314-cp314t-macosx_11_0_arm64.whl": "sha256:f785f6161f202ab04d8ca194158968798e480ca058943907972da5f12e2881e8", + "https://files.pythonhosted.org/packages/d3/69/2c833a049475e0a3444e94c7d0aca0aa51d166374a449b09e92ac98138de/cryptography-50.0.2-cp311-abi3-manylinux_2_34_x86_64.whl": "sha256:9dab55f57c74c3cad24c323bacbbd04be4705ba6eb0d92e920b1fc4837ed5079", + "https://files.pythonhosted.org/packages/d4/aa/f3f6e0de7e6253b8baa8b2d8fb9d50924fa75cee3d4624bd4bc1208ee923/cryptography-50.0.2-cp39-abi3-musllinux_1_2_x86_64.whl": "sha256:ce47f66801c20ec6c6632453bb5960fe38939e9306970b48b3a5a26de7745d94", + "https://files.pythonhosted.org/packages/d4/be/688367b74de86984bd58d8efacfc7c9e68b89a6a22ced0fb4f38db50254a/cryptography-50.0.2-cp315-abi3.abi3t-musllinux_1_2_x86_64.whl": "sha256:c71be1cbfa5cd9a41ee452acf1eccd82b2c05950358b106ec8ceb83411d1a020", + "https://files.pythonhosted.org/packages/d5/8d/6d585339bedf85d45044c85d8412dac53f2bb6f918e8b7777efba1787844/cryptography-50.0.2-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl": "sha256:c5e67125c7dca78d199ec4e116aa93dbb83494808ecbb8211a2cb09b1bf41dbd", + "https://files.pythonhosted.org/packages/d9/69/c9bd862c3bf43d6399c433caf002df16e2dffd4be49bdf515cda38038711/cryptography-50.0.2-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl": "sha256:79def8d059362e7831389ed3be0ecdf58a89386e1271e35dd9f5af84e81bffd0", + "https://files.pythonhosted.org/packages/e5/56/d194340cc4a57535e82e1bee9e89667ac4b7c13b5d3f59686deae3094dd5/cryptography-50.0.2-cp311-abi3-macosx_11_0_arm64.whl": "sha256:fa8f5efb344d6908a1ce62f4a24e2e5780f825d6f53f5f50ec5ffacac72936cb", + "https://files.pythonhosted.org/packages/eb/94/2bfe8f29ec0cc9c0d99359c4161adf32858e4934b72c6d100d2ac0bbe962/cryptography-50.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl": "sha256:deb9fde5c60e437ee4821bc9bc39ff31b42135c27e1dc61ef0a629389c1de62e", + "https://files.pythonhosted.org/packages/f2/20/196f112617fb08eb4d608a2a6c422373d46f9cc2857f38fc0667033c0899/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_34_ppc64le.whl": "sha256:cbc8738fd8526d80f35cb3a40d41f41a2e7030bb3b18b09a6778ef63d291c2fd", + "https://files.pythonhosted.org/packages/f4/37/cce70f150c432914460157a6ecc161752e053aa5ec0ef3b3f7dc6e31039a/cryptography-50.0.2-cp314-cp314t-manylinux_2_28_ppc64le.whl": "sha256:94e5e9f108ee10471288214d3d233fbfbb492840a8457eb85178d643ddeb32c7", + "https://files.pythonhosted.org/packages/f6/b6/a1faf3a27ae9405fb34b1713cc73b2d8a26b04d5c561578fa2e6ef3e5bb9/cryptography-50.0.2-cp39-abi3-win_amd64.whl": "sha256:4e81d95e5bafc2d6e34e4bed780e53e4d5b9a2f928573428aa4d35fbec1eb0de", + "https://files.pythonhosted.org/packages/f8/cc/1d33befb3cd7ea7e77d2d73f43f2066471da1b21f24a6156efcaabf6d2e8/cryptography-50.0.2-cp314-cp314t-win_amd64.whl": "sha256:78198641e5be9521beea5aa782bb551a58068d10e6eb04c9c680c1b69f2e7d45", + "https://files.pythonhosted.org/packages/fc/35/b345bdfa40c9126df1a9d33236aa98418367931b8725f84fc3ae2b98dc59/cryptography-50.0.2-cp39-abi3-manylinux_2_28_ppc64le.whl": "sha256:58ddb5a8e3179d12f19e4ea34d2d32e9d63a4baa142c875c1eb59f41b7243acd" }, "docutils": { "https://files.pythonhosted.org/packages/32/91/30151a39f7570f448ed84529390628a651d7f27c87d73c9b887f8189695e/docutils-0.23-py3-none-any.whl": "sha256:25d013af9bf23bc1c7b2b093dff4208166c53a94786c9e447808335ef1185fea", @@ -626,12 +783,12 @@ "https://files.pythonhosted.org/packages/6d/04/c2156091427636080787aac190019dc64096e56a23b7364d3c1764ee3a06/id-1.6.1.tar.gz": "sha256:d0732d624fb46fd4e7bc4e5152f00214450953b9e772c182c1c22964def1a069" }, "idna": { - "https://files.pythonhosted.org/packages/57/b0/0e52c878c53f245edd3a11020f20979b3f490f245af532c7cae3027754b5/idna-3.19-py3-none-any.whl": "sha256:815e7be7a7806d54abb586dc943addc79e8b2ee16915059658cbeff4b1b43bf4", - "https://files.pythonhosted.org/packages/5f/f7/abb373e5757eaec4b922b92f97ec8d6d7e057cf06778247604fbc4e7c3f3/idna-3.19.tar.gz": "sha256:5e0811a4383b21dc5838069f801c4fb62113b7447663d2530d2bd6e77b49bf15" + "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl": "sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c", + "https://files.pythonhosted.org/packages/f5/08/8eea9d4b8302028f3abb2c0813953f7aec26d33b7a8960ed760e65ff29fa/idna-3.20.tar.gz": "sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44" }, "importlib-metadata": { - "https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl": "sha256:2d21d1cc5a017bd0559e36150c21c830ab1dc304dedd1b7ea85d20f45ef3edd7", - "https://files.pythonhosted.org/packages/a9/01/15bb152d77b21318514a96f43af312635eb2500c96b55398d020c93d86ea/importlib_metadata-9.0.0.tar.gz": "sha256:a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc" + "https://files.pythonhosted.org/packages/6f/7e/1e7e8dc30634b93ebb3d58a3dea569ad146e656218d3960ab04f62047b29/importlib_metadata-9.0.1.tar.gz": "sha256:ab830580bc0ef3db61ce8fae716389e5462b67e033018bab6d8f80ef17172f99", + "https://files.pythonhosted.org/packages/b3/55/ecca97ae19075f1fac62def77731e7f535e6c1fb8f92ff08160c5e6dade8/importlib_metadata-9.0.1-py3-none-any.whl": "sha256:bba5600596a7e21f3eef53281cf28d6a5195634d2f2b78ff9501a3272c6eaab0" }, "jaraco-classes": { "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz": "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", @@ -666,33 +823,33 @@ "https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl": "sha256:4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192" }, "nh3": { - "https://files.pythonhosted.org/packages/09/a1/ea83abe738a3fbaa203dfdb836ca7cbab0e7e9609faaee4fe1d4652599c0/nh3-0.3.6-cp314-cp314t-musllinux_1_2_i686.whl": "sha256:edb2b4a1a27523e6cc7c417f8d21ce3d005243548b93e56b762b66b0c7f589f9", - "https://files.pythonhosted.org/packages/0a/13/6f1e302ca674ac74362e150848ad56a1be5145391204f74facdb8e94df12/nh3-0.3.6-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl": "sha256:455469a29951edc92bc48b47ac2281c3f2609e6c4f6a047056449f8c2c23facf", - "https://files.pythonhosted.org/packages/0e/24/a0d80182a18919665fefd19c1c06f1d1df1c9a6455d0252de40c034a0bc3/nh3-0.3.6-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl": "sha256:e6b7beece07525dc6e6b0fc2f104442de2ba328360ad00e50cbe2e1fd620447d", - "https://files.pythonhosted.org/packages/11/f9/3966c61455668c08853bf5e33b4bed93c421f3194ce4de896dc248d6f6ce/nh3-0.3.6-cp38-abi3-musllinux_1_2_armv7l.whl": "sha256:f5ed5fe84aee7f39db95c214a7421bf0499fbf500fec6d86a4e29bfc37971438", - "https://files.pythonhosted.org/packages/17/0c/6cdb5ee1e127be50dc8391e54bddc1f64e87bf4bfad0c55633320e2e02db/nh3-0.3.6-cp38-abi3-musllinux_1_2_x86_64.whl": "sha256:36d06341bd501240d320f5942481ed5e6846136b666e1ba4faf802b78ebc875f", - "https://files.pythonhosted.org/packages/19/d3/479cb4ae440424825735d60525b53e3c77fd60fd6e6afc0e984f00eb0178/nh3-0.3.6-cp38-abi3-musllinux_1_2_i686.whl": "sha256:082675ff87b9385ec430ffe6d5847ba7456cc39b73720cd4add472f9f4cffd56", - "https://files.pythonhosted.org/packages/25/bb/431615ba1d1d3eb63cde0f974f2114edf863a8a3f6049a12fed23fc241d3/nh3-0.3.6-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl": "sha256:44673b27010051ab5a5e438a86ec31bbda61d4a77d7e900af6b7be3037c1abae", - "https://files.pythonhosted.org/packages/30/a8/fb2c38845efb703a9173bffdfc745fc64d2b0e55cfc73a3647d2f028250c/nh3-0.3.6-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl": "sha256:2f90d9a0cfdbee218994fdaaeeb5a0fde62d08f35e4eef0378ec1e2200172fd0", - "https://files.pythonhosted.org/packages/36/ea/5542f3c45da4c00290d9d67a65e996702e23e613c4b627de3e09cb9fe357/nh3-0.3.6-cp314-cp314t-win_amd64.whl": "sha256:4713502748f564fee0633b37b3403783ce0a3af3a3d148ad91025a5bdadb7bc6", - "https://files.pythonhosted.org/packages/3c/a6/bfaa00046e58603507dcfc266c4778e3ab7adf68a5dedd73b6274b8d9314/nh3-0.3.6-cp38-abi3-manylinux_2_31_riscv64.whl": "sha256:25c733bee928530556b1db0ea46c52cf5aa686146e38e60a6fc7cb801ef91cec", - "https://files.pythonhosted.org/packages/41/21/e1084ab18eb589506335c7c7576f2d4643e9a0c0e33983ef0e549a256b96/nh3-0.3.6-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl": "sha256:e1b160831c9cdb06a6c79c2f9cdb11386602938f9af260d1c457a85add4f6f69", - "https://files.pythonhosted.org/packages/49/09/0d8e3101636d9ad88cdefb2914e764cb8e876ebdbb4286bfc251277d9c67/nh3-0.3.6-cp314-cp314t-musllinux_1_2_armv7l.whl": "sha256:889932a97fb4abb6f95fef1914c0d269ebfb60011e67121c1163059b9449dbb4", - "https://files.pythonhosted.org/packages/4b/4a/526f199626bfcb496bc01a268051b44737962005553b158e985ed7e64865/nh3-0.3.6-cp314-cp314t-musllinux_1_2_aarch64.whl": "sha256:f2f14b7ae1fca99c4a66c981aac3974e7fbc1ca30a12673d223ae1df76680917", - "https://files.pythonhosted.org/packages/59/62/5b6108bedaef2b2637fed04c87bdbcb5967b9961758b41f0e466ef22a022/nh3-0.3.6-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl": "sha256:34d2b0d934156b87ee114f599a3ba9b8b9e17b5d79652ba3a13fa50903de965e", - "https://files.pythonhosted.org/packages/5b/67/314f6151bad77a93d751978a344033e1fc890822f05f0416079338e34231/nh3-0.3.6-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl": "sha256:905f877dc66dd7aea4a76e54bcb26acb5ff8216f720c0017ccf63e0e6035698e", - "https://files.pythonhosted.org/packages/5e/1b/ef84624f14954d270f74060a19fc550dd4f06656399447569afb584d8c06/nh3-0.3.6.tar.gz": "sha256:f3736c9dd3d1856f80cd031715b84ca75cda2bbb1ac802c3da26bfce590838d7", - "https://files.pythonhosted.org/packages/66/35/26bd47e6af5915a628281dccdac354ddf4e32f7397047894270acd8c9870/nh3-0.3.6-cp314-cp314t-win_arm64.whl": "sha256:69bbb92865a693d909db3a700d3c01537533844d0948c1e9323561ce06ecda41", - "https://files.pythonhosted.org/packages/66/69/0654482b8635012fbae67826bd6c381abb05d841ac7388b9b4666300fdad/nh3-0.3.6-cp314-cp314t-musllinux_1_2_x86_64.whl": "sha256:43bc1ed3fa0716295fabee29ba42b2667e4a51d140b0a68e092170a765474fa6", - "https://files.pythonhosted.org/packages/68/17/06e72a18ee9b572914447338237ca7eb164c0df901f141bc10d1282247a2/nh3-0.3.6-cp38-abi3-musllinux_1_2_aarch64.whl": "sha256:82ca5bf427ad1b216b65ede1a2e2d87dc49bec417ceba0f297213107d3cd9d78", - "https://files.pythonhosted.org/packages/7b/e5/7cafee2f0413ca4cb0ef3bd111e94d408a48810008b283ad8aee00dd1809/nh3-0.3.6-cp38-abi3-win_arm64.whl": "sha256:69f365963f63a1e9bff53bdbb3c542c7c2efed3e163c9d5d83a772a2ac468c21", - "https://files.pythonhosted.org/packages/82/fa/2b5d684e3edf1e81bfd02d298c78c3e3da77ca1d8a2be3183a79544a7548/nh3-0.3.6-cp38-abi3-win_amd64.whl": "sha256:f338ac7d594c067679f1e99b4f5ec3906842979560f9d8f15d6bdfa39a353b10", - "https://files.pythonhosted.org/packages/99/3e/6506aa4f23dc7b7993a2d0a45dca3ce864ec48380adfe15a173e643c63e8/nh3-0.3.6-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl": "sha256:2411e8c3cee81a1ddd62c2a5d50585c28aa5566d373ad1db92536b95ddb24ef2", - "https://files.pythonhosted.org/packages/b0/94/f48d08e6f72a406300fa11d8acd929fea1a80d4bf750fa292cb10785f126/nh3-0.3.6-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl": "sha256:d14bf7982e7a77c0c775634c29c07ce08b38a046df73e1c1f139b3e82f18a38e", - "https://files.pythonhosted.org/packages/e3/e1/e96e7864a7a53bd6b6fab7e9632467382a2a2c1f3fed951918ad131542fb/nh3-0.3.6-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl": "sha256:e196fa70c2ff2eb4de7d3df3108f8f358c1d69dff20d45b11f20a5aa227ffb6d", - "https://files.pythonhosted.org/packages/e9/55/9de666ad975d6ccd77d799ea0add55ee2347aa81286ce21b2a97c070746b/nh3-0.3.6-cp38-abi3-win32.whl": "sha256:5276ef17bdba9ad8040575c74072008b13aae429436e9d0429e718bb5f90f4da", - "https://files.pythonhosted.org/packages/ed/a6/1f7285ffadc8307c4dbeb08d21b920536d5117785056d1079e998c4dfa44/nh3-0.3.6-cp314-cp314t-win32.whl": "sha256:597a8e843bea00b2eb5520658dc24a9bb032e7fc9e7c2c0c4cd29420220c9796", - "https://files.pythonhosted.org/packages/f3/ab/a7653bce9a3b204be6a6931767a9e23595807bb84790ce6685e4d7e5bd08/nh3-0.3.6-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl": "sha256:a43ebd7543555c3ac1bc353023d0794e75cb76f6f18f19c32e95441496c0cc25" + "https://files.pythonhosted.org/packages/00/0c/1a8985fd43fea5530c0ac890b6f0b423770ee72f111b70b7a77f2dec243a/nh3-0.3.7-cp38-abi3-musllinux_1_2_aarch64.whl": "sha256:d56e76bd3cadb09b6b0cef364850811663734b348a25f5f587a2819c495367bd", + "https://files.pythonhosted.org/packages/04/5c/aa1468e3e281e78d2b3b7d762ccba59f681af355e971dbd255d5903f7b86/nh3-0.3.7-cp314-cp314t-musllinux_1_2_armv7l.whl": "sha256:94fd6e59553fbb9ffd8ba71bbd5a54e3126ba01799a097ae30d5341d750bc6ac", + "https://files.pythonhosted.org/packages/07/42/a687e7091928806e514f89fa2666f25ec9bfe0a902fc4402b25e51ce408b/nh3-0.3.7-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl": "sha256:f266d3f1b3647449923a8e406524632220dd5d8b647078dfe45b885d33d10479", + "https://files.pythonhosted.org/packages/17/40/2a0921d45b20828708bcb56887e47dcf8cae13818de5bf9a01308d348712/nh3-0.3.7-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl": "sha256:19f288c938ec6eef1f5d2c6cab47838e71fef8097e1c1233802be5a6230ba086", + "https://files.pythonhosted.org/packages/18/2f/022b27146d52d24b1b353b003359134788ecbcd6fcdf6283adbd57c0fbc8/nh3-0.3.7.tar.gz": "sha256:71860d01c16f4d8c72e334e0674beb2b0899dbd0bf760de18932ef4390303848", + "https://files.pythonhosted.org/packages/1d/18/3ab564595cb88196f50d26e163ed0fd2acc731ab26ac615df91981885887/nh3-0.3.7-cp314-cp314t-win_arm64.whl": "sha256:157ec1eb7a62f3d9a7badb8d82d89aa810e3e24e097eedfa481a25d0c8a99877", + "https://files.pythonhosted.org/packages/1e/60/847a21339f095c4d4c655af31fa2d18b174585bcc210709facacc7ce205c/nh3-0.3.7-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl": "sha256:eae64328e46a25785535afcb6885b6f182ecaf5ee8c88f8c075422db8aacc65b", + "https://files.pythonhosted.org/packages/20/64/9e36594efad6c290de4240d02cb2bd80c339a4ab1c4de66e599ffa6d9d81/nh3-0.3.7-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl": "sha256:bc42bb1193c1e28a1e74c2cabaca178e118a7103e8832699fef8a2b3e2496493", + "https://files.pythonhosted.org/packages/26/a4/c3423351e8d864ad756e85e15f0c01433361f14d34e4ed156482c0518f2a/nh3-0.3.7-cp38-abi3-musllinux_1_2_x86_64.whl": "sha256:6698a822132beedab80f131c08d8d0ac5a178ddeb488d02ca4b67716ecfac7af", + "https://files.pythonhosted.org/packages/42/e5/ae8c0782fce74fb6fcf7234bb3d4017f37ce181b4f9d29369eab21c50a04/nh3-0.3.7-cp38-abi3-musllinux_1_2_i686.whl": "sha256:15f5fbf090f5c88d61c820e1fc1fceecb6520cca9fe85649c06b57ef9dc9ff62", + "https://files.pythonhosted.org/packages/4b/6a/478f153f1d7c0baaa3d1e8bb5fdcee3a6235f90fe44ea969a9d4e2b8c47a/nh3-0.3.7-cp38-abi3-win32.whl": "sha256:6e4280115d44c3b278eef712a86748c1a723105cd79feec46952383117ab4e59", + "https://files.pythonhosted.org/packages/6a/9f/57d186d9d3dd38905dc12dddb3484406cdf6aa0b1ce33639a2d277d4ee1c/nh3-0.3.7-cp314-cp314t-musllinux_1_2_i686.whl": "sha256:18f4278ecd157d43cb35acd5aae9f35cfa79f546b4922bd86536adc0f6312102", + "https://files.pythonhosted.org/packages/6b/53/097a5ad0b34b15d67a472ef849165a54209fa5fbd3e639801c6fe439ba28/nh3-0.3.7-cp314-cp314t-musllinux_1_2_x86_64.whl": "sha256:808def0c8c07843e6e50dc84f532457bfa2cfd17417b219a5d9e7c773709331a", + "https://files.pythonhosted.org/packages/7b/7f/1a103e00aaf5e59f2dee4c2709aac609bb2d4bb74fddaf0dcfade11ed87b/nh3-0.3.7-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl": "sha256:4968fe8d2db97c6f047659bf46a449fd8ec377f44ebf3e0a1b96c0d3a333ae32", + "https://files.pythonhosted.org/packages/7b/e3/3212c1a5b5745245d7f18885207bbddb34c56075f34dd682bd539aad55cc/nh3-0.3.7-cp38-abi3-manylinux_2_31_riscv64.whl": "sha256:5ffdfcb9a686ffb12765376bcfb6b5b55728516d3c0ee317d29982381ded3df8", + "https://files.pythonhosted.org/packages/85/05/b0e6bef633549a23347d5462aa288fcc42381e7918482062ca3cb456242a/nh3-0.3.7-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl": "sha256:e8fd1ab205258b29254f72db377d99e2c96aa7653ef3b015ccab0420b094b506", + "https://files.pythonhosted.org/packages/93/a7/02dd159d4e71f98607d8d4249cddb7561e77be1a8e4dec77d76e1b68fc99/nh3-0.3.7-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl": "sha256:9b7279d43323a25225df23576af6594a16693f61431170848b8b2ac21ad4f174", + "https://files.pythonhosted.org/packages/94/0d/c257754bf57f829f307aa226bbe136d3a1356b5a0d08324c7b6bd2a8aacd/nh3-0.3.7-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl": "sha256:6c3aa50eb26e9228238271db9f983cbc3b006dfbfeca2d4dc34c33ddc6ac5ea5", + "https://files.pythonhosted.org/packages/9a/a7/c57a2c70534418310889a65ccfac3525e62f0bc0a8613225903403755ce7/nh3-0.3.7-cp314-cp314t-win32.whl": "sha256:874b7d67a067bd29a59223f6270fc30da4edd8e6d87fd219fc93bcbaa662c946", + "https://files.pythonhosted.org/packages/a6/ed/c5510c615dce55b6fcc364aa1838142f938beed64f5e4927490dfcaf4405/nh3-0.3.7-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl": "sha256:70f5ac8626e899a4bab0ef74ca2f5bd602f49c7b739e6e5026b4afc6d63dac42", + "https://files.pythonhosted.org/packages/b2/5d/891e533b716cf00df76ad0ba6485dcfd14d59a6430a3cc99057c4c04004e/nh3-0.3.7-cp38-abi3-musllinux_1_2_armv7l.whl": "sha256:fd4a70efb45d5372174f718878eb7a35c12677626a63b2f103b23b833457dcac", + "https://files.pythonhosted.org/packages/b4/b9/34433ccb1f0fe6968dabbb7d4bf5721c6221878ef07832748c06655a6a80/nh3-0.3.7-cp38-abi3-win_amd64.whl": "sha256:618e3059caf41ccdf5dcccb3fa9df4cf6e4efe23d1382a8bbfca272a8a4f8bfc", + "https://files.pythonhosted.org/packages/ce/88/b594f0e86856b37e182fb663283da419eea6424972506e640e890885467f/nh3-0.3.7-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl": "sha256:91a4dab4e94d9fc54b9f67b1adfb23e81fab7ab43f33c3b8c97be9aa38f789ba", + "https://files.pythonhosted.org/packages/d8/4a/e9c436089a0c80b928011ead0efd156aa7639a19b6064ef58dcedcab8369/nh3-0.3.7-cp314-cp314t-musllinux_1_2_aarch64.whl": "sha256:be53a4825585f701955cb9baf49f478f56eb81e20294329fe4bc689dd5dd81fa", + "https://files.pythonhosted.org/packages/e4/d1/9d70e0e418a48280ec0ddc6c1b08b4b1136ebcc31a1625e57ff5c665fa51/nh3-0.3.7-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl": "sha256:de2b2aab32ea303405debefdcfc58043d3e635fa3f67b9eb140d2b0e0c0d2563", + "https://files.pythonhosted.org/packages/e6/b7/efda1d0a611d940bdfde6893bde1ea6b7b7d48c31273aea48e35b822fd58/nh3-0.3.7-cp314-cp314t-win_amd64.whl": "sha256:614dac4a4c36ad084e78447d16fe898dedd762e354a7ab9cda2984e82f67883d", + "https://files.pythonhosted.org/packages/f9/70/e140dffff6e808dc6343598df76e7e2407fd0f581de3524c75fba2e0cf24/nh3-0.3.7-cp38-abi3-win_arm64.whl": "sha256:f04b7d333b27f13ca439da3cf1c75c2fba34f104969f6ce4ac8e7079699c2f4a" }, "packaging": { "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl": "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", @@ -700,7 +857,9 @@ }, "pycparser": { "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl": "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", - "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz": "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29" + "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz": "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", + "https://files.pythonhosted.org/packages/90/11/0e6f11117525ff0eec40ebac3d313376f102df93ca44ad9e893ee85e4f89/pycparser-3.11-py3-none-any.whl": "sha256:51d5a8ba2be0bbe440b99d2112604c95bbbc3c2748a64260186c541e1729cd80", + "https://files.pythonhosted.org/packages/da/a8/c5fdbeee588bb8ada9458774f43adf1bdd30bd59157055142183e769a024/pycparser-3.11.tar.gz": "sha256:d875f09c3507d00e1aba0eecc6dcadc1352f30fff09dc6bff2f1c2935e97c2bc" }, "pygments": { "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz": "sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c", @@ -711,8 +870,8 @@ "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl": "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8" }, "readme-renderer": { - "https://files.pythonhosted.org/packages/02/51/d3a6ea424652c60f05600d8c2e01a55c913755e7cdad64afabbd1aa16f44/readme_renderer-45.0.tar.gz": "sha256:030a8fac74904f8fba11ad1bb6964e3f76e896dc7e5e71f16af190c9056696d1", - "https://files.pythonhosted.org/packages/97/1b/295bf2fa3e740131778065e5ffa2c481f0e7210182d408e9a2c244ff5b0c/readme_renderer-45.0-py3-none-any.whl": "sha256:3385ed220117104a2bceb4a9dac8c5fdf6d1f96890d7ea2a9c7174fd5c84091f" + "https://files.pythonhosted.org/packages/25/d7/9309494fad74ee831d4546f69325b5519f37c6dfb2d9ba495db8c6d4f4ca/readme_renderer-46.0.tar.gz": "sha256:af3e964914f6310a33ff67b72a4bdd940bed8d7c3bdecd2d14f40edf284bfe90", + "https://files.pythonhosted.org/packages/4b/72/ac5ca81fe9121fcaa9d828d21017cba00a16a98e4ea5fb60c878f93dda4f/readme_renderer-46.0-py3-none-any.whl": "sha256:d0dae1f74bb273b534770cb4cccb6bb78735540afdb03c2146f4e19dcd412560" }, "requests": { "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl": "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", @@ -743,12 +902,12 @@ "https://files.pythonhosted.org/packages/96/08/ddcdc06225eaad6de0e48e1002b06d919dbde20582d0662c7af51308e5d6/twine-7.0.0-py3-none-any.whl": "sha256:b854164df26db268af05f49aa5c0344b10e27a494343ff05b1e0bad3b135f5a7" }, "urllib3": { - "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz": "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", - "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl": "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897" + "https://files.pythonhosted.org/packages/92/9d/c4e665119135114480843e7ab388fa94d8480650450e6f8e26b70d323a4c/urllib3-2.8.0-py3-none-any.whl": "sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3", + "https://files.pythonhosted.org/packages/e3/05/b17359e1cefb4f909b5e40b1b90a496d987258916dbbf88e842c729f510e/urllib3-2.8.0.tar.gz": "sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63" }, "zipp": { - "https://files.pythonhosted.org/packages/3a/13/547360d81e6d88d58492968ffda9f9542854f11310ee556fef14260cc886/zipp-4.1.0-py3-none-any.whl": "sha256:25ad4e16390cd314347dd8f1de67a2ac538ae658ed4ab9db16029c07c188e97f", - "https://files.pythonhosted.org/packages/b9/d8/eab98a517c14134c0b2eb4e2387bc5f457334293ec5d2dd3857ec2966802/zipp-4.1.0.tar.gz": "sha256:4cb57381f544315db7688e976e922a2b18cdb513d21cc194eb42232ba2a3e602" + "https://files.pythonhosted.org/packages/b5/98/df615823cd9419131ce19fba00de53a663794369e198aade064a244b385d/zipp-4.1.1-py3-none-any.whl": "sha256:8979f52d874162f485ff2981e3891f3a3317b7a3dd43ff1e1775b9304f307a9c", + "https://files.pythonhosted.org/packages/dc/23/655a1802fe8041302c959774ca7c80b53bc24737ff3ef45cb50ef11bd96c/zipp-4.1.1.tar.gz": "sha256:7ebb7a44c021b29fd8dbd7cce6812d0d7b5b454521f93cc71af6ccd155aaa70b" } } }, diff --git a/tests/integration/compile_pip_requirements/.bazelrc b/tests/integration/compile_pip_requirements/.bazelrc index b85f03bcb6..05ca7bfdd9 100644 --- a/tests/integration/compile_pip_requirements/.bazelrc +++ b/tests/integration/compile_pip_requirements/.bazelrc @@ -3,3 +3,6 @@ test --test_output=errors # Windows requires these for multi-python support: build --enable_runfiles common:bazel7.x --incompatible_python_disallow_native_rules + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/tests/integration/compile_pip_requirements_test_from_external_repo/.bazelrc b/tests/integration/compile_pip_requirements_test_from_external_repo/.bazelrc index ab10c8caf7..fb11f5b00a 100644 --- a/tests/integration/compile_pip_requirements_test_from_external_repo/.bazelrc +++ b/tests/integration/compile_pip_requirements_test_from_external_repo/.bazelrc @@ -1,2 +1,5 @@ test --test_output=errors common:bazel7.x --incompatible_python_disallow_native_rules + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/tests/integration/custom_commands/.bazelrc b/tests/integration/custom_commands/.bazelrc new file mode 100644 index 0000000000..88cad8b7df --- /dev/null +++ b/tests/integration/custom_commands/.bazelrc @@ -0,0 +1,2 @@ +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/tests/integration/local_toolchains/.bazelrc b/tests/integration/local_toolchains/.bazelrc index 0fbb7678d1..ee70dd411d 100644 --- a/tests/integration/local_toolchains/.bazelrc +++ b/tests/integration/local_toolchains/.bazelrc @@ -8,3 +8,6 @@ build --enable_runfiles common:bazel7.x --incompatible_python_disallow_native_rules build --//:py=local common --announce_rc + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/tests/integration/pip_parse/.bazelrc b/tests/integration/pip_parse/.bazelrc index a74909297d..1ca4ceb309 100644 --- a/tests/integration/pip_parse/.bazelrc +++ b/tests/integration/pip_parse/.bazelrc @@ -6,3 +6,6 @@ build --enable_runfiles try-import %workspace%/user.bazelrc common:bazel7.x --incompatible_python_disallow_native_rules + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/tests/integration/pip_parse_isolated/.bazelrc b/tests/integration/pip_parse_isolated/.bazelrc index 227ce5a4cd..0ceaf23001 100644 --- a/tests/integration/pip_parse_isolated/.bazelrc +++ b/tests/integration/pip_parse_isolated/.bazelrc @@ -6,3 +6,6 @@ common --experimental_isolated_extension_usages # https://docs.bazel.build/versions/main/best-practices.html#using-the-bazelrc-file try-import %workspace%/user.bazelrc + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/tests/integration/py_cc_toolchain_registered/.bazelrc b/tests/integration/py_cc_toolchain_registered/.bazelrc index fb31561892..7c7caf3b62 100644 --- a/tests/integration/py_cc_toolchain_registered/.bazelrc +++ b/tests/integration/py_cc_toolchain_registered/.bazelrc @@ -1,3 +1,6 @@ # This aids debugging on failure build --toolchain_resolution_debug=python common:bazel7.x --incompatible_python_disallow_native_rules + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/tests/integration/runtime_manifests/.bazelrc b/tests/integration/runtime_manifests/.bazelrc index d4d45a5ea7..8c93874cc3 100644 --- a/tests/integration/runtime_manifests/.bazelrc +++ b/tests/integration/runtime_manifests/.bazelrc @@ -2,3 +2,6 @@ common:fast-tests --build_tests_only=true common:fast-tests --build_tag_filters=-large,-enormous,-integration-test common:fast-tests --test_tag_filters=-large,-enormous,-integration-test + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/tests/integration/toolchain_target_settings/.bazelrc b/tests/integration/toolchain_target_settings/.bazelrc index e1df951d06..4cb03b81e3 100644 --- a/tests/integration/toolchain_target_settings/.bazelrc +++ b/tests/integration/toolchain_target_settings/.bazelrc @@ -1,3 +1,6 @@ common --lockfile_mode=off test --test_output=errors build --enable_runfiles + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/tests/integration/unified_pypi/.bazelrc b/tests/integration/unified_pypi/.bazelrc index b3a24e8605..36e8549e1f 100644 --- a/tests/integration/unified_pypi/.bazelrc +++ b/tests/integration/unified_pypi/.bazelrc @@ -1 +1,4 @@ common --experimental_enable_bzlmod + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/tests/integration/uv_lock/.bazelrc b/tests/integration/uv_lock/.bazelrc index 511f8a2413..ac80834a56 100644 --- a/tests/integration/uv_lock/.bazelrc +++ b/tests/integration/uv_lock/.bazelrc @@ -3,3 +3,6 @@ common --experimental_isolated_extension_usages common --action_env=UV_EXTRA_INDEX_URL try-import %workspace%/user.bazelrc + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/tests/integration/validate_test_main/.bazelrc b/tests/integration/validate_test_main/.bazelrc new file mode 100644 index 0000000000..88cad8b7df --- /dev/null +++ b/tests/integration/validate_test_main/.bazelrc @@ -0,0 +1,2 @@ +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build diff --git a/tests/integration/whl_library/.bazelrc b/tests/integration/whl_library/.bazelrc index eee47a8f19..7591e29f40 100644 --- a/tests/integration/whl_library/.bazelrc +++ b/tests/integration/whl_library/.bazelrc @@ -1,2 +1,5 @@ common --incompatible_default_to_explicit_init_py test --test_output=errors + +# TODO: Delete before merging; see the root .bazelrc. +common --registry=https://bazel-contrib.github.io/rules_runfiles_group --registry=https://bcr.bazel.build From 951b17bd977dc80e995b7d1777fadf55b83129ca Mon Sep 17 00:00:00 2001 From: Frank Portman Date: Mon, 19 Oct 2026 10:26:55 -0400 Subject: [PATCH 4/6] chore: bump rules_runfiles_group to 99.0.0-dev.20261019.1.1cee2dd Picks up the analysis test comparing symlinks by path and target. --- MODULE.bazel | 2 +- python/private/py_repositories.bzl | 6 +++--- tests/integration/bzlmod_lockfile/MODULE.bazel.lock | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index 2481d377f9..cdc973c8fa 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -9,7 +9,7 @@ bazel_dep(name = "bazel_skylib", version = "1.8.2") bazel_dep(name = "package_metadata", version = "0.0.7") bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "rules_cc", version = "0.2.17") -bazel_dep(name = "rules_runfiles_group", version = "99.0.0-dev.20261016.1.41d2544") +bazel_dep(name = "rules_runfiles_group", version = "99.0.0-dev.20261019.1.1cee2dd") bazel_dep(name = "toml.bzl", version = "0.4.1") # Those are loaded only when using py_proto_library diff --git a/python/private/py_repositories.bzl b/python/private/py_repositories.bzl index 6b8148e406..7e3db283c4 100644 --- a/python/private/py_repositories.bzl +++ b/python/private/py_repositories.bzl @@ -74,9 +74,9 @@ def py_repositories(transition_settings = []): ) http_archive( name = "rules_runfiles_group", - sha256 = "2da2befdf87d85eafe8b77a9aa0dca0a700cf7ba929866f6c1b505e3389fbaf8", - strip_prefix = "rules_runfiles_group-41d2544bab5c1eee0117c9e8a992631be8e0d9d1", - url = "https://github.com/bazel-contrib/rules_runfiles_group/archive/41d2544bab5c1eee0117c9e8a992631be8e0d9d1.tar.gz", + sha256 = "ca3333c8cdfedf24c5732a9295e1c9633fe90363a6446929fa5d39d3f0167119", + strip_prefix = "rules_runfiles_group-1cee2dde3b5e50ce754c5121bc1759b05976d24a", + url = "https://github.com/bazel-contrib/rules_runfiles_group/archive/1cee2dde3b5e50ce754c5121bc1759b05976d24a.tar.gz", ) http_archive( name = "toml.bzl", diff --git a/tests/integration/bzlmod_lockfile/MODULE.bazel.lock b/tests/integration/bzlmod_lockfile/MODULE.bazel.lock index 8d37f1ef55..ed1f41dd6d 100644 --- a/tests/integration/bzlmod_lockfile/MODULE.bazel.lock +++ b/tests/integration/bzlmod_lockfile/MODULE.bazel.lock @@ -125,8 +125,8 @@ "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "not found", "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_proto/6.0.2/MODULE.bazel": "not found", "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_proto/7.1.0/MODULE.bazel": "not found", - "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_runfiles_group/99.0.0-dev.20261016.1.41d2544/MODULE.bazel": "e35f5260f613c7cd7b29a398cd34191db239ec138ba357dbfe81c3f2ce19de70", - "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_runfiles_group/99.0.0-dev.20261016.1.41d2544/source.json": "801750c105fd41f3ca2818e93a6cbaa55b8236ea505394adfe3596e1bfc44967", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_runfiles_group/99.0.0-dev.20261019.1.1cee2dd/MODULE.bazel": "1d3e9fa86209fc70564e1c931533ec480a60ce27b6682bd3c97da63ce889806d", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_runfiles_group/99.0.0-dev.20261019.1.1cee2dd/source.json": "9ca73bfeb772529f64c51aa55e39499a1864490da7f4ad74885c95ca49f19e8d", "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_shell/0.2.0/MODULE.bazel": "not found", "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_shell/0.3.0/MODULE.bazel": "not found", "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_shell/0.6.1/MODULE.bazel": "not found", From d206a54f7353f58e5805454c225afd1249723e58 Mon Sep 17 00:00:00 2001 From: Frank Portman Date: Mon, 19 Oct 2026 10:47:38 -0400 Subject: [PATCH 5/6] fix(rules): load only the describer side of rules_runfiles_group rules_runfiles_group's lib.bzl loads its packager code, which needs a recent bazel_features that WORKSPACE users don't have. Its new describe.bzl doesn't, so loading the Python rules works in WORKSPACE again without extra setup. The analysis tests still go through the packager, so the dev WORKSPACE gets bazel_features 1.51.0, and the tests are skipped on Bazel versions whose aspects can't walk toolchains. --- MODULE.bazel | 2 +- internal_dev_deps.bzl | 6 +- python/private/BUILD.bazel | 2 +- python/private/py_repositories.bzl | 6 +- python/private/runfiles_groups.bzl | 58 +++++++++++-------- .../bzlmod_lockfile/MODULE.bazel.lock | 4 +- tests/runfiles_groups/BUILD.bazel | 9 +++ 7 files changed, 52 insertions(+), 35 deletions(-) diff --git a/MODULE.bazel b/MODULE.bazel index cdc973c8fa..5d61e97140 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -9,7 +9,7 @@ bazel_dep(name = "bazel_skylib", version = "1.8.2") bazel_dep(name = "package_metadata", version = "0.0.7") bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "rules_cc", version = "0.2.17") -bazel_dep(name = "rules_runfiles_group", version = "99.0.0-dev.20261019.1.1cee2dd") +bazel_dep(name = "rules_runfiles_group", version = "99.0.0-dev.20261019.1.d105dfa") bazel_dep(name = "toml.bzl", version = "0.4.1") # Those are loaded only when using py_proto_library diff --git a/internal_dev_deps.bzl b/internal_dev_deps.bzl index 68b8f89e76..291da0810b 100644 --- a/internal_dev_deps.bzl +++ b/internal_dev_deps.bzl @@ -252,9 +252,9 @@ def rules_python_internal_deps(): http_archive( name = "bazel_features", - sha256 = "d7787da289a7fb497352211ad200ec9f698822a9e0757a4976fd9f713ff372b3", - strip_prefix = "bazel_features-1.9.1", - url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.9.1/bazel_features-v1.9.1.tar.gz", + sha256 = "5450bfb2c8b4bc961c75368838f86156f563cc9adef1be7d504fc5619d54daab", + strip_prefix = "bazel_features-1.51.0", + url = "https://github.com/bazel-contrib/bazel_features/releases/download/v1.51.0/bazel_features-v1.51.0.tar.gz", ) http_archive( diff --git a/python/private/BUILD.bazel b/python/private/BUILD.bazel index 15b283f0de..a4986017e3 100644 --- a/python/private/BUILD.bazel +++ b/python/private/BUILD.bazel @@ -864,7 +864,7 @@ bzl_library( ":py_internal", ":py_library", ":reexports", - "@rules_runfiles_group//runfiles_group:lib", + "@rules_runfiles_group//runfiles_group:describe", ], ) diff --git a/python/private/py_repositories.bzl b/python/private/py_repositories.bzl index 7e3db283c4..d17207c950 100644 --- a/python/private/py_repositories.bzl +++ b/python/private/py_repositories.bzl @@ -74,9 +74,9 @@ def py_repositories(transition_settings = []): ) http_archive( name = "rules_runfiles_group", - sha256 = "ca3333c8cdfedf24c5732a9295e1c9633fe90363a6446929fa5d39d3f0167119", - strip_prefix = "rules_runfiles_group-1cee2dde3b5e50ce754c5121bc1759b05976d24a", - url = "https://github.com/bazel-contrib/rules_runfiles_group/archive/1cee2dde3b5e50ce754c5121bc1759b05976d24a.tar.gz", + sha256 = "17437bb769ecef3d6b14333a1f82d46f0703e9eb645208428a3af0875e79f6d7", + strip_prefix = "rules_runfiles_group-d105dfab75fb550bcfc0d2cc033b27fad0dfc2e4", + url = "https://github.com/bazel-contrib/rules_runfiles_group/archive/d105dfab75fb550bcfc0d2cc033b27fad0dfc2e4.tar.gz", ) http_archive( name = "toml.bzl", diff --git a/python/private/runfiles_groups.bzl b/python/private/runfiles_groups.bzl index bcca0f183c..feabbdaf3e 100644 --- a/python/private/runfiles_groups.bzl +++ b/python/private/runfiles_groups.bzl @@ -27,7 +27,7 @@ A library's group holds what it contributes to a consuming binary: the files the binary takes from its PyInfo, plus its plain data files. """ -load("@rules_runfiles_group//runfiles_group:lib.bzl", "runfiles_groups") +load("@rules_runfiles_group//runfiles_group:describe.bzl", "describe") load(":attributes.bzl", "PycCollectionAttr") load(":common.bzl", "is_py_source", "py_info_runfiles_files") load(":flags.bzl", "PyiDepsToRunfilesFlag") @@ -51,7 +51,7 @@ _PYPI_GROUP_PREFIX = "rules_python#pypi/" # The toolchain type //python:toolchain_type is an alias of; the aspect matches # toolchains by the actual label. -_RUNTIME_MERGE_FROM = runfiles_groups.merge_from( +_RUNTIME_MERGE_FROM = describe.merge_from( toolchain = Label("@bazel_tools//tools/python:toolchain_type"), ) @@ -84,15 +84,23 @@ def _py_info_files(target, pyc_collection_enabled): return py_info_runfiles_files(target[BuiltinPyInfo], pyc_collection_enabled) return [] +def _union(ctx, contents): + # Each content is a depset of File or a runfiles object. + files = [c for c in contents if type(c) == "depset"] + runfiles = [c for c in contents if type(c) != "depset"] + if not runfiles: + return depset(transitive = files) + return ctx.runfiles(transitive_files = depset(transitive = files)).merge_all(runfiles) + def _kind(label): return "first_party" if label.repo_name == "" else "third_party" def _pypi_entry(package, content, weight = None): - return runfiles_groups.entry( + return describe.entry( name = _PYPI_GROUP_PREFIX + package, content = content, kind = "third_party", - rank = runfiles_groups.RANK_SHARED_DEPS, + rank = describe.RANK_SHARED_DEPS, weight = weight, merge_affinity = _MERGE_AFFINITY, ) @@ -140,7 +148,7 @@ def _dep_fallback(ctx, dep, py_outputs): content.append(runfiles) if not content: return None - return runfiles_groups.entry(name = dep.label, content = runfiles_groups.union(ctx, content)) + return describe.entry(name = dep.label, content = _union(ctx, content)) def _library_dep_fallback(ctx, dep): # py_library adds the .py outputs of a dep without PyInfo to its own PyInfo. @@ -154,8 +162,8 @@ def _data_fallback(ctx, dep): default_info = dep[DefaultInfo] if _is_file(dep) or (not default_info.files and _is_empty(default_info.data_runfiles)): return None - content = runfiles_groups.union(ctx, [default_info.files, default_info.data_runfiles]) - return runfiles_groups.entry(name = dep.label, content = content) + content = _union(ctx, [default_info.files, default_info.data_runfiles]) + return describe.entry(name = dep.label, content = content) def _srcs_fallback(ctx, dep): # Plain files are in the merging target's own group. @@ -182,24 +190,24 @@ def _describe_py_library(target, ctx): entry = _pypi_entry(package, content, weight) else: kind = _kind(ctx.label) - entry = runfiles_groups.entry( + entry = describe.entry( name = ctx.label, content = content, kind = kind, - rank = runfiles_groups.RANK_SHARED_DEPS if kind == "third_party" else runfiles_groups.RANK_EXECUTABLE, + rank = describe.RANK_SHARED_DEPS if kind == "third_party" else describe.RANK_EXECUTABLE, weight = weight, merge_affinity = _MERGE_AFFINITY, ) - return runfiles_groups.node( + return describe.node( add = [entry] if content else [], merge_from = [ - runfiles_groups.merge_from("data", fallback = _data_fallback), - runfiles_groups.merge_from("deps", fallback = _library_dep_fallback), - runfiles_groups.merge_from("srcs", fallback = _srcs_fallback), + describe.merge_from("data", fallback = _data_fallback), + describe.merge_from("deps", fallback = _library_dep_fallback), + describe.merge_from("srcs", fallback = _srcs_fallback), ], ) -py_library_runfiles_group_describer = runfiles_groups.make_describer_rule( +py_library_runfiles_group_describer = describe.make_describer_rule( describe = _describe_py_library, ) @@ -265,17 +273,17 @@ def _describe_py_executable(target, ctx): add, venv_runfiles = _venv_entries(ctx, venv_runfiles) merge_from = [ _RUNTIME_MERGE_FROM, - runfiles_groups.merge_from("_debugger_flag", fallback = _executable_dep_fallback), - runfiles_groups.merge_from("data", fallback = _data_fallback), - runfiles_groups.merge_from("deps", fallback = _executable_dep_fallback), - runfiles_groups.merge_from("srcs", fallback = _srcs_fallback), + describe.merge_from("_debugger_flag", fallback = _executable_dep_fallback), + describe.merge_from("data", fallback = _data_fallback), + describe.merge_from("deps", fallback = _executable_dep_fallback), + describe.merge_from("srcs", fallback = _srcs_fallback), ] content.extend([rf for rf in (venv_runfiles, info.venv_interpreter_runfiles) if rf]) - return runfiles_groups.node( - add = [runfiles_groups.entry( + return describe.node( + add = [describe.entry( name = ctx.label, - content = runfiles_groups.union(ctx, content), + content = _union(ctx, content), kind = _kind(ctx.label), merge_affinity = _MERGE_AFFINITY, )] + add, @@ -283,22 +291,22 @@ def _describe_py_executable(target, ctx): executable_group = ctx.label, ) -py_executable_runfiles_group_describer = runfiles_groups.make_describer_rule( +py_executable_runfiles_group_describer = describe.make_describer_rule( describe = _describe_py_executable, ) def _describe_py_runtime_pair(target, ctx): runtime = target[platform_common.ToolchainInfo].py3_runtime files = get_runtime_files(ctx, runtime) if runtime else depset() - return runfiles_groups.node(add = [runfiles_groups.entry( + return describe.node(add = [describe.entry( name = _RUNTIME_GROUP, content = files, kind = "foundation", - rank = runfiles_groups.RANK_FOUNDATION, + rank = describe.RANK_FOUNDATION, do_not_merge = True, merge_affinity = _MERGE_AFFINITY, )] if files else []) -py_runtime_pair_runfiles_group_describer = runfiles_groups.make_describer_rule( +py_runtime_pair_runfiles_group_describer = describe.make_describer_rule( describe = _describe_py_runtime_pair, ) diff --git a/tests/integration/bzlmod_lockfile/MODULE.bazel.lock b/tests/integration/bzlmod_lockfile/MODULE.bazel.lock index ed1f41dd6d..c575876a06 100644 --- a/tests/integration/bzlmod_lockfile/MODULE.bazel.lock +++ b/tests/integration/bzlmod_lockfile/MODULE.bazel.lock @@ -125,8 +125,8 @@ "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "not found", "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_proto/6.0.2/MODULE.bazel": "not found", "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_proto/7.1.0/MODULE.bazel": "not found", - "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_runfiles_group/99.0.0-dev.20261019.1.1cee2dd/MODULE.bazel": "1d3e9fa86209fc70564e1c931533ec480a60ce27b6682bd3c97da63ce889806d", - "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_runfiles_group/99.0.0-dev.20261019.1.1cee2dd/source.json": "9ca73bfeb772529f64c51aa55e39499a1864490da7f4ad74885c95ca49f19e8d", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_runfiles_group/99.0.0-dev.20261019.1.d105dfa/MODULE.bazel": "4b7f46fc4ef79043bdc3792459339d0d5351cb92e645162197a0d309da3fc814", + "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_runfiles_group/99.0.0-dev.20261019.1.d105dfa/source.json": "d9d04acc3ab7dba753c6219bbc01a9b2e9dddf698e034f0de3841374daf24672", "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_shell/0.2.0/MODULE.bazel": "not found", "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_shell/0.3.0/MODULE.bazel": "not found", "https://bazel-contrib.github.io/rules_runfiles_group/modules/rules_shell/0.6.1/MODULE.bazel": "not found", diff --git a/tests/runfiles_groups/BUILD.bazel b/tests/runfiles_groups/BUILD.bazel index f1d7a04d35..8f6bb264b9 100644 --- a/tests/runfiles_groups/BUILD.bazel +++ b/tests/runfiles_groups/BUILD.bazel @@ -1,3 +1,4 @@ +load("@bazel_features//:features.bzl", "bazel_features") load("@rules_runfiles_group//runfiles_group:runfiles_group_analysis_test.bzl", "runfiles_group_analysis_test") load("//python:py_binary.bzl", "py_binary") load("//python:py_library.bzl", "py_library") @@ -5,6 +6,12 @@ load("//python:py_test.bzl", "py_test") load("//tests/support:py_reconfig.bzl", "py_reconfig_binary") load(":test_rules.bzl", "outputs_and_runfiles", "outputs_only") +# Packagers walk the Python toolchain, which needs Bazel 8.8 or later. +_WALKS_TOOLCHAINS = [] if ( + bazel_features.rules.aspect_propagation_context or + bazel_features.rules.supports_toolchains_aspects_star +) else ["@platforms//:incompatible"] + outputs_only(name = "outputs_only") outputs_and_runfiles(name = "outputs_and_runfiles") @@ -167,6 +174,7 @@ runfiles_group_analysis_test( ":test", ], overlapping_group_behavior = "error", + target_compatible_with = _WALKS_TOOLCHAINS, ) runfiles_group_analysis_test( @@ -185,4 +193,5 @@ runfiles_group_analysis_test( "@@//tests/runfiles_groups:srcs_with_runfiles", "@@//tests/runfiles_groups:bin", ], + target_compatible_with = _WALKS_TOOLCHAINS, ) From 58788028c75d757afb1a75ac6ab46ad323b29293 Mon Sep 17 00:00:00 2001 From: Frank Portman Date: Wed, 21 Oct 2026 10:33:53 -0400 Subject: [PATCH 6/6] style: sort the runfiles group attributes, name the Bazel versions for toolchain walking --- python/private/py_executable.bzl | 8 ++++---- python/private/py_runtime_pair_rule.bzl | 6 +++--- tests/runfiles_groups/BUILD.bazel | 3 ++- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/python/private/py_executable.bzl b/python/private/py_executable.bzl index b2f8a4fa6d..13bdc0aebe 100644 --- a/python/private/py_executable.bzl +++ b/python/private/py_executable.bzl @@ -93,16 +93,16 @@ EXECUTABLE_ATTRS = dicts.add( WINDOWS_CONSTRAINTS_ATTRS, # starlark flags attributes { - "_build_python_zip_flag": attr.label(default = "//python/config_settings:build_python_zip"), - "_default_to_explicit_init_py_flag": attr.label(default = "//python/config_settings:incompatible_default_to_explicit_init_py"), - "_python_import_all_repositories_flag": attr.label(default = "//python/config_settings:experimental_python_import_all_repositories"), - "_python_path_flag": attr.label(default = "//python/config_settings:python_path"), # Read by rules_runfiles_group's packaging aspects; see runfiles_groups.bzl. "_aspect_rule_hints": attr.label_list(default = [ "//python/private:py_executable_runfiles_group_describer", # What //python:toolchain_type is an alias of. "@bazel_tools//tools/python:toolchain_type", ]), + "_build_python_zip_flag": attr.label(default = "//python/config_settings:build_python_zip"), + "_default_to_explicit_init_py_flag": attr.label(default = "//python/config_settings:incompatible_default_to_explicit_init_py"), + "_python_import_all_repositories_flag": attr.label(default = "//python/config_settings:experimental_python_import_all_repositories"), + "_python_path_flag": attr.label(default = "//python/config_settings:python_path"), "_runfiles_group_attrs": attr.string_list(default = ["_debugger_flag", "data", "deps", "srcs"]), }, { diff --git a/python/private/py_runtime_pair_rule.bzl b/python/private/py_runtime_pair_rule.bzl index a648bbdca9..ea153a0e0d 100644 --- a/python/private/py_runtime_pair_rule.bzl +++ b/python/private/py_runtime_pair_rule.bzl @@ -133,14 +133,14 @@ The runtime to use for Python 3 targets. Must have `python_version` set to `PY3`. """, ), - "_visible_for_testing": attr.label( - default = labels.VISIBLE_FOR_TESTING, - ), # Read by rules_runfiles_group's packaging aspects; see runfiles_groups.bzl. "_aspect_rule_hints": attr.label_list( default = ["//python/private:py_runtime_pair_runfiles_group_describer"], ), "_runfiles_group_attrs": attr.string_list(default = []), + "_visible_for_testing": attr.label( + default = labels.VISIBLE_FOR_TESTING, + ), }, fragments = ["py"], doc = """ diff --git a/tests/runfiles_groups/BUILD.bazel b/tests/runfiles_groups/BUILD.bazel index 8f6bb264b9..c4358e132c 100644 --- a/tests/runfiles_groups/BUILD.bazel +++ b/tests/runfiles_groups/BUILD.bazel @@ -6,7 +6,8 @@ load("//python:py_test.bzl", "py_test") load("//tests/support:py_reconfig.bzl", "py_reconfig_binary") load(":test_rules.bzl", "outputs_and_runfiles", "outputs_only") -# Packagers walk the Python toolchain, which needs Bazel 8.8 or later. +# Packagers walk the Python toolchain through toolchains_aspects, which takes +# "*" since Bazel 8.8.0 and a propagation filter since Bazel 9.0.0. _WALKS_TOOLCHAINS = [] if ( bazel_features.rules.aspect_propagation_context or bazel_features.rules.supports_toolchains_aspects_star