From bfec05e0659ce40ee61e2ec1b227486720bbc834 Mon Sep 17 00:00:00 2001 From: soaxelbrooke Date: Sun, 13 Jul 2025 21:18:15 -0700 Subject: [PATCH] Big change --- MODULE.bazel | 4 + MODULE.bazel.lock | 6 +- databuild/BUILD.bazel | 14 + databuild/cli/BUILD.bazel | 26 ++ databuild/cli/error.rs | 25 ++ databuild/cli/main.rs | 207 ++++++++++ databuild/client/BUILD.bazel | 12 + databuild/client/tsconfig.json | 2 +- databuild/dashboard/pages.ts | 310 +++++++++++++-- databuild/dashboard/services.ts | 73 +++- databuild/dashboard/utils.ts | 14 +- databuild/databuild.proto | 18 +- databuild/event_log/mod.rs | 6 + databuild/event_log/postgres.rs | 9 + databuild/event_log/sqlite.rs | 254 +++++++----- databuild/event_log/stdout.rs | 10 + databuild/graph/analyze.rs | 140 +------ databuild/graph/execute.rs | 180 +++++---- databuild/lib.rs | 8 +- databuild/orchestration/error.rs | 15 + databuild/orchestration/events.rs | 146 +++++++ databuild/orchestration/mod.rs | 375 ++++++++++++++++++ databuild/rules.bzl | 122 ++++-- databuild/service/handlers.rs | 390 ++++++++++++++++--- databuild/service/mod.rs | 50 ++- docs/partition-delegation.md | 49 ++- examples/basic_graph/MODULE.bazel.lock | 6 +- examples/basic_graph/generated_number/pippin | 1 + examples/podcast_reviews/MODULE.bazel.lock | 6 +- generated_number/pippin | 1 + plans/cli-service-build-unification.md | 336 ++++++++++++++++ plans/integration-test-v2.md | 148 +++++++ run_e2e_tests.sh | 22 ++ tests/end_to_end/BUILD | 18 + tests/end_to_end/delegation_test.sh | 135 +++++++ tests/end_to_end/podcast_simple_test.sh | 13 +- tests/end_to_end/simple_test.sh | 30 +- tests/end_to_end/validate_runner.sh | 5 +- 38 files changed, 2745 insertions(+), 441 deletions(-) create mode 100644 databuild/cli/BUILD.bazel create mode 100644 databuild/cli/error.rs create mode 100644 databuild/cli/main.rs create mode 100644 databuild/orchestration/error.rs create mode 100644 databuild/orchestration/events.rs create mode 100644 databuild/orchestration/mod.rs create mode 100644 examples/basic_graph/generated_number/pippin create mode 100644 generated_number/pippin create mode 100644 plans/cli-service-build-unification.md create mode 100644 plans/integration-test-v2.md create mode 100755 tests/end_to_end/delegation_test.sh diff --git a/MODULE.bazel b/MODULE.bazel index 4de5f81..44f17dc 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -122,6 +122,10 @@ crate.spec( package = "axum-jsonschema", version = "0.8.0", ) +crate.spec( + package = "thiserror", + version = "1.0", +) crate.spec( features = ["debug-embed"], package = "rust-embed", diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock index 07984b8..8b3b016 100644 --- a/MODULE.bazel.lock +++ b/MODULE.bazel.lock @@ -719,7 +719,7 @@ "@@rules_rust+//crate_universe:extensions.bzl%crate": { "general": { "bzlTransitiveDigest": "7WZJd6ddUExnqTm+/VXRBmv6c4MCs9hJn2U/AZqeQvA=", - "usagesDigest": "QH5/rIfbT6bYy+MqU03e2I4d6wBeDNC68QhFPJUZOo0=", + "usagesDigest": "ruICTrf7LQcmU/IUcNrOW6DJQgLEu7OaIUZDlndqgKo=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": { @@ -736,9 +736,9 @@ "repoRuleId": "@@rules_rust+//crate_universe:extensions.bzl%_generate_repo", "attributes": { "contents": { - "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'databuild'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"aide-0.13.5\",\n actual = \"@crates__aide-0.13.5//:aide\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"aide\",\n actual = \"@crates__aide-0.13.5//:aide\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait-0.1.88\",\n actual = \"@crates__async-trait-0.1.88//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait\",\n actual = \"@crates__async-trait-0.1.88//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-0.7.9\",\n actual = \"@crates__axum-0.7.9//:axum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum\",\n actual = \"@crates__axum-0.7.9//:axum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-jsonschema-0.8.0\",\n actual = \"@crates__axum-jsonschema-0.8.0//:axum_jsonschema\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-jsonschema\",\n actual = \"@crates__axum-jsonschema-0.8.0//:axum_jsonschema\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap-4.5.41\",\n actual = \"@crates__clap-4.5.41//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap\",\n actual = \"@crates__clap-4.5.41//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"crossbeam-channel-0.5.15\",\n actual = \"@crates__crossbeam-channel-0.5.15//:crossbeam_channel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"crossbeam-channel\",\n actual = \"@crates__crossbeam-channel-0.5.15//:crossbeam_channel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hyper-1.6.0\",\n actual = \"@crates__hyper-1.6.0//:hyper\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hyper\",\n actual = \"@crates__hyper-1.6.0//:hyper\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"log-0.4.27\",\n actual = \"@crates__log-0.4.27//:log\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"log\",\n actual = \"@crates__log-0.4.27//:log\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num_cpus-1.17.0\",\n actual = \"@crates__num_cpus-1.17.0//:num_cpus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num_cpus\",\n actual = \"@crates__num_cpus-1.17.0//:num_cpus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-0.13.5\",\n actual = \"@crates__prost-0.13.5//:prost\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost\",\n actual = \"@crates__prost-0.13.5//:prost\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-build-0.13.5\",\n actual = \"@crates__prost-build-0.13.5//:prost_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-build\",\n actual = \"@crates__prost-build-0.13.5//:prost_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-types-0.13.5\",\n actual = \"@crates__prost-types-0.13.5//:prost_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-types\",\n actual = \"@crates__prost-types-0.13.5//:prost_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rusqlite-0.31.0\",\n actual = \"@crates__rusqlite-0.31.0//:rusqlite\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rusqlite\",\n actual = \"@crates__rusqlite-0.31.0//:rusqlite\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rust-embed-8.7.2\",\n actual = \"@crates__rust-embed-8.7.2//:rust_embed\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rust-embed\",\n actual = \"@crates__rust-embed-8.7.2//:rust_embed\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"schemars-0.8.22\",\n actual = \"@crates__schemars-0.8.22//:schemars\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"schemars\",\n actual = \"@crates__schemars-0.8.22//:schemars\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde-1.0.219\",\n actual = \"@crates__serde-1.0.219//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde\",\n actual = \"@crates__serde-1.0.219//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json-1.0.140\",\n actual = \"@crates__serde_json-1.0.140//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json\",\n actual = \"@crates__serde_json-1.0.140//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"simple_logger-4.3.3\",\n actual = \"@crates__simple_logger-4.3.3//:simple_logger\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"simple_logger\",\n actual = \"@crates__simple_logger-4.3.3//:simple_logger\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile-3.20.0\",\n actual = \"@crates__tempfile-3.20.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile\",\n actual = \"@crates__tempfile-3.20.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-1.46.1\",\n actual = \"@crates__tokio-1.46.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio\",\n actual = \"@crates__tokio-1.46.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-0.4.13\",\n actual = \"@crates__tower-0.4.13//:tower\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower\",\n actual = \"@crates__tower-0.4.13//:tower\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-http-0.5.2\",\n actual = \"@crates__tower-http-0.5.2//:tower_http\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-http\",\n actual = \"@crates__tower-http-0.5.2//:tower_http\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid-1.17.0\",\n actual = \"@crates__uuid-1.17.0//:uuid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid\",\n actual = \"@crates__uuid-1.17.0//:uuid\",\n tags = [\"manual\"],\n)\n", + "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'databuild'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"aide-0.13.5\",\n actual = \"@crates__aide-0.13.5//:aide\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"aide\",\n actual = \"@crates__aide-0.13.5//:aide\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait-0.1.88\",\n actual = \"@crates__async-trait-0.1.88//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait\",\n actual = \"@crates__async-trait-0.1.88//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-0.7.9\",\n actual = \"@crates__axum-0.7.9//:axum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum\",\n actual = \"@crates__axum-0.7.9//:axum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-jsonschema-0.8.0\",\n actual = \"@crates__axum-jsonschema-0.8.0//:axum_jsonschema\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-jsonschema\",\n actual = \"@crates__axum-jsonschema-0.8.0//:axum_jsonschema\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap-4.5.41\",\n actual = \"@crates__clap-4.5.41//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap\",\n actual = \"@crates__clap-4.5.41//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"crossbeam-channel-0.5.15\",\n actual = \"@crates__crossbeam-channel-0.5.15//:crossbeam_channel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"crossbeam-channel\",\n actual = \"@crates__crossbeam-channel-0.5.15//:crossbeam_channel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hyper-1.6.0\",\n actual = \"@crates__hyper-1.6.0//:hyper\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hyper\",\n actual = \"@crates__hyper-1.6.0//:hyper\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"log-0.4.27\",\n actual = \"@crates__log-0.4.27//:log\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"log\",\n actual = \"@crates__log-0.4.27//:log\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num_cpus-1.17.0\",\n actual = \"@crates__num_cpus-1.17.0//:num_cpus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num_cpus\",\n actual = \"@crates__num_cpus-1.17.0//:num_cpus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-0.13.5\",\n actual = \"@crates__prost-0.13.5//:prost\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost\",\n actual = \"@crates__prost-0.13.5//:prost\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-build-0.13.5\",\n actual = \"@crates__prost-build-0.13.5//:prost_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-build\",\n actual = \"@crates__prost-build-0.13.5//:prost_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-types-0.13.5\",\n actual = \"@crates__prost-types-0.13.5//:prost_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-types\",\n actual = \"@crates__prost-types-0.13.5//:prost_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rusqlite-0.31.0\",\n actual = \"@crates__rusqlite-0.31.0//:rusqlite\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rusqlite\",\n actual = \"@crates__rusqlite-0.31.0//:rusqlite\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rust-embed-8.7.2\",\n actual = \"@crates__rust-embed-8.7.2//:rust_embed\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rust-embed\",\n actual = \"@crates__rust-embed-8.7.2//:rust_embed\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"schemars-0.8.22\",\n actual = \"@crates__schemars-0.8.22//:schemars\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"schemars\",\n actual = \"@crates__schemars-0.8.22//:schemars\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde-1.0.219\",\n actual = \"@crates__serde-1.0.219//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde\",\n actual = \"@crates__serde-1.0.219//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json-1.0.140\",\n actual = \"@crates__serde_json-1.0.140//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json\",\n actual = \"@crates__serde_json-1.0.140//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"simple_logger-4.3.3\",\n actual = \"@crates__simple_logger-4.3.3//:simple_logger\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"simple_logger\",\n actual = \"@crates__simple_logger-4.3.3//:simple_logger\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile-3.20.0\",\n actual = \"@crates__tempfile-3.20.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile\",\n actual = \"@crates__tempfile-3.20.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"thiserror-1.0.69\",\n actual = \"@crates__thiserror-1.0.69//:thiserror\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"thiserror\",\n actual = \"@crates__thiserror-1.0.69//:thiserror\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-1.46.1\",\n actual = \"@crates__tokio-1.46.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio\",\n actual = \"@crates__tokio-1.46.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-0.4.13\",\n actual = \"@crates__tower-0.4.13//:tower\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower\",\n actual = \"@crates__tower-0.4.13//:tower\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-http-0.5.2\",\n actual = \"@crates__tower-http-0.5.2//:tower_http\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-http\",\n actual = \"@crates__tower-http-0.5.2//:tower_http\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid-1.17.0\",\n actual = \"@crates__uuid-1.17.0//:uuid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid\",\n actual = \"@crates__uuid-1.17.0//:uuid\",\n tags = [\"manual\"],\n)\n", "alias_rules.bzl": "\"\"\"Alias that transitions its target to `compilation_mode=opt`. Use `transition_alias=\"opt\"` to enable.\"\"\"\n\nload(\"@rules_cc//cc:defs.bzl\", \"CcInfo\")\nload(\"@rules_rust//rust:rust_common.bzl\", \"COMMON_PROVIDERS\")\n\ndef _transition_alias_impl(ctx):\n # `ctx.attr.actual` is a list of 1 item due to the transition\n providers = [ctx.attr.actual[0][provider] for provider in COMMON_PROVIDERS]\n if CcInfo in ctx.attr.actual[0]:\n providers.append(ctx.attr.actual[0][CcInfo])\n return providers\n\ndef _change_compilation_mode(compilation_mode):\n def _change_compilation_mode_impl(_settings, _attr):\n return {\n \"//command_line_option:compilation_mode\": compilation_mode,\n }\n\n return transition(\n implementation = _change_compilation_mode_impl,\n inputs = [],\n outputs = [\n \"//command_line_option:compilation_mode\",\n ],\n )\n\ndef _transition_alias_rule(compilation_mode):\n return rule(\n implementation = _transition_alias_impl,\n provides = COMMON_PROVIDERS,\n attrs = {\n \"actual\": attr.label(\n mandatory = True,\n doc = \"`rust_library()` target to transition to `compilation_mode=opt`.\",\n providers = COMMON_PROVIDERS,\n cfg = _change_compilation_mode(compilation_mode),\n ),\n \"_allowlist_function_transition\": attr.label(\n default = \"@bazel_tools//tools/allowlists/function_transition_allowlist\",\n ),\n },\n doc = \"Transitions a Rust library crate to the `compilation_mode=opt`.\",\n )\n\ntransition_alias_dbg = _transition_alias_rule(\"dbg\")\ntransition_alias_fastbuild = _transition_alias_rule(\"fastbuild\")\ntransition_alias_opt = _transition_alias_rule(\"opt\")\n", - "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'databuild'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"new_git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe/private:local_crate_mirror.bzl\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS AND ALIASES\n###############################################################################\n\n_NORMAL_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"aide\": Label(\"@crates//:aide-0.13.5\"),\n \"axum\": Label(\"@crates//:axum-0.7.9\"),\n \"axum-jsonschema\": Label(\"@crates//:axum-jsonschema-0.8.0\"),\n \"clap\": Label(\"@crates//:clap-4.5.41\"),\n \"crossbeam-channel\": Label(\"@crates//:crossbeam-channel-0.5.15\"),\n \"hyper\": Label(\"@crates//:hyper-1.6.0\"),\n \"log\": Label(\"@crates//:log-0.4.27\"),\n \"num_cpus\": Label(\"@crates//:num_cpus-1.17.0\"),\n \"prost\": Label(\"@crates//:prost-0.13.5\"),\n \"prost-build\": Label(\"@crates//:prost-build-0.13.5\"),\n \"prost-types\": Label(\"@crates//:prost-types-0.13.5\"),\n \"rusqlite\": Label(\"@crates//:rusqlite-0.31.0\"),\n \"rust-embed\": Label(\"@crates//:rust-embed-8.7.2\"),\n \"schemars\": Label(\"@crates//:schemars-0.8.22\"),\n \"serde\": Label(\"@crates//:serde-1.0.219\"),\n \"serde_json\": Label(\"@crates//:serde_json-1.0.140\"),\n \"simple_logger\": Label(\"@crates//:simple_logger-4.3.3\"),\n \"tempfile\": Label(\"@crates//:tempfile-3.20.0\"),\n \"tokio\": Label(\"@crates//:tokio-1.46.1\"),\n \"tower\": Label(\"@crates//:tower-0.4.13\"),\n \"tower-http\": Label(\"@crates//:tower-http-0.5.2\"),\n \"uuid\": Label(\"@crates//:uuid-1.17.0\"),\n },\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"async-trait\": Label(\"@crates//:async-trait-0.1.88\"),\n },\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"aarch64-linux-android\": [],\n \"aarch64-pc-windows-gnullvm\": [],\n \"aarch64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(any(target_arch = \\\"x86_64\\\", target_arch = \\\"arm64ec\\\"), target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(all(any(target_os = \\\"android\\\", target_os = \\\"linux\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), not(any(all(target_os = \\\"linux\\\", target_env = \\\"\\\"), getrandom_backend = \\\"custom\\\", getrandom_backend = \\\"linux_raw\\\", getrandom_backend = \\\"rdrand\\\", getrandom_backend = \\\"rndr\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"linux\\\"))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_vendor = \\\"apple\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(all(target_arch = \\\"loongarch64\\\", target_os = \\\"linux\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"wasi\\\", target_env = \\\"p2\\\"))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(all(target_os = \\\"uefi\\\", getrandom_backend = \\\"efi_rng\\\"))\": [],\n \"cfg(all(tokio_uring, target_os = \\\"linux\\\"))\": [],\n \"cfg(any())\": [],\n \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any(target_os = \\\"dragonfly\\\", target_os = \\\"freebsd\\\", target_os = \\\"hurd\\\", target_os = \\\"illumos\\\", target_os = \\\"cygwin\\\", all(target_os = \\\"horizon\\\", target_arch = \\\"arm\\\")))\": [],\n \"cfg(any(target_os = \\\"haiku\\\", target_os = \\\"redox\\\", target_os = \\\"nto\\\", target_os = \\\"aix\\\"))\": [],\n \"cfg(any(target_os = \\\"ios\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\", target_os = \\\"tvos\\\"))\": [],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"ios\\\", target_os = \\\"freebsd\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"openbsd\\\", target_os = \\\"vita\\\", target_os = \\\"emscripten\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(unix, target_os = \\\"wasi\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any(windows, target_os = \\\"cygwin\\\"))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(not(all(target_arch = \\\"arm\\\", target_os = \\\"none\\\")))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(all(windows, target_env = \\\"msvc\\\", not(target_vendor = \\\"uwp\\\"))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(windows))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(target_arch = \\\"wasm32\\\")\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(target_os = \\\"hermit\\\")\": [],\n \"cfg(target_os = \\\"netbsd\\\")\": [],\n \"cfg(target_os = \\\"redox\\\")\": [],\n \"cfg(target_os = \\\"solaris\\\")\": [],\n \"cfg(target_os = \\\"vxworks\\\")\": [],\n \"cfg(target_os = \\\"wasi\\\")\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(tokio_taskdump)\": [],\n \"cfg(unix)\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(windows)\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"i686-pc-windows-gnullvm\": [],\n \"wasm32-unknown-unknown\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"wasm32-wasip1\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"x86_64-pc-windows-gnullvm\": [],\n \"x86_64-pc-windows-msvc\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"x86_64-unknown-nixos-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n http_archive,\n name = \"crates__addr2line-0.24.2\",\n sha256 = \"dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/addr2line/0.24.2/download\"],\n strip_prefix = \"addr2line-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.addr2line-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__adler2-2.0.1\",\n sha256 = \"320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/adler2/2.0.1/download\"],\n strip_prefix = \"adler2-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.adler2-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ahash-0.8.12\",\n sha256 = \"5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ahash/0.8.12/download\"],\n strip_prefix = \"ahash-0.8.12\",\n build_file = Label(\"@crates//crates:BUILD.ahash-0.8.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aho-corasick-1.1.3\",\n sha256 = \"8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aho-corasick/1.1.3/download\"],\n strip_prefix = \"aho-corasick-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.aho-corasick-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aide-0.13.5\",\n sha256 = \"5678d2978845ddb4bd736a026f467dd652d831e9e6254b0e41b07f7ee7523309\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aide/0.13.5/download\"],\n strip_prefix = \"aide-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.aide-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstream-0.6.19\",\n sha256 = \"301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstream/0.6.19/download\"],\n strip_prefix = \"anstream-0.6.19\",\n build_file = Label(\"@crates//crates:BUILD.anstream-0.6.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-1.0.11\",\n sha256 = \"862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle/1.0.11/download\"],\n strip_prefix = \"anstyle-1.0.11\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-1.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-parse-0.2.7\",\n sha256 = \"4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-parse/0.2.7/download\"],\n strip_prefix = \"anstyle-parse-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-parse-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-query-1.1.3\",\n sha256 = \"6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-query/1.1.3/download\"],\n strip_prefix = \"anstyle-query-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-query-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-wincon-3.0.9\",\n sha256 = \"403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.9/download\"],\n strip_prefix = \"anstyle-wincon-3.0.9\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-wincon-3.0.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anyhow-1.0.98\",\n sha256 = \"e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anyhow/1.0.98/download\"],\n strip_prefix = \"anyhow-1.0.98\",\n build_file = Label(\"@crates//crates:BUILD.anyhow-1.0.98.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-trait-0.1.88\",\n sha256 = \"e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-trait/0.1.88/download\"],\n strip_prefix = \"async-trait-0.1.88\",\n build_file = Label(\"@crates//crates:BUILD.async-trait-0.1.88.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atomic-waker-1.1.2\",\n sha256 = \"1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atomic-waker/1.1.2/download\"],\n strip_prefix = \"atomic-waker-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.atomic-waker-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__autocfg-1.5.0\",\n sha256 = \"c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/autocfg/1.5.0/download\"],\n strip_prefix = \"autocfg-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.autocfg-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-0.7.9\",\n sha256 = \"edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum/0.7.9/download\"],\n strip_prefix = \"axum-0.7.9\",\n build_file = Label(\"@crates//crates:BUILD.axum-0.7.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-core-0.4.5\",\n sha256 = \"09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum-core/0.4.5/download\"],\n strip_prefix = \"axum-core-0.4.5\",\n build_file = Label(\"@crates//crates:BUILD.axum-core-0.4.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-jsonschema-0.8.0\",\n sha256 = \"fcffe29ca1b60172349fea781ec34441d598809bd227ccbb5bf5dc2879cd9c78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum-jsonschema/0.8.0/download\"],\n strip_prefix = \"axum-jsonschema-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.axum-jsonschema-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__backtrace-0.3.75\",\n sha256 = \"6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/backtrace/0.3.75/download\"],\n strip_prefix = \"backtrace-0.3.75\",\n build_file = Label(\"@crates//crates:BUILD.backtrace-0.3.75.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-0.21.7\",\n sha256 = \"9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64/0.21.7/download\"],\n strip_prefix = \"base64-0.21.7\",\n build_file = Label(\"@crates//crates:BUILD.base64-0.21.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-set-0.5.3\",\n sha256 = \"0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-set/0.5.3/download\"],\n strip_prefix = \"bit-set-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.bit-set-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-vec-0.6.3\",\n sha256 = \"349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-vec/0.6.3/download\"],\n strip_prefix = \"bit-vec-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.bit-vec-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-2.9.1\",\n sha256 = \"1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/2.9.1/download\"],\n strip_prefix = \"bitflags-2.9.1\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-2.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-buffer-0.10.4\",\n sha256 = \"3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-buffer/0.10.4/download\"],\n strip_prefix = \"block-buffer-0.10.4\",\n build_file = Label(\"@crates//crates:BUILD.block-buffer-0.10.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bumpalo-3.19.0\",\n sha256 = \"46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bumpalo/3.19.0/download\"],\n strip_prefix = \"bumpalo-3.19.0\",\n build_file = Label(\"@crates//crates:BUILD.bumpalo-3.19.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecount-0.6.9\",\n sha256 = \"175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecount/0.6.9/download\"],\n strip_prefix = \"bytecount-0.6.9\",\n build_file = Label(\"@crates//crates:BUILD.bytecount-0.6.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytes-1.10.1\",\n sha256 = \"d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytes/1.10.1/download\"],\n strip_prefix = \"bytes-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.bytes-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cc-1.2.29\",\n sha256 = \"5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cc/1.2.29/download\"],\n strip_prefix = \"cc-1.2.29\",\n build_file = Label(\"@crates//crates:BUILD.cc-1.2.29.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-if-1.0.1\",\n sha256 = \"9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-if/1.0.1/download\"],\n strip_prefix = \"cfg-if-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.cfg-if-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap-4.5.41\",\n sha256 = \"be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap/4.5.41/download\"],\n strip_prefix = \"clap-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_builder-4.5.41\",\n sha256 = \"707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_builder/4.5.41/download\"],\n strip_prefix = \"clap_builder-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap_builder-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_derive-4.5.41\",\n sha256 = \"ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_derive/4.5.41/download\"],\n strip_prefix = \"clap_derive-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap_derive-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_lex-0.7.5\",\n sha256 = \"b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_lex/0.7.5/download\"],\n strip_prefix = \"clap_lex-0.7.5\",\n build_file = Label(\"@crates//crates:BUILD.clap_lex-0.7.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colorchoice-1.0.4\",\n sha256 = \"b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colorchoice/1.0.4/download\"],\n strip_prefix = \"colorchoice-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.colorchoice-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colored-2.2.0\",\n sha256 = \"117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colored/2.2.0/download\"],\n strip_prefix = \"colored-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.colored-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cpufeatures-0.2.17\",\n sha256 = \"59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cpufeatures/0.2.17/download\"],\n strip_prefix = \"cpufeatures-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.cpufeatures-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-channel-0.5.15\",\n sha256 = \"82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-channel/0.5.15/download\"],\n strip_prefix = \"crossbeam-channel-0.5.15\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-channel-0.5.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-utils-0.8.21\",\n sha256 = \"d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-utils/0.8.21/download\"],\n strip_prefix = \"crossbeam-utils-0.8.21\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-utils-0.8.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-common-0.1.6\",\n sha256 = \"1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-common/0.1.6/download\"],\n strip_prefix = \"crypto-common-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.crypto-common-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__deranged-0.4.0\",\n sha256 = \"9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/deranged/0.4.0/download\"],\n strip_prefix = \"deranged-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.deranged-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__digest-0.10.7\",\n sha256 = \"9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/digest/0.10.7/download\"],\n strip_prefix = \"digest-0.10.7\",\n build_file = Label(\"@crates//crates:BUILD.digest-0.10.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__displaydoc-0.2.5\",\n sha256 = \"97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/displaydoc/0.2.5/download\"],\n strip_prefix = \"displaydoc-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.displaydoc-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dyn-clone-1.0.19\",\n sha256 = \"1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dyn-clone/1.0.19/download\"],\n strip_prefix = \"dyn-clone-1.0.19\",\n build_file = Label(\"@crates//crates:BUILD.dyn-clone-1.0.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__either-1.15.0\",\n sha256 = \"48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/either/1.15.0/download\"],\n strip_prefix = \"either-1.15.0\",\n build_file = Label(\"@crates//crates:BUILD.either-1.15.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__equivalent-1.0.2\",\n sha256 = \"877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/equivalent/1.0.2/download\"],\n strip_prefix = \"equivalent-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.equivalent-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__errno-0.3.13\",\n sha256 = \"778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/errno/0.3.13/download\"],\n strip_prefix = \"errno-0.3.13\",\n build_file = Label(\"@crates//crates:BUILD.errno-0.3.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fallible-iterator-0.3.0\",\n sha256 = \"2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fallible-iterator/0.3.0/download\"],\n strip_prefix = \"fallible-iterator-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fallible-iterator-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fallible-streaming-iterator-0.1.9\",\n sha256 = \"7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fallible-streaming-iterator/0.1.9/download\"],\n strip_prefix = \"fallible-streaming-iterator-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.fallible-streaming-iterator-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.11.0\",\n sha256 = \"b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.11.0/download\"],\n strip_prefix = \"fancy-regex-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fastrand-2.3.0\",\n sha256 = \"37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fastrand/2.3.0/download\"],\n strip_prefix = \"fastrand-2.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fastrand-2.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fixedbitset-0.5.7\",\n sha256 = \"1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fixedbitset/0.5.7/download\"],\n strip_prefix = \"fixedbitset-0.5.7\",\n build_file = Label(\"@crates//crates:BUILD.fixedbitset-0.5.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fnv-1.0.7\",\n sha256 = \"3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fnv/1.0.7/download\"],\n strip_prefix = \"fnv-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.fnv-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__form_urlencoded-1.2.1\",\n sha256 = \"e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/form_urlencoded/1.2.1/download\"],\n strip_prefix = \"form_urlencoded-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.form_urlencoded-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fraction-0.13.1\",\n sha256 = \"3027ae1df8d41b4bed2241c8fdad4acc1e7af60c8e17743534b545e77182d678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fraction/0.13.1/download\"],\n strip_prefix = \"fraction-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.fraction-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-0.3.31\",\n sha256 = \"65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures/0.3.31/download\"],\n strip_prefix = \"futures-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-channel-0.3.31\",\n sha256 = \"2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-channel/0.3.31/download\"],\n strip_prefix = \"futures-channel-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-channel-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-core-0.3.31\",\n sha256 = \"05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-core/0.3.31/download\"],\n strip_prefix = \"futures-core-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-core-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-executor-0.3.31\",\n sha256 = \"1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-executor/0.3.31/download\"],\n strip_prefix = \"futures-executor-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-executor-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-io-0.3.31\",\n sha256 = \"9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-io/0.3.31/download\"],\n strip_prefix = \"futures-io-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-io-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-macro-0.3.31\",\n sha256 = \"162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-macro/0.3.31/download\"],\n strip_prefix = \"futures-macro-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-macro-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-sink-0.3.31\",\n sha256 = \"e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-sink/0.3.31/download\"],\n strip_prefix = \"futures-sink-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-sink-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-task-0.3.31\",\n sha256 = \"f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-task/0.3.31/download\"],\n strip_prefix = \"futures-task-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-task-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-util-0.3.31\",\n sha256 = \"9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-util/0.3.31/download\"],\n strip_prefix = \"futures-util-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-util-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__generic-array-0.14.7\",\n sha256 = \"85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/generic-array/0.14.7/download\"],\n strip_prefix = \"generic-array-0.14.7\",\n build_file = Label(\"@crates//crates:BUILD.generic-array-0.14.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.2.16\",\n sha256 = \"335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.2.16/download\"],\n strip_prefix = \"getrandom-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.3.3\",\n sha256 = \"26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.3.3/download\"],\n strip_prefix = \"getrandom-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gimli-0.31.1\",\n sha256 = \"07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gimli/0.31.1/download\"],\n strip_prefix = \"gimli-0.31.1\",\n build_file = Label(\"@crates//crates:BUILD.gimli-0.31.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__h2-0.4.11\",\n sha256 = \"17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/h2/0.4.11/download\"],\n strip_prefix = \"h2-0.4.11\",\n build_file = Label(\"@crates//crates:BUILD.h2-0.4.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.14.5\",\n sha256 = \"e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.14.5/download\"],\n strip_prefix = \"hashbrown-0.14.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.14.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.15.4\",\n sha256 = \"5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.15.4/download\"],\n strip_prefix = \"hashbrown-0.15.4\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.15.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashlink-0.9.1\",\n sha256 = \"6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashlink/0.9.1/download\"],\n strip_prefix = \"hashlink-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.hashlink-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__heck-0.5.0\",\n sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n strip_prefix = \"heck-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.heck-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hermit-abi-0.5.2\",\n sha256 = \"fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hermit-abi/0.5.2/download\"],\n strip_prefix = \"hermit-abi-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.hermit-abi-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-1.3.1\",\n sha256 = \"f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http/1.3.1/download\"],\n strip_prefix = \"http-1.3.1\",\n build_file = Label(\"@crates//crates:BUILD.http-1.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-1.0.1\",\n sha256 = \"1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body/1.0.1/download\"],\n strip_prefix = \"http-body-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.http-body-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-util-0.1.3\",\n sha256 = \"b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body-util/0.1.3/download\"],\n strip_prefix = \"http-body-util-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.http-body-util-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__httparse-1.10.1\",\n sha256 = \"6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/httparse/1.10.1/download\"],\n strip_prefix = \"httparse-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.httparse-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__httpdate-1.0.3\",\n sha256 = \"df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/httpdate/1.0.3/download\"],\n strip_prefix = \"httpdate-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.httpdate-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-1.6.0\",\n sha256 = \"cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper/1.6.0/download\"],\n strip_prefix = \"hyper-1.6.0\",\n build_file = Label(\"@crates//crates:BUILD.hyper-1.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-util-0.1.15\",\n sha256 = \"7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper-util/0.1.15/download\"],\n strip_prefix = \"hyper-util-0.1.15\",\n build_file = Label(\"@crates//crates:BUILD.hyper-util-0.1.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collections-2.0.0\",\n sha256 = \"200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collections/2.0.0/download\"],\n strip_prefix = \"icu_collections-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collections-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_core-2.0.0\",\n sha256 = \"0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_core/2.0.0/download\"],\n strip_prefix = \"icu_locale_core-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_core-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer-2.0.0\",\n sha256 = \"436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer/2.0.0/download\"],\n strip_prefix = \"icu_normalizer-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer_data-2.0.0\",\n sha256 = \"00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer_data/2.0.0/download\"],\n strip_prefix = \"icu_normalizer_data-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer_data-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties-2.0.1\",\n sha256 = \"016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties/2.0.1/download\"],\n strip_prefix = \"icu_properties-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties_data-2.0.1\",\n sha256 = \"298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties_data/2.0.1/download\"],\n strip_prefix = \"icu_properties_data-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties_data-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_provider-2.0.0\",\n sha256 = \"03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_provider/2.0.0/download\"],\n strip_prefix = \"icu_provider-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_provider-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna-1.0.3\",\n sha256 = \"686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna/1.0.3/download\"],\n strip_prefix = \"idna-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.idna-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna_adapter-1.2.1\",\n sha256 = \"3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna_adapter/1.2.1/download\"],\n strip_prefix = \"idna_adapter-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.idna_adapter-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indexmap-2.10.0\",\n sha256 = \"fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indexmap/2.10.0/download\"],\n strip_prefix = \"indexmap-2.10.0\",\n build_file = Label(\"@crates//crates:BUILD.indexmap-2.10.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__io-uring-0.7.8\",\n sha256 = \"b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/io-uring/0.7.8/download\"],\n strip_prefix = \"io-uring-0.7.8\",\n build_file = Label(\"@crates//crates:BUILD.io-uring-0.7.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__is_terminal_polyfill-1.70.1\",\n sha256 = \"7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.1/download\"],\n strip_prefix = \"is_terminal_polyfill-1.70.1\",\n build_file = Label(\"@crates//crates:BUILD.is_terminal_polyfill-1.70.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__iso8601-0.6.3\",\n sha256 = \"e1082f0c48f143442a1ac6122f67e360ceee130b967af4d50996e5154a45df46\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/iso8601/0.6.3/download\"],\n strip_prefix = \"iso8601-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.iso8601-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.12.1\",\n sha256 = \"ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.12.1/download\"],\n strip_prefix = \"itertools-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.14.0\",\n sha256 = \"2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.14.0/download\"],\n strip_prefix = \"itertools-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itoa-1.0.15\",\n sha256 = \"4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itoa/1.0.15/download\"],\n strip_prefix = \"itoa-1.0.15\",\n build_file = Label(\"@crates//crates:BUILD.itoa-1.0.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__js-sys-0.3.77\",\n sha256 = \"1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/js-sys/0.3.77/download\"],\n strip_prefix = \"js-sys-0.3.77\",\n build_file = Label(\"@crates//crates:BUILD.js-sys-0.3.77.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jsonschema-0.17.1\",\n sha256 = \"2a071f4f7efc9a9118dfb627a0a94ef247986e1ab8606a4c806ae2b3aa3b6978\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jsonschema/0.17.1/download\"],\n strip_prefix = \"jsonschema-0.17.1\",\n build_file = Label(\"@crates//crates:BUILD.jsonschema-0.17.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lazy_static-1.5.0\",\n sha256 = \"bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lazy_static/1.5.0/download\"],\n strip_prefix = \"lazy_static-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.lazy_static-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libc-0.2.174\",\n sha256 = \"1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libc/0.2.174/download\"],\n strip_prefix = \"libc-0.2.174\",\n build_file = Label(\"@crates//crates:BUILD.libc-0.2.174.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libsqlite3-sys-0.28.0\",\n sha256 = \"0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libsqlite3-sys/0.28.0/download\"],\n strip_prefix = \"libsqlite3-sys-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.libsqlite3-sys-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.9.4\",\n sha256 = \"cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.9.4/download\"],\n strip_prefix = \"linux-raw-sys-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__litemap-0.8.0\",\n sha256 = \"241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/litemap/0.8.0/download\"],\n strip_prefix = \"litemap-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.litemap-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lock_api-0.4.13\",\n sha256 = \"96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lock_api/0.4.13/download\"],\n strip_prefix = \"lock_api-0.4.13\",\n build_file = Label(\"@crates//crates:BUILD.lock_api-0.4.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__log-0.4.27\",\n sha256 = \"13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/log/0.4.27/download\"],\n strip_prefix = \"log-0.4.27\",\n build_file = Label(\"@crates//crates:BUILD.log-0.4.27.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__matchit-0.7.3\",\n sha256 = \"0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/matchit/0.7.3/download\"],\n strip_prefix = \"matchit-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.matchit-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memchr-2.7.5\",\n sha256 = \"32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.7.5/download\"],\n strip_prefix = \"memchr-2.7.5\",\n build_file = Label(\"@crates//crates:BUILD.memchr-2.7.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mime-0.3.17\",\n sha256 = \"6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mime/0.3.17/download\"],\n strip_prefix = \"mime-0.3.17\",\n build_file = Label(\"@crates//crates:BUILD.mime-0.3.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__miniz_oxide-0.8.9\",\n sha256 = \"1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/miniz_oxide/0.8.9/download\"],\n strip_prefix = \"miniz_oxide-0.8.9\",\n build_file = Label(\"@crates//crates:BUILD.miniz_oxide-0.8.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mio-1.0.4\",\n sha256 = \"78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mio/1.0.4/download\"],\n strip_prefix = \"mio-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.mio-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__multimap-0.10.1\",\n sha256 = \"1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/multimap/0.10.1/download\"],\n strip_prefix = \"multimap-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.multimap-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nom-8.0.0\",\n sha256 = \"df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nom/8.0.0/download\"],\n strip_prefix = \"nom-8.0.0\",\n build_file = Label(\"@crates//crates:BUILD.nom-8.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-0.4.3\",\n sha256 = \"35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num/0.4.3/download\"],\n strip_prefix = \"num-0.4.3\",\n build_file = Label(\"@crates//crates:BUILD.num-0.4.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-bigint-0.4.6\",\n sha256 = \"a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-bigint/0.4.6/download\"],\n strip_prefix = \"num-bigint-0.4.6\",\n build_file = Label(\"@crates//crates:BUILD.num-bigint-0.4.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-cmp-0.1.0\",\n sha256 = \"63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-cmp/0.1.0/download\"],\n strip_prefix = \"num-cmp-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.num-cmp-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-complex-0.4.6\",\n sha256 = \"73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-complex/0.4.6/download\"],\n strip_prefix = \"num-complex-0.4.6\",\n build_file = Label(\"@crates//crates:BUILD.num-complex-0.4.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-conv-0.1.0\",\n sha256 = \"51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-conv/0.1.0/download\"],\n strip_prefix = \"num-conv-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.num-conv-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-integer-0.1.46\",\n sha256 = \"7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-integer/0.1.46/download\"],\n strip_prefix = \"num-integer-0.1.46\",\n build_file = Label(\"@crates//crates:BUILD.num-integer-0.1.46.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-iter-0.1.45\",\n sha256 = \"1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-iter/0.1.45/download\"],\n strip_prefix = \"num-iter-0.1.45\",\n build_file = Label(\"@crates//crates:BUILD.num-iter-0.1.45.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-rational-0.4.2\",\n sha256 = \"f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-rational/0.4.2/download\"],\n strip_prefix = \"num-rational-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.num-rational-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-traits-0.2.19\",\n sha256 = \"071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-traits/0.2.19/download\"],\n strip_prefix = \"num-traits-0.2.19\",\n build_file = Label(\"@crates//crates:BUILD.num-traits-0.2.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num_cpus-1.17.0\",\n sha256 = \"91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num_cpus/1.17.0/download\"],\n strip_prefix = \"num_cpus-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.num_cpus-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num_threads-0.1.7\",\n sha256 = \"5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num_threads/0.1.7/download\"],\n strip_prefix = \"num_threads-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.num_threads-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__object-0.36.7\",\n sha256 = \"62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/object/0.36.7/download\"],\n strip_prefix = \"object-0.36.7\",\n build_file = Label(\"@crates//crates:BUILD.object-0.36.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell-1.21.3\",\n sha256 = \"42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell/1.21.3/download\"],\n strip_prefix = \"once_cell-1.21.3\",\n build_file = Label(\"@crates//crates:BUILD.once_cell-1.21.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell_polyfill-1.70.1\",\n sha256 = \"a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.1/download\"],\n strip_prefix = \"once_cell_polyfill-1.70.1\",\n build_file = Label(\"@crates//crates:BUILD.once_cell_polyfill-1.70.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot-0.12.4\",\n sha256 = \"70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot/0.12.4/download\"],\n strip_prefix = \"parking_lot-0.12.4\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot-0.12.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot_core-0.9.11\",\n sha256 = \"bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot_core/0.9.11/download\"],\n strip_prefix = \"parking_lot_core-0.9.11\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot_core-0.9.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__percent-encoding-2.3.1\",\n sha256 = \"e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/percent-encoding/2.3.1/download\"],\n strip_prefix = \"percent-encoding-2.3.1\",\n build_file = Label(\"@crates//crates:BUILD.percent-encoding-2.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__petgraph-0.7.1\",\n sha256 = \"3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/petgraph/0.7.1/download\"],\n strip_prefix = \"petgraph-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.petgraph-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-project-lite-0.2.16\",\n sha256 = \"3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-project-lite/0.2.16/download\"],\n strip_prefix = \"pin-project-lite-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.pin-project-lite-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-utils-0.1.0\",\n sha256 = \"8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-utils/0.1.0/download\"],\n strip_prefix = \"pin-utils-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.pin-utils-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pkg-config-0.3.32\",\n sha256 = \"7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pkg-config/0.3.32/download\"],\n strip_prefix = \"pkg-config-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.pkg-config-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__potential_utf-0.1.2\",\n sha256 = \"e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/potential_utf/0.1.2/download\"],\n strip_prefix = \"potential_utf-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.potential_utf-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__powerfmt-0.2.0\",\n sha256 = \"439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/powerfmt/0.2.0/download\"],\n strip_prefix = \"powerfmt-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.powerfmt-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prettyplease-0.2.35\",\n sha256 = \"061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prettyplease/0.2.35/download\"],\n strip_prefix = \"prettyplease-0.2.35\",\n build_file = Label(\"@crates//crates:BUILD.prettyplease-0.2.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro2-1.0.95\",\n sha256 = \"02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.95/download\"],\n strip_prefix = \"proc-macro2-1.0.95\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro2-1.0.95.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-0.13.5\",\n sha256 = \"2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost/0.13.5/download\"],\n strip_prefix = \"prost-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-build-0.13.5\",\n sha256 = \"be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-build/0.13.5/download\"],\n strip_prefix = \"prost-build-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-build-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-derive-0.13.5\",\n sha256 = \"8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-derive/0.13.5/download\"],\n strip_prefix = \"prost-derive-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-derive-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-types-0.13.5\",\n sha256 = \"52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-types/0.13.5/download\"],\n strip_prefix = \"prost-types-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-types-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quote-1.0.40\",\n sha256 = \"1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.40/download\"],\n strip_prefix = \"quote-1.0.40\",\n build_file = Label(\"@crates//crates:BUILD.quote-1.0.40.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-5.3.0\",\n sha256 = \"69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/5.3.0/download\"],\n strip_prefix = \"r-efi-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__redox_syscall-0.5.13\",\n sha256 = \"0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/redox_syscall/0.5.13/download\"],\n strip_prefix = \"redox_syscall-0.5.13\",\n build_file = Label(\"@crates//crates:BUILD.redox_syscall-0.5.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-1.11.1\",\n sha256 = \"b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex/1.11.1/download\"],\n strip_prefix = \"regex-1.11.1\",\n build_file = Label(\"@crates//crates:BUILD.regex-1.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-automata-0.4.9\",\n sha256 = \"809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-automata/0.4.9/download\"],\n strip_prefix = \"regex-automata-0.4.9\",\n build_file = Label(\"@crates//crates:BUILD.regex-automata-0.4.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-syntax-0.8.5\",\n sha256 = \"2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-syntax/0.8.5/download\"],\n strip_prefix = \"regex-syntax-0.8.5\",\n build_file = Label(\"@crates//crates:BUILD.regex-syntax-0.8.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rusqlite-0.31.0\",\n sha256 = \"b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rusqlite/0.31.0/download\"],\n strip_prefix = \"rusqlite-0.31.0\",\n build_file = Label(\"@crates//crates:BUILD.rusqlite-0.31.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-8.7.2\",\n sha256 = \"025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed/8.7.2/download\"],\n strip_prefix = \"rust-embed-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-impl-8.7.2\",\n sha256 = \"6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed-impl/8.7.2/download\"],\n strip_prefix = \"rust-embed-impl-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-impl-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-utils-8.7.2\",\n sha256 = \"f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed-utils/8.7.2/download\"],\n strip_prefix = \"rust-embed-utils-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-utils-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-demangle-0.1.25\",\n sha256 = \"989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-demangle/0.1.25/download\"],\n strip_prefix = \"rustc-demangle-0.1.25\",\n build_file = Label(\"@crates//crates:BUILD.rustc-demangle-0.1.25.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-1.0.7\",\n sha256 = \"c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/1.0.7/download\"],\n strip_prefix = \"rustix-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.rustix-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustversion-1.0.21\",\n sha256 = \"8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustversion/1.0.21/download\"],\n strip_prefix = \"rustversion-1.0.21\",\n build_file = Label(\"@crates//crates:BUILD.rustversion-1.0.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ryu-1.0.20\",\n sha256 = \"28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ryu/1.0.20/download\"],\n strip_prefix = \"ryu-1.0.20\",\n build_file = Label(\"@crates//crates:BUILD.ryu-1.0.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__same-file-1.0.6\",\n sha256 = \"93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/same-file/1.0.6/download\"],\n strip_prefix = \"same-file-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.same-file-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__schemars-0.8.22\",\n sha256 = \"3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/schemars/0.8.22/download\"],\n strip_prefix = \"schemars-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.schemars-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__schemars_derive-0.8.22\",\n sha256 = \"32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/schemars_derive/0.8.22/download\"],\n strip_prefix = \"schemars_derive-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.schemars_derive-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__scopeguard-1.2.0\",\n sha256 = \"94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/scopeguard/1.2.0/download\"],\n strip_prefix = \"scopeguard-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.scopeguard-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde-1.0.219\",\n sha256 = \"5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde/1.0.219/download\"],\n strip_prefix = \"serde-1.0.219\",\n build_file = Label(\"@crates//crates:BUILD.serde-1.0.219.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive-1.0.219\",\n sha256 = \"5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive/1.0.219/download\"],\n strip_prefix = \"serde_derive-1.0.219\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive-1.0.219.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive_internals-0.29.1\",\n sha256 = \"18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive_internals/0.29.1/download\"],\n strip_prefix = \"serde_derive_internals-0.29.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive_internals-0.29.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_json-1.0.140\",\n sha256 = \"20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_json/1.0.140/download\"],\n strip_prefix = \"serde_json-1.0.140\",\n build_file = Label(\"@crates//crates:BUILD.serde_json-1.0.140.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_path_to_error-0.1.17\",\n sha256 = \"59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_path_to_error/0.1.17/download\"],\n strip_prefix = \"serde_path_to_error-0.1.17\",\n build_file = Label(\"@crates//crates:BUILD.serde_path_to_error-0.1.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_qs-0.13.0\",\n sha256 = \"cd34f36fe4c5ba9654417139a9b3a20d2e1de6012ee678ad14d240c22c78d8d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_qs/0.13.0/download\"],\n strip_prefix = \"serde_qs-0.13.0\",\n build_file = Label(\"@crates//crates:BUILD.serde_qs-0.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_urlencoded-0.7.1\",\n sha256 = \"d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_urlencoded/0.7.1/download\"],\n strip_prefix = \"serde_urlencoded-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_urlencoded-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha2-0.10.9\",\n sha256 = \"a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha2/0.10.9/download\"],\n strip_prefix = \"sha2-0.10.9\",\n build_file = Label(\"@crates//crates:BUILD.sha2-0.10.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-1.3.0\",\n sha256 = \"0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/1.3.0/download\"],\n strip_prefix = \"shlex-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.shlex-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simple_logger-4.3.3\",\n sha256 = \"8e7e46c8c90251d47d08b28b8a419ffb4aede0f87c2eea95e17d1d5bacbf3ef1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simple_logger/4.3.3/download\"],\n strip_prefix = \"simple_logger-4.3.3\",\n build_file = Label(\"@crates//crates:BUILD.simple_logger-4.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__slab-0.4.10\",\n sha256 = \"04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/slab/0.4.10/download\"],\n strip_prefix = \"slab-0.4.10\",\n build_file = Label(\"@crates//crates:BUILD.slab-0.4.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smallvec-1.15.1\",\n sha256 = \"67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smallvec/1.15.1/download\"],\n strip_prefix = \"smallvec-1.15.1\",\n build_file = Label(\"@crates//crates:BUILD.smallvec-1.15.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.5.10\",\n sha256 = \"e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.5.10/download\"],\n strip_prefix = \"socket2-0.5.10\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.5.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stable_deref_trait-1.2.0\",\n sha256 = \"a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stable_deref_trait/1.2.0/download\"],\n strip_prefix = \"stable_deref_trait-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.stable_deref_trait-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strsim-0.11.1\",\n sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n strip_prefix = \"strsim-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.strsim-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-2.0.104\",\n sha256 = \"17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.104/download\"],\n strip_prefix = \"syn-2.0.104\",\n build_file = Label(\"@crates//crates:BUILD.syn-2.0.104.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sync_wrapper-1.0.2\",\n sha256 = \"0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sync_wrapper/1.0.2/download\"],\n strip_prefix = \"sync_wrapper-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.sync_wrapper-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__synstructure-0.13.2\",\n sha256 = \"728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/synstructure/0.13.2/download\"],\n strip_prefix = \"synstructure-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.synstructure-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tempfile-3.20.0\",\n sha256 = \"e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tempfile/3.20.0/download\"],\n strip_prefix = \"tempfile-3.20.0\",\n build_file = Label(\"@crates//crates:BUILD.tempfile-3.20.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-1.0.69\",\n sha256 = \"b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/1.0.69/download\"],\n strip_prefix = \"thiserror-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-1.0.69\",\n sha256 = \"4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/1.0.69/download\"],\n strip_prefix = \"thiserror-impl-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-0.3.41\",\n sha256 = \"8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time/0.3.41/download\"],\n strip_prefix = \"time-0.3.41\",\n build_file = Label(\"@crates//crates:BUILD.time-0.3.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-core-0.1.4\",\n sha256 = \"c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-core/0.1.4/download\"],\n strip_prefix = \"time-core-0.1.4\",\n build_file = Label(\"@crates//crates:BUILD.time-core-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-macros-0.2.22\",\n sha256 = \"3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-macros/0.2.22/download\"],\n strip_prefix = \"time-macros-0.2.22\",\n build_file = Label(\"@crates//crates:BUILD.time-macros-0.2.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinystr-0.8.1\",\n sha256 = \"5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinystr/0.8.1/download\"],\n strip_prefix = \"tinystr-0.8.1\",\n build_file = Label(\"@crates//crates:BUILD.tinystr-0.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-1.46.1\",\n sha256 = \"0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio/1.46.1/download\"],\n strip_prefix = \"tokio-1.46.1\",\n build_file = Label(\"@crates//crates:BUILD.tokio-1.46.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-macros-2.5.0\",\n sha256 = \"6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-macros/2.5.0/download\"],\n strip_prefix = \"tokio-macros-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.tokio-macros-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-util-0.7.15\",\n sha256 = \"66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-util/0.7.15/download\"],\n strip_prefix = \"tokio-util-0.7.15\",\n build_file = Label(\"@crates//crates:BUILD.tokio-util-0.7.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-0.4.13\",\n sha256 = \"b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower/0.4.13/download\"],\n strip_prefix = \"tower-0.4.13\",\n build_file = Label(\"@crates//crates:BUILD.tower-0.4.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-0.5.2\",\n sha256 = \"d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower/0.5.2/download\"],\n strip_prefix = \"tower-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.tower-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-http-0.5.2\",\n sha256 = \"1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-http/0.5.2/download\"],\n strip_prefix = \"tower-http-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.tower-http-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-layer-0.3.3\",\n sha256 = \"121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-layer/0.3.3/download\"],\n strip_prefix = \"tower-layer-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-layer-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-service-0.3.3\",\n sha256 = \"8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-service/0.3.3/download\"],\n strip_prefix = \"tower-service-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-service-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-0.1.41\",\n sha256 = \"784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing/0.1.41/download\"],\n strip_prefix = \"tracing-0.1.41\",\n build_file = Label(\"@crates//crates:BUILD.tracing-0.1.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-attributes-0.1.30\",\n sha256 = \"81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-attributes/0.1.30/download\"],\n strip_prefix = \"tracing-attributes-0.1.30\",\n build_file = Label(\"@crates//crates:BUILD.tracing-attributes-0.1.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-core-0.1.34\",\n sha256 = \"b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-core/0.1.34/download\"],\n strip_prefix = \"tracing-core-0.1.34\",\n build_file = Label(\"@crates//crates:BUILD.tracing-core-0.1.34.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__try-lock-0.2.5\",\n sha256 = \"e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/try-lock/0.2.5/download\"],\n strip_prefix = \"try-lock-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.try-lock-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__typenum-1.18.0\",\n sha256 = \"1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/typenum/1.18.0/download\"],\n strip_prefix = \"typenum-1.18.0\",\n build_file = Label(\"@crates//crates:BUILD.typenum-1.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-ident-1.0.18\",\n sha256 = \"5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.18/download\"],\n strip_prefix = \"unicode-ident-1.0.18\",\n build_file = Label(\"@crates//crates:BUILD.unicode-ident-1.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__url-2.5.4\",\n sha256 = \"32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/url/2.5.4/download\"],\n strip_prefix = \"url-2.5.4\",\n build_file = Label(\"@crates//crates:BUILD.url-2.5.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8_iter-1.0.4\",\n sha256 = \"b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8_iter/1.0.4/download\"],\n strip_prefix = \"utf8_iter-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.utf8_iter-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8parse-0.2.2\",\n sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n strip_prefix = \"utf8parse-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.utf8parse-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uuid-1.17.0\",\n sha256 = \"3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uuid/1.17.0/download\"],\n strip_prefix = \"uuid-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.uuid-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__vcpkg-0.2.15\",\n sha256 = \"accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/vcpkg/0.2.15/download\"],\n strip_prefix = \"vcpkg-0.2.15\",\n build_file = Label(\"@crates//crates:BUILD.vcpkg-0.2.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__version_check-0.9.5\",\n sha256 = \"0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/version_check/0.9.5/download\"],\n strip_prefix = \"version_check-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.version_check-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__walkdir-2.5.0\",\n sha256 = \"29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/walkdir/2.5.0/download\"],\n strip_prefix = \"walkdir-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.walkdir-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__want-0.3.1\",\n sha256 = \"bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/want/0.3.1/download\"],\n strip_prefix = \"want-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.want-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.11.1-wasi-snapshot-preview1\",\n sha256 = \"ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download\"],\n strip_prefix = \"wasi-0.11.1+wasi-snapshot-preview1\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.14.2-wasi-0.2.4\",\n sha256 = \"9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.14.2+wasi-0.2.4/download\"],\n strip_prefix = \"wasi-0.14.2+wasi-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.14.2+wasi-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-0.2.100\",\n sha256 = \"1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-backend-0.2.100\",\n sha256 = \"2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-backend/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-backend-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-backend-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-0.2.100\",\n sha256 = \"7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-macro-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-support-0.2.100\",\n sha256 = \"8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-macro-support-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-support-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-shared-0.2.100\",\n sha256 = \"1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-shared/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-shared-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-shared-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-util-0.1.9\",\n sha256 = \"cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-util/0.1.9/download\"],\n strip_prefix = \"winapi-util-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.winapi-util-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.48.0\",\n sha256 = \"677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.48.0/download\"],\n strip_prefix = \"windows-sys-0.48.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.48.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.52.0\",\n sha256 = \"282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.52.0/download\"],\n strip_prefix = \"windows-sys-0.52.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.52.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.59.0\",\n sha256 = \"1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.59.0/download\"],\n strip_prefix = \"windows-sys-0.59.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.59.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.60.2\",\n sha256 = \"f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.60.2/download\"],\n strip_prefix = \"windows-sys-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.48.5\",\n sha256 = \"9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.48.5/download\"],\n strip_prefix = \"windows-targets-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.52.6\",\n sha256 = \"9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.52.6/download\"],\n strip_prefix = \"windows-targets-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.53.2\",\n sha256 = \"c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.53.2/download\"],\n strip_prefix = \"windows-targets-0.53.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.53.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.48.5\",\n sha256 = \"2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.52.6\",\n sha256 = \"32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.53.0\",\n sha256 = \"86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.48.5\",\n sha256 = \"dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.52.6\",\n sha256 = \"09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.53.0\",\n sha256 = \"c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.53.0/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.48.5\",\n sha256 = \"a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.48.5/download\"],\n strip_prefix = \"windows_i686_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.52.6\",\n sha256 = \"8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.53.0\",\n sha256 = \"c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.53.0/download\"],\n strip_prefix = \"windows_i686_gnu-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.52.6\",\n sha256 = \"0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.53.0\",\n sha256 = \"9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.48.5\",\n sha256 = \"8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.48.5/download\"],\n strip_prefix = \"windows_i686_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.52.6\",\n sha256 = \"240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.52.6/download\"],\n strip_prefix = \"windows_i686_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.53.0\",\n sha256 = \"581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.53.0/download\"],\n strip_prefix = \"windows_i686_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.48.5\",\n sha256 = \"53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.52.6\",\n sha256 = \"147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.53.0\",\n sha256 = \"2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.48.5\",\n sha256 = \"0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.52.6\",\n sha256 = \"24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.53.0\",\n sha256 = \"0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.48.5\",\n sha256 = \"ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.52.6\",\n sha256 = \"589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.53.0\",\n sha256 = \"271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-rt-0.39.0\",\n sha256 = \"6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen-rt/0.39.0/download\"],\n strip_prefix = \"wit-bindgen-rt-0.39.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-rt-0.39.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__writeable-0.6.1\",\n sha256 = \"ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/writeable/0.6.1/download\"],\n strip_prefix = \"writeable-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.writeable-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-0.8.0\",\n sha256 = \"5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke/0.8.0/download\"],\n strip_prefix = \"yoke-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.yoke-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-derive-0.8.0\",\n sha256 = \"38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke-derive/0.8.0/download\"],\n strip_prefix = \"yoke-derive-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.yoke-derive-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-0.8.26\",\n sha256 = \"1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy/0.8.26/download\"],\n strip_prefix = \"zerocopy-0.8.26\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-0.8.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-derive-0.8.26\",\n sha256 = \"9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy-derive/0.8.26/download\"],\n strip_prefix = \"zerocopy-derive-0.8.26\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-derive-0.8.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-0.1.6\",\n sha256 = \"50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom/0.1.6/download\"],\n strip_prefix = \"zerofrom-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-derive-0.1.6\",\n sha256 = \"d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom-derive/0.1.6/download\"],\n strip_prefix = \"zerofrom-derive-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-derive-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerotrie-0.2.2\",\n sha256 = \"36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerotrie/0.2.2/download\"],\n strip_prefix = \"zerotrie-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.zerotrie-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-0.11.2\",\n sha256 = \"4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec/0.11.2/download\"],\n strip_prefix = \"zerovec-0.11.2\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-0.11.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-derive-0.11.1\",\n sha256 = \"5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec-derive/0.11.1/download\"],\n strip_prefix = \"zerovec-derive-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-derive-0.11.1.bazel\"),\n )\n\n return [\n struct(repo=\"crates__aide-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__async-trait-0.1.88\", is_dev_dep = False),\n struct(repo=\"crates__axum-0.7.9\", is_dev_dep = False),\n struct(repo=\"crates__axum-jsonschema-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__clap-4.5.41\", is_dev_dep = False),\n struct(repo=\"crates__crossbeam-channel-0.5.15\", is_dev_dep = False),\n struct(repo=\"crates__hyper-1.6.0\", is_dev_dep = False),\n struct(repo=\"crates__log-0.4.27\", is_dev_dep = False),\n struct(repo=\"crates__num_cpus-1.17.0\", is_dev_dep = False),\n struct(repo=\"crates__prost-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__prost-build-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__prost-types-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__rusqlite-0.31.0\", is_dev_dep = False),\n struct(repo=\"crates__rust-embed-8.7.2\", is_dev_dep = False),\n struct(repo=\"crates__schemars-0.8.22\", is_dev_dep = False),\n struct(repo=\"crates__serde-1.0.219\", is_dev_dep = False),\n struct(repo=\"crates__serde_json-1.0.140\", is_dev_dep = False),\n struct(repo=\"crates__simple_logger-4.3.3\", is_dev_dep = False),\n struct(repo=\"crates__tempfile-3.20.0\", is_dev_dep = False),\n struct(repo=\"crates__tokio-1.46.1\", is_dev_dep = False),\n struct(repo=\"crates__tower-0.4.13\", is_dev_dep = False),\n struct(repo=\"crates__tower-http-0.5.2\", is_dev_dep = False),\n struct(repo=\"crates__uuid-1.17.0\", is_dev_dep = False),\n ]\n" + "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'databuild'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"new_git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe/private:local_crate_mirror.bzl\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS AND ALIASES\n###############################################################################\n\n_NORMAL_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"aide\": Label(\"@crates//:aide-0.13.5\"),\n \"axum\": Label(\"@crates//:axum-0.7.9\"),\n \"axum-jsonschema\": Label(\"@crates//:axum-jsonschema-0.8.0\"),\n \"clap\": Label(\"@crates//:clap-4.5.41\"),\n \"crossbeam-channel\": Label(\"@crates//:crossbeam-channel-0.5.15\"),\n \"hyper\": Label(\"@crates//:hyper-1.6.0\"),\n \"log\": Label(\"@crates//:log-0.4.27\"),\n \"num_cpus\": Label(\"@crates//:num_cpus-1.17.0\"),\n \"prost\": Label(\"@crates//:prost-0.13.5\"),\n \"prost-build\": Label(\"@crates//:prost-build-0.13.5\"),\n \"prost-types\": Label(\"@crates//:prost-types-0.13.5\"),\n \"rusqlite\": Label(\"@crates//:rusqlite-0.31.0\"),\n \"rust-embed\": Label(\"@crates//:rust-embed-8.7.2\"),\n \"schemars\": Label(\"@crates//:schemars-0.8.22\"),\n \"serde\": Label(\"@crates//:serde-1.0.219\"),\n \"serde_json\": Label(\"@crates//:serde_json-1.0.140\"),\n \"simple_logger\": Label(\"@crates//:simple_logger-4.3.3\"),\n \"tempfile\": Label(\"@crates//:tempfile-3.20.0\"),\n \"thiserror\": Label(\"@crates//:thiserror-1.0.69\"),\n \"tokio\": Label(\"@crates//:tokio-1.46.1\"),\n \"tower\": Label(\"@crates//:tower-0.4.13\"),\n \"tower-http\": Label(\"@crates//:tower-http-0.5.2\"),\n \"uuid\": Label(\"@crates//:uuid-1.17.0\"),\n },\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"async-trait\": Label(\"@crates//:async-trait-0.1.88\"),\n },\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"aarch64-linux-android\": [],\n \"aarch64-pc-windows-gnullvm\": [],\n \"aarch64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(any(target_arch = \\\"x86_64\\\", target_arch = \\\"arm64ec\\\"), target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(all(any(target_os = \\\"android\\\", target_os = \\\"linux\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), not(any(all(target_os = \\\"linux\\\", target_env = \\\"\\\"), getrandom_backend = \\\"custom\\\", getrandom_backend = \\\"linux_raw\\\", getrandom_backend = \\\"rdrand\\\", getrandom_backend = \\\"rndr\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"linux\\\"))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_vendor = \\\"apple\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(all(target_arch = \\\"loongarch64\\\", target_os = \\\"linux\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"wasi\\\", target_env = \\\"p2\\\"))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(all(target_os = \\\"uefi\\\", getrandom_backend = \\\"efi_rng\\\"))\": [],\n \"cfg(all(tokio_uring, target_os = \\\"linux\\\"))\": [],\n \"cfg(any())\": [],\n \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any(target_os = \\\"dragonfly\\\", target_os = \\\"freebsd\\\", target_os = \\\"hurd\\\", target_os = \\\"illumos\\\", target_os = \\\"cygwin\\\", all(target_os = \\\"horizon\\\", target_arch = \\\"arm\\\")))\": [],\n \"cfg(any(target_os = \\\"haiku\\\", target_os = \\\"redox\\\", target_os = \\\"nto\\\", target_os = \\\"aix\\\"))\": [],\n \"cfg(any(target_os = \\\"ios\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\", target_os = \\\"tvos\\\"))\": [],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"ios\\\", target_os = \\\"freebsd\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"openbsd\\\", target_os = \\\"vita\\\", target_os = \\\"emscripten\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(unix, target_os = \\\"wasi\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any(windows, target_os = \\\"cygwin\\\"))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(not(all(target_arch = \\\"arm\\\", target_os = \\\"none\\\")))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(all(windows, target_env = \\\"msvc\\\", not(target_vendor = \\\"uwp\\\"))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(windows))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(target_arch = \\\"wasm32\\\")\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(target_os = \\\"hermit\\\")\": [],\n \"cfg(target_os = \\\"netbsd\\\")\": [],\n \"cfg(target_os = \\\"redox\\\")\": [],\n \"cfg(target_os = \\\"solaris\\\")\": [],\n \"cfg(target_os = \\\"vxworks\\\")\": [],\n \"cfg(target_os = \\\"wasi\\\")\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(tokio_taskdump)\": [],\n \"cfg(unix)\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(windows)\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"i686-pc-windows-gnullvm\": [],\n \"wasm32-unknown-unknown\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"wasm32-wasip1\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"x86_64-pc-windows-gnullvm\": [],\n \"x86_64-pc-windows-msvc\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"x86_64-unknown-nixos-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n http_archive,\n name = \"crates__addr2line-0.24.2\",\n sha256 = \"dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/addr2line/0.24.2/download\"],\n strip_prefix = \"addr2line-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.addr2line-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__adler2-2.0.1\",\n sha256 = \"320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/adler2/2.0.1/download\"],\n strip_prefix = \"adler2-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.adler2-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ahash-0.8.12\",\n sha256 = \"5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ahash/0.8.12/download\"],\n strip_prefix = \"ahash-0.8.12\",\n build_file = Label(\"@crates//crates:BUILD.ahash-0.8.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aho-corasick-1.1.3\",\n sha256 = \"8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aho-corasick/1.1.3/download\"],\n strip_prefix = \"aho-corasick-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.aho-corasick-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aide-0.13.5\",\n sha256 = \"5678d2978845ddb4bd736a026f467dd652d831e9e6254b0e41b07f7ee7523309\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aide/0.13.5/download\"],\n strip_prefix = \"aide-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.aide-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstream-0.6.19\",\n sha256 = \"301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstream/0.6.19/download\"],\n strip_prefix = \"anstream-0.6.19\",\n build_file = Label(\"@crates//crates:BUILD.anstream-0.6.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-1.0.11\",\n sha256 = \"862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle/1.0.11/download\"],\n strip_prefix = \"anstyle-1.0.11\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-1.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-parse-0.2.7\",\n sha256 = \"4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-parse/0.2.7/download\"],\n strip_prefix = \"anstyle-parse-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-parse-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-query-1.1.3\",\n sha256 = \"6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-query/1.1.3/download\"],\n strip_prefix = \"anstyle-query-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-query-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-wincon-3.0.9\",\n sha256 = \"403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.9/download\"],\n strip_prefix = \"anstyle-wincon-3.0.9\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-wincon-3.0.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anyhow-1.0.98\",\n sha256 = \"e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anyhow/1.0.98/download\"],\n strip_prefix = \"anyhow-1.0.98\",\n build_file = Label(\"@crates//crates:BUILD.anyhow-1.0.98.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-trait-0.1.88\",\n sha256 = \"e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-trait/0.1.88/download\"],\n strip_prefix = \"async-trait-0.1.88\",\n build_file = Label(\"@crates//crates:BUILD.async-trait-0.1.88.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atomic-waker-1.1.2\",\n sha256 = \"1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atomic-waker/1.1.2/download\"],\n strip_prefix = \"atomic-waker-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.atomic-waker-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__autocfg-1.5.0\",\n sha256 = \"c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/autocfg/1.5.0/download\"],\n strip_prefix = \"autocfg-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.autocfg-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-0.7.9\",\n sha256 = \"edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum/0.7.9/download\"],\n strip_prefix = \"axum-0.7.9\",\n build_file = Label(\"@crates//crates:BUILD.axum-0.7.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-core-0.4.5\",\n sha256 = \"09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum-core/0.4.5/download\"],\n strip_prefix = \"axum-core-0.4.5\",\n build_file = Label(\"@crates//crates:BUILD.axum-core-0.4.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-jsonschema-0.8.0\",\n sha256 = \"fcffe29ca1b60172349fea781ec34441d598809bd227ccbb5bf5dc2879cd9c78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum-jsonschema/0.8.0/download\"],\n strip_prefix = \"axum-jsonschema-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.axum-jsonschema-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__backtrace-0.3.75\",\n sha256 = \"6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/backtrace/0.3.75/download\"],\n strip_prefix = \"backtrace-0.3.75\",\n build_file = Label(\"@crates//crates:BUILD.backtrace-0.3.75.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-0.21.7\",\n sha256 = \"9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64/0.21.7/download\"],\n strip_prefix = \"base64-0.21.7\",\n build_file = Label(\"@crates//crates:BUILD.base64-0.21.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-set-0.5.3\",\n sha256 = \"0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-set/0.5.3/download\"],\n strip_prefix = \"bit-set-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.bit-set-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-vec-0.6.3\",\n sha256 = \"349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-vec/0.6.3/download\"],\n strip_prefix = \"bit-vec-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.bit-vec-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-2.9.1\",\n sha256 = \"1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/2.9.1/download\"],\n strip_prefix = \"bitflags-2.9.1\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-2.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-buffer-0.10.4\",\n sha256 = \"3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-buffer/0.10.4/download\"],\n strip_prefix = \"block-buffer-0.10.4\",\n build_file = Label(\"@crates//crates:BUILD.block-buffer-0.10.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bumpalo-3.19.0\",\n sha256 = \"46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bumpalo/3.19.0/download\"],\n strip_prefix = \"bumpalo-3.19.0\",\n build_file = Label(\"@crates//crates:BUILD.bumpalo-3.19.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecount-0.6.9\",\n sha256 = \"175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecount/0.6.9/download\"],\n strip_prefix = \"bytecount-0.6.9\",\n build_file = Label(\"@crates//crates:BUILD.bytecount-0.6.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytes-1.10.1\",\n sha256 = \"d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytes/1.10.1/download\"],\n strip_prefix = \"bytes-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.bytes-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cc-1.2.29\",\n sha256 = \"5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cc/1.2.29/download\"],\n strip_prefix = \"cc-1.2.29\",\n build_file = Label(\"@crates//crates:BUILD.cc-1.2.29.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-if-1.0.1\",\n sha256 = \"9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-if/1.0.1/download\"],\n strip_prefix = \"cfg-if-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.cfg-if-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap-4.5.41\",\n sha256 = \"be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap/4.5.41/download\"],\n strip_prefix = \"clap-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_builder-4.5.41\",\n sha256 = \"707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_builder/4.5.41/download\"],\n strip_prefix = \"clap_builder-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap_builder-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_derive-4.5.41\",\n sha256 = \"ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_derive/4.5.41/download\"],\n strip_prefix = \"clap_derive-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap_derive-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_lex-0.7.5\",\n sha256 = \"b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_lex/0.7.5/download\"],\n strip_prefix = \"clap_lex-0.7.5\",\n build_file = Label(\"@crates//crates:BUILD.clap_lex-0.7.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colorchoice-1.0.4\",\n sha256 = \"b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colorchoice/1.0.4/download\"],\n strip_prefix = \"colorchoice-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.colorchoice-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colored-2.2.0\",\n sha256 = \"117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colored/2.2.0/download\"],\n strip_prefix = \"colored-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.colored-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cpufeatures-0.2.17\",\n sha256 = \"59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cpufeatures/0.2.17/download\"],\n strip_prefix = \"cpufeatures-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.cpufeatures-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-channel-0.5.15\",\n sha256 = \"82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-channel/0.5.15/download\"],\n strip_prefix = \"crossbeam-channel-0.5.15\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-channel-0.5.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-utils-0.8.21\",\n sha256 = \"d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-utils/0.8.21/download\"],\n strip_prefix = \"crossbeam-utils-0.8.21\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-utils-0.8.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-common-0.1.6\",\n sha256 = \"1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-common/0.1.6/download\"],\n strip_prefix = \"crypto-common-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.crypto-common-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__deranged-0.4.0\",\n sha256 = \"9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/deranged/0.4.0/download\"],\n strip_prefix = \"deranged-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.deranged-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__digest-0.10.7\",\n sha256 = \"9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/digest/0.10.7/download\"],\n strip_prefix = \"digest-0.10.7\",\n build_file = Label(\"@crates//crates:BUILD.digest-0.10.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__displaydoc-0.2.5\",\n sha256 = \"97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/displaydoc/0.2.5/download\"],\n strip_prefix = \"displaydoc-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.displaydoc-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dyn-clone-1.0.19\",\n sha256 = \"1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dyn-clone/1.0.19/download\"],\n strip_prefix = \"dyn-clone-1.0.19\",\n build_file = Label(\"@crates//crates:BUILD.dyn-clone-1.0.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__either-1.15.0\",\n sha256 = \"48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/either/1.15.0/download\"],\n strip_prefix = \"either-1.15.0\",\n build_file = Label(\"@crates//crates:BUILD.either-1.15.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__equivalent-1.0.2\",\n sha256 = \"877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/equivalent/1.0.2/download\"],\n strip_prefix = \"equivalent-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.equivalent-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__errno-0.3.13\",\n sha256 = \"778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/errno/0.3.13/download\"],\n strip_prefix = \"errno-0.3.13\",\n build_file = Label(\"@crates//crates:BUILD.errno-0.3.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fallible-iterator-0.3.0\",\n sha256 = \"2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fallible-iterator/0.3.0/download\"],\n strip_prefix = \"fallible-iterator-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fallible-iterator-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fallible-streaming-iterator-0.1.9\",\n sha256 = \"7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fallible-streaming-iterator/0.1.9/download\"],\n strip_prefix = \"fallible-streaming-iterator-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.fallible-streaming-iterator-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.11.0\",\n sha256 = \"b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.11.0/download\"],\n strip_prefix = \"fancy-regex-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fastrand-2.3.0\",\n sha256 = \"37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fastrand/2.3.0/download\"],\n strip_prefix = \"fastrand-2.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fastrand-2.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fixedbitset-0.5.7\",\n sha256 = \"1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fixedbitset/0.5.7/download\"],\n strip_prefix = \"fixedbitset-0.5.7\",\n build_file = Label(\"@crates//crates:BUILD.fixedbitset-0.5.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fnv-1.0.7\",\n sha256 = \"3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fnv/1.0.7/download\"],\n strip_prefix = \"fnv-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.fnv-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__form_urlencoded-1.2.1\",\n sha256 = \"e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/form_urlencoded/1.2.1/download\"],\n strip_prefix = \"form_urlencoded-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.form_urlencoded-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fraction-0.13.1\",\n sha256 = \"3027ae1df8d41b4bed2241c8fdad4acc1e7af60c8e17743534b545e77182d678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fraction/0.13.1/download\"],\n strip_prefix = \"fraction-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.fraction-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-0.3.31\",\n sha256 = \"65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures/0.3.31/download\"],\n strip_prefix = \"futures-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-channel-0.3.31\",\n sha256 = \"2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-channel/0.3.31/download\"],\n strip_prefix = \"futures-channel-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-channel-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-core-0.3.31\",\n sha256 = \"05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-core/0.3.31/download\"],\n strip_prefix = \"futures-core-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-core-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-executor-0.3.31\",\n sha256 = \"1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-executor/0.3.31/download\"],\n strip_prefix = \"futures-executor-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-executor-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-io-0.3.31\",\n sha256 = \"9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-io/0.3.31/download\"],\n strip_prefix = \"futures-io-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-io-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-macro-0.3.31\",\n sha256 = \"162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-macro/0.3.31/download\"],\n strip_prefix = \"futures-macro-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-macro-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-sink-0.3.31\",\n sha256 = \"e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-sink/0.3.31/download\"],\n strip_prefix = \"futures-sink-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-sink-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-task-0.3.31\",\n sha256 = \"f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-task/0.3.31/download\"],\n strip_prefix = \"futures-task-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-task-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-util-0.3.31\",\n sha256 = \"9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-util/0.3.31/download\"],\n strip_prefix = \"futures-util-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-util-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__generic-array-0.14.7\",\n sha256 = \"85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/generic-array/0.14.7/download\"],\n strip_prefix = \"generic-array-0.14.7\",\n build_file = Label(\"@crates//crates:BUILD.generic-array-0.14.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.2.16\",\n sha256 = \"335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.2.16/download\"],\n strip_prefix = \"getrandom-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.3.3\",\n sha256 = \"26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.3.3/download\"],\n strip_prefix = \"getrandom-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gimli-0.31.1\",\n sha256 = \"07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gimli/0.31.1/download\"],\n strip_prefix = \"gimli-0.31.1\",\n build_file = Label(\"@crates//crates:BUILD.gimli-0.31.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__h2-0.4.11\",\n sha256 = \"17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/h2/0.4.11/download\"],\n strip_prefix = \"h2-0.4.11\",\n build_file = Label(\"@crates//crates:BUILD.h2-0.4.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.14.5\",\n sha256 = \"e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.14.5/download\"],\n strip_prefix = \"hashbrown-0.14.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.14.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.15.4\",\n sha256 = \"5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.15.4/download\"],\n strip_prefix = \"hashbrown-0.15.4\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.15.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashlink-0.9.1\",\n sha256 = \"6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashlink/0.9.1/download\"],\n strip_prefix = \"hashlink-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.hashlink-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__heck-0.5.0\",\n sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n strip_prefix = \"heck-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.heck-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hermit-abi-0.5.2\",\n sha256 = \"fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hermit-abi/0.5.2/download\"],\n strip_prefix = \"hermit-abi-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.hermit-abi-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-1.3.1\",\n sha256 = \"f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http/1.3.1/download\"],\n strip_prefix = \"http-1.3.1\",\n build_file = Label(\"@crates//crates:BUILD.http-1.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-1.0.1\",\n sha256 = \"1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body/1.0.1/download\"],\n strip_prefix = \"http-body-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.http-body-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-util-0.1.3\",\n sha256 = \"b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body-util/0.1.3/download\"],\n strip_prefix = \"http-body-util-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.http-body-util-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__httparse-1.10.1\",\n sha256 = \"6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/httparse/1.10.1/download\"],\n strip_prefix = \"httparse-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.httparse-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__httpdate-1.0.3\",\n sha256 = \"df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/httpdate/1.0.3/download\"],\n strip_prefix = \"httpdate-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.httpdate-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-1.6.0\",\n sha256 = \"cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper/1.6.0/download\"],\n strip_prefix = \"hyper-1.6.0\",\n build_file = Label(\"@crates//crates:BUILD.hyper-1.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-util-0.1.15\",\n sha256 = \"7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper-util/0.1.15/download\"],\n strip_prefix = \"hyper-util-0.1.15\",\n build_file = Label(\"@crates//crates:BUILD.hyper-util-0.1.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collections-2.0.0\",\n sha256 = \"200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collections/2.0.0/download\"],\n strip_prefix = \"icu_collections-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collections-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_core-2.0.0\",\n sha256 = \"0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_core/2.0.0/download\"],\n strip_prefix = \"icu_locale_core-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_core-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer-2.0.0\",\n sha256 = \"436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer/2.0.0/download\"],\n strip_prefix = \"icu_normalizer-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer_data-2.0.0\",\n sha256 = \"00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer_data/2.0.0/download\"],\n strip_prefix = \"icu_normalizer_data-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer_data-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties-2.0.1\",\n sha256 = \"016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties/2.0.1/download\"],\n strip_prefix = \"icu_properties-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties_data-2.0.1\",\n sha256 = \"298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties_data/2.0.1/download\"],\n strip_prefix = \"icu_properties_data-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties_data-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_provider-2.0.0\",\n sha256 = \"03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_provider/2.0.0/download\"],\n strip_prefix = \"icu_provider-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_provider-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna-1.0.3\",\n sha256 = \"686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna/1.0.3/download\"],\n strip_prefix = \"idna-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.idna-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna_adapter-1.2.1\",\n sha256 = \"3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna_adapter/1.2.1/download\"],\n strip_prefix = \"idna_adapter-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.idna_adapter-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indexmap-2.10.0\",\n sha256 = \"fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indexmap/2.10.0/download\"],\n strip_prefix = \"indexmap-2.10.0\",\n build_file = Label(\"@crates//crates:BUILD.indexmap-2.10.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__io-uring-0.7.8\",\n sha256 = \"b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/io-uring/0.7.8/download\"],\n strip_prefix = \"io-uring-0.7.8\",\n build_file = Label(\"@crates//crates:BUILD.io-uring-0.7.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__is_terminal_polyfill-1.70.1\",\n sha256 = \"7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.1/download\"],\n strip_prefix = \"is_terminal_polyfill-1.70.1\",\n build_file = Label(\"@crates//crates:BUILD.is_terminal_polyfill-1.70.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__iso8601-0.6.3\",\n sha256 = \"e1082f0c48f143442a1ac6122f67e360ceee130b967af4d50996e5154a45df46\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/iso8601/0.6.3/download\"],\n strip_prefix = \"iso8601-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.iso8601-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.12.1\",\n sha256 = \"ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.12.1/download\"],\n strip_prefix = \"itertools-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.14.0\",\n sha256 = \"2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.14.0/download\"],\n strip_prefix = \"itertools-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itoa-1.0.15\",\n sha256 = \"4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itoa/1.0.15/download\"],\n strip_prefix = \"itoa-1.0.15\",\n build_file = Label(\"@crates//crates:BUILD.itoa-1.0.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__js-sys-0.3.77\",\n sha256 = \"1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/js-sys/0.3.77/download\"],\n strip_prefix = \"js-sys-0.3.77\",\n build_file = Label(\"@crates//crates:BUILD.js-sys-0.3.77.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jsonschema-0.17.1\",\n sha256 = \"2a071f4f7efc9a9118dfb627a0a94ef247986e1ab8606a4c806ae2b3aa3b6978\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jsonschema/0.17.1/download\"],\n strip_prefix = \"jsonschema-0.17.1\",\n build_file = Label(\"@crates//crates:BUILD.jsonschema-0.17.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lazy_static-1.5.0\",\n sha256 = \"bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lazy_static/1.5.0/download\"],\n strip_prefix = \"lazy_static-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.lazy_static-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libc-0.2.174\",\n sha256 = \"1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libc/0.2.174/download\"],\n strip_prefix = \"libc-0.2.174\",\n build_file = Label(\"@crates//crates:BUILD.libc-0.2.174.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libsqlite3-sys-0.28.0\",\n sha256 = \"0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libsqlite3-sys/0.28.0/download\"],\n strip_prefix = \"libsqlite3-sys-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.libsqlite3-sys-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.9.4\",\n sha256 = \"cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.9.4/download\"],\n strip_prefix = \"linux-raw-sys-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__litemap-0.8.0\",\n sha256 = \"241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/litemap/0.8.0/download\"],\n strip_prefix = \"litemap-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.litemap-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lock_api-0.4.13\",\n sha256 = \"96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lock_api/0.4.13/download\"],\n strip_prefix = \"lock_api-0.4.13\",\n build_file = Label(\"@crates//crates:BUILD.lock_api-0.4.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__log-0.4.27\",\n sha256 = \"13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/log/0.4.27/download\"],\n strip_prefix = \"log-0.4.27\",\n build_file = Label(\"@crates//crates:BUILD.log-0.4.27.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__matchit-0.7.3\",\n sha256 = \"0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/matchit/0.7.3/download\"],\n strip_prefix = \"matchit-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.matchit-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memchr-2.7.5\",\n sha256 = \"32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.7.5/download\"],\n strip_prefix = \"memchr-2.7.5\",\n build_file = Label(\"@crates//crates:BUILD.memchr-2.7.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mime-0.3.17\",\n sha256 = \"6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mime/0.3.17/download\"],\n strip_prefix = \"mime-0.3.17\",\n build_file = Label(\"@crates//crates:BUILD.mime-0.3.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__miniz_oxide-0.8.9\",\n sha256 = \"1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/miniz_oxide/0.8.9/download\"],\n strip_prefix = \"miniz_oxide-0.8.9\",\n build_file = Label(\"@crates//crates:BUILD.miniz_oxide-0.8.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mio-1.0.4\",\n sha256 = \"78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mio/1.0.4/download\"],\n strip_prefix = \"mio-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.mio-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__multimap-0.10.1\",\n sha256 = \"1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/multimap/0.10.1/download\"],\n strip_prefix = \"multimap-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.multimap-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nom-8.0.0\",\n sha256 = \"df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nom/8.0.0/download\"],\n strip_prefix = \"nom-8.0.0\",\n build_file = Label(\"@crates//crates:BUILD.nom-8.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-0.4.3\",\n sha256 = \"35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num/0.4.3/download\"],\n strip_prefix = \"num-0.4.3\",\n build_file = Label(\"@crates//crates:BUILD.num-0.4.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-bigint-0.4.6\",\n sha256 = \"a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-bigint/0.4.6/download\"],\n strip_prefix = \"num-bigint-0.4.6\",\n build_file = Label(\"@crates//crates:BUILD.num-bigint-0.4.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-cmp-0.1.0\",\n sha256 = \"63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-cmp/0.1.0/download\"],\n strip_prefix = \"num-cmp-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.num-cmp-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-complex-0.4.6\",\n sha256 = \"73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-complex/0.4.6/download\"],\n strip_prefix = \"num-complex-0.4.6\",\n build_file = Label(\"@crates//crates:BUILD.num-complex-0.4.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-conv-0.1.0\",\n sha256 = \"51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-conv/0.1.0/download\"],\n strip_prefix = \"num-conv-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.num-conv-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-integer-0.1.46\",\n sha256 = \"7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-integer/0.1.46/download\"],\n strip_prefix = \"num-integer-0.1.46\",\n build_file = Label(\"@crates//crates:BUILD.num-integer-0.1.46.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-iter-0.1.45\",\n sha256 = \"1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-iter/0.1.45/download\"],\n strip_prefix = \"num-iter-0.1.45\",\n build_file = Label(\"@crates//crates:BUILD.num-iter-0.1.45.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-rational-0.4.2\",\n sha256 = \"f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-rational/0.4.2/download\"],\n strip_prefix = \"num-rational-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.num-rational-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-traits-0.2.19\",\n sha256 = \"071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-traits/0.2.19/download\"],\n strip_prefix = \"num-traits-0.2.19\",\n build_file = Label(\"@crates//crates:BUILD.num-traits-0.2.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num_cpus-1.17.0\",\n sha256 = \"91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num_cpus/1.17.0/download\"],\n strip_prefix = \"num_cpus-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.num_cpus-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num_threads-0.1.7\",\n sha256 = \"5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num_threads/0.1.7/download\"],\n strip_prefix = \"num_threads-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.num_threads-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__object-0.36.7\",\n sha256 = \"62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/object/0.36.7/download\"],\n strip_prefix = \"object-0.36.7\",\n build_file = Label(\"@crates//crates:BUILD.object-0.36.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell-1.21.3\",\n sha256 = \"42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell/1.21.3/download\"],\n strip_prefix = \"once_cell-1.21.3\",\n build_file = Label(\"@crates//crates:BUILD.once_cell-1.21.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell_polyfill-1.70.1\",\n sha256 = \"a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.1/download\"],\n strip_prefix = \"once_cell_polyfill-1.70.1\",\n build_file = Label(\"@crates//crates:BUILD.once_cell_polyfill-1.70.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot-0.12.4\",\n sha256 = \"70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot/0.12.4/download\"],\n strip_prefix = \"parking_lot-0.12.4\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot-0.12.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot_core-0.9.11\",\n sha256 = \"bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot_core/0.9.11/download\"],\n strip_prefix = \"parking_lot_core-0.9.11\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot_core-0.9.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__percent-encoding-2.3.1\",\n sha256 = \"e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/percent-encoding/2.3.1/download\"],\n strip_prefix = \"percent-encoding-2.3.1\",\n build_file = Label(\"@crates//crates:BUILD.percent-encoding-2.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__petgraph-0.7.1\",\n sha256 = \"3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/petgraph/0.7.1/download\"],\n strip_prefix = \"petgraph-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.petgraph-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-project-lite-0.2.16\",\n sha256 = \"3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-project-lite/0.2.16/download\"],\n strip_prefix = \"pin-project-lite-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.pin-project-lite-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-utils-0.1.0\",\n sha256 = \"8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-utils/0.1.0/download\"],\n strip_prefix = \"pin-utils-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.pin-utils-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pkg-config-0.3.32\",\n sha256 = \"7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pkg-config/0.3.32/download\"],\n strip_prefix = \"pkg-config-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.pkg-config-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__potential_utf-0.1.2\",\n sha256 = \"e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/potential_utf/0.1.2/download\"],\n strip_prefix = \"potential_utf-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.potential_utf-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__powerfmt-0.2.0\",\n sha256 = \"439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/powerfmt/0.2.0/download\"],\n strip_prefix = \"powerfmt-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.powerfmt-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prettyplease-0.2.35\",\n sha256 = \"061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prettyplease/0.2.35/download\"],\n strip_prefix = \"prettyplease-0.2.35\",\n build_file = Label(\"@crates//crates:BUILD.prettyplease-0.2.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro2-1.0.95\",\n sha256 = \"02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.95/download\"],\n strip_prefix = \"proc-macro2-1.0.95\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro2-1.0.95.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-0.13.5\",\n sha256 = \"2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost/0.13.5/download\"],\n strip_prefix = \"prost-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-build-0.13.5\",\n sha256 = \"be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-build/0.13.5/download\"],\n strip_prefix = \"prost-build-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-build-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-derive-0.13.5\",\n sha256 = \"8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-derive/0.13.5/download\"],\n strip_prefix = \"prost-derive-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-derive-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-types-0.13.5\",\n sha256 = \"52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-types/0.13.5/download\"],\n strip_prefix = \"prost-types-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-types-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quote-1.0.40\",\n sha256 = \"1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.40/download\"],\n strip_prefix = \"quote-1.0.40\",\n build_file = Label(\"@crates//crates:BUILD.quote-1.0.40.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-5.3.0\",\n sha256 = \"69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/5.3.0/download\"],\n strip_prefix = \"r-efi-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__redox_syscall-0.5.13\",\n sha256 = \"0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/redox_syscall/0.5.13/download\"],\n strip_prefix = \"redox_syscall-0.5.13\",\n build_file = Label(\"@crates//crates:BUILD.redox_syscall-0.5.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-1.11.1\",\n sha256 = \"b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex/1.11.1/download\"],\n strip_prefix = \"regex-1.11.1\",\n build_file = Label(\"@crates//crates:BUILD.regex-1.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-automata-0.4.9\",\n sha256 = \"809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-automata/0.4.9/download\"],\n strip_prefix = \"regex-automata-0.4.9\",\n build_file = Label(\"@crates//crates:BUILD.regex-automata-0.4.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-syntax-0.8.5\",\n sha256 = \"2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-syntax/0.8.5/download\"],\n strip_prefix = \"regex-syntax-0.8.5\",\n build_file = Label(\"@crates//crates:BUILD.regex-syntax-0.8.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rusqlite-0.31.0\",\n sha256 = \"b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rusqlite/0.31.0/download\"],\n strip_prefix = \"rusqlite-0.31.0\",\n build_file = Label(\"@crates//crates:BUILD.rusqlite-0.31.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-8.7.2\",\n sha256 = \"025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed/8.7.2/download\"],\n strip_prefix = \"rust-embed-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-impl-8.7.2\",\n sha256 = \"6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed-impl/8.7.2/download\"],\n strip_prefix = \"rust-embed-impl-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-impl-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-utils-8.7.2\",\n sha256 = \"f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed-utils/8.7.2/download\"],\n strip_prefix = \"rust-embed-utils-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-utils-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-demangle-0.1.25\",\n sha256 = \"989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-demangle/0.1.25/download\"],\n strip_prefix = \"rustc-demangle-0.1.25\",\n build_file = Label(\"@crates//crates:BUILD.rustc-demangle-0.1.25.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-1.0.7\",\n sha256 = \"c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/1.0.7/download\"],\n strip_prefix = \"rustix-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.rustix-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustversion-1.0.21\",\n sha256 = \"8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustversion/1.0.21/download\"],\n strip_prefix = \"rustversion-1.0.21\",\n build_file = Label(\"@crates//crates:BUILD.rustversion-1.0.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ryu-1.0.20\",\n sha256 = \"28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ryu/1.0.20/download\"],\n strip_prefix = \"ryu-1.0.20\",\n build_file = Label(\"@crates//crates:BUILD.ryu-1.0.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__same-file-1.0.6\",\n sha256 = \"93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/same-file/1.0.6/download\"],\n strip_prefix = \"same-file-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.same-file-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__schemars-0.8.22\",\n sha256 = \"3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/schemars/0.8.22/download\"],\n strip_prefix = \"schemars-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.schemars-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__schemars_derive-0.8.22\",\n sha256 = \"32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/schemars_derive/0.8.22/download\"],\n strip_prefix = \"schemars_derive-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.schemars_derive-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__scopeguard-1.2.0\",\n sha256 = \"94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/scopeguard/1.2.0/download\"],\n strip_prefix = \"scopeguard-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.scopeguard-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde-1.0.219\",\n sha256 = \"5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde/1.0.219/download\"],\n strip_prefix = \"serde-1.0.219\",\n build_file = Label(\"@crates//crates:BUILD.serde-1.0.219.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive-1.0.219\",\n sha256 = \"5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive/1.0.219/download\"],\n strip_prefix = \"serde_derive-1.0.219\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive-1.0.219.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive_internals-0.29.1\",\n sha256 = \"18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive_internals/0.29.1/download\"],\n strip_prefix = \"serde_derive_internals-0.29.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive_internals-0.29.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_json-1.0.140\",\n sha256 = \"20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_json/1.0.140/download\"],\n strip_prefix = \"serde_json-1.0.140\",\n build_file = Label(\"@crates//crates:BUILD.serde_json-1.0.140.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_path_to_error-0.1.17\",\n sha256 = \"59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_path_to_error/0.1.17/download\"],\n strip_prefix = \"serde_path_to_error-0.1.17\",\n build_file = Label(\"@crates//crates:BUILD.serde_path_to_error-0.1.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_qs-0.13.0\",\n sha256 = \"cd34f36fe4c5ba9654417139a9b3a20d2e1de6012ee678ad14d240c22c78d8d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_qs/0.13.0/download\"],\n strip_prefix = \"serde_qs-0.13.0\",\n build_file = Label(\"@crates//crates:BUILD.serde_qs-0.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_urlencoded-0.7.1\",\n sha256 = \"d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_urlencoded/0.7.1/download\"],\n strip_prefix = \"serde_urlencoded-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_urlencoded-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha2-0.10.9\",\n sha256 = \"a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha2/0.10.9/download\"],\n strip_prefix = \"sha2-0.10.9\",\n build_file = Label(\"@crates//crates:BUILD.sha2-0.10.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-1.3.0\",\n sha256 = \"0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/1.3.0/download\"],\n strip_prefix = \"shlex-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.shlex-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simple_logger-4.3.3\",\n sha256 = \"8e7e46c8c90251d47d08b28b8a419ffb4aede0f87c2eea95e17d1d5bacbf3ef1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simple_logger/4.3.3/download\"],\n strip_prefix = \"simple_logger-4.3.3\",\n build_file = Label(\"@crates//crates:BUILD.simple_logger-4.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__slab-0.4.10\",\n sha256 = \"04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/slab/0.4.10/download\"],\n strip_prefix = \"slab-0.4.10\",\n build_file = Label(\"@crates//crates:BUILD.slab-0.4.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smallvec-1.15.1\",\n sha256 = \"67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smallvec/1.15.1/download\"],\n strip_prefix = \"smallvec-1.15.1\",\n build_file = Label(\"@crates//crates:BUILD.smallvec-1.15.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.5.10\",\n sha256 = \"e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.5.10/download\"],\n strip_prefix = \"socket2-0.5.10\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.5.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stable_deref_trait-1.2.0\",\n sha256 = \"a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stable_deref_trait/1.2.0/download\"],\n strip_prefix = \"stable_deref_trait-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.stable_deref_trait-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strsim-0.11.1\",\n sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n strip_prefix = \"strsim-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.strsim-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-2.0.104\",\n sha256 = \"17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.104/download\"],\n strip_prefix = \"syn-2.0.104\",\n build_file = Label(\"@crates//crates:BUILD.syn-2.0.104.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sync_wrapper-1.0.2\",\n sha256 = \"0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sync_wrapper/1.0.2/download\"],\n strip_prefix = \"sync_wrapper-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.sync_wrapper-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__synstructure-0.13.2\",\n sha256 = \"728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/synstructure/0.13.2/download\"],\n strip_prefix = \"synstructure-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.synstructure-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tempfile-3.20.0\",\n sha256 = \"e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tempfile/3.20.0/download\"],\n strip_prefix = \"tempfile-3.20.0\",\n build_file = Label(\"@crates//crates:BUILD.tempfile-3.20.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-1.0.69\",\n sha256 = \"b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/1.0.69/download\"],\n strip_prefix = \"thiserror-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-1.0.69\",\n sha256 = \"4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/1.0.69/download\"],\n strip_prefix = \"thiserror-impl-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-0.3.41\",\n sha256 = \"8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time/0.3.41/download\"],\n strip_prefix = \"time-0.3.41\",\n build_file = Label(\"@crates//crates:BUILD.time-0.3.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-core-0.1.4\",\n sha256 = \"c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-core/0.1.4/download\"],\n strip_prefix = \"time-core-0.1.4\",\n build_file = Label(\"@crates//crates:BUILD.time-core-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-macros-0.2.22\",\n sha256 = \"3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-macros/0.2.22/download\"],\n strip_prefix = \"time-macros-0.2.22\",\n build_file = Label(\"@crates//crates:BUILD.time-macros-0.2.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinystr-0.8.1\",\n sha256 = \"5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinystr/0.8.1/download\"],\n strip_prefix = \"tinystr-0.8.1\",\n build_file = Label(\"@crates//crates:BUILD.tinystr-0.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-1.46.1\",\n sha256 = \"0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio/1.46.1/download\"],\n strip_prefix = \"tokio-1.46.1\",\n build_file = Label(\"@crates//crates:BUILD.tokio-1.46.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-macros-2.5.0\",\n sha256 = \"6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-macros/2.5.0/download\"],\n strip_prefix = \"tokio-macros-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.tokio-macros-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-util-0.7.15\",\n sha256 = \"66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-util/0.7.15/download\"],\n strip_prefix = \"tokio-util-0.7.15\",\n build_file = Label(\"@crates//crates:BUILD.tokio-util-0.7.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-0.4.13\",\n sha256 = \"b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower/0.4.13/download\"],\n strip_prefix = \"tower-0.4.13\",\n build_file = Label(\"@crates//crates:BUILD.tower-0.4.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-0.5.2\",\n sha256 = \"d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower/0.5.2/download\"],\n strip_prefix = \"tower-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.tower-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-http-0.5.2\",\n sha256 = \"1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-http/0.5.2/download\"],\n strip_prefix = \"tower-http-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.tower-http-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-layer-0.3.3\",\n sha256 = \"121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-layer/0.3.3/download\"],\n strip_prefix = \"tower-layer-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-layer-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-service-0.3.3\",\n sha256 = \"8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-service/0.3.3/download\"],\n strip_prefix = \"tower-service-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-service-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-0.1.41\",\n sha256 = \"784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing/0.1.41/download\"],\n strip_prefix = \"tracing-0.1.41\",\n build_file = Label(\"@crates//crates:BUILD.tracing-0.1.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-attributes-0.1.30\",\n sha256 = \"81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-attributes/0.1.30/download\"],\n strip_prefix = \"tracing-attributes-0.1.30\",\n build_file = Label(\"@crates//crates:BUILD.tracing-attributes-0.1.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-core-0.1.34\",\n sha256 = \"b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-core/0.1.34/download\"],\n strip_prefix = \"tracing-core-0.1.34\",\n build_file = Label(\"@crates//crates:BUILD.tracing-core-0.1.34.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__try-lock-0.2.5\",\n sha256 = \"e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/try-lock/0.2.5/download\"],\n strip_prefix = \"try-lock-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.try-lock-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__typenum-1.18.0\",\n sha256 = \"1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/typenum/1.18.0/download\"],\n strip_prefix = \"typenum-1.18.0\",\n build_file = Label(\"@crates//crates:BUILD.typenum-1.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-ident-1.0.18\",\n sha256 = \"5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.18/download\"],\n strip_prefix = \"unicode-ident-1.0.18\",\n build_file = Label(\"@crates//crates:BUILD.unicode-ident-1.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__url-2.5.4\",\n sha256 = \"32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/url/2.5.4/download\"],\n strip_prefix = \"url-2.5.4\",\n build_file = Label(\"@crates//crates:BUILD.url-2.5.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8_iter-1.0.4\",\n sha256 = \"b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8_iter/1.0.4/download\"],\n strip_prefix = \"utf8_iter-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.utf8_iter-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8parse-0.2.2\",\n sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n strip_prefix = \"utf8parse-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.utf8parse-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uuid-1.17.0\",\n sha256 = \"3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uuid/1.17.0/download\"],\n strip_prefix = \"uuid-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.uuid-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__vcpkg-0.2.15\",\n sha256 = \"accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/vcpkg/0.2.15/download\"],\n strip_prefix = \"vcpkg-0.2.15\",\n build_file = Label(\"@crates//crates:BUILD.vcpkg-0.2.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__version_check-0.9.5\",\n sha256 = \"0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/version_check/0.9.5/download\"],\n strip_prefix = \"version_check-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.version_check-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__walkdir-2.5.0\",\n sha256 = \"29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/walkdir/2.5.0/download\"],\n strip_prefix = \"walkdir-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.walkdir-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__want-0.3.1\",\n sha256 = \"bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/want/0.3.1/download\"],\n strip_prefix = \"want-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.want-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.11.1-wasi-snapshot-preview1\",\n sha256 = \"ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download\"],\n strip_prefix = \"wasi-0.11.1+wasi-snapshot-preview1\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.14.2-wasi-0.2.4\",\n sha256 = \"9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.14.2+wasi-0.2.4/download\"],\n strip_prefix = \"wasi-0.14.2+wasi-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.14.2+wasi-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-0.2.100\",\n sha256 = \"1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-backend-0.2.100\",\n sha256 = \"2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-backend/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-backend-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-backend-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-0.2.100\",\n sha256 = \"7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-macro-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-support-0.2.100\",\n sha256 = \"8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-macro-support-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-support-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-shared-0.2.100\",\n sha256 = \"1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-shared/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-shared-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-shared-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-util-0.1.9\",\n sha256 = \"cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-util/0.1.9/download\"],\n strip_prefix = \"winapi-util-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.winapi-util-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.48.0\",\n sha256 = \"677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.48.0/download\"],\n strip_prefix = \"windows-sys-0.48.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.48.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.52.0\",\n sha256 = \"282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.52.0/download\"],\n strip_prefix = \"windows-sys-0.52.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.52.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.59.0\",\n sha256 = \"1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.59.0/download\"],\n strip_prefix = \"windows-sys-0.59.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.59.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.60.2\",\n sha256 = \"f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.60.2/download\"],\n strip_prefix = \"windows-sys-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.48.5\",\n sha256 = \"9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.48.5/download\"],\n strip_prefix = \"windows-targets-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.52.6\",\n sha256 = \"9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.52.6/download\"],\n strip_prefix = \"windows-targets-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.53.2\",\n sha256 = \"c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.53.2/download\"],\n strip_prefix = \"windows-targets-0.53.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.53.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.48.5\",\n sha256 = \"2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.52.6\",\n sha256 = \"32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.53.0\",\n sha256 = \"86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.48.5\",\n sha256 = \"dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.52.6\",\n sha256 = \"09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.53.0\",\n sha256 = \"c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.53.0/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.48.5\",\n sha256 = \"a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.48.5/download\"],\n strip_prefix = \"windows_i686_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.52.6\",\n sha256 = \"8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.53.0\",\n sha256 = \"c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.53.0/download\"],\n strip_prefix = \"windows_i686_gnu-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.52.6\",\n sha256 = \"0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.53.0\",\n sha256 = \"9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.48.5\",\n sha256 = \"8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.48.5/download\"],\n strip_prefix = \"windows_i686_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.52.6\",\n sha256 = \"240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.52.6/download\"],\n strip_prefix = \"windows_i686_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.53.0\",\n sha256 = \"581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.53.0/download\"],\n strip_prefix = \"windows_i686_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.48.5\",\n sha256 = \"53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.52.6\",\n sha256 = \"147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.53.0\",\n sha256 = \"2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.48.5\",\n sha256 = \"0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.52.6\",\n sha256 = \"24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.53.0\",\n sha256 = \"0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.48.5\",\n sha256 = \"ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.52.6\",\n sha256 = \"589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.53.0\",\n sha256 = \"271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-rt-0.39.0\",\n sha256 = \"6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen-rt/0.39.0/download\"],\n strip_prefix = \"wit-bindgen-rt-0.39.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-rt-0.39.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__writeable-0.6.1\",\n sha256 = \"ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/writeable/0.6.1/download\"],\n strip_prefix = \"writeable-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.writeable-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-0.8.0\",\n sha256 = \"5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke/0.8.0/download\"],\n strip_prefix = \"yoke-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.yoke-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-derive-0.8.0\",\n sha256 = \"38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke-derive/0.8.0/download\"],\n strip_prefix = \"yoke-derive-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.yoke-derive-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-0.8.26\",\n sha256 = \"1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy/0.8.26/download\"],\n strip_prefix = \"zerocopy-0.8.26\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-0.8.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-derive-0.8.26\",\n sha256 = \"9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy-derive/0.8.26/download\"],\n strip_prefix = \"zerocopy-derive-0.8.26\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-derive-0.8.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-0.1.6\",\n sha256 = \"50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom/0.1.6/download\"],\n strip_prefix = \"zerofrom-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-derive-0.1.6\",\n sha256 = \"d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom-derive/0.1.6/download\"],\n strip_prefix = \"zerofrom-derive-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-derive-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerotrie-0.2.2\",\n sha256 = \"36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerotrie/0.2.2/download\"],\n strip_prefix = \"zerotrie-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.zerotrie-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-0.11.2\",\n sha256 = \"4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec/0.11.2/download\"],\n strip_prefix = \"zerovec-0.11.2\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-0.11.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-derive-0.11.1\",\n sha256 = \"5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec-derive/0.11.1/download\"],\n strip_prefix = \"zerovec-derive-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-derive-0.11.1.bazel\"),\n )\n\n return [\n struct(repo=\"crates__aide-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__async-trait-0.1.88\", is_dev_dep = False),\n struct(repo=\"crates__axum-0.7.9\", is_dev_dep = False),\n struct(repo=\"crates__axum-jsonschema-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__clap-4.5.41\", is_dev_dep = False),\n struct(repo=\"crates__crossbeam-channel-0.5.15\", is_dev_dep = False),\n struct(repo=\"crates__hyper-1.6.0\", is_dev_dep = False),\n struct(repo=\"crates__log-0.4.27\", is_dev_dep = False),\n struct(repo=\"crates__num_cpus-1.17.0\", is_dev_dep = False),\n struct(repo=\"crates__prost-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__prost-build-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__prost-types-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__rusqlite-0.31.0\", is_dev_dep = False),\n struct(repo=\"crates__rust-embed-8.7.2\", is_dev_dep = False),\n struct(repo=\"crates__schemars-0.8.22\", is_dev_dep = False),\n struct(repo=\"crates__serde-1.0.219\", is_dev_dep = False),\n struct(repo=\"crates__serde_json-1.0.140\", is_dev_dep = False),\n struct(repo=\"crates__simple_logger-4.3.3\", is_dev_dep = False),\n struct(repo=\"crates__tempfile-3.20.0\", is_dev_dep = False),\n struct(repo=\"crates__thiserror-1.0.69\", is_dev_dep = False),\n struct(repo=\"crates__tokio-1.46.1\", is_dev_dep = False),\n struct(repo=\"crates__tower-0.4.13\", is_dev_dep = False),\n struct(repo=\"crates__tower-http-0.5.2\", is_dev_dep = False),\n struct(repo=\"crates__uuid-1.17.0\", is_dev_dep = False),\n ]\n" } } }, diff --git a/databuild/BUILD.bazel b/databuild/BUILD.bazel index ba81416..7380d91 100644 --- a/databuild/BUILD.bazel +++ b/databuild/BUILD.bazel @@ -39,6 +39,9 @@ rust_library( "event_log/sqlite.rs", "event_log/stdout.rs", "lib.rs", + "orchestration/mod.rs", + "orchestration/error.rs", + "orchestration/events.rs", "service/handlers.rs", "service/mod.rs", ":generate_databuild_rust", @@ -59,6 +62,7 @@ rust_library( "@crates//:schemars", "@crates//:serde", "@crates//:serde_json", + "@crates//:thiserror", "@crates//:tokio", "@crates//:uuid", ], @@ -104,6 +108,16 @@ rust_binary( ], ) +# Test for orchestration module +rust_test( + name = "orchestration_test", + crate = ":databuild", + edition = "2021", + deps = [ + "@crates//:tokio", + ], +) + # Legacy filegroup for backwards compatibility filegroup( name = "proto", diff --git a/databuild/cli/BUILD.bazel b/databuild/cli/BUILD.bazel new file mode 100644 index 0000000..b463758 --- /dev/null +++ b/databuild/cli/BUILD.bazel @@ -0,0 +1,26 @@ +load("@rules_rust//rust:defs.bzl", "rust_binary") + +# DataBuild CLI wrapper using orchestrator +rust_binary( + name = "databuild_cli", + srcs = [ + "main.rs", + "error.rs", + ], + edition = "2021", + visibility = ["//visibility:public"], + data = [ + "//databuild/graph:analyze", + "//databuild/graph:execute", + ], + deps = [ + "//databuild:databuild", + "@crates//:clap", + "@crates//:log", + "@crates//:serde_json", + "@crates//:simple_logger", + "@crates//:thiserror", + "@crates//:tokio", + "@crates//:uuid", + ], +) \ No newline at end of file diff --git a/databuild/cli/error.rs b/databuild/cli/error.rs new file mode 100644 index 0000000..c03195b --- /dev/null +++ b/databuild/cli/error.rs @@ -0,0 +1,25 @@ +use crate::event_log::BuildEventLogError; +use crate::orchestration::OrchestrationError; + +#[derive(Debug, thiserror::Error)] +pub enum CliError { + #[error("Event log error: {0}")] + EventLog(#[from] BuildEventLogError), + + #[error("Orchestration error: {0}")] + Orchestration(#[from] OrchestrationError), + + #[error("Analysis error: {0}")] + Analysis(String), + + #[error("Execution error: {0}")] + Execution(String), + + #[error("Environment error: {0}")] + Environment(String), + + #[error("Invalid arguments: {0}")] + InvalidArguments(String), +} + +pub type Result = std::result::Result; \ No newline at end of file diff --git a/databuild/cli/main.rs b/databuild/cli/main.rs new file mode 100644 index 0000000..34c4061 --- /dev/null +++ b/databuild/cli/main.rs @@ -0,0 +1,207 @@ +use databuild::*; +use databuild::event_log::create_build_event_log; +use databuild::orchestration::{BuildOrchestrator, BuildResult}; +use clap::{Arg, Command as ClapCommand}; +use log::info; +use simple_logger::SimpleLogger; +use std::env; +use std::process::{Command, Stdio}; +use uuid::Uuid; + +mod error; +use error::{CliError, Result}; + +/// Run the analyze command and return the job graph +async fn run_analysis( + partitions: &[String], + orchestrator: &BuildOrchestrator, +) -> Result { + info!("Running analysis for partitions: {:?}", partitions); + + // Get required environment variables + let candidate_jobs = env::var("DATABUILD_CANDIDATE_JOBS") + .map_err(|_| CliError::Environment("DATABUILD_CANDIDATE_JOBS not set".to_string()))?; + let job_lookup_path = env::var("DATABUILD_JOB_LOOKUP_PATH") + .map_err(|_| CliError::Environment("DATABUILD_JOB_LOOKUP_PATH not set".to_string()))?; + let graph_label = env::var("DATABUILD_GRAPH_LABEL") + .map_err(|_| CliError::Environment("DATABUILD_GRAPH_LABEL not set".to_string()))?; + + // Find analyze binary using runfiles + let analyze_path = env::var("RUNFILES_DIR") + .map(|runfiles_dir| format!("{}/databuild+/databuild/graph/analyze", runfiles_dir)) + .or_else(|_| { + // Fallback for direct execution + Ok("./databuild/graph/analyze".to_string()) + }) + .map_err(|e: std::env::VarError| CliError::Environment(format!("Failed to locate analyze binary: {}", e)))?; + + // Build analyze command + let cmd = Command::new(analyze_path) + .args(partitions) + .env("DATABUILD_CANDIDATE_JOBS", candidate_jobs) + .env("DATABUILD_JOB_LOOKUP_PATH", job_lookup_path) + .env("DATABUILD_GRAPH_LABEL", graph_label) + .env("DATABUILD_MODE", "plan") + .env("DATABUILD_BUILD_REQUEST_ID", orchestrator.build_request_id()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .map_err(|e| CliError::Analysis(format!("Failed to spawn analyze process: {}", e)))?; + + let output = cmd.wait_with_output() + .map_err(|e| CliError::Analysis(format!("Failed to run analyze: {}", e)))?; + + if !output.status.success() { + let stderr = String::from_utf8_lossy(&output.stderr); + return Err(CliError::Analysis(format!("Analysis failed: {}", stderr))); + } + + let stdout = String::from_utf8_lossy(&output.stdout); + let job_graph: JobGraph = serde_json::from_str(&stdout) + .map_err(|e| CliError::Analysis(format!("Failed to parse job graph: {}", e)))?; + + info!("Analysis complete, found {} tasks", job_graph.nodes.len()); + Ok(job_graph) +} + +/// Run the execute command with the job graph +async fn run_execution( + job_graph: JobGraph, + orchestrator: &BuildOrchestrator, +) -> Result { + info!("Running execution for {} tasks", job_graph.nodes.len()); + + // Serialize job graph to JSON for the execute command + let job_graph_json = serde_json::to_string(&job_graph) + .map_err(|e| CliError::Execution(format!("Failed to serialize job graph: {}", e)))?; + + // Get required environment variables + let candidate_jobs = env::var("DATABUILD_CANDIDATE_JOBS") + .map_err(|_| CliError::Environment("DATABUILD_CANDIDATE_JOBS not set".to_string()))?; + let build_event_log_uri = env::var("DATABUILD_BUILD_EVENT_LOG").unwrap_or_else(|_| "stdout".to_string()); + + // Find execute binary using runfiles + let execute_path = env::var("RUNFILES_DIR") + .map(|runfiles_dir| format!("{}/databuild+/databuild/graph/execute", runfiles_dir)) + .or_else(|_| { + // Fallback for direct execution + Ok("./databuild/graph/execute".to_string()) + }) + .map_err(|e: std::env::VarError| CliError::Environment(format!("Failed to locate execute binary: {}", e)))?; + + // Build execute command + let mut cmd = Command::new(execute_path) + .env("DATABUILD_CANDIDATE_JOBS", candidate_jobs) + .env("DATABUILD_BUILD_EVENT_LOG", build_event_log_uri) + .env("DATABUILD_BUILD_REQUEST_ID", orchestrator.build_request_id()) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .map_err(|e| CliError::Execution(format!("Failed to spawn execute process: {}", e)))?; + + // Write job graph to stdin + if let Some(stdin) = cmd.stdin.as_mut() { + use std::io::Write; + stdin.write_all(job_graph_json.as_bytes()) + .map_err(|e| CliError::Execution(format!("Failed to write job graph to execute: {}", e)))?; + } + + let output = cmd.wait_with_output() + .map_err(|e| CliError::Execution(format!("Failed to run execute: {}", e)))?; + + if !output.status.success() { + let stderr = String::from_utf8_lossy(&output.stderr); + return Err(CliError::Execution(format!("Execution failed: {}", stderr))); + } + + // For now, assume success if the command completed without error + // In the future, we could parse the output to get more detailed results + info!("Execution completed successfully"); + Ok(BuildResult::Success { jobs_completed: job_graph.nodes.len() }) +} + +#[tokio::main] +async fn main() -> Result<()> { + // Initialize logger + SimpleLogger::new() + .with_level(log::LevelFilter::Info) + .init() + .map_err(|e| CliError::Environment(format!("Failed to initialize logger: {}", e)))?; + + info!("Starting DataBuild CLI wrapper"); + + // Parse command line arguments + let matches = ClapCommand::new("databuild") + .version("1.0") + .about("DataBuild unified CLI") + .arg( + Arg::new("partitions") + .help("Partition references to build") + .required(true) + .num_args(1..) + .value_name("PARTITIONS") + ) + .arg( + Arg::new("event-log") + .long("event-log") + .help("Event log URI (default: stdout)") + .value_name("URI") + ) + .arg( + Arg::new("build-request-id") + .long("build-request-id") + .help("Build request ID (default: generate UUID)") + .value_name("ID") + ) + .get_matches(); + + let partitions: Vec = matches.get_many::("partitions") + .unwrap() + .cloned() + .collect(); + + let event_log_uri = matches.get_one::("event-log") + .cloned() + .or_else(|| env::var("DATABUILD_BUILD_EVENT_LOG").ok()) + .unwrap_or_else(|| "stdout".to_string()); + + let build_request_id = matches.get_one::("build-request-id") + .cloned() + .or_else(|| env::var("DATABUILD_BUILD_REQUEST_ID").ok()) + .unwrap_or_else(|| Uuid::new_v4().to_string()); + + info!("Build request ID: {}", build_request_id); + info!("Partitions: {:?}", partitions); + info!("Event log URI: {}", event_log_uri); + + // Create event log and orchestrator + let event_log = create_build_event_log(&event_log_uri).await?; + + let requested_partitions: Vec = partitions.iter() + .map(|p| PartitionRef { str: p.clone() }) + .collect(); + + let orchestrator = BuildOrchestrator::new( + std::sync::Arc::from(event_log), + build_request_id, + requested_partitions, + ); + + // Emit orchestration events + orchestrator.start_build().await?; + orchestrator.start_planning().await?; + + // Run analysis + let job_graph = run_analysis(&partitions, &orchestrator).await?; + + orchestrator.start_execution().await?; + + // Run execution + let result = run_execution(job_graph, &orchestrator).await?; + + orchestrator.complete_build(result).await?; + + info!("DataBuild CLI completed successfully"); + Ok(()) +} \ No newline at end of file diff --git a/databuild/client/BUILD.bazel b/databuild/client/BUILD.bazel index 0c1fbad..21a671d 100644 --- a/databuild/client/BUILD.bazel +++ b/databuild/client/BUILD.bazel @@ -43,6 +43,12 @@ genrule( "typescript_generated/src/models/BuildSummary.ts", "typescript_generated/src/models/BuildsListResponse.ts", "typescript_generated/src/models/CancelBuildRequest.ts", + "typescript_generated/src/models/JobDailyStats.ts", + "typescript_generated/src/models/JobMetricsRequest.ts", + "typescript_generated/src/models/JobMetricsResponse.ts", + "typescript_generated/src/models/JobRunSummary.ts", + "typescript_generated/src/models/JobSummary.ts", + "typescript_generated/src/models/JobsListResponse.ts", "typescript_generated/src/models/PartitionEventsRequest.ts", "typescript_generated/src/models/PartitionEventsResponse.ts", "typescript_generated/src/models/PartitionStatusRequest.ts", @@ -84,6 +90,12 @@ genrule( cp $$TEMP_DIR/src/models/BuildSummary.ts $(location typescript_generated/src/models/BuildSummary.ts) cp $$TEMP_DIR/src/models/BuildsListResponse.ts $(location typescript_generated/src/models/BuildsListResponse.ts) cp $$TEMP_DIR/src/models/CancelBuildRequest.ts $(location typescript_generated/src/models/CancelBuildRequest.ts) + cp $$TEMP_DIR/src/models/JobDailyStats.ts $(location typescript_generated/src/models/JobDailyStats.ts) + cp $$TEMP_DIR/src/models/JobMetricsRequest.ts $(location typescript_generated/src/models/JobMetricsRequest.ts) + cp $$TEMP_DIR/src/models/JobMetricsResponse.ts $(location typescript_generated/src/models/JobMetricsResponse.ts) + cp $$TEMP_DIR/src/models/JobRunSummary.ts $(location typescript_generated/src/models/JobRunSummary.ts) + cp $$TEMP_DIR/src/models/JobSummary.ts $(location typescript_generated/src/models/JobSummary.ts) + cp $$TEMP_DIR/src/models/JobsListResponse.ts $(location typescript_generated/src/models/JobsListResponse.ts) cp $$TEMP_DIR/src/models/PartitionEventsRequest.ts $(location typescript_generated/src/models/PartitionEventsRequest.ts) cp $$TEMP_DIR/src/models/PartitionEventsResponse.ts $(location typescript_generated/src/models/PartitionEventsResponse.ts) cp $$TEMP_DIR/src/models/PartitionStatusRequest.ts $(location typescript_generated/src/models/PartitionStatusRequest.ts) diff --git a/databuild/client/tsconfig.json b/databuild/client/tsconfig.json index 547ac45..aa570ed 100644 --- a/databuild/client/tsconfig.json +++ b/databuild/client/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ES2020", - "module": "ESNext", + "module": "CommonJS", "moduleResolution": "node", "allowJs": true, "declaration": true, diff --git a/databuild/dashboard/pages.ts b/databuild/dashboard/pages.ts index 7fe1312..fbaedbd 100644 --- a/databuild/dashboard/pages.ts +++ b/databuild/dashboard/pages.ts @@ -1,6 +1,6 @@ import m from 'mithril'; -import { DashboardService, pollingManager, formatTime, formatDateTime, RecentActivitySummary } from './services'; -import { encodePartitionRef, decodePartitionRef, BuildStatusBadge, PartitionStatusBadge, EventTypeBadge } from './utils'; +import { DashboardService, pollingManager, formatTime, formatDateTime, formatDuration, formatDate, RecentActivitySummary } from './services'; +import { encodePartitionRef, decodePartitionRef, encodeJobLabel, decodeJobLabel, BuildStatusBadge, PartitionStatusBadge, EventTypeBadge } from './utils'; // Page scaffold components export const RecentActivity = { @@ -975,41 +975,293 @@ export const PartitionStatus = { }; export const JobsList = { - view: () => m('div.container.mx-auto.p-4', [ - m('h1.text-3xl.font-bold.mb-4', 'Jobs'), - m('div.card.bg-base-100.shadow-xl', [ - m('div.card-body', [ - m('h2.card-title', 'Job Listing'), - m('p', 'Jobs in the graph with high-level metadata and performance metrics.'), - m('div.alert.alert-info', [ - m('span', 'Job list will be populated from the graph configuration.'), - ]), + jobs: [] as any[], + searchTerm: '', + loading: false, + error: null as string | null, + searchTimeout: null as NodeJS.Timeout | null, + + oninit(vnode: any) { + JobsList.loadJobs(); + }, + + async loadJobs() { + JobsList.loading = true; + JobsList.error = null; + + try { + const service = DashboardService.getInstance(); + JobsList.jobs = await service.getJobs(JobsList.searchTerm || undefined); + } catch (error) { + console.error('Failed to load jobs:', error); + JobsList.error = 'Failed to load jobs. Please try again.'; + } finally { + JobsList.loading = false; + m.redraw(); + } + }, + + filteredJobs() { + if (!JobsList.searchTerm) { + return JobsList.jobs; + } + const search = JobsList.searchTerm.toLowerCase(); + return JobsList.jobs.filter((job: any) => + job.job_label.toLowerCase().includes(search) + ); + }, + + view: () => { + if (JobsList.loading) { + return m('div.container.mx-auto.p-4', [ + m('div.flex.justify-center.items-center.h-64', [ + m('div.loading.loading-spinner.loading-lg') + ]) + ]); + } + + if (JobsList.error) { + return m('div.container.mx-auto.p-4', [ + m('div.alert.alert-error', [ + m('span', JobsList.error), + m('div', [ + m('button.btn.btn-sm.btn-outline', { + onclick: () => JobsList.loadJobs() + }, 'Retry') + ]) + ]) + ]); + } + + return m('div.container.mx-auto.p-4', [ + // Jobs Header + m('.jobs-header.mb-6', [ + m('h1.text-3xl.font-bold.mb-4', 'Jobs'), + m('div.flex.gap-4.items-center.mb-4', [ + m('input.input.input-bordered.flex-1[placeholder="Search jobs..."]', { + value: JobsList.searchTerm, + oninput: (e: Event) => { + JobsList.searchTerm = (e.target as HTMLInputElement).value; + // Debounce search + if (JobsList.searchTimeout) clearTimeout(JobsList.searchTimeout); + JobsList.searchTimeout = setTimeout(() => JobsList.loadJobs(), 300); + } + }), + m('button.btn.btn-outline', { + onclick: () => JobsList.loadJobs() + }, 'Refresh') + ]) ]), - ]), - ]) + + // Jobs Table + JobsList.filteredJobs().length === 0 ? + m('div.text-center.py-8.text-base-content.opacity-60', 'No jobs found') : + m('.jobs-table.card.bg-base-100.shadow-xl', [ + m('.card-body.p-0', [ + m('.overflow-x-auto', [ + m('table.table.table-zebra', [ + m('thead', [ + m('tr', [ + m('th', 'Job Label'), + m('th', 'Success Rate'), + m('th', 'Avg Duration'), + m('th', 'Recent Runs'), + m('th', 'Last Run'), + ]) + ]), + m('tbody', JobsList.filteredJobs().map((job: any) => + m('tr.hover', [ + m('td', [ + m('a.link.link-primary.font-mono.text-sm', { + href: `/jobs/${encodeJobLabel(job.job_label)}`, + onclick: (e: Event) => { + e.preventDefault(); + m.route.set(`/jobs/${encodeJobLabel(job.job_label)}`); + } + }, job.job_label) + ]), + m('td', [ + m(`span.badge.${job.success_rate >= 0.9 ? 'badge-success' : job.success_rate >= 0.7 ? 'badge-warning' : 'badge-error'}`, + `${Math.round(job.success_rate * 100)}%`) + ]), + m('td', formatDuration(job.avg_duration_ms)), + m('td', (job.recent_runs || 0).toString()), + m('td.text-sm.opacity-70', + job.last_run ? formatTime(new Date(job.last_run / 1000000).toISOString()) : '—'), + ]) + )) + ]) + ]) + ]) + ]) + ]); + } }; export const JobMetrics = { - view: (vnode: any) => { - const jobLabel = vnode.attrs.label; + jobLabel: '', + metrics: null as any, + loading: false, + error: null as string | null, + + oninit(vnode: any) { + JobMetrics.jobLabel = decodeJobLabel(vnode.attrs.label); + JobMetrics.loadJobMetrics(); + }, + + async loadJobMetrics() { + JobMetrics.loading = true; + JobMetrics.error = null; + + try { + const service = DashboardService.getInstance(); + JobMetrics.metrics = await service.getJobMetrics(JobMetrics.jobLabel); + if (!JobMetrics.metrics) { + JobMetrics.error = 'Job not found or no metrics available'; + } + } catch (error) { + console.error('Failed to load job metrics:', error); + JobMetrics.error = 'Failed to load job metrics. Please try again.'; + } finally { + JobMetrics.loading = false; + m.redraw(); + } + }, + + view: () => { + if (JobMetrics.loading) { + return m('div.container.mx-auto.p-4', [ + m('div.flex.justify-center.items-center.h-64', [ + m('div.loading.loading-spinner.loading-lg') + ]) + ]); + } + + if (JobMetrics.error) { + return m('div.container.mx-auto.p-4', [ + m('div.alert.alert-error', [ + m('span', JobMetrics.error), + m('div', [ + m('button.btn.btn-sm.btn-outline', { + onclick: () => JobMetrics.loadJobMetrics() + }, 'Retry') + ]) + ]) + ]); + } + + if (!JobMetrics.metrics) { + return m('div.container.mx-auto.p-4', [ + m('div.text-center.py-8.text-base-content.opacity-60', 'No metrics available') + ]); + } + return m('div.container.mx-auto.p-4', [ - m('h1.text-3xl.font-bold.mb-4', `Job Metrics: ${jobLabel}`), - m('div.card.bg-base-100.shadow-xl', [ - m('div.card-body', [ - m('h2.card-title', 'Performance and Reliability'), - m('p', 'Success rate charts, duration trends, and recent runs.'), - m('div.stats.shadow', [ - m('div.stat', [ - m('div.stat-title', 'Success Rate'), - m('div.stat-value', '95%'), - ]), - m('div.stat', [ - m('div.stat-title', 'Avg Duration'), - m('div.stat-value', '2.5s'), + // Job Header + m('.job-header.mb-6', [ + m('h1.text-3xl.font-bold.mb-4', [ + 'Job Metrics: ', + m('span.font-mono.text-2xl', JobMetrics.jobLabel) + ]), + m('.job-stats.grid.grid-cols-1.md:grid-cols-3.gap-4.mb-6', [ + m('.stat.bg-base-100.shadow-xl.rounded-lg.p-4', [ + m('.stat-title', 'Success Rate'), + m('.stat-value.text-3xl', [ + m(`span.${JobMetrics.metrics.success_rate >= 0.9 ? 'text-success' : JobMetrics.metrics.success_rate >= 0.7 ? 'text-warning' : 'text-error'}`, + `${Math.round(JobMetrics.metrics.success_rate * 100)}%`) ]), ]), - ]), + m('.stat.bg-base-100.shadow-xl.rounded-lg.p-4', [ + m('.stat-title', 'Avg Duration'), + m('.stat-value.text-3xl', formatDuration(JobMetrics.metrics.avg_duration_ms)), + ]), + m('.stat.bg-base-100.shadow-xl.rounded-lg.p-4', [ + m('.stat-title', 'Total Runs'), + m('.stat-value.text-3xl', JobMetrics.metrics.total_runs), + ]), + ]) ]), + + // Main Content + m('.job-content.space-y-6', [ + // Performance Trends + JobMetrics.metrics.daily_stats?.length > 0 && m('.performance-trends.card.bg-base-100.shadow-xl', [ + m('.card-body', [ + m('h2.card-title.text-xl.mb-4', 'Performance Trends (Last 30 Days)'), + m('.overflow-x-auto', [ + m('table.table.table-sm', [ + m('thead', [ + m('tr', [ + m('th', 'Date'), + m('th', 'Success Rate'), + m('th', 'Avg Duration'), + m('th', 'Total Runs'), + ]) + ]), + m('tbody', JobMetrics.metrics.daily_stats.map((stat: any) => + m('tr.hover', [ + m('td', formatDate(stat.date)), + m('td', [ + m(`span.badge.${stat.success_rate >= 0.9 ? 'badge-success' : stat.success_rate >= 0.7 ? 'badge-warning' : 'badge-error'}`, + `${Math.round(stat.success_rate * 100)}%`) + ]), + m('td', formatDuration(stat.avg_duration_ms)), + m('td', stat.total_runs), + ]) + )) + ]) + ]) + ]) + ]), + + // Recent Runs + m('.recent-runs.card.bg-base-100.shadow-xl', [ + m('.card-body', [ + m('h2.card-title.text-xl.mb-4', `Recent Runs (${JobMetrics.metrics.recent_runs?.length || 0})`), + !JobMetrics.metrics.recent_runs || JobMetrics.metrics.recent_runs.length === 0 ? + m('.text-center.py-8.text-base-content.opacity-60', 'No recent runs available') : + m('.overflow-x-auto', [ + m('table.table.table-sm', [ + m('thead', [ + m('tr', [ + m('th', 'Build Request'), + m('th', 'Partitions'), + m('th', 'Status'), + m('th', 'Duration'), + m('th', 'Started'), + ]) + ]), + m('tbody', JobMetrics.metrics.recent_runs.map((run: any) => + m('tr.hover', [ + m('td', [ + m('a.link.link-primary.font-mono.text-sm', { + href: `/builds/${run.build_request_id}`, + onclick: (e: Event) => { + e.preventDefault(); + m.route.set(`/builds/${run.build_request_id}`); + } + }, run.build_request_id) + ]), + m('td.text-sm', [ + m('span.font-mono', run.partitions.slice(0, 3).join(', ')), + run.partitions.length > 3 && m('span.opacity-60', ` +${run.partitions.length - 3} more`) + ]), + m('td', [ + m(`span.badge.${run.status === 'completed' ? 'badge-success' : + run.status === 'failed' ? 'badge-error' : + run.status === 'running' ? 'badge-warning' : 'badge-info'}`, + run.status) + ]), + m('td', formatDuration(run.duration_ms)), + m('td.text-sm.opacity-70', + formatTime(new Date(run.started_at / 1000000).toISOString())), + ]) + )) + ]) + ]) + ]) + ]) + ]) ]); } }; diff --git a/databuild/dashboard/services.ts b/databuild/dashboard/services.ts index 5767b19..9362f92 100644 --- a/databuild/dashboard/services.ts +++ b/databuild/dashboard/services.ts @@ -1,5 +1,5 @@ // Import the generated TypeScript client -import { DefaultApi, Configuration, ActivityResponse, BuildSummary, PartitionSummary } from '../client/typescript_generated/src/index'; +import { DefaultApi, Configuration, ActivityResponse, BuildSummary, PartitionSummary, JobsListResponse, JobMetricsResponse, JobSummary, JobRunSummary, JobDailyStats } from '../client/typescript_generated/src/index'; // Base API configuration const API_BASE = '/api/v1'; @@ -87,6 +87,48 @@ export class DashboardService { }; } } + + async getJobs(searchTerm?: string): Promise { + try { + // Build query parameters manually since the generated client may not support query params correctly + const queryParams = new URLSearchParams(); + if (searchTerm) { + queryParams.append('search', searchTerm); + } + const url = `/api/v1/jobs${queryParams.toString() ? '?' + queryParams.toString() : ''}`; + + const response = await fetch(url); + if (!response.ok) { + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + const data: JobsListResponse = await response.json(); + return data.jobs; + } catch (error) { + console.error('Failed to fetch jobs:', error); + return []; + } + } + + async getJobMetrics(jobLabel: string): Promise { + try { + // Encode job label like partition refs for URL safety + const encodedLabel = btoa(jobLabel).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); + const url = `/api/v1/jobs/${encodedLabel}`; + + const response = await fetch(url); + if (!response.ok) { + if (response.status === 404) { + return null; // Job not found + } + throw new Error(`HTTP ${response.status}: ${response.statusText}`); + } + const data: JobMetricsResponse = await response.json(); + return data; + } catch (error) { + console.error('Failed to fetch job metrics:', error); + return null; + } + } } // Polling manager with Page Visibility API integration @@ -199,4 +241,33 @@ export function formatDateTime(isoString: string): string { // Insert milliseconds between seconds and AM/PM: "7/12/2025, 9:03:48.264 AM EST" return `${dateStr}, ${timeStr.replace(/(\d{2})\s+(AM|PM)/, `$1.${millisStr} $2`)}`; +} + +export function formatDuration(durationMs?: number | null): string { + if (!durationMs || durationMs <= 0) { + return '—'; + } + + if (durationMs < 1000) { + return `${Math.round(durationMs)}ms`; + } else if (durationMs < 60000) { + return `${(durationMs / 1000).toFixed(1)}s`; + } else if (durationMs < 3600000) { + const minutes = Math.floor(durationMs / 60000); + const seconds = Math.floor((durationMs % 60000) / 1000); + return `${minutes}m ${seconds}s`; + } else { + const hours = Math.floor(durationMs / 3600000); + const minutes = Math.floor((durationMs % 3600000) / 60000); + return `${hours}h ${minutes}m`; + } +} + +export function formatDate(dateString: string): string { + const date = new Date(dateString); + return date.toLocaleDateString('en-US', { + month: 'short', + day: 'numeric', + year: 'numeric' + }); } \ No newline at end of file diff --git a/databuild/dashboard/utils.ts b/databuild/dashboard/utils.ts index 693fdbf..daffb9d 100644 --- a/databuild/dashboard/utils.ts +++ b/databuild/dashboard/utils.ts @@ -10,6 +10,18 @@ export function decodePartitionRef(encoded: string): string { return atob(padded); } +// Job label encoding utilities (same pattern as partition refs) +export function encodeJobLabel(label: string): string { + return btoa(label).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); +} + +export function decodeJobLabel(encoded: string): string { + // Add padding if needed + const padding = '='.repeat((4 - (encoded.length % 4)) % 4); + const padded = encoded.replace(/-/g, '+').replace(/_/g, '/') + padding; + return atob(padded); +} + import m from 'mithril'; // Mithril components for status badges - encapsulates both logic and presentation @@ -46,7 +58,7 @@ export const PartitionStatusBadge = { if (normalizedStatus.includes('available')) { badgeClass = 'badge-success'; - } else if (normalizedStatus.includes('building') || normalizedStatus.includes('scheduled')) { + } else if (normalizedStatus.includes('building') || normalizedStatus.includes('analyzed')) { badgeClass = 'badge-warning'; } else if (normalizedStatus.includes('requested') || normalizedStatus.includes('delegated')) { badgeClass = 'badge-info'; diff --git a/databuild/databuild.proto b/databuild/databuild.proto index e963a96..0a3b368 100644 --- a/databuild/databuild.proto +++ b/databuild/databuild.proto @@ -162,8 +162,8 @@ message GraphBuildResponse { repeated PartitionManifest manifests = 1; } // Partition lifecycle states enum PartitionStatus { PARTITION_UNKNOWN = 0; - PARTITION_REQUESTED = 1; // Partition requested but not yet scheduled - PARTITION_SCHEDULED = 2; // Job scheduled to produce this partition + PARTITION_REQUESTED = 1; // Partition requested but not yet analyzed + PARTITION_ANALYZED = 2; // Partition analyzed successfully PARTITION_BUILDING = 3; // Job actively building this partition PARTITION_AVAILABLE = 4; // Partition successfully built and available PARTITION_FAILED = 5; // Partition build failed @@ -178,17 +178,19 @@ enum JobStatus { JOB_COMPLETED = 3; // Job completed successfully JOB_FAILED = 4; // Job execution failed JOB_CANCELLED = 5; // Job execution cancelled + JOB_SKIPPED = 6; // Job skipped because target partitions already available } // Build request lifecycle enum BuildRequestStatus { BUILD_REQUEST_UNKNOWN = 0; - BUILD_REQUEST_RECEIVED = 1; // Build request received and queued - BUILD_REQUEST_PLANNING = 2; // Graph analysis in progress - BUILD_REQUEST_EXECUTING = 3; // Jobs are being executed - BUILD_REQUEST_COMPLETED = 4; // All requested partitions built - BUILD_REQUEST_FAILED = 5; // Build request failed - BUILD_REQUEST_CANCELLED = 6; // Build request cancelled + BUILD_REQUEST_RECEIVED = 1; // Build request received and queued + BUILD_REQUEST_PLANNING = 2; // Graph analysis in progress + BUILD_REQUEST_ANALYSIS_COMPLETED = 7; // Graph analysis completed successfully + BUILD_REQUEST_EXECUTING = 3; // Jobs are being executed + BUILD_REQUEST_COMPLETED = 4; // All requested partitions built + BUILD_REQUEST_FAILED = 5; // Build request failed + BUILD_REQUEST_CANCELLED = 6; // Build request cancelled } // Build request lifecycle event diff --git a/databuild/event_log/mod.rs b/databuild/event_log/mod.rs index 48120aa..84ca054 100644 --- a/databuild/event_log/mod.rs +++ b/databuild/event_log/mod.rs @@ -130,6 +130,12 @@ pub trait BuildEventLog: Send + Sync { // Get aggregated activity summary for dashboard async fn get_activity_summary(&self) -> Result; + + // Get the build request ID that created an available partition + async fn get_build_request_for_available_partition( + &self, + partition_ref: &str + ) -> Result>; // build request ID that made partition available } // Helper function to generate event ID diff --git a/databuild/event_log/postgres.rs b/databuild/event_log/postgres.rs index 372853e..566ec6a 100644 --- a/databuild/event_log/postgres.rs +++ b/databuild/event_log/postgres.rs @@ -120,4 +120,13 @@ impl BuildEventLog for PostgresBuildEventLog { "PostgreSQL implementation not yet available".to_string() )) } + + async fn get_build_request_for_available_partition( + &self, + _partition_ref: &str + ) -> Result> { + Err(BuildEventLogError::DatabaseError( + "PostgreSQL implementation not yet available".to_string() + )) + } } \ No newline at end of file diff --git a/databuild/event_log/sqlite.rs b/databuild/event_log/sqlite.rs index 6f33ec5..303e4e0 100644 --- a/databuild/event_log/sqlite.rs +++ b/databuild/event_log/sqlite.rs @@ -22,7 +22,7 @@ fn int_to_partition_status(i: i32) -> PartitionStatus { match i { 0 => PartitionStatus::PartitionUnknown, 1 => PartitionStatus::PartitionRequested, - 2 => PartitionStatus::PartitionScheduled, + 2 => PartitionStatus::PartitionAnalyzed, 3 => PartitionStatus::PartitionBuilding, 4 => PartitionStatus::PartitionAvailable, 5 => PartitionStatus::PartitionFailed, @@ -381,7 +381,18 @@ impl BuildEventLog for SqliteBuildEventLog { let rows = stmt.query_map([], |row| { let mut row_data = Vec::new(); for i in 0..column_count { - let value: String = row.get(i).unwrap_or_default(); + // Try to get as different types and convert to string + let value: String = if let Ok(int_val) = row.get::<_, i64>(i) { + int_val.to_string() + } else if let Ok(float_val) = row.get::<_, f64>(i) { + float_val.to_string() + } else if let Ok(str_val) = row.get::<_, String>(i) { + str_val + } else if let Ok(str_val) = row.get::<_, Option>(i) { + str_val.unwrap_or_default() + } else { + String::new() + }; row_data.push(value); } Ok(row_data) @@ -397,37 +408,13 @@ impl BuildEventLog for SqliteBuildEventLog { rows: result_rows, }) } - async fn get_latest_partition_status( &self, partition_ref: &str ) -> Result> { - let conn = self.connection.lock().unwrap(); - - let query = "SELECT pe.status, be.timestamp - FROM partition_events pe - JOIN build_events be ON pe.event_id = be.event_id - WHERE pe.partition_ref = ?1 - ORDER BY be.timestamp DESC - LIMIT 1"; - - let mut stmt = conn.prepare(query) - .map_err(|e| BuildEventLogError::QueryError(e.to_string()))?; - - let result = stmt.query_row([partition_ref], |row| { - let status_str: String = row.get(0)?; - let timestamp: i64 = row.get(1)?; - let status = status_str.parse::().unwrap_or(0); - Ok((status, timestamp)) - }); - - match result { - Ok((status, timestamp)) => { - let partition_status = PartitionStatus::try_from(status).unwrap_or(PartitionStatus::PartitionUnknown); - Ok(Some((partition_status, timestamp))) - } - Err(rusqlite::Error::QueryReturnedNoRows) => Ok(None), - Err(e) => Err(BuildEventLogError::QueryError(e.to_string())), + match self.get_meaningful_partition_status(partition_ref).await? { + Some((status, timestamp, _build_request_id)) => Ok(Some((status, timestamp))), + None => Ok(None), } } @@ -445,7 +432,7 @@ impl BuildEventLog for SqliteBuildEventLog { FROM partition_events pe JOIN build_events be ON pe.event_id = be.event_id WHERE pe.partition_ref = ?1 - AND pe.status IN ('2', '3') -- PARTITION_SCHEDULED or PARTITION_BUILDING + AND pe.status IN ('2', '3') -- PARTITION_ANALYZED or PARTITION_BUILDING AND be.build_request_id NOT IN ( SELECT DISTINCT be3.build_request_id FROM build_request_events bre @@ -551,71 +538,61 @@ impl BuildEventLog for SqliteBuildEventLog { offset: u32, status_filter: Option, ) -> Result<(Vec, u32)> { - let conn = self.connection.lock().unwrap(); - - // Build query based on status filter - let (where_clause, count_where_clause) = match status_filter { - Some(_) => (" WHERE pe.status = ?1", " WHERE pe.status = ?1"), - None => ("", ""), - }; - - let query = format!( - "SELECT pe.partition_ref, pe.status, MAX(be.timestamp) as updated_at, be.build_request_id - FROM build_events be - JOIN partition_events pe ON be.event_id = pe.event_id{} - GROUP BY pe.partition_ref - ORDER BY updated_at DESC - LIMIT {} OFFSET {}", - where_clause, limit, offset - ); - - let count_query = format!( - "SELECT COUNT(DISTINCT pe.partition_ref) - FROM build_events be - JOIN partition_events pe ON be.event_id = pe.event_id{}", - count_where_clause - ); - - // Execute count query first - let total_count: u32 = if let Some(status) = status_filter { - let status_str = format!("{:?}", status); - conn.query_row(&count_query, params![status_str], |row| row.get(0)) - .map_err(|e| BuildEventLogError::QueryError(e.to_string()))? - } else { - conn.query_row(&count_query, [], |row| row.get(0)) - .map_err(|e| BuildEventLogError::QueryError(e.to_string()))? - }; - - // Execute main query - let mut stmt = conn.prepare(&query) - .map_err(|e| BuildEventLogError::QueryError(e.to_string()))?; - - let row_mapper = |row: &Row| -> rusqlite::Result { - let status_str: String = row.get(1)?; - let status = status_str.parse::() - .map(int_to_partition_status) - .unwrap_or(PartitionStatus::PartitionUnknown); + // Get all unique partition refs first, ordered by most recent activity + let (total_count, partition_refs) = { + let conn = self.connection.lock().unwrap(); - Ok(PartitionSummary { - partition_ref: row.get(0)?, - status, - updated_at: row.get(2)?, - build_request_id: Some(row.get(3)?), - }) + let count_query = "SELECT COUNT(DISTINCT pe.partition_ref) + FROM partition_events pe"; + let total_count: u32 = conn.query_row(count_query, [], |row| row.get(0)) + .map_err(|e| BuildEventLogError::QueryError(e.to_string()))?; + + let refs_query = "SELECT DISTINCT pe.partition_ref + FROM partition_events pe + JOIN build_events be ON pe.event_id = be.event_id + GROUP BY pe.partition_ref + ORDER BY MAX(be.timestamp) DESC + LIMIT ? OFFSET ?"; + + let mut stmt = conn.prepare(refs_query) + .map_err(|e| BuildEventLogError::QueryError(e.to_string()))?; + + let rows = stmt.query_map([limit, offset], |row| { + let partition_ref: String = row.get(0)?; + Ok(partition_ref) + }).map_err(|e| BuildEventLogError::QueryError(e.to_string()))?; + + let mut partition_refs = Vec::new(); + for row in rows { + partition_refs.push(row.map_err(|e| BuildEventLogError::QueryError(e.to_string()))?); + } + + (total_count, partition_refs) }; - let rows = if let Some(status) = status_filter { - let status_str = format!("{:?}", status); - stmt.query_map(params![status_str], row_mapper) - } else { - stmt.query_map([], row_mapper) - }.map_err(|e| BuildEventLogError::QueryError(e.to_string()))?; - + // Get meaningful status for each partition using shared helper let mut summaries = Vec::new(); - for row in rows { - summaries.push(row.map_err(|e| BuildEventLogError::QueryError(e.to_string()))?); + for partition_ref in partition_refs { + if let Some((status, updated_at, build_request_id)) = self.get_meaningful_partition_status(&partition_ref).await? { + // Apply status filter if specified + if let Some(filter_status) = status_filter { + if status != filter_status { + continue; + } + } + + summaries.push(PartitionSummary { + partition_ref, + status, + updated_at, + build_request_id: Some(build_request_id), + }); + } } + // Sort by updated_at descending (most recent first) + summaries.sort_by(|a, b| b.updated_at.cmp(&a.updated_at)); + Ok((summaries, total_count)) } @@ -742,4 +719,103 @@ impl BuildEventLog for SqliteBuildEventLog { Ok(()) } + + async fn get_build_request_for_available_partition( + &self, + partition_ref: &str + ) -> Result> { + let conn = self.connection.lock().unwrap(); + + // Find the most recent PARTITION_AVAILABLE event for this partition + let query = "SELECT be.build_request_id + FROM partition_events pe + JOIN build_events be ON pe.event_id = be.event_id + WHERE pe.partition_ref = ?1 AND pe.status = '4' + ORDER BY be.timestamp DESC + LIMIT 1"; + + let result = conn.query_row(query, [partition_ref], |row| { + let build_request_id: String = row.get(0)?; + Ok(build_request_id) + }); + + match result { + Ok(build_request_id) => Ok(Some(build_request_id)), + Err(rusqlite::Error::QueryReturnedNoRows) => Ok(None), + Err(e) => Err(BuildEventLogError::QueryError(e.to_string())), + } + } +} + +impl SqliteBuildEventLog { + // Shared helper method to get the meaningful partition status for build coordination and display + // This implements the "delegation-friendly" logic: if a partition was ever available, it remains available + async fn get_meaningful_partition_status( + &self, + partition_ref: &str + ) -> Result> { // (status, timestamp, build_request_id) + let conn = self.connection.lock().unwrap(); + + // Check for ANY historical completion first - this is resilient to later events being added + let available_query = "SELECT pe.status, be.timestamp, be.build_request_id + FROM partition_events pe + JOIN build_events be ON pe.event_id = be.event_id + WHERE pe.partition_ref = ?1 AND pe.status = '4' + ORDER BY be.timestamp DESC + LIMIT 1"; + + let mut available_stmt = conn.prepare(available_query) + .map_err(|e| BuildEventLogError::QueryError(e.to_string()))?; + + let available_result = available_stmt.query_row([partition_ref], |row| { + let status_str: String = row.get(0)?; + let timestamp: i64 = row.get(1)?; + let build_request_id: String = row.get(2)?; + let status = status_str.parse::() + .map_err(|_e| rusqlite::Error::InvalidColumnType(0, status_str.clone(), rusqlite::types::Type::Integer))?; + Ok((status, timestamp, build_request_id)) + }); + + match available_result { + Ok((status, timestamp, build_request_id)) => { + let partition_status = PartitionStatus::try_from(status) + .map_err(|_| BuildEventLogError::QueryError(format!("Invalid partition status: {}", status)))?; + return Ok(Some((partition_status, timestamp, build_request_id))); + } + Err(rusqlite::Error::QueryReturnedNoRows) => { + // No available partition found, fall back to latest status + } + Err(e) => return Err(BuildEventLogError::QueryError(e.to_string())), + } + + // Fall back to latest status if no available partition found + let latest_query = "SELECT pe.status, be.timestamp, be.build_request_id + FROM partition_events pe + JOIN build_events be ON pe.event_id = be.event_id + WHERE pe.partition_ref = ?1 + ORDER BY be.timestamp DESC + LIMIT 1"; + + let mut latest_stmt = conn.prepare(latest_query) + .map_err(|e| BuildEventLogError::QueryError(e.to_string()))?; + + let result = latest_stmt.query_row([partition_ref], |row| { + let status_str: String = row.get(0)?; + let timestamp: i64 = row.get(1)?; + let build_request_id: String = row.get(2)?; + let status = status_str.parse::() + .map_err(|_e| rusqlite::Error::InvalidColumnType(0, status_str.clone(), rusqlite::types::Type::Integer))?; + Ok((status, timestamp, build_request_id)) + }); + + match result { + Ok((status, timestamp, build_request_id)) => { + let partition_status = PartitionStatus::try_from(status) + .map_err(|_| BuildEventLogError::QueryError(format!("Invalid partition status: {}", status)))?; + Ok(Some((partition_status, timestamp, build_request_id))) + } + Err(rusqlite::Error::QueryReturnedNoRows) => Ok(None), + Err(e) => Err(BuildEventLogError::QueryError(e.to_string())), + } + } } \ No newline at end of file diff --git a/databuild/event_log/stdout.rs b/databuild/event_log/stdout.rs index abbdaa8..46b5ad1 100644 --- a/databuild/event_log/stdout.rs +++ b/databuild/event_log/stdout.rs @@ -126,4 +126,14 @@ impl BuildEventLog for StdoutBuildEventLog { "Stdout build event log does not support querying".to_string() )) } + + async fn get_build_request_for_available_partition( + &self, + _partition_ref: &str + ) -> Result> { + // Stdout implementation doesn't support querying + Err(BuildEventLogError::QueryError( + "Stdout build event log does not support querying".to_string() + )) + } } \ No newline at end of file diff --git a/databuild/graph/analyze.rs b/databuild/graph/analyze.rs index cbd1573..3410677 100644 --- a/databuild/graph/analyze.rs +++ b/databuild/graph/analyze.rs @@ -171,60 +171,17 @@ fn configure_parallel(job_refs: HashMap>, num_workers: usize Ok(all_tasks) } -// Check for non-stale partitions and delegation opportunities +// Simple staleness check - all requested partitions need jobs created +// Delegation optimization happens in execution phase async fn check_partition_staleness( partition_refs: &[String], - event_log: &Box, - build_request_id: &str + _event_log: &Box, + _build_request_id: &str ) -> Result<(Vec, Vec), String> { - let mut stale_partitions = Vec::new(); - let mut delegated_partitions = Vec::new(); - - for partition_ref in partition_refs { - // Check latest partition status - match event_log.get_latest_partition_status(partition_ref).await { - Ok(Some((PartitionStatus::PartitionAvailable, _timestamp))) => { - info!("Partition {} is already available, skipping", partition_ref); - // Could add more sophisticated staleness checking here based on timestamp - // For now, assume available partitions are fresh - delegated_partitions.push(partition_ref.clone()); - } - Ok(Some((PartitionStatus::PartitionBuilding, _timestamp))) | - Ok(Some((PartitionStatus::PartitionScheduled, _timestamp))) => { - // Check if another build is actively working on this partition - match event_log.get_active_builds_for_partition(partition_ref).await { - Ok(active_builds) if !active_builds.is_empty() => { - info!("Partition {} is being built by another request: {:?}", partition_ref, active_builds); - - // Log delegation event - for delegated_to_build_id in &active_builds { - let event = create_build_event( - build_request_id.to_string(), - crate::build_event::EventType::DelegationEvent(DelegationEvent { - partition_ref: Some(PartitionRef { str: partition_ref.clone() }), - delegated_to_build_request_id: delegated_to_build_id.clone(), - message: format!("Delegated to existing build"), - }) - ); - if let Err(e) = event_log.append_event(event).await { - error!("Failed to log delegation event: {}", e); - } - } - - delegated_partitions.push(partition_ref.clone()); - } - _ => { - // No active builds, consider it stale and needs rebuilding - stale_partitions.push(partition_ref.clone()); - } - } - } - _ => { - // Partition not found or failed, needs to be built - stale_partitions.push(partition_ref.clone()); - } - } - } + // Analysis phase creates jobs for all requested partitions + // Execution phase will handle delegation optimization + let stale_partitions = partition_refs.to_vec(); + let delegated_partitions = Vec::new(); Ok((stale_partitions, delegated_partitions)) } @@ -276,23 +233,7 @@ async fn plan( unhandled_refs.insert(ref_str.clone()); } - // Log partition scheduling events for stale partitions - if let Some(ref event_log) = build_event_log { - for partition_ref in &stale_refs { - let event = create_build_event( - build_request_id.to_string(), - crate::build_event::EventType::PartitionEvent(PartitionEvent { - partition_ref: Some(PartitionRef { str: partition_ref.clone() }), - status: PartitionStatus::PartitionScheduled as i32, - message: "Partition scheduled for building".to_string(), - job_run_id: String::new(), - }) - ); - if let Err(e) = event_log.append_event(event).await { - error!("Failed to log partition scheduled event: {}", e); - } - } - } + // Note: Partition analysis events will be logged after successful job graph creation let mut epoch = 0; let mut nodes = Vec::new(); @@ -379,35 +320,21 @@ async fn plan( } } - // Check if we have delegated partitions that explain why we have no nodes - let all_partitions_delegated = nodes.is_empty() && - output_refs.iter().all(|ref_str| _delegated_refs.contains(ref_str)); - - if !nodes.is_empty() || all_partitions_delegated { - if all_partitions_delegated { - info!("Planning complete: all {} partitions delegated to other builds", output_refs.len()); - } else { - info!("Planning complete: created graph with {} nodes for {} output refs", nodes.len(), output_refs.len()); - } + if !nodes.is_empty() { + info!("Planning complete: created graph with {} nodes for {} output refs", nodes.len(), output_refs.len()); - // Log planning completion + // Log analysis completion event if let Some(ref event_log) = build_event_log { - let message = if all_partitions_delegated { - format!("Analysis completed - all {} partitions delegated to active builds", output_refs.len()) - } else { - format!("Analysis completed with {} jobs", nodes.len()) - }; - let event = create_build_event( build_request_id.to_string(), crate::build_event::EventType::BuildRequestEvent(BuildRequestEvent { - status: BuildRequestStatus::BuildRequestCompleted as i32, + status: BuildRequestStatus::BuildRequestAnalysisCompleted as i32, requested_partitions: output_refs.iter().map(|s| PartitionRef { str: s.clone() }).collect(), - message, + message: format!("Analysis completed successfully, {} tasks planned", nodes.len()), }) ); if let Err(e) = event_log.append_event(event).await { - error!("Failed to log completion event: {}", e); + error!("Failed to log analysis completion event: {}", e); } } @@ -618,43 +545,6 @@ async fn main() { None }; - // Check if this is a CLI build (not service-initiated) - let is_cli_mode = env::var("DATABUILD_CLI_MODE").is_ok(); - - // Emit orchestration events for CLI mode to match Service behavior - if is_cli_mode { - if let Some(ref event_log) = build_event_log { - // Emit "Build request received" event - let event = create_build_event( - build_request_id.clone(), - crate::build_event::EventType::BuildRequestEvent(BuildRequestEvent { - status: BuildRequestStatus::BuildRequestReceived as i32, - requested_partitions: args.iter() - .map(|p| PartitionRef { str: p.clone() }) - .collect(), - message: "Build request received".to_string(), - }) - ); - if let Err(e) = event_log.append_event(event).await { - error!("Failed to log build request received event: {}", e); - } - - // Emit "Starting build planning" event - let event = create_build_event( - build_request_id.clone(), - crate::build_event::EventType::BuildRequestEvent(BuildRequestEvent { - status: BuildRequestStatus::BuildRequestPlanning as i32, - requested_partitions: args.iter() - .map(|p| PartitionRef { str: p.clone() }) - .collect(), - message: "Starting build planning".to_string(), - }) - ); - if let Err(e) = event_log.append_event(event).await { - error!("Failed to log build planning event: {}", e); - } - } - } match mode.as_str() { "plan" => { diff --git a/databuild/graph/execute.rs b/databuild/graph/execute.rs index 269d4bb..2748506 100644 --- a/databuild/graph/execute.rs +++ b/databuild/graph/execute.rs @@ -1,4 +1,4 @@ -use databuild::{JobGraph, Task, JobStatus, BuildRequestStatus, PartitionStatus, BuildRequestEvent, JobEvent, PartitionEvent}; +use databuild::{JobGraph, Task, JobStatus, BuildRequestStatus, PartitionStatus, BuildRequestEvent, JobEvent, PartitionEvent, PartitionRef}; use databuild::event_log::{create_build_event_log, create_build_event}; use databuild::build_event::EventType; use crossbeam_channel::{Receiver, Sender}; @@ -263,14 +263,56 @@ fn is_task_ready(task: &Task, completed_outputs: &HashSet) -> bool { true } -// Check if partitions are already being built by other build requests +// Check if partitions are already available or being built by other build requests async fn check_build_coordination( task: &Task, event_log: &Box, build_request_id: &str -) -> Result { - for output_ref in &task.config.as_ref().unwrap().outputs { - // Check if this partition is already being built by another request +) -> Result<(bool, bool, Vec<(PartitionRef, String)>), String> { + let outputs = &task.config.as_ref().unwrap().outputs; + let mut available_partitions = Vec::new(); + let mut needs_building = false; + + for output_ref in outputs { + debug!("Checking build coordination for partition: {}", output_ref.str); + + // First check if this partition is already available + match event_log.get_latest_partition_status(&output_ref.str).await { + Ok(Some((status, _timestamp))) => { + debug!("Partition {} has status: {:?}", output_ref.str, status); + if status == databuild::PartitionStatus::PartitionAvailable { + // Get which build request created this partition + match event_log.get_build_request_for_available_partition(&output_ref.str).await { + Ok(Some(source_build_id)) => { + info!("Partition {} already available from build {}", output_ref.str, source_build_id); + available_partitions.push((output_ref.clone(), source_build_id)); + continue; + } + Ok(None) => { + error!("Partition {} is available but no source build found - this indicates a bug in the event log implementation", output_ref.str); + return Err(format!("Available partition {} has no source build ID. This suggests the event log is missing required data.", output_ref.str)); + } + Err(e) => { + error!("Failed to get source build for partition {}: {}", output_ref.str, e); + return Err(format!("Cannot determine source build for available partition {}: {}", output_ref.str, e)); + } + } + } else { + debug!("Partition {} has non-available status {:?}, needs building", output_ref.str, status); + needs_building = true; + } + } + Ok(None) => { + debug!("Partition {} has no status, needs building", output_ref.str); + needs_building = true; + } + Err(e) => { + error!("Failed to check partition status for {}: {}", output_ref.str, e); + return Err(format!("Cannot check partition status: {}. Use a queryable event log (e.g., SQLite) for builds that need to check existing partitions.", e)); + } + } + + // Check if this partition is being built by another request match event_log.get_active_builds_for_partition(&output_ref.str).await { Ok(active_builds) => { let other_builds: Vec = active_builds.into_iter() @@ -281,7 +323,7 @@ async fn check_build_coordination( info!("Partition {} is already being built by other requests: {:?}. Delegating.", output_ref.str, other_builds); - // Log delegation event + // Log delegation event for active builds for delegated_to_build_id in &other_builds { let event = create_build_event( build_request_id.to_string(), @@ -296,17 +338,25 @@ async fn check_build_coordination( } } - return Ok(false); // Don't build this task, it's delegated + return Ok((false, false, available_partitions)); // Don't build, delegated to active build } } Err(e) => { - warn!("Failed to check active builds for partition {}: {}", output_ref.str, e); - // Continue with build on error to avoid blocking + error!("Failed to check active builds for partition {}: {}", output_ref.str, e); + return Err(format!("Cannot check active builds: {}. Use a queryable event log (e.g., SQLite) for builds that need to check for concurrent execution.", e)); } } + + // If we reach here, this partition needs to be built + needs_building = true; } - Ok(true) // Safe to build + // Only skip the job if ALL partitions are already available + if !needs_building && available_partitions.len() == outputs.len() { + Ok((false, true, available_partitions)) // Don't build, skip due to all partitions available + } else { + Ok((true, false, available_partitions)) // Need to build (some partitions unavailable) + } } fn log_status_summary( @@ -338,7 +388,14 @@ fn log_status_summary( #[tokio::main] async fn main() -> Result<(), Box> { - simple_logger::SimpleLogger::new().with_level(log::LevelFilter::Info).init()?; + simple_logger::SimpleLogger::new() + .with_level( + std::env::var("RUST_LOG") + .unwrap_or_else(|_| "info".to_string()) + .parse() + .unwrap_or(log::LevelFilter::Info) + ) + .init()?; // Get build event log configuration from environment variables let build_event_log_uri = std::env::var("DATABUILD_BUILD_EVENT_LOG").ok(); @@ -367,26 +424,6 @@ async fn main() -> Result<(), Box> { info!("Executing job graph with {} nodes", graph.nodes.len()); - // Check if this is a CLI build (not service-initiated) - let is_cli_mode = std::env::var("DATABUILD_CLI_MODE").is_ok(); - - // Emit orchestration events for CLI mode to match Service behavior - if is_cli_mode { - if let Some(ref event_log) = build_event_log { - // Emit "Starting build execution" event (matches Service pattern) - let event = create_build_event( - build_request_id.clone(), - EventType::BuildRequestEvent(BuildRequestEvent { - status: BuildRequestStatus::BuildRequestExecuting as i32, - requested_partitions: graph.outputs.clone(), - message: "Starting build execution".to_string(), - }) - ); - if let Err(e) = event_log.append_event(event).await { - error!("Failed to log build execution event: {}", e); - } - } - } // Log build request execution start (existing detailed event) if let Some(ref event_log) = build_event_log { @@ -522,22 +559,63 @@ async fn main() -> Result<(), Box> { if task_states.get(&task_key) == Some(&TaskState::Pending) { if is_task_ready(task_node, &completed_outputs) { // Check build coordination if event log is available - let should_build = if let Some(ref event_log) = build_event_log { + let (should_build, is_skipped, available_partitions) = if let Some(ref event_log) = build_event_log { match check_build_coordination(task_node, event_log, &build_request_id).await { - Ok(should_build) => should_build, + Ok((should_build, is_skipped, available_partitions)) => (should_build, is_skipped, available_partitions), Err(e) => { error!("Error checking build coordination for {}: {}", task_node.job.as_ref().unwrap().label, e); - true // Default to building on error + (true, false, Vec::<(PartitionRef, String)>::new()) // Default to building on error } } } else { - true // No event log, always build + (true, false, Vec::<(PartitionRef, String)>::new()) // No event log, always build }; if !should_build { - // Task delegated to another build, mark as succeeded - info!("Task {} delegated to another build request", task_node.job.as_ref().unwrap().label); + if is_skipped { + // Task skipped due to all partitions already available + info!("Task {} skipped - all target partitions already available", task_node.job.as_ref().unwrap().label); + + // Log delegation events for each available partition + if let Some(ref event_log) = build_event_log { + for (partition_ref, source_build_id) in &available_partitions { + let delegation_event = create_build_event( + build_request_id.clone(), + EventType::DelegationEvent(databuild::DelegationEvent { + partition_ref: Some(partition_ref.clone()), + delegated_to_build_request_id: source_build_id.clone(), + message: "Delegated to historical build - partition already available".to_string(), + }) + ); + if let Err(e) = event_log.append_event(delegation_event).await { + error!("Failed to log historical delegation event: {}", e); + } + } + + // Log JOB_SKIPPED event + let job_run_id = Uuid::new_v4().to_string(); + let job_event = create_build_event( + build_request_id.clone(), + EventType::JobEvent(JobEvent { + job_run_id: job_run_id.clone(), + job_label: task_node.job.clone(), + target_partitions: task_node.config.as_ref().unwrap().outputs.clone(), + status: JobStatus::JobSkipped as i32, + message: "Job skipped - all target partitions already available".to_string(), + config: task_node.config.clone(), + manifests: vec![], + }) + ); + if let Err(e) = event_log.append_event(job_event).await { + error!("Failed to log job skipped event: {}", e); + } + } + } else { + // Task delegated to active build + info!("Task {} delegated to active build request", task_node.job.as_ref().unwrap().label); + } + task_states.insert(task_key.clone(), TaskState::Succeeded); // Mark outputs as completed @@ -669,34 +747,6 @@ async fn main() -> Result<(), Box> { info!("Execution complete: {} succeeded, {} failed", success_count, failure_count); - // Emit orchestration completion events for CLI mode to match Service behavior - if is_cli_mode { - if let Some(ref event_log) = build_event_log { - let orchestration_message = if failure_count > 0 || fail_fast_triggered { - "Build request failed" - } else { - "Build request completed successfully" - }; - - let orchestration_status = if failure_count > 0 || fail_fast_triggered { - BuildRequestStatus::BuildRequestFailed - } else { - BuildRequestStatus::BuildRequestCompleted - }; - - let event = create_build_event( - build_request_id.clone(), - EventType::BuildRequestEvent(BuildRequestEvent { - status: orchestration_status as i32, - requested_partitions: graph.outputs.clone(), - message: orchestration_message.to_string(), - }) - ); - if let Err(e) = event_log.append_event(event).await { - error!("Failed to log build request completion event: {}", e); - } - } - } // Log final build request status (existing detailed event) if let Some(ref event_log) = build_event_log { diff --git a/databuild/lib.rs b/databuild/lib.rs index 8c2c914..3c6ace4 100644 --- a/databuild/lib.rs +++ b/databuild/lib.rs @@ -4,8 +4,14 @@ include!("databuild.rs"); // Event log module pub mod event_log; +// Orchestration module +pub mod orchestration; + // Service module pub mod service; // Re-export commonly used types from event_log -pub use event_log::{BuildEventLog, BuildEventLogError, create_build_event_log}; \ No newline at end of file +pub use event_log::{BuildEventLog, BuildEventLogError, create_build_event_log}; + +// Re-export orchestration types +pub use orchestration::{BuildOrchestrator, BuildResult, OrchestrationError}; \ No newline at end of file diff --git a/databuild/orchestration/error.rs b/databuild/orchestration/error.rs new file mode 100644 index 0000000..8e8f766 --- /dev/null +++ b/databuild/orchestration/error.rs @@ -0,0 +1,15 @@ +use crate::event_log::BuildEventLogError; + +#[derive(Debug, thiserror::Error)] +pub enum OrchestrationError { + #[error("Event log error: {0}")] + EventLog(#[from] BuildEventLogError), + + #[error("Build coordination error: {0}")] + Coordination(String), + + #[error("Invalid build state transition: {current} -> {requested}")] + InvalidStateTransition { current: String, requested: String }, +} + +pub type Result = std::result::Result; \ No newline at end of file diff --git a/databuild/orchestration/events.rs b/databuild/orchestration/events.rs new file mode 100644 index 0000000..b8d53df --- /dev/null +++ b/databuild/orchestration/events.rs @@ -0,0 +1,146 @@ +use crate::*; +use crate::event_log::{create_build_event, current_timestamp_nanos, generate_event_id}; + +/// Helper functions for creating standardized build events + +pub fn create_build_request_received_event( + build_request_id: String, + requested_partitions: Vec, +) -> BuildEvent { + create_build_event( + build_request_id, + build_event::EventType::BuildRequestEvent(BuildRequestEvent { + status: BuildRequestStatus::BuildRequestReceived as i32, + requested_partitions, + message: "Build request received".to_string(), + }), + ) +} + +pub fn create_build_planning_started_event( + build_request_id: String, +) -> BuildEvent { + create_build_event( + build_request_id, + build_event::EventType::BuildRequestEvent(BuildRequestEvent { + status: BuildRequestStatus::BuildRequestPlanning as i32, + requested_partitions: vec![], + message: "Starting build planning".to_string(), + }), + ) +} + +pub fn create_build_execution_started_event( + build_request_id: String, +) -> BuildEvent { + create_build_event( + build_request_id, + build_event::EventType::BuildRequestEvent(BuildRequestEvent { + status: BuildRequestStatus::BuildRequestExecuting as i32, + requested_partitions: vec![], + message: "Starting build execution".to_string(), + }), + ) +} + +pub fn create_build_completed_event( + build_request_id: String, + result: &super::BuildResult, +) -> BuildEvent { + let message = match result { + super::BuildResult::Success { jobs_completed } => { + format!("Build completed successfully with {} jobs", jobs_completed) + } + super::BuildResult::Failed { jobs_completed, jobs_failed } => { + format!("Build failed: {} jobs completed, {} jobs failed", jobs_completed, jobs_failed) + } + super::BuildResult::FailFast { trigger_job } => { + format!("Build failed fast due to job: {}", trigger_job) + } + }; + + let status = match result { + super::BuildResult::Success { .. } => BuildRequestStatus::BuildRequestCompleted, + super::BuildResult::Failed { .. } | super::BuildResult::FailFast { .. } => BuildRequestStatus::BuildRequestFailed, + }; + + create_build_event( + build_request_id, + build_event::EventType::BuildRequestEvent(BuildRequestEvent { + status: status as i32, + requested_partitions: vec![], + message, + }), + ) +} + +pub fn create_analysis_completed_event( + build_request_id: String, + requested_partitions: Vec, + task_count: usize, +) -> BuildEvent { + create_build_event( + build_request_id, + build_event::EventType::BuildRequestEvent(BuildRequestEvent { + status: BuildRequestStatus::BuildRequestAnalysisCompleted as i32, + requested_partitions, + message: format!("Analysis completed successfully, {} tasks planned", task_count), + }), + ) +} + +pub fn create_job_scheduled_event( + build_request_id: String, + job_event: &JobEvent, +) -> BuildEvent { + BuildEvent { + event_id: generate_event_id(), + timestamp: current_timestamp_nanos(), + build_request_id, + event_type: Some(build_event::EventType::JobEvent(job_event.clone())), + } +} + +pub fn create_job_completed_event( + build_request_id: String, + job_event: &JobEvent, +) -> BuildEvent { + BuildEvent { + event_id: generate_event_id(), + timestamp: current_timestamp_nanos(), + build_request_id, + event_type: Some(build_event::EventType::JobEvent(job_event.clone())), + } +} + +pub fn create_partition_available_event( + build_request_id: String, + partition_event: &PartitionEvent, +) -> BuildEvent { + BuildEvent { + event_id: generate_event_id(), + timestamp: current_timestamp_nanos(), + build_request_id, + event_type: Some(build_event::EventType::PartitionEvent(partition_event.clone())), + } +} + +pub fn create_delegation_event( + build_request_id: String, + partition_ref: &str, + target_build: &str, + message: &str, +) -> BuildEvent { + let partition = PartitionRef { + str: partition_ref.to_string(), + }; + + create_build_event( + build_request_id, + build_event::EventType::DelegationEvent(DelegationEvent { + partition_ref: Some(partition), + delegated_to_build_request_id: target_build.to_string(), + message: message.to_string(), + }), + ) +} \ No newline at end of file diff --git a/databuild/orchestration/mod.rs b/databuild/orchestration/mod.rs new file mode 100644 index 0000000..eb21563 --- /dev/null +++ b/databuild/orchestration/mod.rs @@ -0,0 +1,375 @@ +use crate::*; +use crate::event_log::BuildEventLog; +use log::info; +use std::sync::Arc; + +pub mod error; +pub mod events; + +pub use error::{OrchestrationError, Result}; + +/// Result of a build execution +#[derive(Debug, Clone)] +pub enum BuildResult { + Success { jobs_completed: usize }, + Failed { jobs_completed: usize, jobs_failed: usize }, + FailFast { trigger_job: String }, +} + +/// Core orchestrator for managing build lifecycle and event emission +pub struct BuildOrchestrator { + event_log: Arc, + build_request_id: String, + requested_partitions: Vec, +} + +impl BuildOrchestrator { + /// Create a new build orchestrator + pub fn new( + event_log: Arc, + build_request_id: String, + requested_partitions: Vec, + ) -> Self { + Self { + event_log, + build_request_id, + requested_partitions, + } + } + + /// Get the build request ID + pub fn build_request_id(&self) -> &str { + &self.build_request_id + } + + /// Get the requested partitions + pub fn requested_partitions(&self) -> &[PartitionRef] { + &self.requested_partitions + } + + /// Emit build request received event and start the build lifecycle + pub async fn start_build(&self) -> Result<()> { + info!("Starting build for request: {}", self.build_request_id); + + let event = events::create_build_request_received_event( + self.build_request_id.clone(), + self.requested_partitions.clone(), + ); + + self.event_log.append_event(event).await + .map_err(OrchestrationError::EventLog)?; + + Ok(()) + } + + /// Emit build planning started event + pub async fn start_planning(&self) -> Result<()> { + info!("Starting build planning for request: {}", self.build_request_id); + + let event = events::create_build_planning_started_event( + self.build_request_id.clone(), + ); + + self.event_log.append_event(event).await + .map_err(OrchestrationError::EventLog)?; + + Ok(()) + } + + /// Emit build execution started event + pub async fn start_execution(&self) -> Result<()> { + info!("Starting build execution for request: {}", self.build_request_id); + + let event = events::create_build_execution_started_event( + self.build_request_id.clone(), + ); + + self.event_log.append_event(event).await + .map_err(OrchestrationError::EventLog)?; + + Ok(()) + } + + /// Emit build completion event + pub async fn complete_build(&self, result: BuildResult) -> Result<()> { + info!("Completing build for request: {} with result: {:?}", + self.build_request_id, result); + + let event = events::create_build_completed_event( + self.build_request_id.clone(), + &result, + ); + + self.event_log.append_event(event).await + .map_err(OrchestrationError::EventLog)?; + + Ok(()) + } + + /// Emit analysis completed event + pub async fn emit_analysis_completed(&self, task_count: usize) -> Result<()> { + let event = events::create_analysis_completed_event( + self.build_request_id.clone(), + self.requested_partitions.clone(), + task_count, + ); + + self.event_log.append_event(event).await + .map_err(OrchestrationError::EventLog)?; + + Ok(()) + } + + /// Emit job scheduled event + pub async fn emit_job_scheduled(&self, job: &JobEvent) -> Result<()> { + let event = events::create_job_scheduled_event( + self.build_request_id.clone(), + job, + ); + + self.event_log.append_event(event).await + .map_err(OrchestrationError::EventLog)?; + + Ok(()) + } + + /// Emit job completed event + pub async fn emit_job_completed(&self, job: &JobEvent) -> Result<()> { + let event = events::create_job_completed_event( + self.build_request_id.clone(), + job, + ); + + self.event_log.append_event(event).await + .map_err(OrchestrationError::EventLog)?; + + Ok(()) + } + + /// Emit partition available event + pub async fn emit_partition_available(&self, partition: &PartitionEvent) -> Result<()> { + let event = events::create_partition_available_event( + self.build_request_id.clone(), + partition, + ); + + self.event_log.append_event(event).await + .map_err(OrchestrationError::EventLog)?; + + Ok(()) + } + + /// Emit delegation event + pub async fn emit_delegation( + &self, + partition_ref: &str, + target_build: &str, + message: &str, + ) -> Result<()> { + let event = events::create_delegation_event( + self.build_request_id.clone(), + partition_ref, + target_build, + message, + ); + + self.event_log.append_event(event).await + .map_err(OrchestrationError::EventLog)?; + + Ok(()) + } + + /// Get reference to the event log for direct access if needed + pub fn event_log(&self) -> &dyn BuildEventLog { + self.event_log.as_ref() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use async_trait::async_trait; + use std::sync::{Arc, Mutex}; + + /// Mock event log for testing that captures events + struct MockEventLog { + events: Arc>>, + } + + impl MockEventLog { + fn new() -> (Self, Arc>>) { + let events = Arc::new(Mutex::new(Vec::new())); + let log = Self { + events: events.clone(), + }; + (log, events) + } + } + + #[async_trait] + impl BuildEventLog for MockEventLog { + async fn append_event(&self, event: BuildEvent) -> crate::event_log::Result<()> { + self.events.lock().unwrap().push(event); + Ok(()) + } + + async fn get_build_request_events( + &self, + _build_request_id: &str, + _since: Option, + ) -> crate::event_log::Result> { + Ok(self.events.lock().unwrap().clone()) + } + + async fn get_partition_events( + &self, + _partition_ref: &str, + _since: Option, + ) -> crate::event_log::Result> { + Ok(vec![]) + } + + async fn get_job_run_events( + &self, + _job_run_id: &str, + ) -> crate::event_log::Result> { + Ok(vec![]) + } + + async fn get_events_in_range( + &self, + _start_time: i64, + _end_time: i64, + ) -> crate::event_log::Result> { + Ok(vec![]) + } + + async fn execute_query(&self, _query: &str) -> crate::event_log::Result { + Ok(crate::event_log::QueryResult { + columns: vec![], + rows: vec![], + }) + } + + async fn get_latest_partition_status( + &self, + _partition_ref: &str, + ) -> crate::event_log::Result> { + Ok(None) + } + + async fn get_active_builds_for_partition( + &self, + _partition_ref: &str, + ) -> crate::event_log::Result> { + Ok(vec![]) + } + + async fn initialize(&self) -> crate::event_log::Result<()> { + Ok(()) + } + + async fn list_build_requests( + &self, + _limit: u32, + _offset: u32, + _status_filter: Option, + ) -> crate::event_log::Result<(Vec, u32)> { + Ok((vec![], 0)) + } + + async fn list_recent_partitions( + &self, + _limit: u32, + _offset: u32, + _status_filter: Option, + ) -> crate::event_log::Result<(Vec, u32)> { + Ok((vec![], 0)) + } + + async fn get_activity_summary(&self) -> crate::event_log::Result { + Ok(crate::event_log::ActivitySummary { + active_builds_count: 0, + recent_builds: vec![], + recent_partitions: vec![], + total_partitions_count: 0, + }) + } + + async fn get_build_request_for_available_partition( + &self, + _partition_ref: &str, + ) -> crate::event_log::Result> { + Ok(None) + } + } + + #[tokio::test] + async fn test_build_lifecycle_events() { + let (mock_log, events) = MockEventLog::new(); + let partitions = vec![PartitionRef { str: "test/partition".to_string() }]; + + let orchestrator = BuildOrchestrator::new( + Arc::new(mock_log), + "test-build-123".to_string(), + partitions.clone(), + ); + + // Test full build lifecycle + orchestrator.start_build().await.unwrap(); + orchestrator.start_planning().await.unwrap(); + orchestrator.start_execution().await.unwrap(); + orchestrator.complete_build(BuildResult::Success { jobs_completed: 5 }).await.unwrap(); + + let emitted_events = events.lock().unwrap(); + assert_eq!(emitted_events.len(), 4); + + // Verify event types and build request IDs + for event in emitted_events.iter() { + assert_eq!(event.build_request_id, "test-build-123"); + } + + // Verify first event is build request received + if let Some(build_event::EventType::BuildRequestEvent(br_event)) = &emitted_events[0].event_type { + assert_eq!(br_event.status, BuildRequestStatus::BuildRequestReceived as i32); + assert_eq!(br_event.requested_partitions, partitions); + } else { + panic!("First event should be BuildRequestEvent"); + } + } + + #[tokio::test] + async fn test_partition_and_job_events() { + let (mock_log, events) = MockEventLog::new(); + + let orchestrator = BuildOrchestrator::new( + Arc::new(mock_log), + "test-build-456".to_string(), + vec![], + ); + + // Test analysis completed event + orchestrator.emit_analysis_completed(3).await.unwrap(); + + // Test job event + let partition = PartitionRef { str: "data/users".to_string() }; + let job_event = JobEvent { + job_run_id: "job-run-123".to_string(), + job_label: Some(JobLabel { label: "//:test_job".to_string() }), + target_partitions: vec![partition.clone()], + status: JobStatus::JobScheduled as i32, + message: "Job scheduled".to_string(), + config: None, + manifests: vec![], + }; + orchestrator.emit_job_scheduled(&job_event).await.unwrap(); + + let emitted_events = events.lock().unwrap(); + assert_eq!(emitted_events.len(), 2); + + // All events should have the correct build request ID + for event in emitted_events.iter() { + assert_eq!(event.build_request_id, "test-build-456"); + } + } +} \ No newline at end of file diff --git a/databuild/rules.bzl b/databuild/rules.bzl index 5b7394f..605264f 100644 --- a/databuild/rules.bzl +++ b/databuild/rules.bzl @@ -266,9 +266,10 @@ def databuild_graph(name, jobs, lookup, visibility = None): ) _databuild_graph_build( name = "%s.build" % name, - analyze = "%s.analyze" % name, - exec = "%s.exec" % name, + cli_wrapper = "@databuild//databuild/cli:databuild_cli", jobs = jobs, + lookup = "%s.lookup" % name, + graph_label = "//%s:%s" % (native.package_name(), name), visibility = visibility, ) # Build deployment targets (renamed for hierarchical namespacing) @@ -629,35 +630,96 @@ DataBuildGraphInfo = provider( ) def _databuild_graph_build_impl(ctx): - """Wraps the analyze and execute targets in a shell script.""" + """Wraps the DataBuild CLI wrapper in a shell script.""" script = ctx.actions.declare_file(ctx.label.name) + + # Build DATABUILD_CANDIDATE_JOBS JSON string with runtime rlocation resolution + candidate_jobs_script_lines = ["CANDIDATE_JOBS_JSON=\"{\""] + for i, job in enumerate(ctx.attr.jobs): + job_label = "//" + job.label.package + ":" + job.label.name + configure_path = job[DataBuildJobInfo].configure.files_to_run.executable.short_path + separator = "," if i < len(ctx.attr.jobs) - 1 else "" + candidate_jobs_script_lines.append( + 'CANDIDATE_JOBS_JSON="${CANDIDATE_JOBS_JSON}\\"%s\\":\\"$(rlocation _main/%s)\\"%s"' % ( + job_label, configure_path, separator + ) + ) + candidate_jobs_script_lines.append('CANDIDATE_JOBS_JSON="${CANDIDATE_JOBS_JSON}}"') + candidate_jobs_script = "\n".join(candidate_jobs_script_lines) + + script_content = RUNFILES_PREFIX + """ +# Build DATABUILD_CANDIDATE_JOBS dynamically with proper rlocation resolution +%s + +export DATABUILD_CANDIDATE_JOBS="$CANDIDATE_JOBS_JSON" +export DATABUILD_JOB_LOOKUP_PATH="$(rlocation _main/%s)" +export DATABUILD_GRAPH_LABEL="%s" + +# Generate a single build request ID for the entire CLI operation +export DATABUILD_BUILD_REQUEST_ID=$(python3 -c "import uuid; print(uuid.uuid4())") + +# Run unified DataBuild CLI wrapper +"$(rlocation databuild+/databuild/cli/databuild_cli)" "$@" +""" % ( + candidate_jobs_script, + ctx.attr.lookup.files_to_run.executable.short_path, + ctx.attr.graph_label + ) + ctx.actions.write( output = script, is_executable = True, - content = "#!/bin/bash\n\n" + RUNFILES_PREFIX + """ -# Set CLI mode to indicate this is a direct CLI build (not service-initiated) -export DATABUILD_CLI_MODE=true - -# Run analysis and execution phases -$(rlocation _main/{analyze_path}) $@ | $(rlocation _main/{exec_path}) - """.format( - analyze_path = ctx.attr.analyze.files_to_run.executable.short_path, - exec_path = ctx.attr.exec.files_to_run.executable.short_path, - ), + content = script_content, ) + # Gather the configure and execute executables + configure_executables = [ + job[DataBuildJobInfo].configure.files_to_run.executable + for job in ctx.attr.jobs + ] + + # Get the execute targets - these are the .exec files that need to be in runfiles + execute_executables = [] + for job in ctx.attr.jobs: + # The job target itself contains references to both configure and execute + # We need to find the .exec target for each job + job_name = job.label.name + exec_target_name = job_name + ".exec" + # Find the .exec target in the same package + for attr_name in dir(job): + if attr_name.endswith("_exec") or exec_target_name in attr_name: + exec_target = getattr(job, attr_name, None) + if exec_target and hasattr(exec_target, "files_to_run"): + execute_executables.append(exec_target.files_to_run.executable) + break + + # Also check if we can access exec targets directly from job dependencies + all_job_files = [] + for job in ctx.attr.jobs: + if hasattr(job, "default_runfiles") and job.default_runfiles: + all_job_files.extend(job.default_runfiles.files.to_list()) + runfiles = ctx.runfiles( - files = [ctx.executable.analyze, ctx.executable.exec], - ).merge(ctx.attr.analyze.default_runfiles).merge(ctx.attr.exec.default_runfiles) - + files = [ctx.executable.cli_wrapper, ctx.executable.lookup] + configure_executables + execute_executables + all_job_files, + ).merge(ctx.attr.cli_wrapper.default_runfiles).merge(ctx.attr.lookup.default_runfiles).merge( + ctx.attr._bash_runfiles.default_runfiles + ) + + # Merge runfiles from all configure targets and job targets + for job in ctx.attr.jobs: + configure_target = job[DataBuildJobInfo].configure + runfiles = runfiles.merge(configure_target.default_runfiles) + # Also merge the job's own runfiles which should include the .exec target + runfiles = runfiles.merge(job.default_runfiles) + return [ DefaultInfo( executable = script, runfiles = runfiles, ), DataBuildGraphInfo( - analyze = ctx.attr.analyze, - exec = ctx.attr.exec, + analyze = ctx.attr.cli_wrapper, + exec = ctx.attr.cli_wrapper, jobs = ctx.attr.jobs, ), ] @@ -665,14 +727,8 @@ $(rlocation _main/{analyze_path}) $@ | $(rlocation _main/{exec_path}) _databuild_graph_build = rule( implementation = _databuild_graph_build_impl, attrs = { - "analyze": attr.label( - doc = "Target that implements the graph analysis logic", - mandatory = True, - executable = True, - cfg = "target", - ), - "exec": attr.label( - doc = "Target that implements the graph execution logic", + "cli_wrapper": attr.label( + doc = "Target that implements the unified DataBuild CLI", mandatory = True, executable = True, cfg = "target", @@ -681,6 +737,20 @@ _databuild_graph_build = rule( doc = "The list of jobs that are candidates for building partitions in this databuild graph", allow_empty = False, ), + "lookup": attr.label( + doc = "Target that implements job lookup for desired partition refs", + mandatory = True, + executable = True, + cfg = "target", + ), + "graph_label": attr.string( + doc = "The label of this graph for identification", + mandatory = True, + ), + "_bash_runfiles": attr.label( + default = Label("@bazel_tools//tools/bash/runfiles"), + allow_files = True, + ), }, executable = True, ) diff --git a/databuild/service/handlers.rs b/databuild/service/handlers.rs index 4e2df8b..6760bae 100644 --- a/databuild/service/handlers.rs +++ b/databuild/service/handlers.rs @@ -1,5 +1,6 @@ use super::*; use crate::event_log::{current_timestamp_nanos, create_build_event}; +use crate::orchestration::{BuildOrchestrator, BuildResult}; use axum::{ extract::{Path, State}, http::StatusCode, @@ -11,6 +12,42 @@ use schemars::JsonSchema; use std::process::Command; use std::env; +// Simple base64 URL-safe decoding function for job labels +fn base64_url_decode(encoded: &str) -> Result> { + + // Convert URL-safe base64 back to regular base64 + let mut padded = encoded.replace('-', "+").replace('_', "/"); + + // Add padding if needed + match padded.len() % 4 { + 2 => padded.push_str("=="), + 3 => padded.push_str("="), + _ => {} + } + + // Manual base64 decoding (simplified) + let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + let mut result = Vec::new(); + let mut buffer = 0u32; + let mut bits = 0; + + for c in padded.chars() { + if c == '=' { break; } + + if let Some(index) = alphabet.find(c) { + buffer = (buffer << 6) | (index as u32); + bits += 6; + + if bits >= 8 { + result.push(((buffer >> (bits - 8)) & 0xFF) as u8); + bits -= 8; + } + } + } + + String::from_utf8(result).map_err(|e| e.into()) +} + pub async fn submit_build_request( State(service): State, Json(request): Json, @@ -35,19 +72,18 @@ pub async fn submit_build_request( active_builds.insert(build_request_id.clone(), build_state); } - // Log build request received event - let event = create_build_event( + // Create orchestrator and emit build request received event + let requested_partitions: Vec = request.partitions.iter() + .map(|p| PartitionRef { str: p.clone() }) + .collect(); + + let orchestrator = BuildOrchestrator::new( + service.event_log.clone(), build_request_id.clone(), - crate::build_event::EventType::BuildRequestEvent(BuildRequestEvent { - status: BuildRequestStatus::BuildRequestReceived as i32, - requested_partitions: request.partitions.iter() - .map(|p| PartitionRef { str: p.clone() }) - .collect(), - message: "Build request received".to_string(), - }), + requested_partitions, ); - if let Err(e) = service.event_log.append_event(event).await { + if let Err(e) = orchestrator.start_build().await { error!("Failed to log build request received event: {}", e); return Err(( StatusCode::INTERNAL_SERVER_ERROR, @@ -138,6 +174,7 @@ pub async fn get_build_status( 0 => BuildRequestStatus::BuildRequestUnknown, // Default protobuf value - should not happen in production 1 => BuildRequestStatus::BuildRequestReceived, 2 => BuildRequestStatus::BuildRequestPlanning, + 7 => BuildRequestStatus::BuildRequestAnalysisCompleted, 3 => BuildRequestStatus::BuildRequestExecuting, 4 => BuildRequestStatus::BuildRequestCompleted, 5 => BuildRequestStatus::BuildRequestFailed, @@ -394,22 +431,22 @@ async fn execute_build_request( ) -> Result<(), String> { info!("Starting build execution for request {}", build_request_id); + // Create orchestrator for this build request + let requested_partitions: Vec = partitions.iter() + .map(|p| PartitionRef { str: p.clone() }) + .collect(); + + let orchestrator = BuildOrchestrator::new( + service.event_log.clone(), + build_request_id.clone(), + requested_partitions, + ); + // Update status to planning update_build_request_status(&service, &build_request_id, BuildRequestStatus::BuildRequestPlanning).await; // Log planning event - let event = create_build_event( - build_request_id.clone(), - crate::build_event::EventType::BuildRequestEvent(BuildRequestEvent { - status: BuildRequestStatus::BuildRequestPlanning as i32, - requested_partitions: partitions.iter() - .map(|p| PartitionRef { str: p.clone() }) - .collect(), - message: "Starting build planning".to_string(), - }), - ); - - if let Err(e) = service.event_log.append_event(event).await { + if let Err(e) = orchestrator.start_planning().await { error!("Failed to log planning event: {}", e); } @@ -419,6 +456,12 @@ async fn execute_build_request( Err(e) => { error!("Failed to analyze build graph: {}", e); update_build_request_status(&service, &build_request_id, BuildRequestStatus::BuildRequestFailed).await; + + // Log failure event + if let Err(log_err) = orchestrator.complete_build(BuildResult::Failed { jobs_completed: 0, jobs_failed: 1 }).await { + error!("Failed to log failure event: {}", log_err); + } + return Err(e); } }; @@ -427,18 +470,7 @@ async fn execute_build_request( update_build_request_status(&service, &build_request_id, BuildRequestStatus::BuildRequestExecuting).await; // Log executing event - let event = create_build_event( - build_request_id.clone(), - crate::build_event::EventType::BuildRequestEvent(BuildRequestEvent { - status: BuildRequestStatus::BuildRequestExecuting as i32, - requested_partitions: partitions.iter() - .map(|p| PartitionRef { str: p.clone() }) - .collect(), - message: "Starting build execution".to_string(), - }), - ); - - if let Err(e) = service.event_log.append_event(event).await { + if let Err(e) = orchestrator.start_execution().await { error!("Failed to log executing event: {}", e); } @@ -449,18 +481,7 @@ async fn execute_build_request( update_build_request_status(&service, &build_request_id, BuildRequestStatus::BuildRequestCompleted).await; // Log completion event - let event = create_build_event( - build_request_id.clone(), - crate::build_event::EventType::BuildRequestEvent(BuildRequestEvent { - status: BuildRequestStatus::BuildRequestCompleted as i32, - requested_partitions: partitions.iter() - .map(|p| PartitionRef { str: p.clone() }) - .collect(), - message: "Build request completed successfully".to_string(), - }), - ); - - if let Err(e) = service.event_log.append_event(event).await { + if let Err(e) = orchestrator.complete_build(BuildResult::Success { jobs_completed: 0 }).await { error!("Failed to log completion event: {}", e); } @@ -471,19 +492,8 @@ async fn execute_build_request( update_build_request_status(&service, &build_request_id, BuildRequestStatus::BuildRequestFailed).await; // Log failure event - let event = create_build_event( - build_request_id.clone(), - crate::build_event::EventType::BuildRequestEvent(BuildRequestEvent { - status: BuildRequestStatus::BuildRequestFailed as i32, - requested_partitions: partitions.iter() - .map(|p| PartitionRef { str: p.clone() }) - .collect(), - message: format!("Build request failed: {}", e), - }), - ); - - if let Err(e) = service.event_log.append_event(event).await { - error!("Failed to log failure event: {}", e); + if let Err(log_err) = orchestrator.complete_build(BuildResult::Failed { jobs_completed: 0, jobs_failed: 1 }).await { + error!("Failed to log failure event: {}", log_err); } Err(e) @@ -693,7 +703,7 @@ pub async fn list_partitions( let status_filter = params.get("status") .and_then(|s| match s.as_str() { "requested" => Some(PartitionStatus::PartitionRequested), - "scheduled" => Some(PartitionStatus::PartitionScheduled), + "analyzed" => Some(PartitionStatus::PartitionAnalyzed), "building" => Some(PartitionStatus::PartitionBuilding), "available" => Some(PartitionStatus::PartitionAvailable), "failed" => Some(PartitionStatus::PartitionFailed), @@ -776,4 +786,264 @@ pub async fn get_activity_summary( )) } } +} + +#[derive(Deserialize, JsonSchema)] +pub struct JobMetricsRequest { + pub label: String, +} + +pub async fn list_jobs( + State(service): State, + Query(params): Query>, +) -> Result, (StatusCode, Json)> { + let search_term = params.get("search").map(|s| s.to_lowercase()); + + // Debug: Let's see what's actually in the database + let debug_query = " + SELECT + je.job_label, + je.status, + COUNT(*) as count_for_this_status + FROM job_events je + JOIN build_events be ON je.event_id = be.event_id + WHERE je.job_label != '' + GROUP BY je.job_label, je.status + ORDER BY je.job_label, je.status"; + + // Log the debug results first + if let Ok(debug_result) = service.event_log.execute_query(debug_query).await { + for row in &debug_result.rows { + if row.len() >= 3 { + log::info!("Debug: job_label={}, status={}, count={}", row[0], row[1], row[2]); + } + } + } + + // Original query but let's see all statuses + let query = " + SELECT + je.job_label, + COUNT(CASE WHEN je.status IN ('3', '6') THEN 1 END) as completed_count, + COUNT(CASE WHEN je.status = '4' THEN 1 END) as failed_count, + COUNT(*) as total_count, + -- For now, skip duration calculation since we need start/end times + NULL as avg_duration_ms, + MAX(be.timestamp) as last_run, + GROUP_CONCAT(DISTINCT je.status) as all_statuses + FROM job_events je + JOIN build_events be ON je.event_id = be.event_id + WHERE je.job_label != '' + GROUP BY je.job_label + ORDER BY last_run DESC"; + + match service.event_log.execute_query(query).await { + Ok(result) => { + let mut jobs = Vec::new(); + + for row in result.rows { + if row.len() >= 7 { + let job_label = &row[0]; + + // Apply search filter if provided + if let Some(ref search) = search_term { + if !job_label.to_lowercase().contains(search) { + continue; + } + } + + let completed_count: u32 = row[1].parse().unwrap_or(0); + let failed_count: u32 = row[2].parse().unwrap_or(0); + let total_count: u32 = row[3].parse().unwrap_or(0); + let avg_duration_ms: Option = row[4].parse().ok(); + let last_run: Option = row[5].parse().ok(); + let all_statuses = &row[6]; + + // Log additional debug info + log::info!("Job: {}, completed: {}, failed: {}, total: {}, statuses: {}", + job_label, completed_count, failed_count, total_count, all_statuses); + + let success_rate = if total_count > 0 { + completed_count as f64 / total_count as f64 + } else { + 0.0 + }; + + jobs.push(JobSummary { + job_label: job_label.clone(), + success_rate, + avg_duration_ms, + recent_runs: total_count.min(50), // Limit to recent runs + last_run, + }); + } + } + + let total_count = jobs.len() as u32; + + Ok(Json(JobsListResponse { + jobs, + total_count, + })) + } + Err(e) => { + error!("Failed to list jobs: {}", e); + Err(( + StatusCode::INTERNAL_SERVER_ERROR, + Json(ErrorResponse { + error: format!("Failed to list jobs: {}", e), + }), + )) + } + } +} + +pub async fn get_job_metrics( + State(service): State, + Path(JobMetricsRequest { label }): Path, +) -> Result, (StatusCode, Json)> { + // Decode the base64-encoded job label + let decoded_label = match base64_url_decode(&label) { + Ok(decoded) => decoded, + Err(_) => { + return Err(( + StatusCode::BAD_REQUEST, + Json(ErrorResponse { + error: "Invalid job label encoding".to_string(), + }), + )); + } + }; + + log::info!("get_job_metrics: encoded='{}', decoded='{}'", label, decoded_label); + + // Get overall job metrics + let metrics_query = " + SELECT + COUNT(CASE WHEN je.status IN ('3', '6') THEN 1 END) as completed_count, + COUNT(*) as total_count, + -- Skip duration calculation for now + NULL as avg_duration_ms + FROM job_events je + JOIN build_events be ON je.event_id = be.event_id + WHERE je.job_label = ?"; + + let (success_rate, total_runs, avg_duration_ms) = match service.event_log.execute_query(&metrics_query.replace("?", &format!("'{}'", decoded_label))).await { + Ok(result) if !result.rows.is_empty() => { + let row = &result.rows[0]; + let completed_count: u32 = row[0].parse().unwrap_or(0); + let total_count: u32 = row[1].parse().unwrap_or(0); + let avg_duration: Option = row[2].parse().ok(); + + let success_rate = if total_count > 0 { + completed_count as f64 / total_count as f64 + } else { + 0.0 + }; + + (success_rate, total_count, avg_duration) + } + _ => (0.0, 0, None), + }; + + // Get recent runs + let recent_runs_query = " + SELECT DISTINCT + be.build_request_id, + je.target_partitions, + je.status, + be.timestamp, + (julianday('now') - julianday(be.timestamp/1000000000, 'unixepoch')) * 24 * 60 * 60 * 1000 as duration_ms + FROM job_events je + JOIN build_events be ON je.event_id = be.event_id + WHERE je.job_label = ? + ORDER BY be.timestamp DESC + LIMIT 50"; + + let recent_runs = match service.event_log.execute_query(&recent_runs_query.replace("?", &format!("'{}'", decoded_label))).await { + Ok(result) => { + result.rows.into_iter().map(|row| { + let build_request_id = row[0].clone(); + let partitions_json: String = row[1].clone(); + let status_code: String = row[2].clone(); + let started_at: i64 = row[3].parse().unwrap_or(0); + let duration_ms: Option = row[4].parse().ok(); + + let partitions: Vec = serde_json::from_str::>(&partitions_json) + .unwrap_or_default() + .into_iter() + .filter_map(|v| { + v.get("str").and_then(|s| s.as_str()).map(|s| s.to_string()) + }) + .collect(); + + let status = match status_code.as_str() { + "1" => "scheduled", + "2" => "running", + "3" => "completed", + "4" => "failed", + "5" => "cancelled", + _ => "unknown", + }; + + JobRunSummary { + build_request_id, + partitions, + status: status.to_string(), + duration_ms, + started_at, + } + }).collect() + } + Err(_) => Vec::new(), + }; + + // Get daily stats (simplified - just recent days) + let daily_stats_query = " + SELECT + date(be.timestamp/1000000000, 'unixepoch') as date, + COUNT(CASE WHEN je.status IN ('3', '6') THEN 1 END) as completed_count, + COUNT(*) as total_count, + -- Skip duration calculation for now + NULL as avg_duration_ms + FROM job_events je + JOIN build_events be ON je.event_id = be.event_id + WHERE je.job_label = ? + AND be.timestamp > (strftime('%s', 'now', '-30 days') * 1000000000) + GROUP BY date(be.timestamp/1000000000, 'unixepoch') + ORDER BY date DESC"; + + let daily_stats = match service.event_log.execute_query(&daily_stats_query.replace("?", &format!("'{}'", decoded_label))).await { + Ok(result) => { + result.rows.into_iter().map(|row| { + let date = row[0].clone(); + let completed_count: u32 = row[1].parse().unwrap_or(0); + let total_count: u32 = row[2].parse().unwrap_or(0); + let avg_duration: Option = row[3].parse().ok(); + + let success_rate = if total_count > 0 { + completed_count as f64 / total_count as f64 + } else { + 0.0 + }; + + JobDailyStats { + date, + success_rate, + avg_duration_ms: avg_duration, + total_runs: total_count, + } + }).collect() + } + Err(_) => Vec::new(), + }; + + Ok(Json(JobMetricsResponse { + job_label: decoded_label, + success_rate, + avg_duration_ms, + total_runs, + recent_runs, + daily_stats, + })) } \ No newline at end of file diff --git a/databuild/service/mod.rs b/databuild/service/mod.rs index aba31ac..595cead 100644 --- a/databuild/service/mod.rs +++ b/databuild/service/mod.rs @@ -141,6 +141,49 @@ pub struct ActivityResponse { pub graph_name: String, } +// Job-related request/response types +#[derive(Debug, Serialize, Deserialize, JsonSchema)] +pub struct JobsListResponse { + pub jobs: Vec, + pub total_count: u32, +} + +#[derive(Debug, Serialize, Deserialize, JsonSchema)] +pub struct JobSummary { + pub job_label: String, + pub success_rate: f64, + pub avg_duration_ms: Option, + pub recent_runs: u32, + pub last_run: Option, +} + +#[derive(Debug, Serialize, Deserialize, JsonSchema)] +pub struct JobMetricsResponse { + pub job_label: String, + pub success_rate: f64, + pub avg_duration_ms: Option, + pub total_runs: u32, + pub recent_runs: Vec, + pub daily_stats: Vec, +} + +#[derive(Debug, Serialize, Deserialize, JsonSchema)] +pub struct JobRunSummary { + pub build_request_id: String, + pub partitions: Vec, + pub status: String, + pub duration_ms: Option, + pub started_at: i64, +} + +#[derive(Debug, Serialize, Deserialize, JsonSchema)] +pub struct JobDailyStats { + pub date: String, + pub success_rate: f64, + pub avg_duration_ms: Option, + pub total_runs: u32, +} + impl BuildGraphService { pub async fn new( event_log_uri: &str, @@ -172,6 +215,8 @@ impl BuildGraphService { .api_route("/api/v1/partitions", get(handlers::list_partitions)) .api_route("/api/v1/partitions/:ref/status", get(handlers::get_partition_status)) .api_route("/api/v1/partitions/:ref/events", get(handlers::get_partition_events)) + .api_route("/api/v1/jobs", get(handlers::list_jobs)) + .api_route("/api/v1/jobs/:label", get(handlers::get_job_metrics)) .api_route("/api/v1/activity", get(handlers::get_activity_summary)) .api_route("/api/v1/analyze", post(handlers::analyze_build_graph)) .finish_api(&mut api); @@ -190,6 +235,8 @@ impl BuildGraphService { .api_route("/api/v1/partitions", get(handlers::list_partitions)) .api_route("/api/v1/partitions/:ref/status", get(handlers::get_partition_status)) .api_route("/api/v1/partitions/:ref/events", get(handlers::get_partition_events)) + .api_route("/api/v1/jobs", get(handlers::list_jobs)) + .api_route("/api/v1/jobs/:label", get(handlers::get_job_metrics)) .api_route("/api/v1/activity", get(handlers::get_activity_summary)) .api_route("/api/v1/analyze", post(handlers::analyze_build_graph)) .route("/api/v1/openapi.json", get(Self::openapi_spec)) @@ -299,6 +346,7 @@ impl BuildGraphService { BuildRequestStatus::BuildRequestUnknown => "unknown".to_string(), BuildRequestStatus::BuildRequestReceived => "received".to_string(), BuildRequestStatus::BuildRequestPlanning => "planning".to_string(), + BuildRequestStatus::BuildRequestAnalysisCompleted => "analysis_completed".to_string(), BuildRequestStatus::BuildRequestExecuting => "executing".to_string(), BuildRequestStatus::BuildRequestCompleted => "completed".to_string(), BuildRequestStatus::BuildRequestFailed => "failed".to_string(), @@ -310,7 +358,7 @@ impl BuildGraphService { match status { PartitionStatus::PartitionUnknown => "unknown".to_string(), PartitionStatus::PartitionRequested => "requested".to_string(), - PartitionStatus::PartitionScheduled => "scheduled".to_string(), + PartitionStatus::PartitionAnalyzed => "analyzed".to_string(), PartitionStatus::PartitionBuilding => "building".to_string(), PartitionStatus::PartitionAvailable => "available".to_string(), PartitionStatus::PartitionFailed => "failed".to_string(), diff --git a/docs/partition-delegation.md b/docs/partition-delegation.md index f90a783..95d1f4b 100644 --- a/docs/partition-delegation.md +++ b/docs/partition-delegation.md @@ -171,6 +171,20 @@ Success Rate = (completed_count) / (total_count) where completed includes both e ## Implementation Architecture +### Clean Separation of Concerns + +**Analysis Phase** (`databuild/graph/analyze.rs`): +- **Purpose**: Pure transformation of partition requests → job graph +- **Responsibility**: Determine what work would be needed (logical plan) +- **No delegation logic**: Creates jobs for all requested partitions +- **Output**: Complete job graph representing the logical work + +**Execution Phase** (`databuild/graph/execute.rs`): +- **Purpose**: Execute the job graph efficiently with delegation optimization +- **Responsibility**: Coordinate with concurrent builds and optimize execution +- **All delegation logic**: Handles both active and historical delegation +- **Event logging**: Emits all job lifecycle events including `JOB_SKIPPED` + ### Core Components 1. **Event Log Trait** (`databuild/event_log/mod.rs`): @@ -178,20 +192,25 @@ Success Rate = (completed_count) / (total_count) where completed includes both e - `get_build_request_for_available_partition()`: Find historical source - `get_active_builds_for_partition()`: Find concurrent builds -2. **Coordination Logic** (`databuild/graph/execute.rs`): - - `check_build_coordination()`: Implements delegation decision rules +2. **Execution Coordination Logic** (`databuild/graph/execute.rs`): + - `check_build_coordination()`: Implements all delegation decision rules - Multi-partition job evaluation logic - Event logging for delegation and job skipping + - Handles both active delegation (to running builds) and historical delegation (to completed builds) 3. **Dashboard Integration** (`databuild/service/handlers.rs`): - Success rate calculations including `JOB_SKIPPED` - Job metrics queries treating delegation as success - Proper handling of skipped jobs in analytics -### Delegation Decision Algorithm +### Delegation Decision Algorithm (Execution Phase) ```rust -for each job in execution_plan: +// Analysis phase creates complete job graph for all requested partitions +job_graph = analyze_partitions(requested_partitions) + +// Execution phase optimizes by delegating when possible +for each job in job_graph: available_partitions = [] needs_building = false @@ -200,14 +219,16 @@ for each job in execution_plan: source_build = get_build_request_for_available_partition(partition) available_partitions.push((partition, source_build)) elif partition has active_builds: - delegate_entire_job_to_active_build() - return + // Active delegation - delegate entire job to running build + log_delegation_events_to_active_build() + mark_job_as_succeeded() + continue_to_next_job() else: needs_building = true if !needs_building && available_partitions.len() == job.outputs.len(): // Historical delegation - all partitions available - log_delegation_events(available_partitions) + log_delegation_events(available_partitions) // Point to source builds log_job_skipped_event() mark_job_as_succeeded() elif needs_building: @@ -217,12 +238,14 @@ for each job in execution_plan: ## Benefits -1. **Efficiency**: Eliminates duplicate computation -2. **Consistency**: Single source of truth for each partition -3. **Traceability**: Complete audit trail via delegation events -4. **Accuracy**: Proper success rate calculation including delegated work -5. **Scalability**: Supports concurrent build requests without conflicts -6. **Transparency**: Clear visibility into why work was or wasn't performed +1. **Clean Architecture**: Clear separation between logical planning (analysis) and execution optimization +2. **Efficiency**: Eliminates duplicate computation through execution-time delegation +3. **Consistency**: Single source of truth for each partition +4. **Traceability**: Complete audit trail via delegation events with full build request traceability +5. **Accuracy**: Proper success rate calculation including delegated work +6. **Scalability**: Supports concurrent build requests without conflicts +7. **Testability**: Analysis phase becomes pure function (requests → job graph) +8. **Transparency**: Clear visibility into why work was or wasn't performed ## Future Enhancements diff --git a/examples/basic_graph/MODULE.bazel.lock b/examples/basic_graph/MODULE.bazel.lock index 7010dac..3f37460 100644 --- a/examples/basic_graph/MODULE.bazel.lock +++ b/examples/basic_graph/MODULE.bazel.lock @@ -3489,7 +3489,7 @@ "@@rules_rust+//crate_universe:extensions.bzl%crate": { "general": { "bzlTransitiveDigest": "7WZJd6ddUExnqTm+/VXRBmv6c4MCs9hJn2U/AZqeQvA=", - "usagesDigest": "k784W1PeHeDcEcg97064SpH8e2DyNdDHXgJPwiIEV28=", + "usagesDigest": "SvELD47AUgER5pfXXAet2HBxN6mq+A0dBjq0xU51Z4A=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": { @@ -3506,9 +3506,9 @@ "repoRuleId": "@@rules_rust+//crate_universe:extensions.bzl%_generate_repo", "attributes": { "contents": { - "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'databuild'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"aide-0.13.5\",\n actual = \"@crates__aide-0.13.5//:aide\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"aide\",\n actual = \"@crates__aide-0.13.5//:aide\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait-0.1.88\",\n actual = \"@crates__async-trait-0.1.88//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait\",\n actual = \"@crates__async-trait-0.1.88//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-0.7.9\",\n actual = \"@crates__axum-0.7.9//:axum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum\",\n actual = \"@crates__axum-0.7.9//:axum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-jsonschema-0.8.0\",\n actual = \"@crates__axum-jsonschema-0.8.0//:axum_jsonschema\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-jsonschema\",\n actual = \"@crates__axum-jsonschema-0.8.0//:axum_jsonschema\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap-4.5.41\",\n actual = \"@crates__clap-4.5.41//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap\",\n actual = \"@crates__clap-4.5.41//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"crossbeam-channel-0.5.15\",\n actual = \"@crates__crossbeam-channel-0.5.15//:crossbeam_channel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"crossbeam-channel\",\n actual = \"@crates__crossbeam-channel-0.5.15//:crossbeam_channel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hyper-1.6.0\",\n actual = \"@crates__hyper-1.6.0//:hyper\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hyper\",\n actual = \"@crates__hyper-1.6.0//:hyper\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"log-0.4.27\",\n actual = \"@crates__log-0.4.27//:log\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"log\",\n actual = \"@crates__log-0.4.27//:log\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num_cpus-1.17.0\",\n actual = \"@crates__num_cpus-1.17.0//:num_cpus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num_cpus\",\n actual = \"@crates__num_cpus-1.17.0//:num_cpus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-0.13.5\",\n actual = \"@crates__prost-0.13.5//:prost\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost\",\n actual = \"@crates__prost-0.13.5//:prost\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-build-0.13.5\",\n actual = \"@crates__prost-build-0.13.5//:prost_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-build\",\n actual = \"@crates__prost-build-0.13.5//:prost_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-types-0.13.5\",\n actual = \"@crates__prost-types-0.13.5//:prost_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-types\",\n actual = \"@crates__prost-types-0.13.5//:prost_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rusqlite-0.31.0\",\n actual = \"@crates__rusqlite-0.31.0//:rusqlite\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rusqlite\",\n actual = \"@crates__rusqlite-0.31.0//:rusqlite\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rust-embed-8.7.2\",\n actual = \"@crates__rust-embed-8.7.2//:rust_embed\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rust-embed\",\n actual = \"@crates__rust-embed-8.7.2//:rust_embed\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"schemars-0.8.22\",\n actual = \"@crates__schemars-0.8.22//:schemars\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"schemars\",\n actual = \"@crates__schemars-0.8.22//:schemars\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde-1.0.219\",\n actual = \"@crates__serde-1.0.219//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde\",\n actual = \"@crates__serde-1.0.219//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json-1.0.140\",\n actual = \"@crates__serde_json-1.0.140//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json\",\n actual = \"@crates__serde_json-1.0.140//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"simple_logger-4.3.3\",\n actual = \"@crates__simple_logger-4.3.3//:simple_logger\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"simple_logger\",\n actual = \"@crates__simple_logger-4.3.3//:simple_logger\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile-3.20.0\",\n actual = \"@crates__tempfile-3.20.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile\",\n actual = \"@crates__tempfile-3.20.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-1.46.1\",\n actual = \"@crates__tokio-1.46.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio\",\n actual = \"@crates__tokio-1.46.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-0.4.13\",\n actual = \"@crates__tower-0.4.13//:tower\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower\",\n actual = \"@crates__tower-0.4.13//:tower\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-http-0.5.2\",\n actual = \"@crates__tower-http-0.5.2//:tower_http\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-http\",\n actual = \"@crates__tower-http-0.5.2//:tower_http\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid-1.17.0\",\n actual = \"@crates__uuid-1.17.0//:uuid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid\",\n actual = \"@crates__uuid-1.17.0//:uuid\",\n tags = [\"manual\"],\n)\n", + "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'databuild'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"aide-0.13.5\",\n actual = \"@crates__aide-0.13.5//:aide\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"aide\",\n actual = \"@crates__aide-0.13.5//:aide\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait-0.1.88\",\n actual = \"@crates__async-trait-0.1.88//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait\",\n actual = \"@crates__async-trait-0.1.88//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-0.7.9\",\n actual = \"@crates__axum-0.7.9//:axum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum\",\n actual = \"@crates__axum-0.7.9//:axum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-jsonschema-0.8.0\",\n actual = \"@crates__axum-jsonschema-0.8.0//:axum_jsonschema\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-jsonschema\",\n actual = \"@crates__axum-jsonschema-0.8.0//:axum_jsonschema\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap-4.5.41\",\n actual = \"@crates__clap-4.5.41//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap\",\n actual = \"@crates__clap-4.5.41//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"crossbeam-channel-0.5.15\",\n actual = \"@crates__crossbeam-channel-0.5.15//:crossbeam_channel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"crossbeam-channel\",\n actual = \"@crates__crossbeam-channel-0.5.15//:crossbeam_channel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hyper-1.6.0\",\n actual = \"@crates__hyper-1.6.0//:hyper\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hyper\",\n actual = \"@crates__hyper-1.6.0//:hyper\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"log-0.4.27\",\n actual = \"@crates__log-0.4.27//:log\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"log\",\n actual = \"@crates__log-0.4.27//:log\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num_cpus-1.17.0\",\n actual = \"@crates__num_cpus-1.17.0//:num_cpus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num_cpus\",\n actual = \"@crates__num_cpus-1.17.0//:num_cpus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-0.13.5\",\n actual = \"@crates__prost-0.13.5//:prost\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost\",\n actual = \"@crates__prost-0.13.5//:prost\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-build-0.13.5\",\n actual = \"@crates__prost-build-0.13.5//:prost_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-build\",\n actual = \"@crates__prost-build-0.13.5//:prost_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-types-0.13.5\",\n actual = \"@crates__prost-types-0.13.5//:prost_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-types\",\n actual = \"@crates__prost-types-0.13.5//:prost_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rusqlite-0.31.0\",\n actual = \"@crates__rusqlite-0.31.0//:rusqlite\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rusqlite\",\n actual = \"@crates__rusqlite-0.31.0//:rusqlite\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rust-embed-8.7.2\",\n actual = \"@crates__rust-embed-8.7.2//:rust_embed\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rust-embed\",\n actual = \"@crates__rust-embed-8.7.2//:rust_embed\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"schemars-0.8.22\",\n actual = \"@crates__schemars-0.8.22//:schemars\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"schemars\",\n actual = \"@crates__schemars-0.8.22//:schemars\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde-1.0.219\",\n actual = \"@crates__serde-1.0.219//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde\",\n actual = \"@crates__serde-1.0.219//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json-1.0.140\",\n actual = \"@crates__serde_json-1.0.140//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json\",\n actual = \"@crates__serde_json-1.0.140//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"simple_logger-4.3.3\",\n actual = \"@crates__simple_logger-4.3.3//:simple_logger\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"simple_logger\",\n actual = \"@crates__simple_logger-4.3.3//:simple_logger\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile-3.20.0\",\n actual = \"@crates__tempfile-3.20.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile\",\n actual = \"@crates__tempfile-3.20.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"thiserror-1.0.69\",\n actual = \"@crates__thiserror-1.0.69//:thiserror\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"thiserror\",\n actual = \"@crates__thiserror-1.0.69//:thiserror\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-1.46.1\",\n actual = \"@crates__tokio-1.46.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio\",\n actual = \"@crates__tokio-1.46.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-0.4.13\",\n actual = \"@crates__tower-0.4.13//:tower\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower\",\n actual = \"@crates__tower-0.4.13//:tower\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-http-0.5.2\",\n actual = \"@crates__tower-http-0.5.2//:tower_http\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-http\",\n actual = \"@crates__tower-http-0.5.2//:tower_http\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid-1.17.0\",\n actual = \"@crates__uuid-1.17.0//:uuid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid\",\n actual = \"@crates__uuid-1.17.0//:uuid\",\n tags = [\"manual\"],\n)\n", "alias_rules.bzl": "\"\"\"Alias that transitions its target to `compilation_mode=opt`. Use `transition_alias=\"opt\"` to enable.\"\"\"\n\nload(\"@rules_cc//cc:defs.bzl\", \"CcInfo\")\nload(\"@rules_rust//rust:rust_common.bzl\", \"COMMON_PROVIDERS\")\n\ndef _transition_alias_impl(ctx):\n # `ctx.attr.actual` is a list of 1 item due to the transition\n providers = [ctx.attr.actual[0][provider] for provider in COMMON_PROVIDERS]\n if CcInfo in ctx.attr.actual[0]:\n providers.append(ctx.attr.actual[0][CcInfo])\n return providers\n\ndef _change_compilation_mode(compilation_mode):\n def _change_compilation_mode_impl(_settings, _attr):\n return {\n \"//command_line_option:compilation_mode\": compilation_mode,\n }\n\n return transition(\n implementation = _change_compilation_mode_impl,\n inputs = [],\n outputs = [\n \"//command_line_option:compilation_mode\",\n ],\n )\n\ndef _transition_alias_rule(compilation_mode):\n return rule(\n implementation = _transition_alias_impl,\n provides = COMMON_PROVIDERS,\n attrs = {\n \"actual\": attr.label(\n mandatory = True,\n doc = \"`rust_library()` target to transition to `compilation_mode=opt`.\",\n providers = COMMON_PROVIDERS,\n cfg = _change_compilation_mode(compilation_mode),\n ),\n \"_allowlist_function_transition\": attr.label(\n default = \"@bazel_tools//tools/allowlists/function_transition_allowlist\",\n ),\n },\n doc = \"Transitions a Rust library crate to the `compilation_mode=opt`.\",\n )\n\ntransition_alias_dbg = _transition_alias_rule(\"dbg\")\ntransition_alias_fastbuild = _transition_alias_rule(\"fastbuild\")\ntransition_alias_opt = _transition_alias_rule(\"opt\")\n", - "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'databuild'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"new_git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe/private:local_crate_mirror.bzl\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS AND ALIASES\n###############################################################################\n\n_NORMAL_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"aide\": Label(\"@crates//:aide-0.13.5\"),\n \"axum\": Label(\"@crates//:axum-0.7.9\"),\n \"axum-jsonschema\": Label(\"@crates//:axum-jsonschema-0.8.0\"),\n \"clap\": Label(\"@crates//:clap-4.5.41\"),\n \"crossbeam-channel\": Label(\"@crates//:crossbeam-channel-0.5.15\"),\n \"hyper\": Label(\"@crates//:hyper-1.6.0\"),\n \"log\": Label(\"@crates//:log-0.4.27\"),\n \"num_cpus\": Label(\"@crates//:num_cpus-1.17.0\"),\n \"prost\": Label(\"@crates//:prost-0.13.5\"),\n \"prost-build\": Label(\"@crates//:prost-build-0.13.5\"),\n \"prost-types\": Label(\"@crates//:prost-types-0.13.5\"),\n \"rusqlite\": Label(\"@crates//:rusqlite-0.31.0\"),\n \"rust-embed\": Label(\"@crates//:rust-embed-8.7.2\"),\n \"schemars\": Label(\"@crates//:schemars-0.8.22\"),\n \"serde\": Label(\"@crates//:serde-1.0.219\"),\n \"serde_json\": Label(\"@crates//:serde_json-1.0.140\"),\n \"simple_logger\": Label(\"@crates//:simple_logger-4.3.3\"),\n \"tempfile\": Label(\"@crates//:tempfile-3.20.0\"),\n \"tokio\": Label(\"@crates//:tokio-1.46.1\"),\n \"tower\": Label(\"@crates//:tower-0.4.13\"),\n \"tower-http\": Label(\"@crates//:tower-http-0.5.2\"),\n \"uuid\": Label(\"@crates//:uuid-1.17.0\"),\n },\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"async-trait\": Label(\"@crates//:async-trait-0.1.88\"),\n },\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"aarch64-linux-android\": [],\n \"aarch64-pc-windows-gnullvm\": [],\n \"aarch64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(any(target_arch = \\\"x86_64\\\", target_arch = \\\"arm64ec\\\"), target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(all(any(target_os = \\\"android\\\", target_os = \\\"linux\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), not(any(all(target_os = \\\"linux\\\", target_env = \\\"\\\"), getrandom_backend = \\\"custom\\\", getrandom_backend = \\\"linux_raw\\\", getrandom_backend = \\\"rdrand\\\", getrandom_backend = \\\"rndr\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"linux\\\"))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_vendor = \\\"apple\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(all(target_arch = \\\"loongarch64\\\", target_os = \\\"linux\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"wasi\\\", target_env = \\\"p2\\\"))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(all(target_os = \\\"uefi\\\", getrandom_backend = \\\"efi_rng\\\"))\": [],\n \"cfg(all(tokio_uring, target_os = \\\"linux\\\"))\": [],\n \"cfg(any())\": [],\n \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any(target_os = \\\"dragonfly\\\", target_os = \\\"freebsd\\\", target_os = \\\"hurd\\\", target_os = \\\"illumos\\\", target_os = \\\"cygwin\\\", all(target_os = \\\"horizon\\\", target_arch = \\\"arm\\\")))\": [],\n \"cfg(any(target_os = \\\"haiku\\\", target_os = \\\"redox\\\", target_os = \\\"nto\\\", target_os = \\\"aix\\\"))\": [],\n \"cfg(any(target_os = \\\"ios\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\", target_os = \\\"tvos\\\"))\": [],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"ios\\\", target_os = \\\"freebsd\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"openbsd\\\", target_os = \\\"vita\\\", target_os = \\\"emscripten\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(unix, target_os = \\\"wasi\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any(windows, target_os = \\\"cygwin\\\"))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(not(all(target_arch = \\\"arm\\\", target_os = \\\"none\\\")))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(all(windows, target_env = \\\"msvc\\\", not(target_vendor = \\\"uwp\\\"))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(windows))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(target_arch = \\\"wasm32\\\")\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(target_os = \\\"hermit\\\")\": [],\n \"cfg(target_os = \\\"netbsd\\\")\": [],\n \"cfg(target_os = \\\"redox\\\")\": [],\n \"cfg(target_os = \\\"solaris\\\")\": [],\n \"cfg(target_os = \\\"vxworks\\\")\": [],\n \"cfg(target_os = \\\"wasi\\\")\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(tokio_taskdump)\": [],\n \"cfg(unix)\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(windows)\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"i686-pc-windows-gnullvm\": [],\n \"wasm32-unknown-unknown\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"wasm32-wasip1\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"x86_64-pc-windows-gnullvm\": [],\n \"x86_64-pc-windows-msvc\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"x86_64-unknown-nixos-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n http_archive,\n name = \"crates__addr2line-0.24.2\",\n sha256 = \"dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/addr2line/0.24.2/download\"],\n strip_prefix = \"addr2line-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.addr2line-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__adler2-2.0.1\",\n sha256 = \"320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/adler2/2.0.1/download\"],\n strip_prefix = \"adler2-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.adler2-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ahash-0.8.12\",\n sha256 = \"5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ahash/0.8.12/download\"],\n strip_prefix = \"ahash-0.8.12\",\n build_file = Label(\"@crates//crates:BUILD.ahash-0.8.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aho-corasick-1.1.3\",\n sha256 = \"8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aho-corasick/1.1.3/download\"],\n strip_prefix = \"aho-corasick-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.aho-corasick-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aide-0.13.5\",\n sha256 = \"5678d2978845ddb4bd736a026f467dd652d831e9e6254b0e41b07f7ee7523309\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aide/0.13.5/download\"],\n strip_prefix = \"aide-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.aide-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstream-0.6.19\",\n sha256 = \"301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstream/0.6.19/download\"],\n strip_prefix = \"anstream-0.6.19\",\n build_file = Label(\"@crates//crates:BUILD.anstream-0.6.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-1.0.11\",\n sha256 = \"862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle/1.0.11/download\"],\n strip_prefix = \"anstyle-1.0.11\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-1.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-parse-0.2.7\",\n sha256 = \"4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-parse/0.2.7/download\"],\n strip_prefix = \"anstyle-parse-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-parse-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-query-1.1.3\",\n sha256 = \"6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-query/1.1.3/download\"],\n strip_prefix = \"anstyle-query-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-query-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-wincon-3.0.9\",\n sha256 = \"403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.9/download\"],\n strip_prefix = \"anstyle-wincon-3.0.9\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-wincon-3.0.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anyhow-1.0.98\",\n sha256 = \"e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anyhow/1.0.98/download\"],\n strip_prefix = \"anyhow-1.0.98\",\n build_file = Label(\"@crates//crates:BUILD.anyhow-1.0.98.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-trait-0.1.88\",\n sha256 = \"e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-trait/0.1.88/download\"],\n strip_prefix = \"async-trait-0.1.88\",\n build_file = Label(\"@crates//crates:BUILD.async-trait-0.1.88.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atomic-waker-1.1.2\",\n sha256 = \"1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atomic-waker/1.1.2/download\"],\n strip_prefix = \"atomic-waker-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.atomic-waker-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__autocfg-1.5.0\",\n sha256 = \"c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/autocfg/1.5.0/download\"],\n strip_prefix = \"autocfg-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.autocfg-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-0.7.9\",\n sha256 = \"edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum/0.7.9/download\"],\n strip_prefix = \"axum-0.7.9\",\n build_file = Label(\"@crates//crates:BUILD.axum-0.7.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-core-0.4.5\",\n sha256 = \"09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum-core/0.4.5/download\"],\n strip_prefix = \"axum-core-0.4.5\",\n build_file = Label(\"@crates//crates:BUILD.axum-core-0.4.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-jsonschema-0.8.0\",\n sha256 = \"fcffe29ca1b60172349fea781ec34441d598809bd227ccbb5bf5dc2879cd9c78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum-jsonschema/0.8.0/download\"],\n strip_prefix = \"axum-jsonschema-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.axum-jsonschema-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__backtrace-0.3.75\",\n sha256 = \"6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/backtrace/0.3.75/download\"],\n strip_prefix = \"backtrace-0.3.75\",\n build_file = Label(\"@crates//crates:BUILD.backtrace-0.3.75.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-0.21.7\",\n sha256 = \"9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64/0.21.7/download\"],\n strip_prefix = \"base64-0.21.7\",\n build_file = Label(\"@crates//crates:BUILD.base64-0.21.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-set-0.5.3\",\n sha256 = \"0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-set/0.5.3/download\"],\n strip_prefix = \"bit-set-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.bit-set-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-vec-0.6.3\",\n sha256 = \"349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-vec/0.6.3/download\"],\n strip_prefix = \"bit-vec-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.bit-vec-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-2.9.1\",\n sha256 = \"1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/2.9.1/download\"],\n strip_prefix = \"bitflags-2.9.1\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-2.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-buffer-0.10.4\",\n sha256 = \"3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-buffer/0.10.4/download\"],\n strip_prefix = \"block-buffer-0.10.4\",\n build_file = Label(\"@crates//crates:BUILD.block-buffer-0.10.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bumpalo-3.19.0\",\n sha256 = \"46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bumpalo/3.19.0/download\"],\n strip_prefix = \"bumpalo-3.19.0\",\n build_file = Label(\"@crates//crates:BUILD.bumpalo-3.19.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecount-0.6.9\",\n sha256 = \"175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecount/0.6.9/download\"],\n strip_prefix = \"bytecount-0.6.9\",\n build_file = Label(\"@crates//crates:BUILD.bytecount-0.6.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytes-1.10.1\",\n sha256 = \"d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytes/1.10.1/download\"],\n strip_prefix = \"bytes-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.bytes-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cc-1.2.29\",\n sha256 = \"5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cc/1.2.29/download\"],\n strip_prefix = \"cc-1.2.29\",\n build_file = Label(\"@crates//crates:BUILD.cc-1.2.29.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-if-1.0.1\",\n sha256 = \"9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-if/1.0.1/download\"],\n strip_prefix = \"cfg-if-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.cfg-if-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap-4.5.41\",\n sha256 = \"be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap/4.5.41/download\"],\n strip_prefix = \"clap-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_builder-4.5.41\",\n sha256 = \"707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_builder/4.5.41/download\"],\n strip_prefix = \"clap_builder-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap_builder-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_derive-4.5.41\",\n sha256 = \"ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_derive/4.5.41/download\"],\n strip_prefix = \"clap_derive-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap_derive-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_lex-0.7.5\",\n sha256 = \"b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_lex/0.7.5/download\"],\n strip_prefix = \"clap_lex-0.7.5\",\n build_file = Label(\"@crates//crates:BUILD.clap_lex-0.7.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colorchoice-1.0.4\",\n sha256 = \"b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colorchoice/1.0.4/download\"],\n strip_prefix = \"colorchoice-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.colorchoice-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colored-2.2.0\",\n sha256 = \"117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colored/2.2.0/download\"],\n strip_prefix = \"colored-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.colored-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cpufeatures-0.2.17\",\n sha256 = \"59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cpufeatures/0.2.17/download\"],\n strip_prefix = \"cpufeatures-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.cpufeatures-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-channel-0.5.15\",\n sha256 = \"82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-channel/0.5.15/download\"],\n strip_prefix = \"crossbeam-channel-0.5.15\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-channel-0.5.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-utils-0.8.21\",\n sha256 = \"d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-utils/0.8.21/download\"],\n strip_prefix = \"crossbeam-utils-0.8.21\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-utils-0.8.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-common-0.1.6\",\n sha256 = \"1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-common/0.1.6/download\"],\n strip_prefix = \"crypto-common-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.crypto-common-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__deranged-0.4.0\",\n sha256 = \"9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/deranged/0.4.0/download\"],\n strip_prefix = \"deranged-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.deranged-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__digest-0.10.7\",\n sha256 = \"9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/digest/0.10.7/download\"],\n strip_prefix = \"digest-0.10.7\",\n build_file = Label(\"@crates//crates:BUILD.digest-0.10.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__displaydoc-0.2.5\",\n sha256 = \"97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/displaydoc/0.2.5/download\"],\n strip_prefix = \"displaydoc-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.displaydoc-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dyn-clone-1.0.19\",\n sha256 = \"1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dyn-clone/1.0.19/download\"],\n strip_prefix = \"dyn-clone-1.0.19\",\n build_file = Label(\"@crates//crates:BUILD.dyn-clone-1.0.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__either-1.15.0\",\n sha256 = \"48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/either/1.15.0/download\"],\n strip_prefix = \"either-1.15.0\",\n build_file = Label(\"@crates//crates:BUILD.either-1.15.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__equivalent-1.0.2\",\n sha256 = \"877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/equivalent/1.0.2/download\"],\n strip_prefix = \"equivalent-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.equivalent-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__errno-0.3.13\",\n sha256 = \"778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/errno/0.3.13/download\"],\n strip_prefix = \"errno-0.3.13\",\n build_file = Label(\"@crates//crates:BUILD.errno-0.3.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fallible-iterator-0.3.0\",\n sha256 = \"2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fallible-iterator/0.3.0/download\"],\n strip_prefix = \"fallible-iterator-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fallible-iterator-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fallible-streaming-iterator-0.1.9\",\n sha256 = \"7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fallible-streaming-iterator/0.1.9/download\"],\n strip_prefix = \"fallible-streaming-iterator-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.fallible-streaming-iterator-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.11.0\",\n sha256 = \"b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.11.0/download\"],\n strip_prefix = \"fancy-regex-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fastrand-2.3.0\",\n sha256 = \"37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fastrand/2.3.0/download\"],\n strip_prefix = \"fastrand-2.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fastrand-2.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fixedbitset-0.5.7\",\n sha256 = \"1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fixedbitset/0.5.7/download\"],\n strip_prefix = \"fixedbitset-0.5.7\",\n build_file = Label(\"@crates//crates:BUILD.fixedbitset-0.5.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fnv-1.0.7\",\n sha256 = \"3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fnv/1.0.7/download\"],\n strip_prefix = \"fnv-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.fnv-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__form_urlencoded-1.2.1\",\n sha256 = \"e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/form_urlencoded/1.2.1/download\"],\n strip_prefix = \"form_urlencoded-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.form_urlencoded-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fraction-0.13.1\",\n sha256 = \"3027ae1df8d41b4bed2241c8fdad4acc1e7af60c8e17743534b545e77182d678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fraction/0.13.1/download\"],\n strip_prefix = \"fraction-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.fraction-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-0.3.31\",\n sha256 = \"65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures/0.3.31/download\"],\n strip_prefix = \"futures-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-channel-0.3.31\",\n sha256 = \"2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-channel/0.3.31/download\"],\n strip_prefix = \"futures-channel-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-channel-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-core-0.3.31\",\n sha256 = \"05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-core/0.3.31/download\"],\n strip_prefix = \"futures-core-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-core-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-executor-0.3.31\",\n sha256 = \"1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-executor/0.3.31/download\"],\n strip_prefix = \"futures-executor-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-executor-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-io-0.3.31\",\n sha256 = \"9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-io/0.3.31/download\"],\n strip_prefix = \"futures-io-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-io-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-macro-0.3.31\",\n sha256 = \"162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-macro/0.3.31/download\"],\n strip_prefix = \"futures-macro-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-macro-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-sink-0.3.31\",\n sha256 = \"e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-sink/0.3.31/download\"],\n strip_prefix = \"futures-sink-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-sink-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-task-0.3.31\",\n sha256 = \"f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-task/0.3.31/download\"],\n strip_prefix = \"futures-task-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-task-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-util-0.3.31\",\n sha256 = \"9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-util/0.3.31/download\"],\n strip_prefix = \"futures-util-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-util-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__generic-array-0.14.7\",\n sha256 = \"85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/generic-array/0.14.7/download\"],\n strip_prefix = \"generic-array-0.14.7\",\n build_file = Label(\"@crates//crates:BUILD.generic-array-0.14.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.2.16\",\n sha256 = \"335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.2.16/download\"],\n strip_prefix = \"getrandom-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.3.3\",\n sha256 = \"26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.3.3/download\"],\n strip_prefix = \"getrandom-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gimli-0.31.1\",\n sha256 = \"07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gimli/0.31.1/download\"],\n strip_prefix = \"gimli-0.31.1\",\n build_file = Label(\"@crates//crates:BUILD.gimli-0.31.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__h2-0.4.11\",\n sha256 = \"17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/h2/0.4.11/download\"],\n strip_prefix = \"h2-0.4.11\",\n build_file = Label(\"@crates//crates:BUILD.h2-0.4.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.14.5\",\n sha256 = \"e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.14.5/download\"],\n strip_prefix = \"hashbrown-0.14.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.14.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.15.4\",\n sha256 = \"5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.15.4/download\"],\n strip_prefix = \"hashbrown-0.15.4\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.15.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashlink-0.9.1\",\n sha256 = \"6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashlink/0.9.1/download\"],\n strip_prefix = \"hashlink-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.hashlink-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__heck-0.5.0\",\n sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n strip_prefix = \"heck-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.heck-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hermit-abi-0.5.2\",\n sha256 = \"fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hermit-abi/0.5.2/download\"],\n strip_prefix = \"hermit-abi-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.hermit-abi-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-1.3.1\",\n sha256 = \"f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http/1.3.1/download\"],\n strip_prefix = \"http-1.3.1\",\n build_file = Label(\"@crates//crates:BUILD.http-1.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-1.0.1\",\n sha256 = \"1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body/1.0.1/download\"],\n strip_prefix = \"http-body-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.http-body-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-util-0.1.3\",\n sha256 = \"b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body-util/0.1.3/download\"],\n strip_prefix = \"http-body-util-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.http-body-util-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__httparse-1.10.1\",\n sha256 = \"6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/httparse/1.10.1/download\"],\n strip_prefix = \"httparse-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.httparse-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__httpdate-1.0.3\",\n sha256 = \"df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/httpdate/1.0.3/download\"],\n strip_prefix = \"httpdate-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.httpdate-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-1.6.0\",\n sha256 = \"cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper/1.6.0/download\"],\n strip_prefix = \"hyper-1.6.0\",\n build_file = Label(\"@crates//crates:BUILD.hyper-1.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-util-0.1.15\",\n sha256 = \"7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper-util/0.1.15/download\"],\n strip_prefix = \"hyper-util-0.1.15\",\n build_file = Label(\"@crates//crates:BUILD.hyper-util-0.1.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collections-2.0.0\",\n sha256 = \"200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collections/2.0.0/download\"],\n strip_prefix = \"icu_collections-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collections-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_core-2.0.0\",\n sha256 = \"0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_core/2.0.0/download\"],\n strip_prefix = \"icu_locale_core-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_core-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer-2.0.0\",\n sha256 = \"436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer/2.0.0/download\"],\n strip_prefix = \"icu_normalizer-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer_data-2.0.0\",\n sha256 = \"00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer_data/2.0.0/download\"],\n strip_prefix = \"icu_normalizer_data-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer_data-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties-2.0.1\",\n sha256 = \"016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties/2.0.1/download\"],\n strip_prefix = \"icu_properties-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties_data-2.0.1\",\n sha256 = \"298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties_data/2.0.1/download\"],\n strip_prefix = \"icu_properties_data-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties_data-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_provider-2.0.0\",\n sha256 = \"03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_provider/2.0.0/download\"],\n strip_prefix = \"icu_provider-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_provider-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna-1.0.3\",\n sha256 = \"686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna/1.0.3/download\"],\n strip_prefix = \"idna-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.idna-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna_adapter-1.2.1\",\n sha256 = \"3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna_adapter/1.2.1/download\"],\n strip_prefix = \"idna_adapter-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.idna_adapter-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indexmap-2.10.0\",\n sha256 = \"fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indexmap/2.10.0/download\"],\n strip_prefix = \"indexmap-2.10.0\",\n build_file = Label(\"@crates//crates:BUILD.indexmap-2.10.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__io-uring-0.7.8\",\n sha256 = \"b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/io-uring/0.7.8/download\"],\n strip_prefix = \"io-uring-0.7.8\",\n build_file = Label(\"@crates//crates:BUILD.io-uring-0.7.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__is_terminal_polyfill-1.70.1\",\n sha256 = \"7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.1/download\"],\n strip_prefix = \"is_terminal_polyfill-1.70.1\",\n build_file = Label(\"@crates//crates:BUILD.is_terminal_polyfill-1.70.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__iso8601-0.6.3\",\n sha256 = \"e1082f0c48f143442a1ac6122f67e360ceee130b967af4d50996e5154a45df46\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/iso8601/0.6.3/download\"],\n strip_prefix = \"iso8601-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.iso8601-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.12.1\",\n sha256 = \"ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.12.1/download\"],\n strip_prefix = \"itertools-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.14.0\",\n sha256 = \"2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.14.0/download\"],\n strip_prefix = \"itertools-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itoa-1.0.15\",\n sha256 = \"4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itoa/1.0.15/download\"],\n strip_prefix = \"itoa-1.0.15\",\n build_file = Label(\"@crates//crates:BUILD.itoa-1.0.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__js-sys-0.3.77\",\n sha256 = \"1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/js-sys/0.3.77/download\"],\n strip_prefix = \"js-sys-0.3.77\",\n build_file = Label(\"@crates//crates:BUILD.js-sys-0.3.77.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jsonschema-0.17.1\",\n sha256 = \"2a071f4f7efc9a9118dfb627a0a94ef247986e1ab8606a4c806ae2b3aa3b6978\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jsonschema/0.17.1/download\"],\n strip_prefix = \"jsonschema-0.17.1\",\n build_file = Label(\"@crates//crates:BUILD.jsonschema-0.17.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lazy_static-1.5.0\",\n sha256 = \"bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lazy_static/1.5.0/download\"],\n strip_prefix = \"lazy_static-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.lazy_static-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libc-0.2.174\",\n sha256 = \"1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libc/0.2.174/download\"],\n strip_prefix = \"libc-0.2.174\",\n build_file = Label(\"@crates//crates:BUILD.libc-0.2.174.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libsqlite3-sys-0.28.0\",\n sha256 = \"0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libsqlite3-sys/0.28.0/download\"],\n strip_prefix = \"libsqlite3-sys-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.libsqlite3-sys-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.9.4\",\n sha256 = \"cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.9.4/download\"],\n strip_prefix = \"linux-raw-sys-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__litemap-0.8.0\",\n sha256 = \"241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/litemap/0.8.0/download\"],\n strip_prefix = \"litemap-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.litemap-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lock_api-0.4.13\",\n sha256 = \"96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lock_api/0.4.13/download\"],\n strip_prefix = \"lock_api-0.4.13\",\n build_file = Label(\"@crates//crates:BUILD.lock_api-0.4.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__log-0.4.27\",\n sha256 = \"13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/log/0.4.27/download\"],\n strip_prefix = \"log-0.4.27\",\n build_file = Label(\"@crates//crates:BUILD.log-0.4.27.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__matchit-0.7.3\",\n sha256 = \"0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/matchit/0.7.3/download\"],\n strip_prefix = \"matchit-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.matchit-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memchr-2.7.5\",\n sha256 = \"32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.7.5/download\"],\n strip_prefix = \"memchr-2.7.5\",\n build_file = Label(\"@crates//crates:BUILD.memchr-2.7.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mime-0.3.17\",\n sha256 = \"6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mime/0.3.17/download\"],\n strip_prefix = \"mime-0.3.17\",\n build_file = Label(\"@crates//crates:BUILD.mime-0.3.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__miniz_oxide-0.8.9\",\n sha256 = \"1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/miniz_oxide/0.8.9/download\"],\n strip_prefix = \"miniz_oxide-0.8.9\",\n build_file = Label(\"@crates//crates:BUILD.miniz_oxide-0.8.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mio-1.0.4\",\n sha256 = \"78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mio/1.0.4/download\"],\n strip_prefix = \"mio-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.mio-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__multimap-0.10.1\",\n sha256 = \"1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/multimap/0.10.1/download\"],\n strip_prefix = \"multimap-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.multimap-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nom-8.0.0\",\n sha256 = \"df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nom/8.0.0/download\"],\n strip_prefix = \"nom-8.0.0\",\n build_file = Label(\"@crates//crates:BUILD.nom-8.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-0.4.3\",\n sha256 = \"35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num/0.4.3/download\"],\n strip_prefix = \"num-0.4.3\",\n build_file = Label(\"@crates//crates:BUILD.num-0.4.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-bigint-0.4.6\",\n sha256 = \"a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-bigint/0.4.6/download\"],\n strip_prefix = \"num-bigint-0.4.6\",\n build_file = Label(\"@crates//crates:BUILD.num-bigint-0.4.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-cmp-0.1.0\",\n sha256 = \"63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-cmp/0.1.0/download\"],\n strip_prefix = \"num-cmp-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.num-cmp-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-complex-0.4.6\",\n sha256 = \"73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-complex/0.4.6/download\"],\n strip_prefix = \"num-complex-0.4.6\",\n build_file = Label(\"@crates//crates:BUILD.num-complex-0.4.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-conv-0.1.0\",\n sha256 = \"51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-conv/0.1.0/download\"],\n strip_prefix = \"num-conv-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.num-conv-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-integer-0.1.46\",\n sha256 = \"7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-integer/0.1.46/download\"],\n strip_prefix = \"num-integer-0.1.46\",\n build_file = Label(\"@crates//crates:BUILD.num-integer-0.1.46.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-iter-0.1.45\",\n sha256 = \"1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-iter/0.1.45/download\"],\n strip_prefix = \"num-iter-0.1.45\",\n build_file = Label(\"@crates//crates:BUILD.num-iter-0.1.45.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-rational-0.4.2\",\n sha256 = \"f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-rational/0.4.2/download\"],\n strip_prefix = \"num-rational-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.num-rational-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-traits-0.2.19\",\n sha256 = \"071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-traits/0.2.19/download\"],\n strip_prefix = \"num-traits-0.2.19\",\n build_file = Label(\"@crates//crates:BUILD.num-traits-0.2.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num_cpus-1.17.0\",\n sha256 = \"91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num_cpus/1.17.0/download\"],\n strip_prefix = \"num_cpus-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.num_cpus-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num_threads-0.1.7\",\n sha256 = \"5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num_threads/0.1.7/download\"],\n strip_prefix = \"num_threads-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.num_threads-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__object-0.36.7\",\n sha256 = \"62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/object/0.36.7/download\"],\n strip_prefix = \"object-0.36.7\",\n build_file = Label(\"@crates//crates:BUILD.object-0.36.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell-1.21.3\",\n sha256 = \"42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell/1.21.3/download\"],\n strip_prefix = \"once_cell-1.21.3\",\n build_file = Label(\"@crates//crates:BUILD.once_cell-1.21.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell_polyfill-1.70.1\",\n sha256 = \"a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.1/download\"],\n strip_prefix = \"once_cell_polyfill-1.70.1\",\n build_file = Label(\"@crates//crates:BUILD.once_cell_polyfill-1.70.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot-0.12.4\",\n sha256 = \"70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot/0.12.4/download\"],\n strip_prefix = \"parking_lot-0.12.4\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot-0.12.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot_core-0.9.11\",\n sha256 = \"bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot_core/0.9.11/download\"],\n strip_prefix = \"parking_lot_core-0.9.11\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot_core-0.9.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__percent-encoding-2.3.1\",\n sha256 = \"e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/percent-encoding/2.3.1/download\"],\n strip_prefix = \"percent-encoding-2.3.1\",\n build_file = Label(\"@crates//crates:BUILD.percent-encoding-2.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__petgraph-0.7.1\",\n sha256 = \"3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/petgraph/0.7.1/download\"],\n strip_prefix = \"petgraph-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.petgraph-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-project-lite-0.2.16\",\n sha256 = \"3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-project-lite/0.2.16/download\"],\n strip_prefix = \"pin-project-lite-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.pin-project-lite-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-utils-0.1.0\",\n sha256 = \"8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-utils/0.1.0/download\"],\n strip_prefix = \"pin-utils-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.pin-utils-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pkg-config-0.3.32\",\n sha256 = \"7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pkg-config/0.3.32/download\"],\n strip_prefix = \"pkg-config-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.pkg-config-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__potential_utf-0.1.2\",\n sha256 = \"e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/potential_utf/0.1.2/download\"],\n strip_prefix = \"potential_utf-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.potential_utf-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__powerfmt-0.2.0\",\n sha256 = \"439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/powerfmt/0.2.0/download\"],\n strip_prefix = \"powerfmt-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.powerfmt-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prettyplease-0.2.35\",\n sha256 = \"061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prettyplease/0.2.35/download\"],\n strip_prefix = \"prettyplease-0.2.35\",\n build_file = Label(\"@crates//crates:BUILD.prettyplease-0.2.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro2-1.0.95\",\n sha256 = \"02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.95/download\"],\n strip_prefix = \"proc-macro2-1.0.95\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro2-1.0.95.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-0.13.5\",\n sha256 = \"2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost/0.13.5/download\"],\n strip_prefix = \"prost-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-build-0.13.5\",\n sha256 = \"be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-build/0.13.5/download\"],\n strip_prefix = \"prost-build-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-build-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-derive-0.13.5\",\n sha256 = \"8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-derive/0.13.5/download\"],\n strip_prefix = \"prost-derive-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-derive-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-types-0.13.5\",\n sha256 = \"52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-types/0.13.5/download\"],\n strip_prefix = \"prost-types-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-types-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quote-1.0.40\",\n sha256 = \"1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.40/download\"],\n strip_prefix = \"quote-1.0.40\",\n build_file = Label(\"@crates//crates:BUILD.quote-1.0.40.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-5.3.0\",\n sha256 = \"69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/5.3.0/download\"],\n strip_prefix = \"r-efi-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__redox_syscall-0.5.13\",\n sha256 = \"0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/redox_syscall/0.5.13/download\"],\n strip_prefix = \"redox_syscall-0.5.13\",\n build_file = Label(\"@crates//crates:BUILD.redox_syscall-0.5.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-1.11.1\",\n sha256 = \"b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex/1.11.1/download\"],\n strip_prefix = \"regex-1.11.1\",\n build_file = Label(\"@crates//crates:BUILD.regex-1.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-automata-0.4.9\",\n sha256 = \"809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-automata/0.4.9/download\"],\n strip_prefix = \"regex-automata-0.4.9\",\n build_file = Label(\"@crates//crates:BUILD.regex-automata-0.4.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-syntax-0.8.5\",\n sha256 = \"2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-syntax/0.8.5/download\"],\n strip_prefix = \"regex-syntax-0.8.5\",\n build_file = Label(\"@crates//crates:BUILD.regex-syntax-0.8.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rusqlite-0.31.0\",\n sha256 = \"b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rusqlite/0.31.0/download\"],\n strip_prefix = \"rusqlite-0.31.0\",\n build_file = Label(\"@crates//crates:BUILD.rusqlite-0.31.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-8.7.2\",\n sha256 = \"025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed/8.7.2/download\"],\n strip_prefix = \"rust-embed-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-impl-8.7.2\",\n sha256 = \"6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed-impl/8.7.2/download\"],\n strip_prefix = \"rust-embed-impl-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-impl-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-utils-8.7.2\",\n sha256 = \"f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed-utils/8.7.2/download\"],\n strip_prefix = \"rust-embed-utils-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-utils-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-demangle-0.1.25\",\n sha256 = \"989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-demangle/0.1.25/download\"],\n strip_prefix = \"rustc-demangle-0.1.25\",\n build_file = Label(\"@crates//crates:BUILD.rustc-demangle-0.1.25.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-1.0.7\",\n sha256 = \"c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/1.0.7/download\"],\n strip_prefix = \"rustix-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.rustix-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustversion-1.0.21\",\n sha256 = \"8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustversion/1.0.21/download\"],\n strip_prefix = \"rustversion-1.0.21\",\n build_file = Label(\"@crates//crates:BUILD.rustversion-1.0.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ryu-1.0.20\",\n sha256 = \"28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ryu/1.0.20/download\"],\n strip_prefix = \"ryu-1.0.20\",\n build_file = Label(\"@crates//crates:BUILD.ryu-1.0.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__same-file-1.0.6\",\n sha256 = \"93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/same-file/1.0.6/download\"],\n strip_prefix = \"same-file-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.same-file-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__schemars-0.8.22\",\n sha256 = \"3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/schemars/0.8.22/download\"],\n strip_prefix = \"schemars-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.schemars-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__schemars_derive-0.8.22\",\n sha256 = \"32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/schemars_derive/0.8.22/download\"],\n strip_prefix = \"schemars_derive-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.schemars_derive-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__scopeguard-1.2.0\",\n sha256 = \"94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/scopeguard/1.2.0/download\"],\n strip_prefix = \"scopeguard-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.scopeguard-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde-1.0.219\",\n sha256 = \"5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde/1.0.219/download\"],\n strip_prefix = \"serde-1.0.219\",\n build_file = Label(\"@crates//crates:BUILD.serde-1.0.219.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive-1.0.219\",\n sha256 = \"5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive/1.0.219/download\"],\n strip_prefix = \"serde_derive-1.0.219\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive-1.0.219.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive_internals-0.29.1\",\n sha256 = \"18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive_internals/0.29.1/download\"],\n strip_prefix = \"serde_derive_internals-0.29.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive_internals-0.29.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_json-1.0.140\",\n sha256 = \"20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_json/1.0.140/download\"],\n strip_prefix = \"serde_json-1.0.140\",\n build_file = Label(\"@crates//crates:BUILD.serde_json-1.0.140.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_path_to_error-0.1.17\",\n sha256 = \"59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_path_to_error/0.1.17/download\"],\n strip_prefix = \"serde_path_to_error-0.1.17\",\n build_file = Label(\"@crates//crates:BUILD.serde_path_to_error-0.1.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_qs-0.13.0\",\n sha256 = \"cd34f36fe4c5ba9654417139a9b3a20d2e1de6012ee678ad14d240c22c78d8d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_qs/0.13.0/download\"],\n strip_prefix = \"serde_qs-0.13.0\",\n build_file = Label(\"@crates//crates:BUILD.serde_qs-0.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_urlencoded-0.7.1\",\n sha256 = \"d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_urlencoded/0.7.1/download\"],\n strip_prefix = \"serde_urlencoded-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_urlencoded-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha2-0.10.9\",\n sha256 = \"a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha2/0.10.9/download\"],\n strip_prefix = \"sha2-0.10.9\",\n build_file = Label(\"@crates//crates:BUILD.sha2-0.10.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-1.3.0\",\n sha256 = \"0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/1.3.0/download\"],\n strip_prefix = \"shlex-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.shlex-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simple_logger-4.3.3\",\n sha256 = \"8e7e46c8c90251d47d08b28b8a419ffb4aede0f87c2eea95e17d1d5bacbf3ef1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simple_logger/4.3.3/download\"],\n strip_prefix = \"simple_logger-4.3.3\",\n build_file = Label(\"@crates//crates:BUILD.simple_logger-4.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__slab-0.4.10\",\n sha256 = \"04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/slab/0.4.10/download\"],\n strip_prefix = \"slab-0.4.10\",\n build_file = Label(\"@crates//crates:BUILD.slab-0.4.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smallvec-1.15.1\",\n sha256 = \"67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smallvec/1.15.1/download\"],\n strip_prefix = \"smallvec-1.15.1\",\n build_file = Label(\"@crates//crates:BUILD.smallvec-1.15.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.5.10\",\n sha256 = \"e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.5.10/download\"],\n strip_prefix = \"socket2-0.5.10\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.5.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stable_deref_trait-1.2.0\",\n sha256 = \"a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stable_deref_trait/1.2.0/download\"],\n strip_prefix = \"stable_deref_trait-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.stable_deref_trait-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strsim-0.11.1\",\n sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n strip_prefix = \"strsim-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.strsim-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-2.0.104\",\n sha256 = \"17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.104/download\"],\n strip_prefix = \"syn-2.0.104\",\n build_file = Label(\"@crates//crates:BUILD.syn-2.0.104.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sync_wrapper-1.0.2\",\n sha256 = \"0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sync_wrapper/1.0.2/download\"],\n strip_prefix = \"sync_wrapper-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.sync_wrapper-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__synstructure-0.13.2\",\n sha256 = \"728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/synstructure/0.13.2/download\"],\n strip_prefix = \"synstructure-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.synstructure-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tempfile-3.20.0\",\n sha256 = \"e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tempfile/3.20.0/download\"],\n strip_prefix = \"tempfile-3.20.0\",\n build_file = Label(\"@crates//crates:BUILD.tempfile-3.20.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-1.0.69\",\n sha256 = \"b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/1.0.69/download\"],\n strip_prefix = \"thiserror-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-1.0.69\",\n sha256 = \"4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/1.0.69/download\"],\n strip_prefix = \"thiserror-impl-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-0.3.41\",\n sha256 = \"8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time/0.3.41/download\"],\n strip_prefix = \"time-0.3.41\",\n build_file = Label(\"@crates//crates:BUILD.time-0.3.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-core-0.1.4\",\n sha256 = \"c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-core/0.1.4/download\"],\n strip_prefix = \"time-core-0.1.4\",\n build_file = Label(\"@crates//crates:BUILD.time-core-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-macros-0.2.22\",\n sha256 = \"3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-macros/0.2.22/download\"],\n strip_prefix = \"time-macros-0.2.22\",\n build_file = Label(\"@crates//crates:BUILD.time-macros-0.2.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinystr-0.8.1\",\n sha256 = \"5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinystr/0.8.1/download\"],\n strip_prefix = \"tinystr-0.8.1\",\n build_file = Label(\"@crates//crates:BUILD.tinystr-0.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-1.46.1\",\n sha256 = \"0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio/1.46.1/download\"],\n strip_prefix = \"tokio-1.46.1\",\n build_file = Label(\"@crates//crates:BUILD.tokio-1.46.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-macros-2.5.0\",\n sha256 = \"6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-macros/2.5.0/download\"],\n strip_prefix = \"tokio-macros-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.tokio-macros-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-util-0.7.15\",\n sha256 = \"66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-util/0.7.15/download\"],\n strip_prefix = \"tokio-util-0.7.15\",\n build_file = Label(\"@crates//crates:BUILD.tokio-util-0.7.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-0.4.13\",\n sha256 = \"b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower/0.4.13/download\"],\n strip_prefix = \"tower-0.4.13\",\n build_file = Label(\"@crates//crates:BUILD.tower-0.4.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-0.5.2\",\n sha256 = \"d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower/0.5.2/download\"],\n strip_prefix = \"tower-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.tower-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-http-0.5.2\",\n sha256 = \"1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-http/0.5.2/download\"],\n strip_prefix = \"tower-http-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.tower-http-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-layer-0.3.3\",\n sha256 = \"121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-layer/0.3.3/download\"],\n strip_prefix = \"tower-layer-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-layer-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-service-0.3.3\",\n sha256 = \"8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-service/0.3.3/download\"],\n strip_prefix = \"tower-service-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-service-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-0.1.41\",\n sha256 = \"784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing/0.1.41/download\"],\n strip_prefix = \"tracing-0.1.41\",\n build_file = Label(\"@crates//crates:BUILD.tracing-0.1.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-attributes-0.1.30\",\n sha256 = \"81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-attributes/0.1.30/download\"],\n strip_prefix = \"tracing-attributes-0.1.30\",\n build_file = Label(\"@crates//crates:BUILD.tracing-attributes-0.1.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-core-0.1.34\",\n sha256 = \"b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-core/0.1.34/download\"],\n strip_prefix = \"tracing-core-0.1.34\",\n build_file = Label(\"@crates//crates:BUILD.tracing-core-0.1.34.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__try-lock-0.2.5\",\n sha256 = \"e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/try-lock/0.2.5/download\"],\n strip_prefix = \"try-lock-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.try-lock-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__typenum-1.18.0\",\n sha256 = \"1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/typenum/1.18.0/download\"],\n strip_prefix = \"typenum-1.18.0\",\n build_file = Label(\"@crates//crates:BUILD.typenum-1.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-ident-1.0.18\",\n sha256 = \"5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.18/download\"],\n strip_prefix = \"unicode-ident-1.0.18\",\n build_file = Label(\"@crates//crates:BUILD.unicode-ident-1.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__url-2.5.4\",\n sha256 = \"32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/url/2.5.4/download\"],\n strip_prefix = \"url-2.5.4\",\n build_file = Label(\"@crates//crates:BUILD.url-2.5.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8_iter-1.0.4\",\n sha256 = \"b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8_iter/1.0.4/download\"],\n strip_prefix = \"utf8_iter-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.utf8_iter-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8parse-0.2.2\",\n sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n strip_prefix = \"utf8parse-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.utf8parse-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uuid-1.17.0\",\n sha256 = \"3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uuid/1.17.0/download\"],\n strip_prefix = \"uuid-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.uuid-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__vcpkg-0.2.15\",\n sha256 = \"accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/vcpkg/0.2.15/download\"],\n strip_prefix = \"vcpkg-0.2.15\",\n build_file = Label(\"@crates//crates:BUILD.vcpkg-0.2.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__version_check-0.9.5\",\n sha256 = \"0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/version_check/0.9.5/download\"],\n strip_prefix = \"version_check-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.version_check-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__walkdir-2.5.0\",\n sha256 = \"29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/walkdir/2.5.0/download\"],\n strip_prefix = \"walkdir-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.walkdir-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__want-0.3.1\",\n sha256 = \"bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/want/0.3.1/download\"],\n strip_prefix = \"want-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.want-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.11.1-wasi-snapshot-preview1\",\n sha256 = \"ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download\"],\n strip_prefix = \"wasi-0.11.1+wasi-snapshot-preview1\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.14.2-wasi-0.2.4\",\n sha256 = \"9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.14.2+wasi-0.2.4/download\"],\n strip_prefix = \"wasi-0.14.2+wasi-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.14.2+wasi-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-0.2.100\",\n sha256 = \"1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-backend-0.2.100\",\n sha256 = \"2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-backend/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-backend-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-backend-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-0.2.100\",\n sha256 = \"7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-macro-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-support-0.2.100\",\n sha256 = \"8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-macro-support-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-support-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-shared-0.2.100\",\n sha256 = \"1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-shared/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-shared-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-shared-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-util-0.1.9\",\n sha256 = \"cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-util/0.1.9/download\"],\n strip_prefix = \"winapi-util-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.winapi-util-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.48.0\",\n sha256 = \"677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.48.0/download\"],\n strip_prefix = \"windows-sys-0.48.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.48.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.52.0\",\n sha256 = \"282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.52.0/download\"],\n strip_prefix = \"windows-sys-0.52.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.52.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.59.0\",\n sha256 = \"1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.59.0/download\"],\n strip_prefix = \"windows-sys-0.59.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.59.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.60.2\",\n sha256 = \"f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.60.2/download\"],\n strip_prefix = \"windows-sys-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.48.5\",\n sha256 = \"9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.48.5/download\"],\n strip_prefix = \"windows-targets-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.52.6\",\n sha256 = \"9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.52.6/download\"],\n strip_prefix = \"windows-targets-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.53.2\",\n sha256 = \"c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.53.2/download\"],\n strip_prefix = \"windows-targets-0.53.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.53.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.48.5\",\n sha256 = \"2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.52.6\",\n sha256 = \"32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.53.0\",\n sha256 = \"86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.48.5\",\n sha256 = \"dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.52.6\",\n sha256 = \"09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.53.0\",\n sha256 = \"c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.53.0/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.48.5\",\n sha256 = \"a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.48.5/download\"],\n strip_prefix = \"windows_i686_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.52.6\",\n sha256 = \"8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.53.0\",\n sha256 = \"c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.53.0/download\"],\n strip_prefix = \"windows_i686_gnu-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.52.6\",\n sha256 = \"0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.53.0\",\n sha256 = \"9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.48.5\",\n sha256 = \"8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.48.5/download\"],\n strip_prefix = \"windows_i686_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.52.6\",\n sha256 = \"240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.52.6/download\"],\n strip_prefix = \"windows_i686_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.53.0\",\n sha256 = \"581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.53.0/download\"],\n strip_prefix = \"windows_i686_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.48.5\",\n sha256 = \"53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.52.6\",\n sha256 = \"147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.53.0\",\n sha256 = \"2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.48.5\",\n sha256 = \"0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.52.6\",\n sha256 = \"24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.53.0\",\n sha256 = \"0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.48.5\",\n sha256 = \"ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.52.6\",\n sha256 = \"589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.53.0\",\n sha256 = \"271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-rt-0.39.0\",\n sha256 = \"6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen-rt/0.39.0/download\"],\n strip_prefix = \"wit-bindgen-rt-0.39.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-rt-0.39.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__writeable-0.6.1\",\n sha256 = \"ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/writeable/0.6.1/download\"],\n strip_prefix = \"writeable-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.writeable-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-0.8.0\",\n sha256 = \"5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke/0.8.0/download\"],\n strip_prefix = \"yoke-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.yoke-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-derive-0.8.0\",\n sha256 = \"38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke-derive/0.8.0/download\"],\n strip_prefix = \"yoke-derive-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.yoke-derive-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-0.8.26\",\n sha256 = \"1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy/0.8.26/download\"],\n strip_prefix = \"zerocopy-0.8.26\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-0.8.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-derive-0.8.26\",\n sha256 = \"9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy-derive/0.8.26/download\"],\n strip_prefix = \"zerocopy-derive-0.8.26\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-derive-0.8.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-0.1.6\",\n sha256 = \"50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom/0.1.6/download\"],\n strip_prefix = \"zerofrom-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-derive-0.1.6\",\n sha256 = \"d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom-derive/0.1.6/download\"],\n strip_prefix = \"zerofrom-derive-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-derive-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerotrie-0.2.2\",\n sha256 = \"36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerotrie/0.2.2/download\"],\n strip_prefix = \"zerotrie-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.zerotrie-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-0.11.2\",\n sha256 = \"4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec/0.11.2/download\"],\n strip_prefix = \"zerovec-0.11.2\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-0.11.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-derive-0.11.1\",\n sha256 = \"5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec-derive/0.11.1/download\"],\n strip_prefix = \"zerovec-derive-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-derive-0.11.1.bazel\"),\n )\n\n return [\n struct(repo=\"crates__aide-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__async-trait-0.1.88\", is_dev_dep = False),\n struct(repo=\"crates__axum-0.7.9\", is_dev_dep = False),\n struct(repo=\"crates__axum-jsonschema-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__clap-4.5.41\", is_dev_dep = False),\n struct(repo=\"crates__crossbeam-channel-0.5.15\", is_dev_dep = False),\n struct(repo=\"crates__hyper-1.6.0\", is_dev_dep = False),\n struct(repo=\"crates__log-0.4.27\", is_dev_dep = False),\n struct(repo=\"crates__num_cpus-1.17.0\", is_dev_dep = False),\n struct(repo=\"crates__prost-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__prost-build-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__prost-types-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__rusqlite-0.31.0\", is_dev_dep = False),\n struct(repo=\"crates__rust-embed-8.7.2\", is_dev_dep = False),\n struct(repo=\"crates__schemars-0.8.22\", is_dev_dep = False),\n struct(repo=\"crates__serde-1.0.219\", is_dev_dep = False),\n struct(repo=\"crates__serde_json-1.0.140\", is_dev_dep = False),\n struct(repo=\"crates__simple_logger-4.3.3\", is_dev_dep = False),\n struct(repo=\"crates__tempfile-3.20.0\", is_dev_dep = False),\n struct(repo=\"crates__tokio-1.46.1\", is_dev_dep = False),\n struct(repo=\"crates__tower-0.4.13\", is_dev_dep = False),\n struct(repo=\"crates__tower-http-0.5.2\", is_dev_dep = False),\n struct(repo=\"crates__uuid-1.17.0\", is_dev_dep = False),\n ]\n" + "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'databuild'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"new_git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe/private:local_crate_mirror.bzl\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS AND ALIASES\n###############################################################################\n\n_NORMAL_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"aide\": Label(\"@crates//:aide-0.13.5\"),\n \"axum\": Label(\"@crates//:axum-0.7.9\"),\n \"axum-jsonschema\": Label(\"@crates//:axum-jsonschema-0.8.0\"),\n \"clap\": Label(\"@crates//:clap-4.5.41\"),\n \"crossbeam-channel\": Label(\"@crates//:crossbeam-channel-0.5.15\"),\n \"hyper\": Label(\"@crates//:hyper-1.6.0\"),\n \"log\": Label(\"@crates//:log-0.4.27\"),\n \"num_cpus\": Label(\"@crates//:num_cpus-1.17.0\"),\n \"prost\": Label(\"@crates//:prost-0.13.5\"),\n \"prost-build\": Label(\"@crates//:prost-build-0.13.5\"),\n \"prost-types\": Label(\"@crates//:prost-types-0.13.5\"),\n \"rusqlite\": Label(\"@crates//:rusqlite-0.31.0\"),\n \"rust-embed\": Label(\"@crates//:rust-embed-8.7.2\"),\n \"schemars\": Label(\"@crates//:schemars-0.8.22\"),\n \"serde\": Label(\"@crates//:serde-1.0.219\"),\n \"serde_json\": Label(\"@crates//:serde_json-1.0.140\"),\n \"simple_logger\": Label(\"@crates//:simple_logger-4.3.3\"),\n \"tempfile\": Label(\"@crates//:tempfile-3.20.0\"),\n \"thiserror\": Label(\"@crates//:thiserror-1.0.69\"),\n \"tokio\": Label(\"@crates//:tokio-1.46.1\"),\n \"tower\": Label(\"@crates//:tower-0.4.13\"),\n \"tower-http\": Label(\"@crates//:tower-http-0.5.2\"),\n \"uuid\": Label(\"@crates//:uuid-1.17.0\"),\n },\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"async-trait\": Label(\"@crates//:async-trait-0.1.88\"),\n },\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"aarch64-linux-android\": [],\n \"aarch64-pc-windows-gnullvm\": [],\n \"aarch64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(any(target_arch = \\\"x86_64\\\", target_arch = \\\"arm64ec\\\"), target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(all(any(target_os = \\\"android\\\", target_os = \\\"linux\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), not(any(all(target_os = \\\"linux\\\", target_env = \\\"\\\"), getrandom_backend = \\\"custom\\\", getrandom_backend = \\\"linux_raw\\\", getrandom_backend = \\\"rdrand\\\", getrandom_backend = \\\"rndr\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"linux\\\"))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_vendor = \\\"apple\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(all(target_arch = \\\"loongarch64\\\", target_os = \\\"linux\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"wasi\\\", target_env = \\\"p2\\\"))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(all(target_os = \\\"uefi\\\", getrandom_backend = \\\"efi_rng\\\"))\": [],\n \"cfg(all(tokio_uring, target_os = \\\"linux\\\"))\": [],\n \"cfg(any())\": [],\n \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any(target_os = \\\"dragonfly\\\", target_os = \\\"freebsd\\\", target_os = \\\"hurd\\\", target_os = \\\"illumos\\\", target_os = \\\"cygwin\\\", all(target_os = \\\"horizon\\\", target_arch = \\\"arm\\\")))\": [],\n \"cfg(any(target_os = \\\"haiku\\\", target_os = \\\"redox\\\", target_os = \\\"nto\\\", target_os = \\\"aix\\\"))\": [],\n \"cfg(any(target_os = \\\"ios\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\", target_os = \\\"tvos\\\"))\": [],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"ios\\\", target_os = \\\"freebsd\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"openbsd\\\", target_os = \\\"vita\\\", target_os = \\\"emscripten\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(unix, target_os = \\\"wasi\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any(windows, target_os = \\\"cygwin\\\"))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(not(all(target_arch = \\\"arm\\\", target_os = \\\"none\\\")))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(all(windows, target_env = \\\"msvc\\\", not(target_vendor = \\\"uwp\\\"))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(windows))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(target_arch = \\\"wasm32\\\")\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(target_os = \\\"hermit\\\")\": [],\n \"cfg(target_os = \\\"netbsd\\\")\": [],\n \"cfg(target_os = \\\"redox\\\")\": [],\n \"cfg(target_os = \\\"solaris\\\")\": [],\n \"cfg(target_os = \\\"vxworks\\\")\": [],\n \"cfg(target_os = \\\"wasi\\\")\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(tokio_taskdump)\": [],\n \"cfg(unix)\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(windows)\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"i686-pc-windows-gnullvm\": [],\n \"wasm32-unknown-unknown\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"wasm32-wasip1\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"x86_64-pc-windows-gnullvm\": [],\n \"x86_64-pc-windows-msvc\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"x86_64-unknown-nixos-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n http_archive,\n name = \"crates__addr2line-0.24.2\",\n sha256 = \"dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/addr2line/0.24.2/download\"],\n strip_prefix = \"addr2line-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.addr2line-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__adler2-2.0.1\",\n sha256 = \"320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/adler2/2.0.1/download\"],\n strip_prefix = \"adler2-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.adler2-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ahash-0.8.12\",\n sha256 = \"5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ahash/0.8.12/download\"],\n strip_prefix = \"ahash-0.8.12\",\n build_file = Label(\"@crates//crates:BUILD.ahash-0.8.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aho-corasick-1.1.3\",\n sha256 = \"8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aho-corasick/1.1.3/download\"],\n strip_prefix = \"aho-corasick-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.aho-corasick-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aide-0.13.5\",\n sha256 = \"5678d2978845ddb4bd736a026f467dd652d831e9e6254b0e41b07f7ee7523309\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aide/0.13.5/download\"],\n strip_prefix = \"aide-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.aide-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstream-0.6.19\",\n sha256 = \"301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstream/0.6.19/download\"],\n strip_prefix = \"anstream-0.6.19\",\n build_file = Label(\"@crates//crates:BUILD.anstream-0.6.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-1.0.11\",\n sha256 = \"862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle/1.0.11/download\"],\n strip_prefix = \"anstyle-1.0.11\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-1.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-parse-0.2.7\",\n sha256 = \"4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-parse/0.2.7/download\"],\n strip_prefix = \"anstyle-parse-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-parse-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-query-1.1.3\",\n sha256 = \"6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-query/1.1.3/download\"],\n strip_prefix = \"anstyle-query-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-query-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-wincon-3.0.9\",\n sha256 = \"403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.9/download\"],\n strip_prefix = \"anstyle-wincon-3.0.9\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-wincon-3.0.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anyhow-1.0.98\",\n sha256 = \"e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anyhow/1.0.98/download\"],\n strip_prefix = \"anyhow-1.0.98\",\n build_file = Label(\"@crates//crates:BUILD.anyhow-1.0.98.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-trait-0.1.88\",\n sha256 = \"e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-trait/0.1.88/download\"],\n strip_prefix = \"async-trait-0.1.88\",\n build_file = Label(\"@crates//crates:BUILD.async-trait-0.1.88.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atomic-waker-1.1.2\",\n sha256 = \"1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atomic-waker/1.1.2/download\"],\n strip_prefix = \"atomic-waker-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.atomic-waker-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__autocfg-1.5.0\",\n sha256 = \"c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/autocfg/1.5.0/download\"],\n strip_prefix = \"autocfg-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.autocfg-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-0.7.9\",\n sha256 = \"edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum/0.7.9/download\"],\n strip_prefix = \"axum-0.7.9\",\n build_file = Label(\"@crates//crates:BUILD.axum-0.7.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-core-0.4.5\",\n sha256 = \"09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum-core/0.4.5/download\"],\n strip_prefix = \"axum-core-0.4.5\",\n build_file = Label(\"@crates//crates:BUILD.axum-core-0.4.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-jsonschema-0.8.0\",\n sha256 = \"fcffe29ca1b60172349fea781ec34441d598809bd227ccbb5bf5dc2879cd9c78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum-jsonschema/0.8.0/download\"],\n strip_prefix = \"axum-jsonschema-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.axum-jsonschema-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__backtrace-0.3.75\",\n sha256 = \"6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/backtrace/0.3.75/download\"],\n strip_prefix = \"backtrace-0.3.75\",\n build_file = Label(\"@crates//crates:BUILD.backtrace-0.3.75.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-0.21.7\",\n sha256 = \"9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64/0.21.7/download\"],\n strip_prefix = \"base64-0.21.7\",\n build_file = Label(\"@crates//crates:BUILD.base64-0.21.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-set-0.5.3\",\n sha256 = \"0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-set/0.5.3/download\"],\n strip_prefix = \"bit-set-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.bit-set-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-vec-0.6.3\",\n sha256 = \"349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-vec/0.6.3/download\"],\n strip_prefix = \"bit-vec-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.bit-vec-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-2.9.1\",\n sha256 = \"1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/2.9.1/download\"],\n strip_prefix = \"bitflags-2.9.1\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-2.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-buffer-0.10.4\",\n sha256 = \"3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-buffer/0.10.4/download\"],\n strip_prefix = \"block-buffer-0.10.4\",\n build_file = Label(\"@crates//crates:BUILD.block-buffer-0.10.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bumpalo-3.19.0\",\n sha256 = \"46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bumpalo/3.19.0/download\"],\n strip_prefix = \"bumpalo-3.19.0\",\n build_file = Label(\"@crates//crates:BUILD.bumpalo-3.19.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecount-0.6.9\",\n sha256 = \"175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecount/0.6.9/download\"],\n strip_prefix = \"bytecount-0.6.9\",\n build_file = Label(\"@crates//crates:BUILD.bytecount-0.6.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytes-1.10.1\",\n sha256 = \"d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytes/1.10.1/download\"],\n strip_prefix = \"bytes-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.bytes-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cc-1.2.29\",\n sha256 = \"5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cc/1.2.29/download\"],\n strip_prefix = \"cc-1.2.29\",\n build_file = Label(\"@crates//crates:BUILD.cc-1.2.29.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-if-1.0.1\",\n sha256 = \"9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-if/1.0.1/download\"],\n strip_prefix = \"cfg-if-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.cfg-if-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap-4.5.41\",\n sha256 = \"be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap/4.5.41/download\"],\n strip_prefix = \"clap-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_builder-4.5.41\",\n sha256 = \"707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_builder/4.5.41/download\"],\n strip_prefix = \"clap_builder-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap_builder-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_derive-4.5.41\",\n sha256 = \"ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_derive/4.5.41/download\"],\n strip_prefix = \"clap_derive-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap_derive-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_lex-0.7.5\",\n sha256 = \"b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_lex/0.7.5/download\"],\n strip_prefix = \"clap_lex-0.7.5\",\n build_file = Label(\"@crates//crates:BUILD.clap_lex-0.7.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colorchoice-1.0.4\",\n sha256 = \"b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colorchoice/1.0.4/download\"],\n strip_prefix = \"colorchoice-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.colorchoice-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colored-2.2.0\",\n sha256 = \"117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colored/2.2.0/download\"],\n strip_prefix = \"colored-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.colored-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cpufeatures-0.2.17\",\n sha256 = \"59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cpufeatures/0.2.17/download\"],\n strip_prefix = \"cpufeatures-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.cpufeatures-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-channel-0.5.15\",\n sha256 = \"82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-channel/0.5.15/download\"],\n strip_prefix = \"crossbeam-channel-0.5.15\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-channel-0.5.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-utils-0.8.21\",\n sha256 = \"d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-utils/0.8.21/download\"],\n strip_prefix = \"crossbeam-utils-0.8.21\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-utils-0.8.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-common-0.1.6\",\n sha256 = \"1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-common/0.1.6/download\"],\n strip_prefix = \"crypto-common-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.crypto-common-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__deranged-0.4.0\",\n sha256 = \"9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/deranged/0.4.0/download\"],\n strip_prefix = \"deranged-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.deranged-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__digest-0.10.7\",\n sha256 = \"9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/digest/0.10.7/download\"],\n strip_prefix = \"digest-0.10.7\",\n build_file = Label(\"@crates//crates:BUILD.digest-0.10.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__displaydoc-0.2.5\",\n sha256 = \"97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/displaydoc/0.2.5/download\"],\n strip_prefix = \"displaydoc-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.displaydoc-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dyn-clone-1.0.19\",\n sha256 = \"1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dyn-clone/1.0.19/download\"],\n strip_prefix = \"dyn-clone-1.0.19\",\n build_file = Label(\"@crates//crates:BUILD.dyn-clone-1.0.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__either-1.15.0\",\n sha256 = \"48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/either/1.15.0/download\"],\n strip_prefix = \"either-1.15.0\",\n build_file = Label(\"@crates//crates:BUILD.either-1.15.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__equivalent-1.0.2\",\n sha256 = \"877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/equivalent/1.0.2/download\"],\n strip_prefix = \"equivalent-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.equivalent-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__errno-0.3.13\",\n sha256 = \"778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/errno/0.3.13/download\"],\n strip_prefix = \"errno-0.3.13\",\n build_file = Label(\"@crates//crates:BUILD.errno-0.3.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fallible-iterator-0.3.0\",\n sha256 = \"2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fallible-iterator/0.3.0/download\"],\n strip_prefix = \"fallible-iterator-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fallible-iterator-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fallible-streaming-iterator-0.1.9\",\n sha256 = \"7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fallible-streaming-iterator/0.1.9/download\"],\n strip_prefix = \"fallible-streaming-iterator-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.fallible-streaming-iterator-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.11.0\",\n sha256 = \"b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.11.0/download\"],\n strip_prefix = \"fancy-regex-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fastrand-2.3.0\",\n sha256 = \"37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fastrand/2.3.0/download\"],\n strip_prefix = \"fastrand-2.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fastrand-2.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fixedbitset-0.5.7\",\n sha256 = \"1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fixedbitset/0.5.7/download\"],\n strip_prefix = \"fixedbitset-0.5.7\",\n build_file = Label(\"@crates//crates:BUILD.fixedbitset-0.5.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fnv-1.0.7\",\n sha256 = \"3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fnv/1.0.7/download\"],\n strip_prefix = \"fnv-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.fnv-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__form_urlencoded-1.2.1\",\n sha256 = \"e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/form_urlencoded/1.2.1/download\"],\n strip_prefix = \"form_urlencoded-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.form_urlencoded-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fraction-0.13.1\",\n sha256 = \"3027ae1df8d41b4bed2241c8fdad4acc1e7af60c8e17743534b545e77182d678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fraction/0.13.1/download\"],\n strip_prefix = \"fraction-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.fraction-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-0.3.31\",\n sha256 = \"65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures/0.3.31/download\"],\n strip_prefix = \"futures-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-channel-0.3.31\",\n sha256 = \"2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-channel/0.3.31/download\"],\n strip_prefix = \"futures-channel-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-channel-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-core-0.3.31\",\n sha256 = \"05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-core/0.3.31/download\"],\n strip_prefix = \"futures-core-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-core-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-executor-0.3.31\",\n sha256 = \"1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-executor/0.3.31/download\"],\n strip_prefix = \"futures-executor-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-executor-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-io-0.3.31\",\n sha256 = \"9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-io/0.3.31/download\"],\n strip_prefix = \"futures-io-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-io-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-macro-0.3.31\",\n sha256 = \"162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-macro/0.3.31/download\"],\n strip_prefix = \"futures-macro-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-macro-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-sink-0.3.31\",\n sha256 = \"e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-sink/0.3.31/download\"],\n strip_prefix = \"futures-sink-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-sink-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-task-0.3.31\",\n sha256 = \"f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-task/0.3.31/download\"],\n strip_prefix = \"futures-task-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-task-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-util-0.3.31\",\n sha256 = \"9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-util/0.3.31/download\"],\n strip_prefix = \"futures-util-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-util-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__generic-array-0.14.7\",\n sha256 = \"85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/generic-array/0.14.7/download\"],\n strip_prefix = \"generic-array-0.14.7\",\n build_file = Label(\"@crates//crates:BUILD.generic-array-0.14.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.2.16\",\n sha256 = \"335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.2.16/download\"],\n strip_prefix = \"getrandom-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.3.3\",\n sha256 = \"26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.3.3/download\"],\n strip_prefix = \"getrandom-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gimli-0.31.1\",\n sha256 = \"07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gimli/0.31.1/download\"],\n strip_prefix = \"gimli-0.31.1\",\n build_file = Label(\"@crates//crates:BUILD.gimli-0.31.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__h2-0.4.11\",\n sha256 = \"17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/h2/0.4.11/download\"],\n strip_prefix = \"h2-0.4.11\",\n build_file = Label(\"@crates//crates:BUILD.h2-0.4.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.14.5\",\n sha256 = \"e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.14.5/download\"],\n strip_prefix = \"hashbrown-0.14.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.14.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.15.4\",\n sha256 = \"5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.15.4/download\"],\n strip_prefix = \"hashbrown-0.15.4\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.15.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashlink-0.9.1\",\n sha256 = \"6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashlink/0.9.1/download\"],\n strip_prefix = \"hashlink-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.hashlink-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__heck-0.5.0\",\n sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n strip_prefix = \"heck-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.heck-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hermit-abi-0.5.2\",\n sha256 = \"fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hermit-abi/0.5.2/download\"],\n strip_prefix = \"hermit-abi-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.hermit-abi-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-1.3.1\",\n sha256 = \"f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http/1.3.1/download\"],\n strip_prefix = \"http-1.3.1\",\n build_file = Label(\"@crates//crates:BUILD.http-1.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-1.0.1\",\n sha256 = \"1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body/1.0.1/download\"],\n strip_prefix = \"http-body-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.http-body-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-util-0.1.3\",\n sha256 = \"b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body-util/0.1.3/download\"],\n strip_prefix = \"http-body-util-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.http-body-util-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__httparse-1.10.1\",\n sha256 = \"6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/httparse/1.10.1/download\"],\n strip_prefix = \"httparse-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.httparse-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__httpdate-1.0.3\",\n sha256 = \"df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/httpdate/1.0.3/download\"],\n strip_prefix = \"httpdate-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.httpdate-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-1.6.0\",\n sha256 = \"cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper/1.6.0/download\"],\n strip_prefix = \"hyper-1.6.0\",\n build_file = Label(\"@crates//crates:BUILD.hyper-1.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-util-0.1.15\",\n sha256 = \"7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper-util/0.1.15/download\"],\n strip_prefix = \"hyper-util-0.1.15\",\n build_file = Label(\"@crates//crates:BUILD.hyper-util-0.1.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collections-2.0.0\",\n sha256 = \"200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collections/2.0.0/download\"],\n strip_prefix = \"icu_collections-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collections-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_core-2.0.0\",\n sha256 = \"0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_core/2.0.0/download\"],\n strip_prefix = \"icu_locale_core-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_core-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer-2.0.0\",\n sha256 = \"436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer/2.0.0/download\"],\n strip_prefix = \"icu_normalizer-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer_data-2.0.0\",\n sha256 = \"00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer_data/2.0.0/download\"],\n strip_prefix = \"icu_normalizer_data-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer_data-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties-2.0.1\",\n sha256 = \"016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties/2.0.1/download\"],\n strip_prefix = \"icu_properties-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties_data-2.0.1\",\n sha256 = \"298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties_data/2.0.1/download\"],\n strip_prefix = \"icu_properties_data-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties_data-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_provider-2.0.0\",\n sha256 = \"03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_provider/2.0.0/download\"],\n strip_prefix = \"icu_provider-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_provider-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna-1.0.3\",\n sha256 = \"686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna/1.0.3/download\"],\n strip_prefix = \"idna-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.idna-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna_adapter-1.2.1\",\n sha256 = \"3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna_adapter/1.2.1/download\"],\n strip_prefix = \"idna_adapter-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.idna_adapter-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indexmap-2.10.0\",\n sha256 = \"fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indexmap/2.10.0/download\"],\n strip_prefix = \"indexmap-2.10.0\",\n build_file = Label(\"@crates//crates:BUILD.indexmap-2.10.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__io-uring-0.7.8\",\n sha256 = \"b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/io-uring/0.7.8/download\"],\n strip_prefix = \"io-uring-0.7.8\",\n build_file = Label(\"@crates//crates:BUILD.io-uring-0.7.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__is_terminal_polyfill-1.70.1\",\n sha256 = \"7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.1/download\"],\n strip_prefix = \"is_terminal_polyfill-1.70.1\",\n build_file = Label(\"@crates//crates:BUILD.is_terminal_polyfill-1.70.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__iso8601-0.6.3\",\n sha256 = \"e1082f0c48f143442a1ac6122f67e360ceee130b967af4d50996e5154a45df46\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/iso8601/0.6.3/download\"],\n strip_prefix = \"iso8601-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.iso8601-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.12.1\",\n sha256 = \"ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.12.1/download\"],\n strip_prefix = \"itertools-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.14.0\",\n sha256 = \"2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.14.0/download\"],\n strip_prefix = \"itertools-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itoa-1.0.15\",\n sha256 = \"4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itoa/1.0.15/download\"],\n strip_prefix = \"itoa-1.0.15\",\n build_file = Label(\"@crates//crates:BUILD.itoa-1.0.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__js-sys-0.3.77\",\n sha256 = \"1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/js-sys/0.3.77/download\"],\n strip_prefix = \"js-sys-0.3.77\",\n build_file = Label(\"@crates//crates:BUILD.js-sys-0.3.77.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jsonschema-0.17.1\",\n sha256 = \"2a071f4f7efc9a9118dfb627a0a94ef247986e1ab8606a4c806ae2b3aa3b6978\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jsonschema/0.17.1/download\"],\n strip_prefix = \"jsonschema-0.17.1\",\n build_file = Label(\"@crates//crates:BUILD.jsonschema-0.17.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lazy_static-1.5.0\",\n sha256 = \"bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lazy_static/1.5.0/download\"],\n strip_prefix = \"lazy_static-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.lazy_static-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libc-0.2.174\",\n sha256 = \"1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libc/0.2.174/download\"],\n strip_prefix = \"libc-0.2.174\",\n build_file = Label(\"@crates//crates:BUILD.libc-0.2.174.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libsqlite3-sys-0.28.0\",\n sha256 = \"0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libsqlite3-sys/0.28.0/download\"],\n strip_prefix = \"libsqlite3-sys-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.libsqlite3-sys-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.9.4\",\n sha256 = \"cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.9.4/download\"],\n strip_prefix = \"linux-raw-sys-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__litemap-0.8.0\",\n sha256 = \"241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/litemap/0.8.0/download\"],\n strip_prefix = \"litemap-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.litemap-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lock_api-0.4.13\",\n sha256 = \"96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lock_api/0.4.13/download\"],\n strip_prefix = \"lock_api-0.4.13\",\n build_file = Label(\"@crates//crates:BUILD.lock_api-0.4.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__log-0.4.27\",\n sha256 = \"13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/log/0.4.27/download\"],\n strip_prefix = \"log-0.4.27\",\n build_file = Label(\"@crates//crates:BUILD.log-0.4.27.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__matchit-0.7.3\",\n sha256 = \"0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/matchit/0.7.3/download\"],\n strip_prefix = \"matchit-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.matchit-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memchr-2.7.5\",\n sha256 = \"32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.7.5/download\"],\n strip_prefix = \"memchr-2.7.5\",\n build_file = Label(\"@crates//crates:BUILD.memchr-2.7.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mime-0.3.17\",\n sha256 = \"6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mime/0.3.17/download\"],\n strip_prefix = \"mime-0.3.17\",\n build_file = Label(\"@crates//crates:BUILD.mime-0.3.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__miniz_oxide-0.8.9\",\n sha256 = \"1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/miniz_oxide/0.8.9/download\"],\n strip_prefix = \"miniz_oxide-0.8.9\",\n build_file = Label(\"@crates//crates:BUILD.miniz_oxide-0.8.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mio-1.0.4\",\n sha256 = \"78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mio/1.0.4/download\"],\n strip_prefix = \"mio-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.mio-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__multimap-0.10.1\",\n sha256 = \"1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/multimap/0.10.1/download\"],\n strip_prefix = \"multimap-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.multimap-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nom-8.0.0\",\n sha256 = \"df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nom/8.0.0/download\"],\n strip_prefix = \"nom-8.0.0\",\n build_file = Label(\"@crates//crates:BUILD.nom-8.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-0.4.3\",\n sha256 = \"35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num/0.4.3/download\"],\n strip_prefix = \"num-0.4.3\",\n build_file = Label(\"@crates//crates:BUILD.num-0.4.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-bigint-0.4.6\",\n sha256 = \"a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-bigint/0.4.6/download\"],\n strip_prefix = \"num-bigint-0.4.6\",\n build_file = Label(\"@crates//crates:BUILD.num-bigint-0.4.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-cmp-0.1.0\",\n sha256 = \"63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-cmp/0.1.0/download\"],\n strip_prefix = \"num-cmp-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.num-cmp-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-complex-0.4.6\",\n sha256 = \"73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-complex/0.4.6/download\"],\n strip_prefix = \"num-complex-0.4.6\",\n build_file = Label(\"@crates//crates:BUILD.num-complex-0.4.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-conv-0.1.0\",\n sha256 = \"51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-conv/0.1.0/download\"],\n strip_prefix = \"num-conv-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.num-conv-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-integer-0.1.46\",\n sha256 = \"7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-integer/0.1.46/download\"],\n strip_prefix = \"num-integer-0.1.46\",\n build_file = Label(\"@crates//crates:BUILD.num-integer-0.1.46.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-iter-0.1.45\",\n sha256 = \"1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-iter/0.1.45/download\"],\n strip_prefix = \"num-iter-0.1.45\",\n build_file = Label(\"@crates//crates:BUILD.num-iter-0.1.45.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-rational-0.4.2\",\n sha256 = \"f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-rational/0.4.2/download\"],\n strip_prefix = \"num-rational-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.num-rational-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-traits-0.2.19\",\n sha256 = \"071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-traits/0.2.19/download\"],\n strip_prefix = \"num-traits-0.2.19\",\n build_file = Label(\"@crates//crates:BUILD.num-traits-0.2.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num_cpus-1.17.0\",\n sha256 = \"91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num_cpus/1.17.0/download\"],\n strip_prefix = \"num_cpus-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.num_cpus-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num_threads-0.1.7\",\n sha256 = \"5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num_threads/0.1.7/download\"],\n strip_prefix = \"num_threads-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.num_threads-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__object-0.36.7\",\n sha256 = \"62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/object/0.36.7/download\"],\n strip_prefix = \"object-0.36.7\",\n build_file = Label(\"@crates//crates:BUILD.object-0.36.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell-1.21.3\",\n sha256 = \"42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell/1.21.3/download\"],\n strip_prefix = \"once_cell-1.21.3\",\n build_file = Label(\"@crates//crates:BUILD.once_cell-1.21.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell_polyfill-1.70.1\",\n sha256 = \"a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.1/download\"],\n strip_prefix = \"once_cell_polyfill-1.70.1\",\n build_file = Label(\"@crates//crates:BUILD.once_cell_polyfill-1.70.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot-0.12.4\",\n sha256 = \"70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot/0.12.4/download\"],\n strip_prefix = \"parking_lot-0.12.4\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot-0.12.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot_core-0.9.11\",\n sha256 = \"bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot_core/0.9.11/download\"],\n strip_prefix = \"parking_lot_core-0.9.11\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot_core-0.9.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__percent-encoding-2.3.1\",\n sha256 = \"e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/percent-encoding/2.3.1/download\"],\n strip_prefix = \"percent-encoding-2.3.1\",\n build_file = Label(\"@crates//crates:BUILD.percent-encoding-2.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__petgraph-0.7.1\",\n sha256 = \"3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/petgraph/0.7.1/download\"],\n strip_prefix = \"petgraph-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.petgraph-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-project-lite-0.2.16\",\n sha256 = \"3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-project-lite/0.2.16/download\"],\n strip_prefix = \"pin-project-lite-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.pin-project-lite-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-utils-0.1.0\",\n sha256 = \"8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-utils/0.1.0/download\"],\n strip_prefix = \"pin-utils-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.pin-utils-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pkg-config-0.3.32\",\n sha256 = \"7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pkg-config/0.3.32/download\"],\n strip_prefix = \"pkg-config-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.pkg-config-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__potential_utf-0.1.2\",\n sha256 = \"e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/potential_utf/0.1.2/download\"],\n strip_prefix = \"potential_utf-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.potential_utf-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__powerfmt-0.2.0\",\n sha256 = \"439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/powerfmt/0.2.0/download\"],\n strip_prefix = \"powerfmt-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.powerfmt-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prettyplease-0.2.35\",\n sha256 = \"061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prettyplease/0.2.35/download\"],\n strip_prefix = \"prettyplease-0.2.35\",\n build_file = Label(\"@crates//crates:BUILD.prettyplease-0.2.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro2-1.0.95\",\n sha256 = \"02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.95/download\"],\n strip_prefix = \"proc-macro2-1.0.95\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro2-1.0.95.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-0.13.5\",\n sha256 = \"2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost/0.13.5/download\"],\n strip_prefix = \"prost-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-build-0.13.5\",\n sha256 = \"be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-build/0.13.5/download\"],\n strip_prefix = \"prost-build-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-build-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-derive-0.13.5\",\n sha256 = \"8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-derive/0.13.5/download\"],\n strip_prefix = \"prost-derive-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-derive-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-types-0.13.5\",\n sha256 = \"52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-types/0.13.5/download\"],\n strip_prefix = \"prost-types-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-types-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quote-1.0.40\",\n sha256 = \"1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.40/download\"],\n strip_prefix = \"quote-1.0.40\",\n build_file = Label(\"@crates//crates:BUILD.quote-1.0.40.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-5.3.0\",\n sha256 = \"69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/5.3.0/download\"],\n strip_prefix = \"r-efi-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__redox_syscall-0.5.13\",\n sha256 = \"0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/redox_syscall/0.5.13/download\"],\n strip_prefix = \"redox_syscall-0.5.13\",\n build_file = Label(\"@crates//crates:BUILD.redox_syscall-0.5.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-1.11.1\",\n sha256 = \"b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex/1.11.1/download\"],\n strip_prefix = \"regex-1.11.1\",\n build_file = Label(\"@crates//crates:BUILD.regex-1.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-automata-0.4.9\",\n sha256 = \"809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-automata/0.4.9/download\"],\n strip_prefix = \"regex-automata-0.4.9\",\n build_file = Label(\"@crates//crates:BUILD.regex-automata-0.4.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-syntax-0.8.5\",\n sha256 = \"2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-syntax/0.8.5/download\"],\n strip_prefix = \"regex-syntax-0.8.5\",\n build_file = Label(\"@crates//crates:BUILD.regex-syntax-0.8.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rusqlite-0.31.0\",\n sha256 = \"b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rusqlite/0.31.0/download\"],\n strip_prefix = \"rusqlite-0.31.0\",\n build_file = Label(\"@crates//crates:BUILD.rusqlite-0.31.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-8.7.2\",\n sha256 = \"025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed/8.7.2/download\"],\n strip_prefix = \"rust-embed-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-impl-8.7.2\",\n sha256 = \"6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed-impl/8.7.2/download\"],\n strip_prefix = \"rust-embed-impl-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-impl-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-utils-8.7.2\",\n sha256 = \"f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed-utils/8.7.2/download\"],\n strip_prefix = \"rust-embed-utils-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-utils-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-demangle-0.1.25\",\n sha256 = \"989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-demangle/0.1.25/download\"],\n strip_prefix = \"rustc-demangle-0.1.25\",\n build_file = Label(\"@crates//crates:BUILD.rustc-demangle-0.1.25.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-1.0.7\",\n sha256 = \"c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/1.0.7/download\"],\n strip_prefix = \"rustix-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.rustix-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustversion-1.0.21\",\n sha256 = \"8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustversion/1.0.21/download\"],\n strip_prefix = \"rustversion-1.0.21\",\n build_file = Label(\"@crates//crates:BUILD.rustversion-1.0.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ryu-1.0.20\",\n sha256 = \"28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ryu/1.0.20/download\"],\n strip_prefix = \"ryu-1.0.20\",\n build_file = Label(\"@crates//crates:BUILD.ryu-1.0.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__same-file-1.0.6\",\n sha256 = \"93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/same-file/1.0.6/download\"],\n strip_prefix = \"same-file-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.same-file-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__schemars-0.8.22\",\n sha256 = \"3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/schemars/0.8.22/download\"],\n strip_prefix = \"schemars-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.schemars-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__schemars_derive-0.8.22\",\n sha256 = \"32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/schemars_derive/0.8.22/download\"],\n strip_prefix = \"schemars_derive-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.schemars_derive-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__scopeguard-1.2.0\",\n sha256 = \"94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/scopeguard/1.2.0/download\"],\n strip_prefix = \"scopeguard-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.scopeguard-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde-1.0.219\",\n sha256 = \"5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde/1.0.219/download\"],\n strip_prefix = \"serde-1.0.219\",\n build_file = Label(\"@crates//crates:BUILD.serde-1.0.219.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive-1.0.219\",\n sha256 = \"5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive/1.0.219/download\"],\n strip_prefix = \"serde_derive-1.0.219\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive-1.0.219.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive_internals-0.29.1\",\n sha256 = \"18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive_internals/0.29.1/download\"],\n strip_prefix = \"serde_derive_internals-0.29.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive_internals-0.29.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_json-1.0.140\",\n sha256 = \"20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_json/1.0.140/download\"],\n strip_prefix = \"serde_json-1.0.140\",\n build_file = Label(\"@crates//crates:BUILD.serde_json-1.0.140.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_path_to_error-0.1.17\",\n sha256 = \"59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_path_to_error/0.1.17/download\"],\n strip_prefix = \"serde_path_to_error-0.1.17\",\n build_file = Label(\"@crates//crates:BUILD.serde_path_to_error-0.1.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_qs-0.13.0\",\n sha256 = \"cd34f36fe4c5ba9654417139a9b3a20d2e1de6012ee678ad14d240c22c78d8d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_qs/0.13.0/download\"],\n strip_prefix = \"serde_qs-0.13.0\",\n build_file = Label(\"@crates//crates:BUILD.serde_qs-0.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_urlencoded-0.7.1\",\n sha256 = \"d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_urlencoded/0.7.1/download\"],\n strip_prefix = \"serde_urlencoded-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_urlencoded-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha2-0.10.9\",\n sha256 = \"a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha2/0.10.9/download\"],\n strip_prefix = \"sha2-0.10.9\",\n build_file = Label(\"@crates//crates:BUILD.sha2-0.10.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-1.3.0\",\n sha256 = \"0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/1.3.0/download\"],\n strip_prefix = \"shlex-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.shlex-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simple_logger-4.3.3\",\n sha256 = \"8e7e46c8c90251d47d08b28b8a419ffb4aede0f87c2eea95e17d1d5bacbf3ef1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simple_logger/4.3.3/download\"],\n strip_prefix = \"simple_logger-4.3.3\",\n build_file = Label(\"@crates//crates:BUILD.simple_logger-4.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__slab-0.4.10\",\n sha256 = \"04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/slab/0.4.10/download\"],\n strip_prefix = \"slab-0.4.10\",\n build_file = Label(\"@crates//crates:BUILD.slab-0.4.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smallvec-1.15.1\",\n sha256 = \"67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smallvec/1.15.1/download\"],\n strip_prefix = \"smallvec-1.15.1\",\n build_file = Label(\"@crates//crates:BUILD.smallvec-1.15.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.5.10\",\n sha256 = \"e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.5.10/download\"],\n strip_prefix = \"socket2-0.5.10\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.5.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stable_deref_trait-1.2.0\",\n sha256 = \"a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stable_deref_trait/1.2.0/download\"],\n strip_prefix = \"stable_deref_trait-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.stable_deref_trait-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strsim-0.11.1\",\n sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n strip_prefix = \"strsim-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.strsim-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-2.0.104\",\n sha256 = \"17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.104/download\"],\n strip_prefix = \"syn-2.0.104\",\n build_file = Label(\"@crates//crates:BUILD.syn-2.0.104.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sync_wrapper-1.0.2\",\n sha256 = \"0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sync_wrapper/1.0.2/download\"],\n strip_prefix = \"sync_wrapper-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.sync_wrapper-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__synstructure-0.13.2\",\n sha256 = \"728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/synstructure/0.13.2/download\"],\n strip_prefix = \"synstructure-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.synstructure-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tempfile-3.20.0\",\n sha256 = \"e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tempfile/3.20.0/download\"],\n strip_prefix = \"tempfile-3.20.0\",\n build_file = Label(\"@crates//crates:BUILD.tempfile-3.20.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-1.0.69\",\n sha256 = \"b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/1.0.69/download\"],\n strip_prefix = \"thiserror-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-1.0.69\",\n sha256 = \"4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/1.0.69/download\"],\n strip_prefix = \"thiserror-impl-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-0.3.41\",\n sha256 = \"8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time/0.3.41/download\"],\n strip_prefix = \"time-0.3.41\",\n build_file = Label(\"@crates//crates:BUILD.time-0.3.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-core-0.1.4\",\n sha256 = \"c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-core/0.1.4/download\"],\n strip_prefix = \"time-core-0.1.4\",\n build_file = Label(\"@crates//crates:BUILD.time-core-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-macros-0.2.22\",\n sha256 = \"3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-macros/0.2.22/download\"],\n strip_prefix = \"time-macros-0.2.22\",\n build_file = Label(\"@crates//crates:BUILD.time-macros-0.2.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinystr-0.8.1\",\n sha256 = \"5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinystr/0.8.1/download\"],\n strip_prefix = \"tinystr-0.8.1\",\n build_file = Label(\"@crates//crates:BUILD.tinystr-0.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-1.46.1\",\n sha256 = \"0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio/1.46.1/download\"],\n strip_prefix = \"tokio-1.46.1\",\n build_file = Label(\"@crates//crates:BUILD.tokio-1.46.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-macros-2.5.0\",\n sha256 = \"6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-macros/2.5.0/download\"],\n strip_prefix = \"tokio-macros-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.tokio-macros-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-util-0.7.15\",\n sha256 = \"66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-util/0.7.15/download\"],\n strip_prefix = \"tokio-util-0.7.15\",\n build_file = Label(\"@crates//crates:BUILD.tokio-util-0.7.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-0.4.13\",\n sha256 = \"b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower/0.4.13/download\"],\n strip_prefix = \"tower-0.4.13\",\n build_file = Label(\"@crates//crates:BUILD.tower-0.4.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-0.5.2\",\n sha256 = \"d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower/0.5.2/download\"],\n strip_prefix = \"tower-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.tower-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-http-0.5.2\",\n sha256 = \"1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-http/0.5.2/download\"],\n strip_prefix = \"tower-http-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.tower-http-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-layer-0.3.3\",\n sha256 = \"121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-layer/0.3.3/download\"],\n strip_prefix = \"tower-layer-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-layer-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-service-0.3.3\",\n sha256 = \"8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-service/0.3.3/download\"],\n strip_prefix = \"tower-service-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-service-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-0.1.41\",\n sha256 = \"784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing/0.1.41/download\"],\n strip_prefix = \"tracing-0.1.41\",\n build_file = Label(\"@crates//crates:BUILD.tracing-0.1.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-attributes-0.1.30\",\n sha256 = \"81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-attributes/0.1.30/download\"],\n strip_prefix = \"tracing-attributes-0.1.30\",\n build_file = Label(\"@crates//crates:BUILD.tracing-attributes-0.1.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-core-0.1.34\",\n sha256 = \"b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-core/0.1.34/download\"],\n strip_prefix = \"tracing-core-0.1.34\",\n build_file = Label(\"@crates//crates:BUILD.tracing-core-0.1.34.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__try-lock-0.2.5\",\n sha256 = \"e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/try-lock/0.2.5/download\"],\n strip_prefix = \"try-lock-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.try-lock-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__typenum-1.18.0\",\n sha256 = \"1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/typenum/1.18.0/download\"],\n strip_prefix = \"typenum-1.18.0\",\n build_file = Label(\"@crates//crates:BUILD.typenum-1.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-ident-1.0.18\",\n sha256 = \"5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.18/download\"],\n strip_prefix = \"unicode-ident-1.0.18\",\n build_file = Label(\"@crates//crates:BUILD.unicode-ident-1.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__url-2.5.4\",\n sha256 = \"32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/url/2.5.4/download\"],\n strip_prefix = \"url-2.5.4\",\n build_file = Label(\"@crates//crates:BUILD.url-2.5.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8_iter-1.0.4\",\n sha256 = \"b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8_iter/1.0.4/download\"],\n strip_prefix = \"utf8_iter-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.utf8_iter-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8parse-0.2.2\",\n sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n strip_prefix = \"utf8parse-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.utf8parse-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uuid-1.17.0\",\n sha256 = \"3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uuid/1.17.0/download\"],\n strip_prefix = \"uuid-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.uuid-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__vcpkg-0.2.15\",\n sha256 = \"accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/vcpkg/0.2.15/download\"],\n strip_prefix = \"vcpkg-0.2.15\",\n build_file = Label(\"@crates//crates:BUILD.vcpkg-0.2.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__version_check-0.9.5\",\n sha256 = \"0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/version_check/0.9.5/download\"],\n strip_prefix = \"version_check-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.version_check-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__walkdir-2.5.0\",\n sha256 = \"29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/walkdir/2.5.0/download\"],\n strip_prefix = \"walkdir-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.walkdir-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__want-0.3.1\",\n sha256 = \"bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/want/0.3.1/download\"],\n strip_prefix = \"want-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.want-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.11.1-wasi-snapshot-preview1\",\n sha256 = \"ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download\"],\n strip_prefix = \"wasi-0.11.1+wasi-snapshot-preview1\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.14.2-wasi-0.2.4\",\n sha256 = \"9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.14.2+wasi-0.2.4/download\"],\n strip_prefix = \"wasi-0.14.2+wasi-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.14.2+wasi-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-0.2.100\",\n sha256 = \"1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-backend-0.2.100\",\n sha256 = \"2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-backend/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-backend-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-backend-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-0.2.100\",\n sha256 = \"7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-macro-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-support-0.2.100\",\n sha256 = \"8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-macro-support-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-support-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-shared-0.2.100\",\n sha256 = \"1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-shared/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-shared-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-shared-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-util-0.1.9\",\n sha256 = \"cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-util/0.1.9/download\"],\n strip_prefix = \"winapi-util-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.winapi-util-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.48.0\",\n sha256 = \"677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.48.0/download\"],\n strip_prefix = \"windows-sys-0.48.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.48.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.52.0\",\n sha256 = \"282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.52.0/download\"],\n strip_prefix = \"windows-sys-0.52.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.52.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.59.0\",\n sha256 = \"1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.59.0/download\"],\n strip_prefix = \"windows-sys-0.59.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.59.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.60.2\",\n sha256 = \"f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.60.2/download\"],\n strip_prefix = \"windows-sys-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.48.5\",\n sha256 = \"9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.48.5/download\"],\n strip_prefix = \"windows-targets-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.52.6\",\n sha256 = \"9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.52.6/download\"],\n strip_prefix = \"windows-targets-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.53.2\",\n sha256 = \"c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.53.2/download\"],\n strip_prefix = \"windows-targets-0.53.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.53.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.48.5\",\n sha256 = \"2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.52.6\",\n sha256 = \"32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.53.0\",\n sha256 = \"86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.48.5\",\n sha256 = \"dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.52.6\",\n sha256 = \"09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.53.0\",\n sha256 = \"c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.53.0/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.48.5\",\n sha256 = \"a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.48.5/download\"],\n strip_prefix = \"windows_i686_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.52.6\",\n sha256 = \"8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.53.0\",\n sha256 = \"c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.53.0/download\"],\n strip_prefix = \"windows_i686_gnu-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.52.6\",\n sha256 = \"0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.53.0\",\n sha256 = \"9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.48.5\",\n sha256 = \"8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.48.5/download\"],\n strip_prefix = \"windows_i686_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.52.6\",\n sha256 = \"240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.52.6/download\"],\n strip_prefix = \"windows_i686_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.53.0\",\n sha256 = \"581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.53.0/download\"],\n strip_prefix = \"windows_i686_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.48.5\",\n sha256 = \"53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.52.6\",\n sha256 = \"147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.53.0\",\n sha256 = \"2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.48.5\",\n sha256 = \"0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.52.6\",\n sha256 = \"24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.53.0\",\n sha256 = \"0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.48.5\",\n sha256 = \"ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.52.6\",\n sha256 = \"589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.53.0\",\n sha256 = \"271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-rt-0.39.0\",\n sha256 = \"6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen-rt/0.39.0/download\"],\n strip_prefix = \"wit-bindgen-rt-0.39.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-rt-0.39.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__writeable-0.6.1\",\n sha256 = \"ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/writeable/0.6.1/download\"],\n strip_prefix = \"writeable-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.writeable-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-0.8.0\",\n sha256 = \"5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke/0.8.0/download\"],\n strip_prefix = \"yoke-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.yoke-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-derive-0.8.0\",\n sha256 = \"38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke-derive/0.8.0/download\"],\n strip_prefix = \"yoke-derive-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.yoke-derive-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-0.8.26\",\n sha256 = \"1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy/0.8.26/download\"],\n strip_prefix = \"zerocopy-0.8.26\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-0.8.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-derive-0.8.26\",\n sha256 = \"9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy-derive/0.8.26/download\"],\n strip_prefix = \"zerocopy-derive-0.8.26\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-derive-0.8.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-0.1.6\",\n sha256 = \"50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom/0.1.6/download\"],\n strip_prefix = \"zerofrom-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-derive-0.1.6\",\n sha256 = \"d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom-derive/0.1.6/download\"],\n strip_prefix = \"zerofrom-derive-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-derive-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerotrie-0.2.2\",\n sha256 = \"36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerotrie/0.2.2/download\"],\n strip_prefix = \"zerotrie-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.zerotrie-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-0.11.2\",\n sha256 = \"4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec/0.11.2/download\"],\n strip_prefix = \"zerovec-0.11.2\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-0.11.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-derive-0.11.1\",\n sha256 = \"5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec-derive/0.11.1/download\"],\n strip_prefix = \"zerovec-derive-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-derive-0.11.1.bazel\"),\n )\n\n return [\n struct(repo=\"crates__aide-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__async-trait-0.1.88\", is_dev_dep = False),\n struct(repo=\"crates__axum-0.7.9\", is_dev_dep = False),\n struct(repo=\"crates__axum-jsonschema-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__clap-4.5.41\", is_dev_dep = False),\n struct(repo=\"crates__crossbeam-channel-0.5.15\", is_dev_dep = False),\n struct(repo=\"crates__hyper-1.6.0\", is_dev_dep = False),\n struct(repo=\"crates__log-0.4.27\", is_dev_dep = False),\n struct(repo=\"crates__num_cpus-1.17.0\", is_dev_dep = False),\n struct(repo=\"crates__prost-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__prost-build-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__prost-types-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__rusqlite-0.31.0\", is_dev_dep = False),\n struct(repo=\"crates__rust-embed-8.7.2\", is_dev_dep = False),\n struct(repo=\"crates__schemars-0.8.22\", is_dev_dep = False),\n struct(repo=\"crates__serde-1.0.219\", is_dev_dep = False),\n struct(repo=\"crates__serde_json-1.0.140\", is_dev_dep = False),\n struct(repo=\"crates__simple_logger-4.3.3\", is_dev_dep = False),\n struct(repo=\"crates__tempfile-3.20.0\", is_dev_dep = False),\n struct(repo=\"crates__thiserror-1.0.69\", is_dev_dep = False),\n struct(repo=\"crates__tokio-1.46.1\", is_dev_dep = False),\n struct(repo=\"crates__tower-0.4.13\", is_dev_dep = False),\n struct(repo=\"crates__tower-http-0.5.2\", is_dev_dep = False),\n struct(repo=\"crates__uuid-1.17.0\", is_dev_dep = False),\n ]\n" } } }, diff --git a/examples/basic_graph/generated_number/pippin b/examples/basic_graph/generated_number/pippin new file mode 100644 index 0000000..3e932fe --- /dev/null +++ b/examples/basic_graph/generated_number/pippin @@ -0,0 +1 @@ +34 \ No newline at end of file diff --git a/examples/podcast_reviews/MODULE.bazel.lock b/examples/podcast_reviews/MODULE.bazel.lock index d889664..6896a5d 100644 --- a/examples/podcast_reviews/MODULE.bazel.lock +++ b/examples/podcast_reviews/MODULE.bazel.lock @@ -3617,7 +3617,7 @@ "@@rules_rust+//crate_universe:extensions.bzl%crate": { "general": { "bzlTransitiveDigest": "7WZJd6ddUExnqTm+/VXRBmv6c4MCs9hJn2U/AZqeQvA=", - "usagesDigest": "k784W1PeHeDcEcg97064SpH8e2DyNdDHXgJPwiIEV28=", + "usagesDigest": "SvELD47AUgER5pfXXAet2HBxN6mq+A0dBjq0xU51Z4A=", "recordedFileInputs": {}, "recordedDirentsInputs": {}, "envVariables": { @@ -3634,9 +3634,9 @@ "repoRuleId": "@@rules_rust+//crate_universe:extensions.bzl%_generate_repo", "attributes": { "contents": { - "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'databuild'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"aide-0.13.5\",\n actual = \"@crates__aide-0.13.5//:aide\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"aide\",\n actual = \"@crates__aide-0.13.5//:aide\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait-0.1.88\",\n actual = \"@crates__async-trait-0.1.88//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait\",\n actual = \"@crates__async-trait-0.1.88//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-0.7.9\",\n actual = \"@crates__axum-0.7.9//:axum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum\",\n actual = \"@crates__axum-0.7.9//:axum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-jsonschema-0.8.0\",\n actual = \"@crates__axum-jsonschema-0.8.0//:axum_jsonschema\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-jsonschema\",\n actual = \"@crates__axum-jsonschema-0.8.0//:axum_jsonschema\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap-4.5.41\",\n actual = \"@crates__clap-4.5.41//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap\",\n actual = \"@crates__clap-4.5.41//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"crossbeam-channel-0.5.15\",\n actual = \"@crates__crossbeam-channel-0.5.15//:crossbeam_channel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"crossbeam-channel\",\n actual = \"@crates__crossbeam-channel-0.5.15//:crossbeam_channel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hyper-1.6.0\",\n actual = \"@crates__hyper-1.6.0//:hyper\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hyper\",\n actual = \"@crates__hyper-1.6.0//:hyper\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"log-0.4.27\",\n actual = \"@crates__log-0.4.27//:log\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"log\",\n actual = \"@crates__log-0.4.27//:log\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num_cpus-1.17.0\",\n actual = \"@crates__num_cpus-1.17.0//:num_cpus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num_cpus\",\n actual = \"@crates__num_cpus-1.17.0//:num_cpus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-0.13.5\",\n actual = \"@crates__prost-0.13.5//:prost\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost\",\n actual = \"@crates__prost-0.13.5//:prost\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-build-0.13.5\",\n actual = \"@crates__prost-build-0.13.5//:prost_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-build\",\n actual = \"@crates__prost-build-0.13.5//:prost_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-types-0.13.5\",\n actual = \"@crates__prost-types-0.13.5//:prost_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-types\",\n actual = \"@crates__prost-types-0.13.5//:prost_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rusqlite-0.31.0\",\n actual = \"@crates__rusqlite-0.31.0//:rusqlite\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rusqlite\",\n actual = \"@crates__rusqlite-0.31.0//:rusqlite\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rust-embed-8.7.2\",\n actual = \"@crates__rust-embed-8.7.2//:rust_embed\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rust-embed\",\n actual = \"@crates__rust-embed-8.7.2//:rust_embed\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"schemars-0.8.22\",\n actual = \"@crates__schemars-0.8.22//:schemars\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"schemars\",\n actual = \"@crates__schemars-0.8.22//:schemars\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde-1.0.219\",\n actual = \"@crates__serde-1.0.219//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde\",\n actual = \"@crates__serde-1.0.219//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json-1.0.140\",\n actual = \"@crates__serde_json-1.0.140//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json\",\n actual = \"@crates__serde_json-1.0.140//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"simple_logger-4.3.3\",\n actual = \"@crates__simple_logger-4.3.3//:simple_logger\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"simple_logger\",\n actual = \"@crates__simple_logger-4.3.3//:simple_logger\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile-3.20.0\",\n actual = \"@crates__tempfile-3.20.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile\",\n actual = \"@crates__tempfile-3.20.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-1.46.1\",\n actual = \"@crates__tokio-1.46.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio\",\n actual = \"@crates__tokio-1.46.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-0.4.13\",\n actual = \"@crates__tower-0.4.13//:tower\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower\",\n actual = \"@crates__tower-0.4.13//:tower\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-http-0.5.2\",\n actual = \"@crates__tower-http-0.5.2//:tower_http\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-http\",\n actual = \"@crates__tower-http-0.5.2//:tower_http\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid-1.17.0\",\n actual = \"@crates__uuid-1.17.0//:uuid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid\",\n actual = \"@crates__uuid-1.17.0//:uuid\",\n tags = [\"manual\"],\n)\n", + "BUILD.bazel": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'databuild'\n###############################################################################\n\npackage(default_visibility = [\"//visibility:public\"])\n\nexports_files(\n [\n \"cargo-bazel.json\",\n \"crates.bzl\",\n \"defs.bzl\",\n ] + glob(\n allow_empty = True,\n include = [\"*.bazel\"],\n ),\n)\n\nfilegroup(\n name = \"srcs\",\n srcs = glob(\n allow_empty = True,\n include = [\n \"*.bazel\",\n \"*.bzl\",\n ],\n ),\n)\n\n# Workspace Member Dependencies\nalias(\n name = \"aide-0.13.5\",\n actual = \"@crates__aide-0.13.5//:aide\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"aide\",\n actual = \"@crates__aide-0.13.5//:aide\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait-0.1.88\",\n actual = \"@crates__async-trait-0.1.88//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"async-trait\",\n actual = \"@crates__async-trait-0.1.88//:async_trait\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-0.7.9\",\n actual = \"@crates__axum-0.7.9//:axum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum\",\n actual = \"@crates__axum-0.7.9//:axum\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-jsonschema-0.8.0\",\n actual = \"@crates__axum-jsonschema-0.8.0//:axum_jsonschema\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"axum-jsonschema\",\n actual = \"@crates__axum-jsonschema-0.8.0//:axum_jsonschema\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap-4.5.41\",\n actual = \"@crates__clap-4.5.41//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"clap\",\n actual = \"@crates__clap-4.5.41//:clap\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"crossbeam-channel-0.5.15\",\n actual = \"@crates__crossbeam-channel-0.5.15//:crossbeam_channel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"crossbeam-channel\",\n actual = \"@crates__crossbeam-channel-0.5.15//:crossbeam_channel\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hyper-1.6.0\",\n actual = \"@crates__hyper-1.6.0//:hyper\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"hyper\",\n actual = \"@crates__hyper-1.6.0//:hyper\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"log-0.4.27\",\n actual = \"@crates__log-0.4.27//:log\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"log\",\n actual = \"@crates__log-0.4.27//:log\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num_cpus-1.17.0\",\n actual = \"@crates__num_cpus-1.17.0//:num_cpus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"num_cpus\",\n actual = \"@crates__num_cpus-1.17.0//:num_cpus\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-0.13.5\",\n actual = \"@crates__prost-0.13.5//:prost\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost\",\n actual = \"@crates__prost-0.13.5//:prost\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-build-0.13.5\",\n actual = \"@crates__prost-build-0.13.5//:prost_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-build\",\n actual = \"@crates__prost-build-0.13.5//:prost_build\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-types-0.13.5\",\n actual = \"@crates__prost-types-0.13.5//:prost_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"prost-types\",\n actual = \"@crates__prost-types-0.13.5//:prost_types\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rusqlite-0.31.0\",\n actual = \"@crates__rusqlite-0.31.0//:rusqlite\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rusqlite\",\n actual = \"@crates__rusqlite-0.31.0//:rusqlite\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rust-embed-8.7.2\",\n actual = \"@crates__rust-embed-8.7.2//:rust_embed\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"rust-embed\",\n actual = \"@crates__rust-embed-8.7.2//:rust_embed\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"schemars-0.8.22\",\n actual = \"@crates__schemars-0.8.22//:schemars\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"schemars\",\n actual = \"@crates__schemars-0.8.22//:schemars\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde-1.0.219\",\n actual = \"@crates__serde-1.0.219//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde\",\n actual = \"@crates__serde-1.0.219//:serde\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json-1.0.140\",\n actual = \"@crates__serde_json-1.0.140//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"serde_json\",\n actual = \"@crates__serde_json-1.0.140//:serde_json\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"simple_logger-4.3.3\",\n actual = \"@crates__simple_logger-4.3.3//:simple_logger\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"simple_logger\",\n actual = \"@crates__simple_logger-4.3.3//:simple_logger\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile-3.20.0\",\n actual = \"@crates__tempfile-3.20.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tempfile\",\n actual = \"@crates__tempfile-3.20.0//:tempfile\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"thiserror-1.0.69\",\n actual = \"@crates__thiserror-1.0.69//:thiserror\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"thiserror\",\n actual = \"@crates__thiserror-1.0.69//:thiserror\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio-1.46.1\",\n actual = \"@crates__tokio-1.46.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tokio\",\n actual = \"@crates__tokio-1.46.1//:tokio\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-0.4.13\",\n actual = \"@crates__tower-0.4.13//:tower\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower\",\n actual = \"@crates__tower-0.4.13//:tower\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-http-0.5.2\",\n actual = \"@crates__tower-http-0.5.2//:tower_http\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"tower-http\",\n actual = \"@crates__tower-http-0.5.2//:tower_http\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid-1.17.0\",\n actual = \"@crates__uuid-1.17.0//:uuid\",\n tags = [\"manual\"],\n)\n\nalias(\n name = \"uuid\",\n actual = \"@crates__uuid-1.17.0//:uuid\",\n tags = [\"manual\"],\n)\n", "alias_rules.bzl": "\"\"\"Alias that transitions its target to `compilation_mode=opt`. Use `transition_alias=\"opt\"` to enable.\"\"\"\n\nload(\"@rules_cc//cc:defs.bzl\", \"CcInfo\")\nload(\"@rules_rust//rust:rust_common.bzl\", \"COMMON_PROVIDERS\")\n\ndef _transition_alias_impl(ctx):\n # `ctx.attr.actual` is a list of 1 item due to the transition\n providers = [ctx.attr.actual[0][provider] for provider in COMMON_PROVIDERS]\n if CcInfo in ctx.attr.actual[0]:\n providers.append(ctx.attr.actual[0][CcInfo])\n return providers\n\ndef _change_compilation_mode(compilation_mode):\n def _change_compilation_mode_impl(_settings, _attr):\n return {\n \"//command_line_option:compilation_mode\": compilation_mode,\n }\n\n return transition(\n implementation = _change_compilation_mode_impl,\n inputs = [],\n outputs = [\n \"//command_line_option:compilation_mode\",\n ],\n )\n\ndef _transition_alias_rule(compilation_mode):\n return rule(\n implementation = _transition_alias_impl,\n provides = COMMON_PROVIDERS,\n attrs = {\n \"actual\": attr.label(\n mandatory = True,\n doc = \"`rust_library()` target to transition to `compilation_mode=opt`.\",\n providers = COMMON_PROVIDERS,\n cfg = _change_compilation_mode(compilation_mode),\n ),\n \"_allowlist_function_transition\": attr.label(\n default = \"@bazel_tools//tools/allowlists/function_transition_allowlist\",\n ),\n },\n doc = \"Transitions a Rust library crate to the `compilation_mode=opt`.\",\n )\n\ntransition_alias_dbg = _transition_alias_rule(\"dbg\")\ntransition_alias_fastbuild = _transition_alias_rule(\"fastbuild\")\ntransition_alias_opt = _transition_alias_rule(\"opt\")\n", - "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'databuild'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"new_git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe/private:local_crate_mirror.bzl\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS AND ALIASES\n###############################################################################\n\n_NORMAL_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"aide\": Label(\"@crates//:aide-0.13.5\"),\n \"axum\": Label(\"@crates//:axum-0.7.9\"),\n \"axum-jsonschema\": Label(\"@crates//:axum-jsonschema-0.8.0\"),\n \"clap\": Label(\"@crates//:clap-4.5.41\"),\n \"crossbeam-channel\": Label(\"@crates//:crossbeam-channel-0.5.15\"),\n \"hyper\": Label(\"@crates//:hyper-1.6.0\"),\n \"log\": Label(\"@crates//:log-0.4.27\"),\n \"num_cpus\": Label(\"@crates//:num_cpus-1.17.0\"),\n \"prost\": Label(\"@crates//:prost-0.13.5\"),\n \"prost-build\": Label(\"@crates//:prost-build-0.13.5\"),\n \"prost-types\": Label(\"@crates//:prost-types-0.13.5\"),\n \"rusqlite\": Label(\"@crates//:rusqlite-0.31.0\"),\n \"rust-embed\": Label(\"@crates//:rust-embed-8.7.2\"),\n \"schemars\": Label(\"@crates//:schemars-0.8.22\"),\n \"serde\": Label(\"@crates//:serde-1.0.219\"),\n \"serde_json\": Label(\"@crates//:serde_json-1.0.140\"),\n \"simple_logger\": Label(\"@crates//:simple_logger-4.3.3\"),\n \"tempfile\": Label(\"@crates//:tempfile-3.20.0\"),\n \"tokio\": Label(\"@crates//:tokio-1.46.1\"),\n \"tower\": Label(\"@crates//:tower-0.4.13\"),\n \"tower-http\": Label(\"@crates//:tower-http-0.5.2\"),\n \"uuid\": Label(\"@crates//:uuid-1.17.0\"),\n },\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"async-trait\": Label(\"@crates//:async-trait-0.1.88\"),\n },\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"aarch64-linux-android\": [],\n \"aarch64-pc-windows-gnullvm\": [],\n \"aarch64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(any(target_arch = \\\"x86_64\\\", target_arch = \\\"arm64ec\\\"), target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(all(any(target_os = \\\"android\\\", target_os = \\\"linux\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), not(any(all(target_os = \\\"linux\\\", target_env = \\\"\\\"), getrandom_backend = \\\"custom\\\", getrandom_backend = \\\"linux_raw\\\", getrandom_backend = \\\"rdrand\\\", getrandom_backend = \\\"rndr\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"linux\\\"))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_vendor = \\\"apple\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(all(target_arch = \\\"loongarch64\\\", target_os = \\\"linux\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"wasi\\\", target_env = \\\"p2\\\"))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(all(target_os = \\\"uefi\\\", getrandom_backend = \\\"efi_rng\\\"))\": [],\n \"cfg(all(tokio_uring, target_os = \\\"linux\\\"))\": [],\n \"cfg(any())\": [],\n \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any(target_os = \\\"dragonfly\\\", target_os = \\\"freebsd\\\", target_os = \\\"hurd\\\", target_os = \\\"illumos\\\", target_os = \\\"cygwin\\\", all(target_os = \\\"horizon\\\", target_arch = \\\"arm\\\")))\": [],\n \"cfg(any(target_os = \\\"haiku\\\", target_os = \\\"redox\\\", target_os = \\\"nto\\\", target_os = \\\"aix\\\"))\": [],\n \"cfg(any(target_os = \\\"ios\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\", target_os = \\\"tvos\\\"))\": [],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"ios\\\", target_os = \\\"freebsd\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"openbsd\\\", target_os = \\\"vita\\\", target_os = \\\"emscripten\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(unix, target_os = \\\"wasi\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any(windows, target_os = \\\"cygwin\\\"))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(not(all(target_arch = \\\"arm\\\", target_os = \\\"none\\\")))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(all(windows, target_env = \\\"msvc\\\", not(target_vendor = \\\"uwp\\\"))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(windows))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(target_arch = \\\"wasm32\\\")\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(target_os = \\\"hermit\\\")\": [],\n \"cfg(target_os = \\\"netbsd\\\")\": [],\n \"cfg(target_os = \\\"redox\\\")\": [],\n \"cfg(target_os = \\\"solaris\\\")\": [],\n \"cfg(target_os = \\\"vxworks\\\")\": [],\n \"cfg(target_os = \\\"wasi\\\")\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(tokio_taskdump)\": [],\n \"cfg(unix)\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(windows)\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"i686-pc-windows-gnullvm\": [],\n \"wasm32-unknown-unknown\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"wasm32-wasip1\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"x86_64-pc-windows-gnullvm\": [],\n \"x86_64-pc-windows-msvc\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"x86_64-unknown-nixos-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n http_archive,\n name = \"crates__addr2line-0.24.2\",\n sha256 = \"dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/addr2line/0.24.2/download\"],\n strip_prefix = \"addr2line-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.addr2line-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__adler2-2.0.1\",\n sha256 = \"320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/adler2/2.0.1/download\"],\n strip_prefix = \"adler2-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.adler2-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ahash-0.8.12\",\n sha256 = \"5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ahash/0.8.12/download\"],\n strip_prefix = \"ahash-0.8.12\",\n build_file = Label(\"@crates//crates:BUILD.ahash-0.8.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aho-corasick-1.1.3\",\n sha256 = \"8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aho-corasick/1.1.3/download\"],\n strip_prefix = \"aho-corasick-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.aho-corasick-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aide-0.13.5\",\n sha256 = \"5678d2978845ddb4bd736a026f467dd652d831e9e6254b0e41b07f7ee7523309\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aide/0.13.5/download\"],\n strip_prefix = \"aide-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.aide-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstream-0.6.19\",\n sha256 = \"301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstream/0.6.19/download\"],\n strip_prefix = \"anstream-0.6.19\",\n build_file = Label(\"@crates//crates:BUILD.anstream-0.6.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-1.0.11\",\n sha256 = \"862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle/1.0.11/download\"],\n strip_prefix = \"anstyle-1.0.11\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-1.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-parse-0.2.7\",\n sha256 = \"4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-parse/0.2.7/download\"],\n strip_prefix = \"anstyle-parse-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-parse-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-query-1.1.3\",\n sha256 = \"6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-query/1.1.3/download\"],\n strip_prefix = \"anstyle-query-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-query-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-wincon-3.0.9\",\n sha256 = \"403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.9/download\"],\n strip_prefix = \"anstyle-wincon-3.0.9\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-wincon-3.0.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anyhow-1.0.98\",\n sha256 = \"e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anyhow/1.0.98/download\"],\n strip_prefix = \"anyhow-1.0.98\",\n build_file = Label(\"@crates//crates:BUILD.anyhow-1.0.98.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-trait-0.1.88\",\n sha256 = \"e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-trait/0.1.88/download\"],\n strip_prefix = \"async-trait-0.1.88\",\n build_file = Label(\"@crates//crates:BUILD.async-trait-0.1.88.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atomic-waker-1.1.2\",\n sha256 = \"1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atomic-waker/1.1.2/download\"],\n strip_prefix = \"atomic-waker-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.atomic-waker-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__autocfg-1.5.0\",\n sha256 = \"c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/autocfg/1.5.0/download\"],\n strip_prefix = \"autocfg-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.autocfg-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-0.7.9\",\n sha256 = \"edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum/0.7.9/download\"],\n strip_prefix = \"axum-0.7.9\",\n build_file = Label(\"@crates//crates:BUILD.axum-0.7.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-core-0.4.5\",\n sha256 = \"09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum-core/0.4.5/download\"],\n strip_prefix = \"axum-core-0.4.5\",\n build_file = Label(\"@crates//crates:BUILD.axum-core-0.4.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-jsonschema-0.8.0\",\n sha256 = \"fcffe29ca1b60172349fea781ec34441d598809bd227ccbb5bf5dc2879cd9c78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum-jsonschema/0.8.0/download\"],\n strip_prefix = \"axum-jsonschema-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.axum-jsonschema-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__backtrace-0.3.75\",\n sha256 = \"6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/backtrace/0.3.75/download\"],\n strip_prefix = \"backtrace-0.3.75\",\n build_file = Label(\"@crates//crates:BUILD.backtrace-0.3.75.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-0.21.7\",\n sha256 = \"9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64/0.21.7/download\"],\n strip_prefix = \"base64-0.21.7\",\n build_file = Label(\"@crates//crates:BUILD.base64-0.21.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-set-0.5.3\",\n sha256 = \"0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-set/0.5.3/download\"],\n strip_prefix = \"bit-set-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.bit-set-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-vec-0.6.3\",\n sha256 = \"349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-vec/0.6.3/download\"],\n strip_prefix = \"bit-vec-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.bit-vec-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-2.9.1\",\n sha256 = \"1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/2.9.1/download\"],\n strip_prefix = \"bitflags-2.9.1\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-2.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-buffer-0.10.4\",\n sha256 = \"3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-buffer/0.10.4/download\"],\n strip_prefix = \"block-buffer-0.10.4\",\n build_file = Label(\"@crates//crates:BUILD.block-buffer-0.10.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bumpalo-3.19.0\",\n sha256 = \"46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bumpalo/3.19.0/download\"],\n strip_prefix = \"bumpalo-3.19.0\",\n build_file = Label(\"@crates//crates:BUILD.bumpalo-3.19.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecount-0.6.9\",\n sha256 = \"175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecount/0.6.9/download\"],\n strip_prefix = \"bytecount-0.6.9\",\n build_file = Label(\"@crates//crates:BUILD.bytecount-0.6.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytes-1.10.1\",\n sha256 = \"d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytes/1.10.1/download\"],\n strip_prefix = \"bytes-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.bytes-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cc-1.2.29\",\n sha256 = \"5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cc/1.2.29/download\"],\n strip_prefix = \"cc-1.2.29\",\n build_file = Label(\"@crates//crates:BUILD.cc-1.2.29.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-if-1.0.1\",\n sha256 = \"9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-if/1.0.1/download\"],\n strip_prefix = \"cfg-if-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.cfg-if-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap-4.5.41\",\n sha256 = \"be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap/4.5.41/download\"],\n strip_prefix = \"clap-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_builder-4.5.41\",\n sha256 = \"707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_builder/4.5.41/download\"],\n strip_prefix = \"clap_builder-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap_builder-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_derive-4.5.41\",\n sha256 = \"ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_derive/4.5.41/download\"],\n strip_prefix = \"clap_derive-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap_derive-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_lex-0.7.5\",\n sha256 = \"b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_lex/0.7.5/download\"],\n strip_prefix = \"clap_lex-0.7.5\",\n build_file = Label(\"@crates//crates:BUILD.clap_lex-0.7.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colorchoice-1.0.4\",\n sha256 = \"b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colorchoice/1.0.4/download\"],\n strip_prefix = \"colorchoice-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.colorchoice-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colored-2.2.0\",\n sha256 = \"117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colored/2.2.0/download\"],\n strip_prefix = \"colored-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.colored-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cpufeatures-0.2.17\",\n sha256 = \"59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cpufeatures/0.2.17/download\"],\n strip_prefix = \"cpufeatures-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.cpufeatures-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-channel-0.5.15\",\n sha256 = \"82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-channel/0.5.15/download\"],\n strip_prefix = \"crossbeam-channel-0.5.15\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-channel-0.5.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-utils-0.8.21\",\n sha256 = \"d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-utils/0.8.21/download\"],\n strip_prefix = \"crossbeam-utils-0.8.21\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-utils-0.8.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-common-0.1.6\",\n sha256 = \"1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-common/0.1.6/download\"],\n strip_prefix = \"crypto-common-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.crypto-common-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__deranged-0.4.0\",\n sha256 = \"9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/deranged/0.4.0/download\"],\n strip_prefix = \"deranged-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.deranged-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__digest-0.10.7\",\n sha256 = \"9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/digest/0.10.7/download\"],\n strip_prefix = \"digest-0.10.7\",\n build_file = Label(\"@crates//crates:BUILD.digest-0.10.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__displaydoc-0.2.5\",\n sha256 = \"97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/displaydoc/0.2.5/download\"],\n strip_prefix = \"displaydoc-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.displaydoc-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dyn-clone-1.0.19\",\n sha256 = \"1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dyn-clone/1.0.19/download\"],\n strip_prefix = \"dyn-clone-1.0.19\",\n build_file = Label(\"@crates//crates:BUILD.dyn-clone-1.0.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__either-1.15.0\",\n sha256 = \"48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/either/1.15.0/download\"],\n strip_prefix = \"either-1.15.0\",\n build_file = Label(\"@crates//crates:BUILD.either-1.15.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__equivalent-1.0.2\",\n sha256 = \"877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/equivalent/1.0.2/download\"],\n strip_prefix = \"equivalent-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.equivalent-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__errno-0.3.13\",\n sha256 = \"778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/errno/0.3.13/download\"],\n strip_prefix = \"errno-0.3.13\",\n build_file = Label(\"@crates//crates:BUILD.errno-0.3.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fallible-iterator-0.3.0\",\n sha256 = \"2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fallible-iterator/0.3.0/download\"],\n strip_prefix = \"fallible-iterator-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fallible-iterator-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fallible-streaming-iterator-0.1.9\",\n sha256 = \"7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fallible-streaming-iterator/0.1.9/download\"],\n strip_prefix = \"fallible-streaming-iterator-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.fallible-streaming-iterator-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.11.0\",\n sha256 = \"b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.11.0/download\"],\n strip_prefix = \"fancy-regex-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fastrand-2.3.0\",\n sha256 = \"37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fastrand/2.3.0/download\"],\n strip_prefix = \"fastrand-2.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fastrand-2.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fixedbitset-0.5.7\",\n sha256 = \"1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fixedbitset/0.5.7/download\"],\n strip_prefix = \"fixedbitset-0.5.7\",\n build_file = Label(\"@crates//crates:BUILD.fixedbitset-0.5.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fnv-1.0.7\",\n sha256 = \"3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fnv/1.0.7/download\"],\n strip_prefix = \"fnv-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.fnv-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__form_urlencoded-1.2.1\",\n sha256 = \"e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/form_urlencoded/1.2.1/download\"],\n strip_prefix = \"form_urlencoded-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.form_urlencoded-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fraction-0.13.1\",\n sha256 = \"3027ae1df8d41b4bed2241c8fdad4acc1e7af60c8e17743534b545e77182d678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fraction/0.13.1/download\"],\n strip_prefix = \"fraction-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.fraction-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-0.3.31\",\n sha256 = \"65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures/0.3.31/download\"],\n strip_prefix = \"futures-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-channel-0.3.31\",\n sha256 = \"2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-channel/0.3.31/download\"],\n strip_prefix = \"futures-channel-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-channel-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-core-0.3.31\",\n sha256 = \"05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-core/0.3.31/download\"],\n strip_prefix = \"futures-core-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-core-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-executor-0.3.31\",\n sha256 = \"1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-executor/0.3.31/download\"],\n strip_prefix = \"futures-executor-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-executor-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-io-0.3.31\",\n sha256 = \"9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-io/0.3.31/download\"],\n strip_prefix = \"futures-io-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-io-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-macro-0.3.31\",\n sha256 = \"162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-macro/0.3.31/download\"],\n strip_prefix = \"futures-macro-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-macro-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-sink-0.3.31\",\n sha256 = \"e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-sink/0.3.31/download\"],\n strip_prefix = \"futures-sink-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-sink-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-task-0.3.31\",\n sha256 = \"f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-task/0.3.31/download\"],\n strip_prefix = \"futures-task-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-task-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-util-0.3.31\",\n sha256 = \"9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-util/0.3.31/download\"],\n strip_prefix = \"futures-util-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-util-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__generic-array-0.14.7\",\n sha256 = \"85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/generic-array/0.14.7/download\"],\n strip_prefix = \"generic-array-0.14.7\",\n build_file = Label(\"@crates//crates:BUILD.generic-array-0.14.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.2.16\",\n sha256 = \"335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.2.16/download\"],\n strip_prefix = \"getrandom-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.3.3\",\n sha256 = \"26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.3.3/download\"],\n strip_prefix = \"getrandom-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gimli-0.31.1\",\n sha256 = \"07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gimli/0.31.1/download\"],\n strip_prefix = \"gimli-0.31.1\",\n build_file = Label(\"@crates//crates:BUILD.gimli-0.31.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__h2-0.4.11\",\n sha256 = \"17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/h2/0.4.11/download\"],\n strip_prefix = \"h2-0.4.11\",\n build_file = Label(\"@crates//crates:BUILD.h2-0.4.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.14.5\",\n sha256 = \"e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.14.5/download\"],\n strip_prefix = \"hashbrown-0.14.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.14.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.15.4\",\n sha256 = \"5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.15.4/download\"],\n strip_prefix = \"hashbrown-0.15.4\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.15.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashlink-0.9.1\",\n sha256 = \"6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashlink/0.9.1/download\"],\n strip_prefix = \"hashlink-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.hashlink-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__heck-0.5.0\",\n sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n strip_prefix = \"heck-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.heck-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hermit-abi-0.5.2\",\n sha256 = \"fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hermit-abi/0.5.2/download\"],\n strip_prefix = \"hermit-abi-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.hermit-abi-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-1.3.1\",\n sha256 = \"f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http/1.3.1/download\"],\n strip_prefix = \"http-1.3.1\",\n build_file = Label(\"@crates//crates:BUILD.http-1.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-1.0.1\",\n sha256 = \"1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body/1.0.1/download\"],\n strip_prefix = \"http-body-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.http-body-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-util-0.1.3\",\n sha256 = \"b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body-util/0.1.3/download\"],\n strip_prefix = \"http-body-util-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.http-body-util-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__httparse-1.10.1\",\n sha256 = \"6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/httparse/1.10.1/download\"],\n strip_prefix = \"httparse-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.httparse-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__httpdate-1.0.3\",\n sha256 = \"df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/httpdate/1.0.3/download\"],\n strip_prefix = \"httpdate-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.httpdate-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-1.6.0\",\n sha256 = \"cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper/1.6.0/download\"],\n strip_prefix = \"hyper-1.6.0\",\n build_file = Label(\"@crates//crates:BUILD.hyper-1.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-util-0.1.15\",\n sha256 = \"7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper-util/0.1.15/download\"],\n strip_prefix = \"hyper-util-0.1.15\",\n build_file = Label(\"@crates//crates:BUILD.hyper-util-0.1.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collections-2.0.0\",\n sha256 = \"200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collections/2.0.0/download\"],\n strip_prefix = \"icu_collections-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collections-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_core-2.0.0\",\n sha256 = \"0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_core/2.0.0/download\"],\n strip_prefix = \"icu_locale_core-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_core-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer-2.0.0\",\n sha256 = \"436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer/2.0.0/download\"],\n strip_prefix = \"icu_normalizer-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer_data-2.0.0\",\n sha256 = \"00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer_data/2.0.0/download\"],\n strip_prefix = \"icu_normalizer_data-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer_data-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties-2.0.1\",\n sha256 = \"016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties/2.0.1/download\"],\n strip_prefix = \"icu_properties-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties_data-2.0.1\",\n sha256 = \"298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties_data/2.0.1/download\"],\n strip_prefix = \"icu_properties_data-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties_data-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_provider-2.0.0\",\n sha256 = \"03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_provider/2.0.0/download\"],\n strip_prefix = \"icu_provider-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_provider-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna-1.0.3\",\n sha256 = \"686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna/1.0.3/download\"],\n strip_prefix = \"idna-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.idna-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna_adapter-1.2.1\",\n sha256 = \"3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna_adapter/1.2.1/download\"],\n strip_prefix = \"idna_adapter-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.idna_adapter-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indexmap-2.10.0\",\n sha256 = \"fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indexmap/2.10.0/download\"],\n strip_prefix = \"indexmap-2.10.0\",\n build_file = Label(\"@crates//crates:BUILD.indexmap-2.10.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__io-uring-0.7.8\",\n sha256 = \"b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/io-uring/0.7.8/download\"],\n strip_prefix = \"io-uring-0.7.8\",\n build_file = Label(\"@crates//crates:BUILD.io-uring-0.7.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__is_terminal_polyfill-1.70.1\",\n sha256 = \"7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.1/download\"],\n strip_prefix = \"is_terminal_polyfill-1.70.1\",\n build_file = Label(\"@crates//crates:BUILD.is_terminal_polyfill-1.70.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__iso8601-0.6.3\",\n sha256 = \"e1082f0c48f143442a1ac6122f67e360ceee130b967af4d50996e5154a45df46\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/iso8601/0.6.3/download\"],\n strip_prefix = \"iso8601-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.iso8601-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.12.1\",\n sha256 = \"ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.12.1/download\"],\n strip_prefix = \"itertools-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.14.0\",\n sha256 = \"2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.14.0/download\"],\n strip_prefix = \"itertools-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itoa-1.0.15\",\n sha256 = \"4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itoa/1.0.15/download\"],\n strip_prefix = \"itoa-1.0.15\",\n build_file = Label(\"@crates//crates:BUILD.itoa-1.0.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__js-sys-0.3.77\",\n sha256 = \"1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/js-sys/0.3.77/download\"],\n strip_prefix = \"js-sys-0.3.77\",\n build_file = Label(\"@crates//crates:BUILD.js-sys-0.3.77.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jsonschema-0.17.1\",\n sha256 = \"2a071f4f7efc9a9118dfb627a0a94ef247986e1ab8606a4c806ae2b3aa3b6978\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jsonschema/0.17.1/download\"],\n strip_prefix = \"jsonschema-0.17.1\",\n build_file = Label(\"@crates//crates:BUILD.jsonschema-0.17.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lazy_static-1.5.0\",\n sha256 = \"bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lazy_static/1.5.0/download\"],\n strip_prefix = \"lazy_static-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.lazy_static-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libc-0.2.174\",\n sha256 = \"1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libc/0.2.174/download\"],\n strip_prefix = \"libc-0.2.174\",\n build_file = Label(\"@crates//crates:BUILD.libc-0.2.174.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libsqlite3-sys-0.28.0\",\n sha256 = \"0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libsqlite3-sys/0.28.0/download\"],\n strip_prefix = \"libsqlite3-sys-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.libsqlite3-sys-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.9.4\",\n sha256 = \"cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.9.4/download\"],\n strip_prefix = \"linux-raw-sys-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__litemap-0.8.0\",\n sha256 = \"241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/litemap/0.8.0/download\"],\n strip_prefix = \"litemap-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.litemap-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lock_api-0.4.13\",\n sha256 = \"96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lock_api/0.4.13/download\"],\n strip_prefix = \"lock_api-0.4.13\",\n build_file = Label(\"@crates//crates:BUILD.lock_api-0.4.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__log-0.4.27\",\n sha256 = \"13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/log/0.4.27/download\"],\n strip_prefix = \"log-0.4.27\",\n build_file = Label(\"@crates//crates:BUILD.log-0.4.27.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__matchit-0.7.3\",\n sha256 = \"0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/matchit/0.7.3/download\"],\n strip_prefix = \"matchit-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.matchit-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memchr-2.7.5\",\n sha256 = \"32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.7.5/download\"],\n strip_prefix = \"memchr-2.7.5\",\n build_file = Label(\"@crates//crates:BUILD.memchr-2.7.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mime-0.3.17\",\n sha256 = \"6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mime/0.3.17/download\"],\n strip_prefix = \"mime-0.3.17\",\n build_file = Label(\"@crates//crates:BUILD.mime-0.3.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__miniz_oxide-0.8.9\",\n sha256 = \"1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/miniz_oxide/0.8.9/download\"],\n strip_prefix = \"miniz_oxide-0.8.9\",\n build_file = Label(\"@crates//crates:BUILD.miniz_oxide-0.8.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mio-1.0.4\",\n sha256 = \"78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mio/1.0.4/download\"],\n strip_prefix = \"mio-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.mio-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__multimap-0.10.1\",\n sha256 = \"1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/multimap/0.10.1/download\"],\n strip_prefix = \"multimap-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.multimap-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nom-8.0.0\",\n sha256 = \"df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nom/8.0.0/download\"],\n strip_prefix = \"nom-8.0.0\",\n build_file = Label(\"@crates//crates:BUILD.nom-8.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-0.4.3\",\n sha256 = \"35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num/0.4.3/download\"],\n strip_prefix = \"num-0.4.3\",\n build_file = Label(\"@crates//crates:BUILD.num-0.4.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-bigint-0.4.6\",\n sha256 = \"a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-bigint/0.4.6/download\"],\n strip_prefix = \"num-bigint-0.4.6\",\n build_file = Label(\"@crates//crates:BUILD.num-bigint-0.4.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-cmp-0.1.0\",\n sha256 = \"63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-cmp/0.1.0/download\"],\n strip_prefix = \"num-cmp-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.num-cmp-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-complex-0.4.6\",\n sha256 = \"73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-complex/0.4.6/download\"],\n strip_prefix = \"num-complex-0.4.6\",\n build_file = Label(\"@crates//crates:BUILD.num-complex-0.4.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-conv-0.1.0\",\n sha256 = \"51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-conv/0.1.0/download\"],\n strip_prefix = \"num-conv-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.num-conv-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-integer-0.1.46\",\n sha256 = \"7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-integer/0.1.46/download\"],\n strip_prefix = \"num-integer-0.1.46\",\n build_file = Label(\"@crates//crates:BUILD.num-integer-0.1.46.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-iter-0.1.45\",\n sha256 = \"1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-iter/0.1.45/download\"],\n strip_prefix = \"num-iter-0.1.45\",\n build_file = Label(\"@crates//crates:BUILD.num-iter-0.1.45.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-rational-0.4.2\",\n sha256 = \"f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-rational/0.4.2/download\"],\n strip_prefix = \"num-rational-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.num-rational-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-traits-0.2.19\",\n sha256 = \"071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-traits/0.2.19/download\"],\n strip_prefix = \"num-traits-0.2.19\",\n build_file = Label(\"@crates//crates:BUILD.num-traits-0.2.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num_cpus-1.17.0\",\n sha256 = \"91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num_cpus/1.17.0/download\"],\n strip_prefix = \"num_cpus-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.num_cpus-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num_threads-0.1.7\",\n sha256 = \"5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num_threads/0.1.7/download\"],\n strip_prefix = \"num_threads-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.num_threads-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__object-0.36.7\",\n sha256 = \"62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/object/0.36.7/download\"],\n strip_prefix = \"object-0.36.7\",\n build_file = Label(\"@crates//crates:BUILD.object-0.36.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell-1.21.3\",\n sha256 = \"42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell/1.21.3/download\"],\n strip_prefix = \"once_cell-1.21.3\",\n build_file = Label(\"@crates//crates:BUILD.once_cell-1.21.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell_polyfill-1.70.1\",\n sha256 = \"a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.1/download\"],\n strip_prefix = \"once_cell_polyfill-1.70.1\",\n build_file = Label(\"@crates//crates:BUILD.once_cell_polyfill-1.70.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot-0.12.4\",\n sha256 = \"70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot/0.12.4/download\"],\n strip_prefix = \"parking_lot-0.12.4\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot-0.12.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot_core-0.9.11\",\n sha256 = \"bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot_core/0.9.11/download\"],\n strip_prefix = \"parking_lot_core-0.9.11\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot_core-0.9.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__percent-encoding-2.3.1\",\n sha256 = \"e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/percent-encoding/2.3.1/download\"],\n strip_prefix = \"percent-encoding-2.3.1\",\n build_file = Label(\"@crates//crates:BUILD.percent-encoding-2.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__petgraph-0.7.1\",\n sha256 = \"3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/petgraph/0.7.1/download\"],\n strip_prefix = \"petgraph-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.petgraph-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-project-lite-0.2.16\",\n sha256 = \"3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-project-lite/0.2.16/download\"],\n strip_prefix = \"pin-project-lite-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.pin-project-lite-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-utils-0.1.0\",\n sha256 = \"8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-utils/0.1.0/download\"],\n strip_prefix = \"pin-utils-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.pin-utils-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pkg-config-0.3.32\",\n sha256 = \"7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pkg-config/0.3.32/download\"],\n strip_prefix = \"pkg-config-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.pkg-config-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__potential_utf-0.1.2\",\n sha256 = \"e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/potential_utf/0.1.2/download\"],\n strip_prefix = \"potential_utf-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.potential_utf-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__powerfmt-0.2.0\",\n sha256 = \"439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/powerfmt/0.2.0/download\"],\n strip_prefix = \"powerfmt-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.powerfmt-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prettyplease-0.2.35\",\n sha256 = \"061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prettyplease/0.2.35/download\"],\n strip_prefix = \"prettyplease-0.2.35\",\n build_file = Label(\"@crates//crates:BUILD.prettyplease-0.2.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro2-1.0.95\",\n sha256 = \"02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.95/download\"],\n strip_prefix = \"proc-macro2-1.0.95\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro2-1.0.95.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-0.13.5\",\n sha256 = \"2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost/0.13.5/download\"],\n strip_prefix = \"prost-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-build-0.13.5\",\n sha256 = \"be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-build/0.13.5/download\"],\n strip_prefix = \"prost-build-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-build-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-derive-0.13.5\",\n sha256 = \"8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-derive/0.13.5/download\"],\n strip_prefix = \"prost-derive-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-derive-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-types-0.13.5\",\n sha256 = \"52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-types/0.13.5/download\"],\n strip_prefix = \"prost-types-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-types-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quote-1.0.40\",\n sha256 = \"1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.40/download\"],\n strip_prefix = \"quote-1.0.40\",\n build_file = Label(\"@crates//crates:BUILD.quote-1.0.40.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-5.3.0\",\n sha256 = \"69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/5.3.0/download\"],\n strip_prefix = \"r-efi-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__redox_syscall-0.5.13\",\n sha256 = \"0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/redox_syscall/0.5.13/download\"],\n strip_prefix = \"redox_syscall-0.5.13\",\n build_file = Label(\"@crates//crates:BUILD.redox_syscall-0.5.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-1.11.1\",\n sha256 = \"b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex/1.11.1/download\"],\n strip_prefix = \"regex-1.11.1\",\n build_file = Label(\"@crates//crates:BUILD.regex-1.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-automata-0.4.9\",\n sha256 = \"809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-automata/0.4.9/download\"],\n strip_prefix = \"regex-automata-0.4.9\",\n build_file = Label(\"@crates//crates:BUILD.regex-automata-0.4.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-syntax-0.8.5\",\n sha256 = \"2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-syntax/0.8.5/download\"],\n strip_prefix = \"regex-syntax-0.8.5\",\n build_file = Label(\"@crates//crates:BUILD.regex-syntax-0.8.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rusqlite-0.31.0\",\n sha256 = \"b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rusqlite/0.31.0/download\"],\n strip_prefix = \"rusqlite-0.31.0\",\n build_file = Label(\"@crates//crates:BUILD.rusqlite-0.31.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-8.7.2\",\n sha256 = \"025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed/8.7.2/download\"],\n strip_prefix = \"rust-embed-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-impl-8.7.2\",\n sha256 = \"6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed-impl/8.7.2/download\"],\n strip_prefix = \"rust-embed-impl-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-impl-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-utils-8.7.2\",\n sha256 = \"f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed-utils/8.7.2/download\"],\n strip_prefix = \"rust-embed-utils-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-utils-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-demangle-0.1.25\",\n sha256 = \"989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-demangle/0.1.25/download\"],\n strip_prefix = \"rustc-demangle-0.1.25\",\n build_file = Label(\"@crates//crates:BUILD.rustc-demangle-0.1.25.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-1.0.7\",\n sha256 = \"c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/1.0.7/download\"],\n strip_prefix = \"rustix-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.rustix-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustversion-1.0.21\",\n sha256 = \"8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustversion/1.0.21/download\"],\n strip_prefix = \"rustversion-1.0.21\",\n build_file = Label(\"@crates//crates:BUILD.rustversion-1.0.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ryu-1.0.20\",\n sha256 = \"28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ryu/1.0.20/download\"],\n strip_prefix = \"ryu-1.0.20\",\n build_file = Label(\"@crates//crates:BUILD.ryu-1.0.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__same-file-1.0.6\",\n sha256 = \"93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/same-file/1.0.6/download\"],\n strip_prefix = \"same-file-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.same-file-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__schemars-0.8.22\",\n sha256 = \"3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/schemars/0.8.22/download\"],\n strip_prefix = \"schemars-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.schemars-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__schemars_derive-0.8.22\",\n sha256 = \"32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/schemars_derive/0.8.22/download\"],\n strip_prefix = \"schemars_derive-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.schemars_derive-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__scopeguard-1.2.0\",\n sha256 = \"94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/scopeguard/1.2.0/download\"],\n strip_prefix = \"scopeguard-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.scopeguard-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde-1.0.219\",\n sha256 = \"5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde/1.0.219/download\"],\n strip_prefix = \"serde-1.0.219\",\n build_file = Label(\"@crates//crates:BUILD.serde-1.0.219.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive-1.0.219\",\n sha256 = \"5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive/1.0.219/download\"],\n strip_prefix = \"serde_derive-1.0.219\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive-1.0.219.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive_internals-0.29.1\",\n sha256 = \"18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive_internals/0.29.1/download\"],\n strip_prefix = \"serde_derive_internals-0.29.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive_internals-0.29.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_json-1.0.140\",\n sha256 = \"20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_json/1.0.140/download\"],\n strip_prefix = \"serde_json-1.0.140\",\n build_file = Label(\"@crates//crates:BUILD.serde_json-1.0.140.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_path_to_error-0.1.17\",\n sha256 = \"59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_path_to_error/0.1.17/download\"],\n strip_prefix = \"serde_path_to_error-0.1.17\",\n build_file = Label(\"@crates//crates:BUILD.serde_path_to_error-0.1.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_qs-0.13.0\",\n sha256 = \"cd34f36fe4c5ba9654417139a9b3a20d2e1de6012ee678ad14d240c22c78d8d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_qs/0.13.0/download\"],\n strip_prefix = \"serde_qs-0.13.0\",\n build_file = Label(\"@crates//crates:BUILD.serde_qs-0.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_urlencoded-0.7.1\",\n sha256 = \"d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_urlencoded/0.7.1/download\"],\n strip_prefix = \"serde_urlencoded-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_urlencoded-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha2-0.10.9\",\n sha256 = \"a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha2/0.10.9/download\"],\n strip_prefix = \"sha2-0.10.9\",\n build_file = Label(\"@crates//crates:BUILD.sha2-0.10.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-1.3.0\",\n sha256 = \"0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/1.3.0/download\"],\n strip_prefix = \"shlex-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.shlex-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simple_logger-4.3.3\",\n sha256 = \"8e7e46c8c90251d47d08b28b8a419ffb4aede0f87c2eea95e17d1d5bacbf3ef1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simple_logger/4.3.3/download\"],\n strip_prefix = \"simple_logger-4.3.3\",\n build_file = Label(\"@crates//crates:BUILD.simple_logger-4.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__slab-0.4.10\",\n sha256 = \"04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/slab/0.4.10/download\"],\n strip_prefix = \"slab-0.4.10\",\n build_file = Label(\"@crates//crates:BUILD.slab-0.4.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smallvec-1.15.1\",\n sha256 = \"67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smallvec/1.15.1/download\"],\n strip_prefix = \"smallvec-1.15.1\",\n build_file = Label(\"@crates//crates:BUILD.smallvec-1.15.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.5.10\",\n sha256 = \"e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.5.10/download\"],\n strip_prefix = \"socket2-0.5.10\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.5.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stable_deref_trait-1.2.0\",\n sha256 = \"a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stable_deref_trait/1.2.0/download\"],\n strip_prefix = \"stable_deref_trait-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.stable_deref_trait-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strsim-0.11.1\",\n sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n strip_prefix = \"strsim-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.strsim-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-2.0.104\",\n sha256 = \"17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.104/download\"],\n strip_prefix = \"syn-2.0.104\",\n build_file = Label(\"@crates//crates:BUILD.syn-2.0.104.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sync_wrapper-1.0.2\",\n sha256 = \"0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sync_wrapper/1.0.2/download\"],\n strip_prefix = \"sync_wrapper-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.sync_wrapper-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__synstructure-0.13.2\",\n sha256 = \"728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/synstructure/0.13.2/download\"],\n strip_prefix = \"synstructure-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.synstructure-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tempfile-3.20.0\",\n sha256 = \"e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tempfile/3.20.0/download\"],\n strip_prefix = \"tempfile-3.20.0\",\n build_file = Label(\"@crates//crates:BUILD.tempfile-3.20.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-1.0.69\",\n sha256 = \"b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/1.0.69/download\"],\n strip_prefix = \"thiserror-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-1.0.69\",\n sha256 = \"4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/1.0.69/download\"],\n strip_prefix = \"thiserror-impl-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-0.3.41\",\n sha256 = \"8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time/0.3.41/download\"],\n strip_prefix = \"time-0.3.41\",\n build_file = Label(\"@crates//crates:BUILD.time-0.3.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-core-0.1.4\",\n sha256 = \"c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-core/0.1.4/download\"],\n strip_prefix = \"time-core-0.1.4\",\n build_file = Label(\"@crates//crates:BUILD.time-core-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-macros-0.2.22\",\n sha256 = \"3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-macros/0.2.22/download\"],\n strip_prefix = \"time-macros-0.2.22\",\n build_file = Label(\"@crates//crates:BUILD.time-macros-0.2.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinystr-0.8.1\",\n sha256 = \"5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinystr/0.8.1/download\"],\n strip_prefix = \"tinystr-0.8.1\",\n build_file = Label(\"@crates//crates:BUILD.tinystr-0.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-1.46.1\",\n sha256 = \"0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio/1.46.1/download\"],\n strip_prefix = \"tokio-1.46.1\",\n build_file = Label(\"@crates//crates:BUILD.tokio-1.46.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-macros-2.5.0\",\n sha256 = \"6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-macros/2.5.0/download\"],\n strip_prefix = \"tokio-macros-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.tokio-macros-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-util-0.7.15\",\n sha256 = \"66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-util/0.7.15/download\"],\n strip_prefix = \"tokio-util-0.7.15\",\n build_file = Label(\"@crates//crates:BUILD.tokio-util-0.7.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-0.4.13\",\n sha256 = \"b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower/0.4.13/download\"],\n strip_prefix = \"tower-0.4.13\",\n build_file = Label(\"@crates//crates:BUILD.tower-0.4.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-0.5.2\",\n sha256 = \"d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower/0.5.2/download\"],\n strip_prefix = \"tower-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.tower-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-http-0.5.2\",\n sha256 = \"1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-http/0.5.2/download\"],\n strip_prefix = \"tower-http-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.tower-http-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-layer-0.3.3\",\n sha256 = \"121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-layer/0.3.3/download\"],\n strip_prefix = \"tower-layer-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-layer-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-service-0.3.3\",\n sha256 = \"8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-service/0.3.3/download\"],\n strip_prefix = \"tower-service-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-service-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-0.1.41\",\n sha256 = \"784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing/0.1.41/download\"],\n strip_prefix = \"tracing-0.1.41\",\n build_file = Label(\"@crates//crates:BUILD.tracing-0.1.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-attributes-0.1.30\",\n sha256 = \"81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-attributes/0.1.30/download\"],\n strip_prefix = \"tracing-attributes-0.1.30\",\n build_file = Label(\"@crates//crates:BUILD.tracing-attributes-0.1.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-core-0.1.34\",\n sha256 = \"b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-core/0.1.34/download\"],\n strip_prefix = \"tracing-core-0.1.34\",\n build_file = Label(\"@crates//crates:BUILD.tracing-core-0.1.34.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__try-lock-0.2.5\",\n sha256 = \"e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/try-lock/0.2.5/download\"],\n strip_prefix = \"try-lock-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.try-lock-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__typenum-1.18.0\",\n sha256 = \"1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/typenum/1.18.0/download\"],\n strip_prefix = \"typenum-1.18.0\",\n build_file = Label(\"@crates//crates:BUILD.typenum-1.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-ident-1.0.18\",\n sha256 = \"5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.18/download\"],\n strip_prefix = \"unicode-ident-1.0.18\",\n build_file = Label(\"@crates//crates:BUILD.unicode-ident-1.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__url-2.5.4\",\n sha256 = \"32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/url/2.5.4/download\"],\n strip_prefix = \"url-2.5.4\",\n build_file = Label(\"@crates//crates:BUILD.url-2.5.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8_iter-1.0.4\",\n sha256 = \"b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8_iter/1.0.4/download\"],\n strip_prefix = \"utf8_iter-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.utf8_iter-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8parse-0.2.2\",\n sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n strip_prefix = \"utf8parse-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.utf8parse-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uuid-1.17.0\",\n sha256 = \"3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uuid/1.17.0/download\"],\n strip_prefix = \"uuid-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.uuid-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__vcpkg-0.2.15\",\n sha256 = \"accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/vcpkg/0.2.15/download\"],\n strip_prefix = \"vcpkg-0.2.15\",\n build_file = Label(\"@crates//crates:BUILD.vcpkg-0.2.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__version_check-0.9.5\",\n sha256 = \"0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/version_check/0.9.5/download\"],\n strip_prefix = \"version_check-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.version_check-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__walkdir-2.5.0\",\n sha256 = \"29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/walkdir/2.5.0/download\"],\n strip_prefix = \"walkdir-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.walkdir-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__want-0.3.1\",\n sha256 = \"bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/want/0.3.1/download\"],\n strip_prefix = \"want-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.want-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.11.1-wasi-snapshot-preview1\",\n sha256 = \"ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download\"],\n strip_prefix = \"wasi-0.11.1+wasi-snapshot-preview1\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.14.2-wasi-0.2.4\",\n sha256 = \"9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.14.2+wasi-0.2.4/download\"],\n strip_prefix = \"wasi-0.14.2+wasi-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.14.2+wasi-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-0.2.100\",\n sha256 = \"1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-backend-0.2.100\",\n sha256 = \"2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-backend/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-backend-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-backend-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-0.2.100\",\n sha256 = \"7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-macro-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-support-0.2.100\",\n sha256 = \"8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-macro-support-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-support-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-shared-0.2.100\",\n sha256 = \"1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-shared/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-shared-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-shared-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-util-0.1.9\",\n sha256 = \"cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-util/0.1.9/download\"],\n strip_prefix = \"winapi-util-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.winapi-util-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.48.0\",\n sha256 = \"677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.48.0/download\"],\n strip_prefix = \"windows-sys-0.48.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.48.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.52.0\",\n sha256 = \"282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.52.0/download\"],\n strip_prefix = \"windows-sys-0.52.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.52.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.59.0\",\n sha256 = \"1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.59.0/download\"],\n strip_prefix = \"windows-sys-0.59.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.59.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.60.2\",\n sha256 = \"f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.60.2/download\"],\n strip_prefix = \"windows-sys-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.48.5\",\n sha256 = \"9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.48.5/download\"],\n strip_prefix = \"windows-targets-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.52.6\",\n sha256 = \"9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.52.6/download\"],\n strip_prefix = \"windows-targets-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.53.2\",\n sha256 = \"c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.53.2/download\"],\n strip_prefix = \"windows-targets-0.53.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.53.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.48.5\",\n sha256 = \"2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.52.6\",\n sha256 = \"32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.53.0\",\n sha256 = \"86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.48.5\",\n sha256 = \"dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.52.6\",\n sha256 = \"09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.53.0\",\n sha256 = \"c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.53.0/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.48.5\",\n sha256 = \"a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.48.5/download\"],\n strip_prefix = \"windows_i686_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.52.6\",\n sha256 = \"8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.53.0\",\n sha256 = \"c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.53.0/download\"],\n strip_prefix = \"windows_i686_gnu-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.52.6\",\n sha256 = \"0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.53.0\",\n sha256 = \"9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.48.5\",\n sha256 = \"8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.48.5/download\"],\n strip_prefix = \"windows_i686_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.52.6\",\n sha256 = \"240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.52.6/download\"],\n strip_prefix = \"windows_i686_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.53.0\",\n sha256 = \"581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.53.0/download\"],\n strip_prefix = \"windows_i686_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.48.5\",\n sha256 = \"53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.52.6\",\n sha256 = \"147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.53.0\",\n sha256 = \"2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.48.5\",\n sha256 = \"0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.52.6\",\n sha256 = \"24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.53.0\",\n sha256 = \"0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.48.5\",\n sha256 = \"ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.52.6\",\n sha256 = \"589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.53.0\",\n sha256 = \"271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-rt-0.39.0\",\n sha256 = \"6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen-rt/0.39.0/download\"],\n strip_prefix = \"wit-bindgen-rt-0.39.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-rt-0.39.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__writeable-0.6.1\",\n sha256 = \"ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/writeable/0.6.1/download\"],\n strip_prefix = \"writeable-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.writeable-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-0.8.0\",\n sha256 = \"5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke/0.8.0/download\"],\n strip_prefix = \"yoke-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.yoke-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-derive-0.8.0\",\n sha256 = \"38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke-derive/0.8.0/download\"],\n strip_prefix = \"yoke-derive-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.yoke-derive-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-0.8.26\",\n sha256 = \"1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy/0.8.26/download\"],\n strip_prefix = \"zerocopy-0.8.26\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-0.8.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-derive-0.8.26\",\n sha256 = \"9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy-derive/0.8.26/download\"],\n strip_prefix = \"zerocopy-derive-0.8.26\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-derive-0.8.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-0.1.6\",\n sha256 = \"50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom/0.1.6/download\"],\n strip_prefix = \"zerofrom-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-derive-0.1.6\",\n sha256 = \"d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom-derive/0.1.6/download\"],\n strip_prefix = \"zerofrom-derive-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-derive-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerotrie-0.2.2\",\n sha256 = \"36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerotrie/0.2.2/download\"],\n strip_prefix = \"zerotrie-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.zerotrie-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-0.11.2\",\n sha256 = \"4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec/0.11.2/download\"],\n strip_prefix = \"zerovec-0.11.2\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-0.11.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-derive-0.11.1\",\n sha256 = \"5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec-derive/0.11.1/download\"],\n strip_prefix = \"zerovec-derive-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-derive-0.11.1.bazel\"),\n )\n\n return [\n struct(repo=\"crates__aide-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__async-trait-0.1.88\", is_dev_dep = False),\n struct(repo=\"crates__axum-0.7.9\", is_dev_dep = False),\n struct(repo=\"crates__axum-jsonschema-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__clap-4.5.41\", is_dev_dep = False),\n struct(repo=\"crates__crossbeam-channel-0.5.15\", is_dev_dep = False),\n struct(repo=\"crates__hyper-1.6.0\", is_dev_dep = False),\n struct(repo=\"crates__log-0.4.27\", is_dev_dep = False),\n struct(repo=\"crates__num_cpus-1.17.0\", is_dev_dep = False),\n struct(repo=\"crates__prost-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__prost-build-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__prost-types-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__rusqlite-0.31.0\", is_dev_dep = False),\n struct(repo=\"crates__rust-embed-8.7.2\", is_dev_dep = False),\n struct(repo=\"crates__schemars-0.8.22\", is_dev_dep = False),\n struct(repo=\"crates__serde-1.0.219\", is_dev_dep = False),\n struct(repo=\"crates__serde_json-1.0.140\", is_dev_dep = False),\n struct(repo=\"crates__simple_logger-4.3.3\", is_dev_dep = False),\n struct(repo=\"crates__tempfile-3.20.0\", is_dev_dep = False),\n struct(repo=\"crates__tokio-1.46.1\", is_dev_dep = False),\n struct(repo=\"crates__tower-0.4.13\", is_dev_dep = False),\n struct(repo=\"crates__tower-http-0.5.2\", is_dev_dep = False),\n struct(repo=\"crates__uuid-1.17.0\", is_dev_dep = False),\n ]\n" + "defs.bzl": "###############################################################################\n# @generated\n# DO NOT MODIFY: This file is auto-generated by a crate_universe tool. To \n# regenerate this file, run the following:\n#\n# bazel mod show_repo 'databuild'\n###############################################################################\n\"\"\"\n# `crates_repository` API\n\n- [aliases](#aliases)\n- [crate_deps](#crate_deps)\n- [all_crate_deps](#all_crate_deps)\n- [crate_repositories](#crate_repositories)\n\n\"\"\"\n\nload(\"@bazel_tools//tools/build_defs/repo:git.bzl\", \"new_git_repository\")\nload(\"@bazel_tools//tools/build_defs/repo:http.bzl\", \"http_archive\")\nload(\"@bazel_tools//tools/build_defs/repo:utils.bzl\", \"maybe\")\nload(\"@bazel_skylib//lib:selects.bzl\", \"selects\")\nload(\"@rules_rust//crate_universe/private:local_crate_mirror.bzl\", \"local_crate_mirror\")\n\n###############################################################################\n# MACROS API\n###############################################################################\n\n# An identifier that represent common dependencies (unconditional).\n_COMMON_CONDITION = \"\"\n\ndef _flatten_dependency_maps(all_dependency_maps):\n \"\"\"Flatten a list of dependency maps into one dictionary.\n\n Dependency maps have the following structure:\n\n ```python\n DEPENDENCIES_MAP = {\n # The first key in the map is a Bazel package\n # name of the workspace this file is defined in.\n \"workspace_member_package\": {\n\n # Not all dependencies are supported for all platforms.\n # the condition key is the condition required to be true\n # on the host platform.\n \"condition\": {\n\n # An alias to a crate target. # The label of the crate target the\n # Aliases are only crate names. # package name refers to.\n \"package_name\": \"@full//:label\",\n }\n }\n }\n ```\n\n Args:\n all_dependency_maps (list): A list of dicts as described above\n\n Returns:\n dict: A dictionary as described above\n \"\"\"\n dependencies = {}\n\n for workspace_deps_map in all_dependency_maps:\n for pkg_name, conditional_deps_map in workspace_deps_map.items():\n if pkg_name not in dependencies:\n non_frozen_map = dict()\n for key, values in conditional_deps_map.items():\n non_frozen_map.update({key: dict(values.items())})\n dependencies.setdefault(pkg_name, non_frozen_map)\n continue\n\n for condition, deps_map in conditional_deps_map.items():\n # If the condition has not been recorded, do so and continue\n if condition not in dependencies[pkg_name]:\n dependencies[pkg_name].setdefault(condition, dict(deps_map.items()))\n continue\n\n # Alert on any miss-matched dependencies\n inconsistent_entries = []\n for crate_name, crate_label in deps_map.items():\n existing = dependencies[pkg_name][condition].get(crate_name)\n if existing and existing != crate_label:\n inconsistent_entries.append((crate_name, existing, crate_label))\n dependencies[pkg_name][condition].update({crate_name: crate_label})\n\n return dependencies\n\ndef crate_deps(deps, package_name = None):\n \"\"\"Finds the fully qualified label of the requested crates for the package where this macro is called.\n\n Args:\n deps (list): The desired list of crate targets.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()`.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if not deps:\n return []\n\n if package_name == None:\n package_name = native.package_name()\n\n # Join both sets of dependencies\n dependencies = _flatten_dependency_maps([\n _NORMAL_DEPENDENCIES,\n _NORMAL_DEV_DEPENDENCIES,\n _PROC_MACRO_DEPENDENCIES,\n _PROC_MACRO_DEV_DEPENDENCIES,\n _BUILD_DEPENDENCIES,\n _BUILD_PROC_MACRO_DEPENDENCIES,\n ]).pop(package_name, {})\n\n # Combine all conditional packages so we can easily index over a flat list\n # TODO: Perhaps this should actually return select statements and maintain\n # the conditionals of the dependencies\n flat_deps = {}\n for deps_set in dependencies.values():\n for crate_name, crate_label in deps_set.items():\n flat_deps.update({crate_name: crate_label})\n\n missing_crates = []\n crate_targets = []\n for crate_target in deps:\n if crate_target not in flat_deps:\n missing_crates.append(crate_target)\n else:\n crate_targets.append(flat_deps[crate_target])\n\n if missing_crates:\n fail(\"Could not find crates `{}` among dependencies of `{}`. Available dependencies were `{}`\".format(\n missing_crates,\n package_name,\n dependencies,\n ))\n\n return crate_targets\n\ndef all_crate_deps(\n normal = False, \n normal_dev = False, \n proc_macro = False, \n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Finds the fully qualified label of all requested direct crate dependencies \\\n for the package where this macro is called.\n\n If no parameters are set, all normal dependencies are returned. Setting any one flag will\n otherwise impact the contents of the returned list.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n list: A list of labels to generated rust targets (str)\n \"\"\"\n\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_dependency_maps = []\n if normal:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n if normal_dev:\n all_dependency_maps.append(_NORMAL_DEV_DEPENDENCIES)\n if proc_macro:\n all_dependency_maps.append(_PROC_MACRO_DEPENDENCIES)\n if proc_macro_dev:\n all_dependency_maps.append(_PROC_MACRO_DEV_DEPENDENCIES)\n if build:\n all_dependency_maps.append(_BUILD_DEPENDENCIES)\n if build_proc_macro:\n all_dependency_maps.append(_BUILD_PROC_MACRO_DEPENDENCIES)\n\n # Default to always using normal dependencies\n if not all_dependency_maps:\n all_dependency_maps.append(_NORMAL_DEPENDENCIES)\n\n dependencies = _flatten_dependency_maps(all_dependency_maps).pop(package_name, None)\n\n if not dependencies:\n if dependencies == None:\n fail(\"Tried to get all_crate_deps for package \" + package_name + \" but that package had no Cargo.toml file\")\n else:\n return []\n\n crate_deps = list(dependencies.pop(_COMMON_CONDITION, {}).values())\n for condition, deps in dependencies.items():\n crate_deps += selects.with_or({\n tuple(_CONDITIONS[condition]): deps.values(),\n \"//conditions:default\": [],\n })\n\n return crate_deps\n\ndef aliases(\n normal = False,\n normal_dev = False,\n proc_macro = False,\n proc_macro_dev = False,\n build = False,\n build_proc_macro = False,\n package_name = None):\n \"\"\"Produces a map of Crate alias names to their original label\n\n If no dependency kinds are specified, `normal` and `proc_macro` are used by default.\n Setting any one flag will otherwise determine the contents of the returned dict.\n\n Args:\n normal (bool, optional): If True, normal dependencies are included in the\n output list.\n normal_dev (bool, optional): If True, normal dev dependencies will be\n included in the output list..\n proc_macro (bool, optional): If True, proc_macro dependencies are included\n in the output list.\n proc_macro_dev (bool, optional): If True, dev proc_macro dependencies are\n included in the output list.\n build (bool, optional): If True, build dependencies are included\n in the output list.\n build_proc_macro (bool, optional): If True, build proc_macro dependencies are\n included in the output list.\n package_name (str, optional): The package name of the set of dependencies to look up.\n Defaults to `native.package_name()` when unset.\n\n Returns:\n dict: The aliases of all associated packages\n \"\"\"\n if package_name == None:\n package_name = native.package_name()\n\n # Determine the relevant maps to use\n all_aliases_maps = []\n if normal:\n all_aliases_maps.append(_NORMAL_ALIASES)\n if normal_dev:\n all_aliases_maps.append(_NORMAL_DEV_ALIASES)\n if proc_macro:\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n if proc_macro_dev:\n all_aliases_maps.append(_PROC_MACRO_DEV_ALIASES)\n if build:\n all_aliases_maps.append(_BUILD_ALIASES)\n if build_proc_macro:\n all_aliases_maps.append(_BUILD_PROC_MACRO_ALIASES)\n\n # Default to always using normal aliases\n if not all_aliases_maps:\n all_aliases_maps.append(_NORMAL_ALIASES)\n all_aliases_maps.append(_PROC_MACRO_ALIASES)\n\n aliases = _flatten_dependency_maps(all_aliases_maps).pop(package_name, None)\n\n if not aliases:\n return dict()\n\n common_items = aliases.pop(_COMMON_CONDITION, {}).items()\n\n # If there are only common items in the dictionary, immediately return them\n if not len(aliases.keys()) == 1:\n return dict(common_items)\n\n # Build a single select statement where each conditional has accounted for the\n # common set of aliases.\n crate_aliases = {\"//conditions:default\": dict(common_items)}\n for condition, deps in aliases.items():\n condition_triples = _CONDITIONS[condition]\n for triple in condition_triples:\n if triple in crate_aliases:\n crate_aliases[triple].update(deps)\n else:\n crate_aliases.update({triple: dict(deps.items() + common_items)})\n\n return select(crate_aliases)\n\n###############################################################################\n# WORKSPACE MEMBER DEPS AND ALIASES\n###############################################################################\n\n_NORMAL_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"aide\": Label(\"@crates//:aide-0.13.5\"),\n \"axum\": Label(\"@crates//:axum-0.7.9\"),\n \"axum-jsonschema\": Label(\"@crates//:axum-jsonschema-0.8.0\"),\n \"clap\": Label(\"@crates//:clap-4.5.41\"),\n \"crossbeam-channel\": Label(\"@crates//:crossbeam-channel-0.5.15\"),\n \"hyper\": Label(\"@crates//:hyper-1.6.0\"),\n \"log\": Label(\"@crates//:log-0.4.27\"),\n \"num_cpus\": Label(\"@crates//:num_cpus-1.17.0\"),\n \"prost\": Label(\"@crates//:prost-0.13.5\"),\n \"prost-build\": Label(\"@crates//:prost-build-0.13.5\"),\n \"prost-types\": Label(\"@crates//:prost-types-0.13.5\"),\n \"rusqlite\": Label(\"@crates//:rusqlite-0.31.0\"),\n \"rust-embed\": Label(\"@crates//:rust-embed-8.7.2\"),\n \"schemars\": Label(\"@crates//:schemars-0.8.22\"),\n \"serde\": Label(\"@crates//:serde-1.0.219\"),\n \"serde_json\": Label(\"@crates//:serde_json-1.0.140\"),\n \"simple_logger\": Label(\"@crates//:simple_logger-4.3.3\"),\n \"tempfile\": Label(\"@crates//:tempfile-3.20.0\"),\n \"thiserror\": Label(\"@crates//:thiserror-1.0.69\"),\n \"tokio\": Label(\"@crates//:tokio-1.46.1\"),\n \"tower\": Label(\"@crates//:tower-0.4.13\"),\n \"tower-http\": Label(\"@crates//:tower-http-0.5.2\"),\n \"uuid\": Label(\"@crates//:uuid-1.17.0\"),\n },\n },\n}\n\n\n_NORMAL_ALIASES = {\n \"\": {\n _COMMON_CONDITION: {\n },\n },\n}\n\n\n_NORMAL_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_NORMAL_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n _COMMON_CONDITION: {\n \"async-trait\": Label(\"@crates//:async-trait-0.1.88\"),\n },\n },\n}\n\n\n_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_PROC_MACRO_DEV_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_ALIASES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_DEPENDENCIES = {\n \"\": {\n },\n}\n\n\n_BUILD_PROC_MACRO_ALIASES = {\n \"\": {\n },\n}\n\n\n_CONDITIONS = {\n \"aarch64-apple-darwin\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"aarch64-linux-android\": [],\n \"aarch64-pc-windows-gnullvm\": [],\n \"aarch64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(any(target_arch = \\\"x86_64\\\", target_arch = \\\"arm64ec\\\"), target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(all(any(target_os = \\\"android\\\", target_os = \\\"linux\\\"), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [],\n \"cfg(all(any(target_os = \\\"linux\\\", target_os = \\\"android\\\"), not(any(all(target_os = \\\"linux\\\", target_env = \\\"\\\"), getrandom_backend = \\\"custom\\\", getrandom_backend = \\\"linux_raw\\\", getrandom_backend = \\\"rdrand\\\", getrandom_backend = \\\"rndr\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(rustix_use_libc), not(miri), target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\"))))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(not(windows), any(rustix_use_libc, miri, not(all(target_os = \\\"linux\\\", any(target_endian = \\\"little\\\", any(target_arch = \\\"s390x\\\", target_arch = \\\"powerpc\\\")), any(target_arch = \\\"arm\\\", all(target_arch = \\\"aarch64\\\", target_pointer_width = \\\"64\\\"), target_arch = \\\"riscv64\\\", all(rustix_use_experimental_asm, target_arch = \\\"powerpc\\\"), all(rustix_use_experimental_asm, target_arch = \\\"powerpc64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"s390x\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips32r6\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64\\\"), all(rustix_use_experimental_asm, target_arch = \\\"mips64r6\\\"), target_arch = \\\"x86\\\", all(target_arch = \\\"x86_64\\\", target_pointer_width = \\\"64\\\")))))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_os = \\\"linux\\\"))\": [\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\"],\n \"cfg(all(target_arch = \\\"aarch64\\\", target_vendor = \\\"apple\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(all(target_arch = \\\"loongarch64\\\", target_os = \\\"linux\\\"))\": [],\n \"cfg(all(target_arch = \\\"wasm32\\\", target_os = \\\"wasi\\\", target_env = \\\"p2\\\"))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"gnu\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"gnu\\\", not(target_abi = \\\"llvm\\\"), not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(all(target_arch = \\\"x86_64\\\", target_env = \\\"msvc\\\", not(windows_raw_dylib)))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(all(target_os = \\\"uefi\\\", getrandom_backend = \\\"efi_rng\\\"))\": [],\n \"cfg(all(tokio_uring, target_os = \\\"linux\\\"))\": [],\n \"cfg(any())\": [],\n \"cfg(any(target_arch = \\\"aarch64\\\", target_arch = \\\"x86_64\\\", target_arch = \\\"x86\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any(target_os = \\\"dragonfly\\\", target_os = \\\"freebsd\\\", target_os = \\\"hurd\\\", target_os = \\\"illumos\\\", target_os = \\\"cygwin\\\", all(target_os = \\\"horizon\\\", target_arch = \\\"arm\\\")))\": [],\n \"cfg(any(target_os = \\\"haiku\\\", target_os = \\\"redox\\\", target_os = \\\"nto\\\", target_os = \\\"aix\\\"))\": [],\n \"cfg(any(target_os = \\\"ios\\\", target_os = \\\"visionos\\\", target_os = \\\"watchos\\\", target_os = \\\"tvos\\\"))\": [],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"ios\\\", target_os = \\\"freebsd\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(target_os = \\\"macos\\\", target_os = \\\"openbsd\\\", target_os = \\\"vita\\\", target_os = \\\"emscripten\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\"],\n \"cfg(any(unix, target_os = \\\"wasi\\\"))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(any(windows, target_os = \\\"cygwin\\\"))\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"cfg(not(all(target_arch = \\\"arm\\\", target_os = \\\"none\\\")))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(all(windows, target_env = \\\"msvc\\\", not(target_vendor = \\\"uwp\\\"))))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(not(windows))\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(target_arch = \\\"wasm32\\\")\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\",\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(target_os = \\\"hermit\\\")\": [],\n \"cfg(target_os = \\\"netbsd\\\")\": [],\n \"cfg(target_os = \\\"redox\\\")\": [],\n \"cfg(target_os = \\\"solaris\\\")\": [],\n \"cfg(target_os = \\\"vxworks\\\")\": [],\n \"cfg(target_os = \\\"wasi\\\")\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"cfg(tokio_taskdump)\": [],\n \"cfg(unix)\": [\"@rules_rust//rust/platform:aarch64-apple-darwin\",\"@rules_rust//rust/platform:aarch64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"cfg(windows)\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"i686-pc-windows-gnullvm\": [],\n \"wasm32-unknown-unknown\": [\"@rules_rust//rust/platform:wasm32-unknown-unknown\"],\n \"wasm32-wasip1\": [\"@rules_rust//rust/platform:wasm32-wasip1\"],\n \"x86_64-pc-windows-gnullvm\": [],\n \"x86_64-pc-windows-msvc\": [\"@rules_rust//rust/platform:x86_64-pc-windows-msvc\"],\n \"x86_64-unknown-linux-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-linux-gnu\",\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n \"x86_64-unknown-nixos-gnu\": [\"@rules_rust//rust/platform:x86_64-unknown-nixos-gnu\"],\n}\n\n###############################################################################\n\ndef crate_repositories():\n \"\"\"A macro for defining repositories for all generated crates.\n\n Returns:\n A list of repos visible to the module through the module extension.\n \"\"\"\n maybe(\n http_archive,\n name = \"crates__addr2line-0.24.2\",\n sha256 = \"dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/addr2line/0.24.2/download\"],\n strip_prefix = \"addr2line-0.24.2\",\n build_file = Label(\"@crates//crates:BUILD.addr2line-0.24.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__adler2-2.0.1\",\n sha256 = \"320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/adler2/2.0.1/download\"],\n strip_prefix = \"adler2-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.adler2-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ahash-0.8.12\",\n sha256 = \"5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ahash/0.8.12/download\"],\n strip_prefix = \"ahash-0.8.12\",\n build_file = Label(\"@crates//crates:BUILD.ahash-0.8.12.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aho-corasick-1.1.3\",\n sha256 = \"8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aho-corasick/1.1.3/download\"],\n strip_prefix = \"aho-corasick-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.aho-corasick-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__aide-0.13.5\",\n sha256 = \"5678d2978845ddb4bd736a026f467dd652d831e9e6254b0e41b07f7ee7523309\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/aide/0.13.5/download\"],\n strip_prefix = \"aide-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.aide-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstream-0.6.19\",\n sha256 = \"301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstream/0.6.19/download\"],\n strip_prefix = \"anstream-0.6.19\",\n build_file = Label(\"@crates//crates:BUILD.anstream-0.6.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-1.0.11\",\n sha256 = \"862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle/1.0.11/download\"],\n strip_prefix = \"anstyle-1.0.11\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-1.0.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-parse-0.2.7\",\n sha256 = \"4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-parse/0.2.7/download\"],\n strip_prefix = \"anstyle-parse-0.2.7\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-parse-0.2.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-query-1.1.3\",\n sha256 = \"6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-query/1.1.3/download\"],\n strip_prefix = \"anstyle-query-1.1.3\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-query-1.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anstyle-wincon-3.0.9\",\n sha256 = \"403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anstyle-wincon/3.0.9/download\"],\n strip_prefix = \"anstyle-wincon-3.0.9\",\n build_file = Label(\"@crates//crates:BUILD.anstyle-wincon-3.0.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__anyhow-1.0.98\",\n sha256 = \"e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/anyhow/1.0.98/download\"],\n strip_prefix = \"anyhow-1.0.98\",\n build_file = Label(\"@crates//crates:BUILD.anyhow-1.0.98.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__async-trait-0.1.88\",\n sha256 = \"e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/async-trait/0.1.88/download\"],\n strip_prefix = \"async-trait-0.1.88\",\n build_file = Label(\"@crates//crates:BUILD.async-trait-0.1.88.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__atomic-waker-1.1.2\",\n sha256 = \"1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/atomic-waker/1.1.2/download\"],\n strip_prefix = \"atomic-waker-1.1.2\",\n build_file = Label(\"@crates//crates:BUILD.atomic-waker-1.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__autocfg-1.5.0\",\n sha256 = \"c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/autocfg/1.5.0/download\"],\n strip_prefix = \"autocfg-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.autocfg-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-0.7.9\",\n sha256 = \"edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum/0.7.9/download\"],\n strip_prefix = \"axum-0.7.9\",\n build_file = Label(\"@crates//crates:BUILD.axum-0.7.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-core-0.4.5\",\n sha256 = \"09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum-core/0.4.5/download\"],\n strip_prefix = \"axum-core-0.4.5\",\n build_file = Label(\"@crates//crates:BUILD.axum-core-0.4.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__axum-jsonschema-0.8.0\",\n sha256 = \"fcffe29ca1b60172349fea781ec34441d598809bd227ccbb5bf5dc2879cd9c78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/axum-jsonschema/0.8.0/download\"],\n strip_prefix = \"axum-jsonschema-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.axum-jsonschema-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__backtrace-0.3.75\",\n sha256 = \"6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/backtrace/0.3.75/download\"],\n strip_prefix = \"backtrace-0.3.75\",\n build_file = Label(\"@crates//crates:BUILD.backtrace-0.3.75.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__base64-0.21.7\",\n sha256 = \"9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/base64/0.21.7/download\"],\n strip_prefix = \"base64-0.21.7\",\n build_file = Label(\"@crates//crates:BUILD.base64-0.21.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-set-0.5.3\",\n sha256 = \"0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-set/0.5.3/download\"],\n strip_prefix = \"bit-set-0.5.3\",\n build_file = Label(\"@crates//crates:BUILD.bit-set-0.5.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bit-vec-0.6.3\",\n sha256 = \"349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bit-vec/0.6.3/download\"],\n strip_prefix = \"bit-vec-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.bit-vec-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bitflags-2.9.1\",\n sha256 = \"1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bitflags/2.9.1/download\"],\n strip_prefix = \"bitflags-2.9.1\",\n build_file = Label(\"@crates//crates:BUILD.bitflags-2.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__block-buffer-0.10.4\",\n sha256 = \"3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/block-buffer/0.10.4/download\"],\n strip_prefix = \"block-buffer-0.10.4\",\n build_file = Label(\"@crates//crates:BUILD.block-buffer-0.10.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bumpalo-3.19.0\",\n sha256 = \"46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bumpalo/3.19.0/download\"],\n strip_prefix = \"bumpalo-3.19.0\",\n build_file = Label(\"@crates//crates:BUILD.bumpalo-3.19.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytecount-0.6.9\",\n sha256 = \"175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytecount/0.6.9/download\"],\n strip_prefix = \"bytecount-0.6.9\",\n build_file = Label(\"@crates//crates:BUILD.bytecount-0.6.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__bytes-1.10.1\",\n sha256 = \"d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/bytes/1.10.1/download\"],\n strip_prefix = \"bytes-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.bytes-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cc-1.2.29\",\n sha256 = \"5c1599538de2394445747c8cf7935946e3cc27e9625f889d979bfb2aaf569362\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cc/1.2.29/download\"],\n strip_prefix = \"cc-1.2.29\",\n build_file = Label(\"@crates//crates:BUILD.cc-1.2.29.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cfg-if-1.0.1\",\n sha256 = \"9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cfg-if/1.0.1/download\"],\n strip_prefix = \"cfg-if-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.cfg-if-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap-4.5.41\",\n sha256 = \"be92d32e80243a54711e5d7ce823c35c41c9d929dc4ab58e1276f625841aadf9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap/4.5.41/download\"],\n strip_prefix = \"clap-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_builder-4.5.41\",\n sha256 = \"707eab41e9622f9139419d573eca0900137718000c517d47da73045f54331c3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_builder/4.5.41/download\"],\n strip_prefix = \"clap_builder-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap_builder-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_derive-4.5.41\",\n sha256 = \"ef4f52386a59ca4c860f7393bcf8abd8dfd91ecccc0f774635ff68e92eeef491\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_derive/4.5.41/download\"],\n strip_prefix = \"clap_derive-4.5.41\",\n build_file = Label(\"@crates//crates:BUILD.clap_derive-4.5.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__clap_lex-0.7.5\",\n sha256 = \"b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/clap_lex/0.7.5/download\"],\n strip_prefix = \"clap_lex-0.7.5\",\n build_file = Label(\"@crates//crates:BUILD.clap_lex-0.7.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colorchoice-1.0.4\",\n sha256 = \"b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colorchoice/1.0.4/download\"],\n strip_prefix = \"colorchoice-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.colorchoice-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__colored-2.2.0\",\n sha256 = \"117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/colored/2.2.0/download\"],\n strip_prefix = \"colored-2.2.0\",\n build_file = Label(\"@crates//crates:BUILD.colored-2.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__cpufeatures-0.2.17\",\n sha256 = \"59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/cpufeatures/0.2.17/download\"],\n strip_prefix = \"cpufeatures-0.2.17\",\n build_file = Label(\"@crates//crates:BUILD.cpufeatures-0.2.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-channel-0.5.15\",\n sha256 = \"82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-channel/0.5.15/download\"],\n strip_prefix = \"crossbeam-channel-0.5.15\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-channel-0.5.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crossbeam-utils-0.8.21\",\n sha256 = \"d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crossbeam-utils/0.8.21/download\"],\n strip_prefix = \"crossbeam-utils-0.8.21\",\n build_file = Label(\"@crates//crates:BUILD.crossbeam-utils-0.8.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__crypto-common-0.1.6\",\n sha256 = \"1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/crypto-common/0.1.6/download\"],\n strip_prefix = \"crypto-common-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.crypto-common-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__deranged-0.4.0\",\n sha256 = \"9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/deranged/0.4.0/download\"],\n strip_prefix = \"deranged-0.4.0\",\n build_file = Label(\"@crates//crates:BUILD.deranged-0.4.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__digest-0.10.7\",\n sha256 = \"9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/digest/0.10.7/download\"],\n strip_prefix = \"digest-0.10.7\",\n build_file = Label(\"@crates//crates:BUILD.digest-0.10.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__displaydoc-0.2.5\",\n sha256 = \"97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/displaydoc/0.2.5/download\"],\n strip_prefix = \"displaydoc-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.displaydoc-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__dyn-clone-1.0.19\",\n sha256 = \"1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/dyn-clone/1.0.19/download\"],\n strip_prefix = \"dyn-clone-1.0.19\",\n build_file = Label(\"@crates//crates:BUILD.dyn-clone-1.0.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__either-1.15.0\",\n sha256 = \"48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/either/1.15.0/download\"],\n strip_prefix = \"either-1.15.0\",\n build_file = Label(\"@crates//crates:BUILD.either-1.15.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__equivalent-1.0.2\",\n sha256 = \"877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/equivalent/1.0.2/download\"],\n strip_prefix = \"equivalent-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.equivalent-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__errno-0.3.13\",\n sha256 = \"778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/errno/0.3.13/download\"],\n strip_prefix = \"errno-0.3.13\",\n build_file = Label(\"@crates//crates:BUILD.errno-0.3.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fallible-iterator-0.3.0\",\n sha256 = \"2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fallible-iterator/0.3.0/download\"],\n strip_prefix = \"fallible-iterator-0.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fallible-iterator-0.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fallible-streaming-iterator-0.1.9\",\n sha256 = \"7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fallible-streaming-iterator/0.1.9/download\"],\n strip_prefix = \"fallible-streaming-iterator-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.fallible-streaming-iterator-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fancy-regex-0.11.0\",\n sha256 = \"b95f7c0680e4142284cf8b22c14a476e87d61b004a3a0861872b32ef7ead40a2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fancy-regex/0.11.0/download\"],\n strip_prefix = \"fancy-regex-0.11.0\",\n build_file = Label(\"@crates//crates:BUILD.fancy-regex-0.11.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fastrand-2.3.0\",\n sha256 = \"37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fastrand/2.3.0/download\"],\n strip_prefix = \"fastrand-2.3.0\",\n build_file = Label(\"@crates//crates:BUILD.fastrand-2.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fixedbitset-0.5.7\",\n sha256 = \"1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fixedbitset/0.5.7/download\"],\n strip_prefix = \"fixedbitset-0.5.7\",\n build_file = Label(\"@crates//crates:BUILD.fixedbitset-0.5.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fnv-1.0.7\",\n sha256 = \"3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fnv/1.0.7/download\"],\n strip_prefix = \"fnv-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.fnv-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__form_urlencoded-1.2.1\",\n sha256 = \"e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/form_urlencoded/1.2.1/download\"],\n strip_prefix = \"form_urlencoded-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.form_urlencoded-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__fraction-0.13.1\",\n sha256 = \"3027ae1df8d41b4bed2241c8fdad4acc1e7af60c8e17743534b545e77182d678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/fraction/0.13.1/download\"],\n strip_prefix = \"fraction-0.13.1\",\n build_file = Label(\"@crates//crates:BUILD.fraction-0.13.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-0.3.31\",\n sha256 = \"65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures/0.3.31/download\"],\n strip_prefix = \"futures-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-channel-0.3.31\",\n sha256 = \"2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-channel/0.3.31/download\"],\n strip_prefix = \"futures-channel-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-channel-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-core-0.3.31\",\n sha256 = \"05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-core/0.3.31/download\"],\n strip_prefix = \"futures-core-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-core-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-executor-0.3.31\",\n sha256 = \"1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-executor/0.3.31/download\"],\n strip_prefix = \"futures-executor-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-executor-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-io-0.3.31\",\n sha256 = \"9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-io/0.3.31/download\"],\n strip_prefix = \"futures-io-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-io-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-macro-0.3.31\",\n sha256 = \"162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-macro/0.3.31/download\"],\n strip_prefix = \"futures-macro-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-macro-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-sink-0.3.31\",\n sha256 = \"e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-sink/0.3.31/download\"],\n strip_prefix = \"futures-sink-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-sink-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-task-0.3.31\",\n sha256 = \"f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-task/0.3.31/download\"],\n strip_prefix = \"futures-task-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-task-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__futures-util-0.3.31\",\n sha256 = \"9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/futures-util/0.3.31/download\"],\n strip_prefix = \"futures-util-0.3.31\",\n build_file = Label(\"@crates//crates:BUILD.futures-util-0.3.31.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__generic-array-0.14.7\",\n sha256 = \"85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/generic-array/0.14.7/download\"],\n strip_prefix = \"generic-array-0.14.7\",\n build_file = Label(\"@crates//crates:BUILD.generic-array-0.14.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.2.16\",\n sha256 = \"335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.2.16/download\"],\n strip_prefix = \"getrandom-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__getrandom-0.3.3\",\n sha256 = \"26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/getrandom/0.3.3/download\"],\n strip_prefix = \"getrandom-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.getrandom-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__gimli-0.31.1\",\n sha256 = \"07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/gimli/0.31.1/download\"],\n strip_prefix = \"gimli-0.31.1\",\n build_file = Label(\"@crates//crates:BUILD.gimli-0.31.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__h2-0.4.11\",\n sha256 = \"17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/h2/0.4.11/download\"],\n strip_prefix = \"h2-0.4.11\",\n build_file = Label(\"@crates//crates:BUILD.h2-0.4.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.14.5\",\n sha256 = \"e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.14.5/download\"],\n strip_prefix = \"hashbrown-0.14.5\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.14.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashbrown-0.15.4\",\n sha256 = \"5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashbrown/0.15.4/download\"],\n strip_prefix = \"hashbrown-0.15.4\",\n build_file = Label(\"@crates//crates:BUILD.hashbrown-0.15.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hashlink-0.9.1\",\n sha256 = \"6ba4ff7128dee98c7dc9794b6a411377e1404dba1c97deb8d1a55297bd25d8af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hashlink/0.9.1/download\"],\n strip_prefix = \"hashlink-0.9.1\",\n build_file = Label(\"@crates//crates:BUILD.hashlink-0.9.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__heck-0.5.0\",\n sha256 = \"2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/heck/0.5.0/download\"],\n strip_prefix = \"heck-0.5.0\",\n build_file = Label(\"@crates//crates:BUILD.heck-0.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hermit-abi-0.5.2\",\n sha256 = \"fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hermit-abi/0.5.2/download\"],\n strip_prefix = \"hermit-abi-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.hermit-abi-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-1.3.1\",\n sha256 = \"f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http/1.3.1/download\"],\n strip_prefix = \"http-1.3.1\",\n build_file = Label(\"@crates//crates:BUILD.http-1.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-1.0.1\",\n sha256 = \"1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body/1.0.1/download\"],\n strip_prefix = \"http-body-1.0.1\",\n build_file = Label(\"@crates//crates:BUILD.http-body-1.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__http-body-util-0.1.3\",\n sha256 = \"b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/http-body-util/0.1.3/download\"],\n strip_prefix = \"http-body-util-0.1.3\",\n build_file = Label(\"@crates//crates:BUILD.http-body-util-0.1.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__httparse-1.10.1\",\n sha256 = \"6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/httparse/1.10.1/download\"],\n strip_prefix = \"httparse-1.10.1\",\n build_file = Label(\"@crates//crates:BUILD.httparse-1.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__httpdate-1.0.3\",\n sha256 = \"df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/httpdate/1.0.3/download\"],\n strip_prefix = \"httpdate-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.httpdate-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-1.6.0\",\n sha256 = \"cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper/1.6.0/download\"],\n strip_prefix = \"hyper-1.6.0\",\n build_file = Label(\"@crates//crates:BUILD.hyper-1.6.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__hyper-util-0.1.15\",\n sha256 = \"7f66d5bd4c6f02bf0542fad85d626775bab9258cf795a4256dcaf3161114d1df\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/hyper-util/0.1.15/download\"],\n strip_prefix = \"hyper-util-0.1.15\",\n build_file = Label(\"@crates//crates:BUILD.hyper-util-0.1.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_collections-2.0.0\",\n sha256 = \"200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_collections/2.0.0/download\"],\n strip_prefix = \"icu_collections-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_collections-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_locale_core-2.0.0\",\n sha256 = \"0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_locale_core/2.0.0/download\"],\n strip_prefix = \"icu_locale_core-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_locale_core-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer-2.0.0\",\n sha256 = \"436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer/2.0.0/download\"],\n strip_prefix = \"icu_normalizer-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_normalizer_data-2.0.0\",\n sha256 = \"00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_normalizer_data/2.0.0/download\"],\n strip_prefix = \"icu_normalizer_data-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_normalizer_data-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties-2.0.1\",\n sha256 = \"016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties/2.0.1/download\"],\n strip_prefix = \"icu_properties-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_properties_data-2.0.1\",\n sha256 = \"298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_properties_data/2.0.1/download\"],\n strip_prefix = \"icu_properties_data-2.0.1\",\n build_file = Label(\"@crates//crates:BUILD.icu_properties_data-2.0.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__icu_provider-2.0.0\",\n sha256 = \"03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/icu_provider/2.0.0/download\"],\n strip_prefix = \"icu_provider-2.0.0\",\n build_file = Label(\"@crates//crates:BUILD.icu_provider-2.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna-1.0.3\",\n sha256 = \"686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna/1.0.3/download\"],\n strip_prefix = \"idna-1.0.3\",\n build_file = Label(\"@crates//crates:BUILD.idna-1.0.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__idna_adapter-1.2.1\",\n sha256 = \"3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/idna_adapter/1.2.1/download\"],\n strip_prefix = \"idna_adapter-1.2.1\",\n build_file = Label(\"@crates//crates:BUILD.idna_adapter-1.2.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__indexmap-2.10.0\",\n sha256 = \"fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/indexmap/2.10.0/download\"],\n strip_prefix = \"indexmap-2.10.0\",\n build_file = Label(\"@crates//crates:BUILD.indexmap-2.10.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__io-uring-0.7.8\",\n sha256 = \"b86e202f00093dcba4275d4636b93ef9dd75d025ae560d2521b45ea28ab49013\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/io-uring/0.7.8/download\"],\n strip_prefix = \"io-uring-0.7.8\",\n build_file = Label(\"@crates//crates:BUILD.io-uring-0.7.8.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__is_terminal_polyfill-1.70.1\",\n sha256 = \"7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/is_terminal_polyfill/1.70.1/download\"],\n strip_prefix = \"is_terminal_polyfill-1.70.1\",\n build_file = Label(\"@crates//crates:BUILD.is_terminal_polyfill-1.70.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__iso8601-0.6.3\",\n sha256 = \"e1082f0c48f143442a1ac6122f67e360ceee130b967af4d50996e5154a45df46\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/iso8601/0.6.3/download\"],\n strip_prefix = \"iso8601-0.6.3\",\n build_file = Label(\"@crates//crates:BUILD.iso8601-0.6.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.12.1\",\n sha256 = \"ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.12.1/download\"],\n strip_prefix = \"itertools-0.12.1\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.12.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itertools-0.14.0\",\n sha256 = \"2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itertools/0.14.0/download\"],\n strip_prefix = \"itertools-0.14.0\",\n build_file = Label(\"@crates//crates:BUILD.itertools-0.14.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__itoa-1.0.15\",\n sha256 = \"4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/itoa/1.0.15/download\"],\n strip_prefix = \"itoa-1.0.15\",\n build_file = Label(\"@crates//crates:BUILD.itoa-1.0.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__js-sys-0.3.77\",\n sha256 = \"1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/js-sys/0.3.77/download\"],\n strip_prefix = \"js-sys-0.3.77\",\n build_file = Label(\"@crates//crates:BUILD.js-sys-0.3.77.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__jsonschema-0.17.1\",\n sha256 = \"2a071f4f7efc9a9118dfb627a0a94ef247986e1ab8606a4c806ae2b3aa3b6978\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/jsonschema/0.17.1/download\"],\n strip_prefix = \"jsonschema-0.17.1\",\n build_file = Label(\"@crates//crates:BUILD.jsonschema-0.17.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lazy_static-1.5.0\",\n sha256 = \"bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lazy_static/1.5.0/download\"],\n strip_prefix = \"lazy_static-1.5.0\",\n build_file = Label(\"@crates//crates:BUILD.lazy_static-1.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libc-0.2.174\",\n sha256 = \"1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libc/0.2.174/download\"],\n strip_prefix = \"libc-0.2.174\",\n build_file = Label(\"@crates//crates:BUILD.libc-0.2.174.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__libsqlite3-sys-0.28.0\",\n sha256 = \"0c10584274047cb335c23d3e61bcef8e323adae7c5c8c760540f73610177fc3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/libsqlite3-sys/0.28.0/download\"],\n strip_prefix = \"libsqlite3-sys-0.28.0\",\n build_file = Label(\"@crates//crates:BUILD.libsqlite3-sys-0.28.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__linux-raw-sys-0.9.4\",\n sha256 = \"cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/linux-raw-sys/0.9.4/download\"],\n strip_prefix = \"linux-raw-sys-0.9.4\",\n build_file = Label(\"@crates//crates:BUILD.linux-raw-sys-0.9.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__litemap-0.8.0\",\n sha256 = \"241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/litemap/0.8.0/download\"],\n strip_prefix = \"litemap-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.litemap-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__lock_api-0.4.13\",\n sha256 = \"96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/lock_api/0.4.13/download\"],\n strip_prefix = \"lock_api-0.4.13\",\n build_file = Label(\"@crates//crates:BUILD.lock_api-0.4.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__log-0.4.27\",\n sha256 = \"13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/log/0.4.27/download\"],\n strip_prefix = \"log-0.4.27\",\n build_file = Label(\"@crates//crates:BUILD.log-0.4.27.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__matchit-0.7.3\",\n sha256 = \"0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/matchit/0.7.3/download\"],\n strip_prefix = \"matchit-0.7.3\",\n build_file = Label(\"@crates//crates:BUILD.matchit-0.7.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__memchr-2.7.5\",\n sha256 = \"32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/memchr/2.7.5/download\"],\n strip_prefix = \"memchr-2.7.5\",\n build_file = Label(\"@crates//crates:BUILD.memchr-2.7.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mime-0.3.17\",\n sha256 = \"6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mime/0.3.17/download\"],\n strip_prefix = \"mime-0.3.17\",\n build_file = Label(\"@crates//crates:BUILD.mime-0.3.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__miniz_oxide-0.8.9\",\n sha256 = \"1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/miniz_oxide/0.8.9/download\"],\n strip_prefix = \"miniz_oxide-0.8.9\",\n build_file = Label(\"@crates//crates:BUILD.miniz_oxide-0.8.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__mio-1.0.4\",\n sha256 = \"78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/mio/1.0.4/download\"],\n strip_prefix = \"mio-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.mio-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__multimap-0.10.1\",\n sha256 = \"1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/multimap/0.10.1/download\"],\n strip_prefix = \"multimap-0.10.1\",\n build_file = Label(\"@crates//crates:BUILD.multimap-0.10.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__nom-8.0.0\",\n sha256 = \"df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/nom/8.0.0/download\"],\n strip_prefix = \"nom-8.0.0\",\n build_file = Label(\"@crates//crates:BUILD.nom-8.0.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-0.4.3\",\n sha256 = \"35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num/0.4.3/download\"],\n strip_prefix = \"num-0.4.3\",\n build_file = Label(\"@crates//crates:BUILD.num-0.4.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-bigint-0.4.6\",\n sha256 = \"a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-bigint/0.4.6/download\"],\n strip_prefix = \"num-bigint-0.4.6\",\n build_file = Label(\"@crates//crates:BUILD.num-bigint-0.4.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-cmp-0.1.0\",\n sha256 = \"63335b2e2c34fae2fb0aa2cecfd9f0832a1e24b3b32ecec612c3426d46dc8aaa\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-cmp/0.1.0/download\"],\n strip_prefix = \"num-cmp-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.num-cmp-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-complex-0.4.6\",\n sha256 = \"73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-complex/0.4.6/download\"],\n strip_prefix = \"num-complex-0.4.6\",\n build_file = Label(\"@crates//crates:BUILD.num-complex-0.4.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-conv-0.1.0\",\n sha256 = \"51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-conv/0.1.0/download\"],\n strip_prefix = \"num-conv-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.num-conv-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-integer-0.1.46\",\n sha256 = \"7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-integer/0.1.46/download\"],\n strip_prefix = \"num-integer-0.1.46\",\n build_file = Label(\"@crates//crates:BUILD.num-integer-0.1.46.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-iter-0.1.45\",\n sha256 = \"1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-iter/0.1.45/download\"],\n strip_prefix = \"num-iter-0.1.45\",\n build_file = Label(\"@crates//crates:BUILD.num-iter-0.1.45.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-rational-0.4.2\",\n sha256 = \"f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-rational/0.4.2/download\"],\n strip_prefix = \"num-rational-0.4.2\",\n build_file = Label(\"@crates//crates:BUILD.num-rational-0.4.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num-traits-0.2.19\",\n sha256 = \"071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num-traits/0.2.19/download\"],\n strip_prefix = \"num-traits-0.2.19\",\n build_file = Label(\"@crates//crates:BUILD.num-traits-0.2.19.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num_cpus-1.17.0\",\n sha256 = \"91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num_cpus/1.17.0/download\"],\n strip_prefix = \"num_cpus-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.num_cpus-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__num_threads-0.1.7\",\n sha256 = \"5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/num_threads/0.1.7/download\"],\n strip_prefix = \"num_threads-0.1.7\",\n build_file = Label(\"@crates//crates:BUILD.num_threads-0.1.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__object-0.36.7\",\n sha256 = \"62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/object/0.36.7/download\"],\n strip_prefix = \"object-0.36.7\",\n build_file = Label(\"@crates//crates:BUILD.object-0.36.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell-1.21.3\",\n sha256 = \"42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell/1.21.3/download\"],\n strip_prefix = \"once_cell-1.21.3\",\n build_file = Label(\"@crates//crates:BUILD.once_cell-1.21.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__once_cell_polyfill-1.70.1\",\n sha256 = \"a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/once_cell_polyfill/1.70.1/download\"],\n strip_prefix = \"once_cell_polyfill-1.70.1\",\n build_file = Label(\"@crates//crates:BUILD.once_cell_polyfill-1.70.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot-0.12.4\",\n sha256 = \"70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot/0.12.4/download\"],\n strip_prefix = \"parking_lot-0.12.4\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot-0.12.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__parking_lot_core-0.9.11\",\n sha256 = \"bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/parking_lot_core/0.9.11/download\"],\n strip_prefix = \"parking_lot_core-0.9.11\",\n build_file = Label(\"@crates//crates:BUILD.parking_lot_core-0.9.11.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__percent-encoding-2.3.1\",\n sha256 = \"e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/percent-encoding/2.3.1/download\"],\n strip_prefix = \"percent-encoding-2.3.1\",\n build_file = Label(\"@crates//crates:BUILD.percent-encoding-2.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__petgraph-0.7.1\",\n sha256 = \"3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/petgraph/0.7.1/download\"],\n strip_prefix = \"petgraph-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.petgraph-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-project-lite-0.2.16\",\n sha256 = \"3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-project-lite/0.2.16/download\"],\n strip_prefix = \"pin-project-lite-0.2.16\",\n build_file = Label(\"@crates//crates:BUILD.pin-project-lite-0.2.16.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pin-utils-0.1.0\",\n sha256 = \"8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pin-utils/0.1.0/download\"],\n strip_prefix = \"pin-utils-0.1.0\",\n build_file = Label(\"@crates//crates:BUILD.pin-utils-0.1.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__pkg-config-0.3.32\",\n sha256 = \"7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/pkg-config/0.3.32/download\"],\n strip_prefix = \"pkg-config-0.3.32\",\n build_file = Label(\"@crates//crates:BUILD.pkg-config-0.3.32.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__potential_utf-0.1.2\",\n sha256 = \"e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/potential_utf/0.1.2/download\"],\n strip_prefix = \"potential_utf-0.1.2\",\n build_file = Label(\"@crates//crates:BUILD.potential_utf-0.1.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__powerfmt-0.2.0\",\n sha256 = \"439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/powerfmt/0.2.0/download\"],\n strip_prefix = \"powerfmt-0.2.0\",\n build_file = Label(\"@crates//crates:BUILD.powerfmt-0.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prettyplease-0.2.35\",\n sha256 = \"061c1221631e079b26479d25bbf2275bfe5917ae8419cd7e34f13bfc2aa7539a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prettyplease/0.2.35/download\"],\n strip_prefix = \"prettyplease-0.2.35\",\n build_file = Label(\"@crates//crates:BUILD.prettyplease-0.2.35.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__proc-macro2-1.0.95\",\n sha256 = \"02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/proc-macro2/1.0.95/download\"],\n strip_prefix = \"proc-macro2-1.0.95\",\n build_file = Label(\"@crates//crates:BUILD.proc-macro2-1.0.95.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-0.13.5\",\n sha256 = \"2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost/0.13.5/download\"],\n strip_prefix = \"prost-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-build-0.13.5\",\n sha256 = \"be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-build/0.13.5/download\"],\n strip_prefix = \"prost-build-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-build-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-derive-0.13.5\",\n sha256 = \"8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-derive/0.13.5/download\"],\n strip_prefix = \"prost-derive-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-derive-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__prost-types-0.13.5\",\n sha256 = \"52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/prost-types/0.13.5/download\"],\n strip_prefix = \"prost-types-0.13.5\",\n build_file = Label(\"@crates//crates:BUILD.prost-types-0.13.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__quote-1.0.40\",\n sha256 = \"1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/quote/1.0.40/download\"],\n strip_prefix = \"quote-1.0.40\",\n build_file = Label(\"@crates//crates:BUILD.quote-1.0.40.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__r-efi-5.3.0\",\n sha256 = \"69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/r-efi/5.3.0/download\"],\n strip_prefix = \"r-efi-5.3.0\",\n build_file = Label(\"@crates//crates:BUILD.r-efi-5.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__redox_syscall-0.5.13\",\n sha256 = \"0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/redox_syscall/0.5.13/download\"],\n strip_prefix = \"redox_syscall-0.5.13\",\n build_file = Label(\"@crates//crates:BUILD.redox_syscall-0.5.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-1.11.1\",\n sha256 = \"b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex/1.11.1/download\"],\n strip_prefix = \"regex-1.11.1\",\n build_file = Label(\"@crates//crates:BUILD.regex-1.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-automata-0.4.9\",\n sha256 = \"809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-automata/0.4.9/download\"],\n strip_prefix = \"regex-automata-0.4.9\",\n build_file = Label(\"@crates//crates:BUILD.regex-automata-0.4.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__regex-syntax-0.8.5\",\n sha256 = \"2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/regex-syntax/0.8.5/download\"],\n strip_prefix = \"regex-syntax-0.8.5\",\n build_file = Label(\"@crates//crates:BUILD.regex-syntax-0.8.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rusqlite-0.31.0\",\n sha256 = \"b838eba278d213a8beaf485bd313fd580ca4505a00d5871caeb1457c55322cae\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rusqlite/0.31.0/download\"],\n strip_prefix = \"rusqlite-0.31.0\",\n build_file = Label(\"@crates//crates:BUILD.rusqlite-0.31.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-8.7.2\",\n sha256 = \"025908b8682a26ba8d12f6f2d66b987584a4a87bc024abc5bbc12553a8cd178a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed/8.7.2/download\"],\n strip_prefix = \"rust-embed-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-impl-8.7.2\",\n sha256 = \"6065f1a4392b71819ec1ea1df1120673418bf386f50de1d6f54204d836d4349c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed-impl/8.7.2/download\"],\n strip_prefix = \"rust-embed-impl-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-impl-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rust-embed-utils-8.7.2\",\n sha256 = \"f6cc0c81648b20b70c491ff8cce00c1c3b223bb8ed2b5d41f0e54c6c4c0a3594\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rust-embed-utils/8.7.2/download\"],\n strip_prefix = \"rust-embed-utils-8.7.2\",\n build_file = Label(\"@crates//crates:BUILD.rust-embed-utils-8.7.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustc-demangle-0.1.25\",\n sha256 = \"989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustc-demangle/0.1.25/download\"],\n strip_prefix = \"rustc-demangle-0.1.25\",\n build_file = Label(\"@crates//crates:BUILD.rustc-demangle-0.1.25.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustix-1.0.7\",\n sha256 = \"c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustix/1.0.7/download\"],\n strip_prefix = \"rustix-1.0.7\",\n build_file = Label(\"@crates//crates:BUILD.rustix-1.0.7.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__rustversion-1.0.21\",\n sha256 = \"8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/rustversion/1.0.21/download\"],\n strip_prefix = \"rustversion-1.0.21\",\n build_file = Label(\"@crates//crates:BUILD.rustversion-1.0.21.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__ryu-1.0.20\",\n sha256 = \"28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/ryu/1.0.20/download\"],\n strip_prefix = \"ryu-1.0.20\",\n build_file = Label(\"@crates//crates:BUILD.ryu-1.0.20.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__same-file-1.0.6\",\n sha256 = \"93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/same-file/1.0.6/download\"],\n strip_prefix = \"same-file-1.0.6\",\n build_file = Label(\"@crates//crates:BUILD.same-file-1.0.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__schemars-0.8.22\",\n sha256 = \"3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/schemars/0.8.22/download\"],\n strip_prefix = \"schemars-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.schemars-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__schemars_derive-0.8.22\",\n sha256 = \"32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/schemars_derive/0.8.22/download\"],\n strip_prefix = \"schemars_derive-0.8.22\",\n build_file = Label(\"@crates//crates:BUILD.schemars_derive-0.8.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__scopeguard-1.2.0\",\n sha256 = \"94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/scopeguard/1.2.0/download\"],\n strip_prefix = \"scopeguard-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.scopeguard-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde-1.0.219\",\n sha256 = \"5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde/1.0.219/download\"],\n strip_prefix = \"serde-1.0.219\",\n build_file = Label(\"@crates//crates:BUILD.serde-1.0.219.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive-1.0.219\",\n sha256 = \"5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive/1.0.219/download\"],\n strip_prefix = \"serde_derive-1.0.219\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive-1.0.219.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_derive_internals-0.29.1\",\n sha256 = \"18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_derive_internals/0.29.1/download\"],\n strip_prefix = \"serde_derive_internals-0.29.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_derive_internals-0.29.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_json-1.0.140\",\n sha256 = \"20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_json/1.0.140/download\"],\n strip_prefix = \"serde_json-1.0.140\",\n build_file = Label(\"@crates//crates:BUILD.serde_json-1.0.140.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_path_to_error-0.1.17\",\n sha256 = \"59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_path_to_error/0.1.17/download\"],\n strip_prefix = \"serde_path_to_error-0.1.17\",\n build_file = Label(\"@crates//crates:BUILD.serde_path_to_error-0.1.17.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_qs-0.13.0\",\n sha256 = \"cd34f36fe4c5ba9654417139a9b3a20d2e1de6012ee678ad14d240c22c78d8d6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_qs/0.13.0/download\"],\n strip_prefix = \"serde_qs-0.13.0\",\n build_file = Label(\"@crates//crates:BUILD.serde_qs-0.13.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__serde_urlencoded-0.7.1\",\n sha256 = \"d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/serde_urlencoded/0.7.1/download\"],\n strip_prefix = \"serde_urlencoded-0.7.1\",\n build_file = Label(\"@crates//crates:BUILD.serde_urlencoded-0.7.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sha2-0.10.9\",\n sha256 = \"a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sha2/0.10.9/download\"],\n strip_prefix = \"sha2-0.10.9\",\n build_file = Label(\"@crates//crates:BUILD.sha2-0.10.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__shlex-1.3.0\",\n sha256 = \"0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/shlex/1.3.0/download\"],\n strip_prefix = \"shlex-1.3.0\",\n build_file = Label(\"@crates//crates:BUILD.shlex-1.3.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__simple_logger-4.3.3\",\n sha256 = \"8e7e46c8c90251d47d08b28b8a419ffb4aede0f87c2eea95e17d1d5bacbf3ef1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/simple_logger/4.3.3/download\"],\n strip_prefix = \"simple_logger-4.3.3\",\n build_file = Label(\"@crates//crates:BUILD.simple_logger-4.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__slab-0.4.10\",\n sha256 = \"04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/slab/0.4.10/download\"],\n strip_prefix = \"slab-0.4.10\",\n build_file = Label(\"@crates//crates:BUILD.slab-0.4.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__smallvec-1.15.1\",\n sha256 = \"67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/smallvec/1.15.1/download\"],\n strip_prefix = \"smallvec-1.15.1\",\n build_file = Label(\"@crates//crates:BUILD.smallvec-1.15.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__socket2-0.5.10\",\n sha256 = \"e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/socket2/0.5.10/download\"],\n strip_prefix = \"socket2-0.5.10\",\n build_file = Label(\"@crates//crates:BUILD.socket2-0.5.10.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__stable_deref_trait-1.2.0\",\n sha256 = \"a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/stable_deref_trait/1.2.0/download\"],\n strip_prefix = \"stable_deref_trait-1.2.0\",\n build_file = Label(\"@crates//crates:BUILD.stable_deref_trait-1.2.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__strsim-0.11.1\",\n sha256 = \"7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/strsim/0.11.1/download\"],\n strip_prefix = \"strsim-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.strsim-0.11.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__syn-2.0.104\",\n sha256 = \"17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/syn/2.0.104/download\"],\n strip_prefix = \"syn-2.0.104\",\n build_file = Label(\"@crates//crates:BUILD.syn-2.0.104.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__sync_wrapper-1.0.2\",\n sha256 = \"0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/sync_wrapper/1.0.2/download\"],\n strip_prefix = \"sync_wrapper-1.0.2\",\n build_file = Label(\"@crates//crates:BUILD.sync_wrapper-1.0.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__synstructure-0.13.2\",\n sha256 = \"728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/synstructure/0.13.2/download\"],\n strip_prefix = \"synstructure-0.13.2\",\n build_file = Label(\"@crates//crates:BUILD.synstructure-0.13.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tempfile-3.20.0\",\n sha256 = \"e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tempfile/3.20.0/download\"],\n strip_prefix = \"tempfile-3.20.0\",\n build_file = Label(\"@crates//crates:BUILD.tempfile-3.20.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-1.0.69\",\n sha256 = \"b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror/1.0.69/download\"],\n strip_prefix = \"thiserror-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__thiserror-impl-1.0.69\",\n sha256 = \"4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/thiserror-impl/1.0.69/download\"],\n strip_prefix = \"thiserror-impl-1.0.69\",\n build_file = Label(\"@crates//crates:BUILD.thiserror-impl-1.0.69.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-0.3.41\",\n sha256 = \"8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time/0.3.41/download\"],\n strip_prefix = \"time-0.3.41\",\n build_file = Label(\"@crates//crates:BUILD.time-0.3.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-core-0.1.4\",\n sha256 = \"c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-core/0.1.4/download\"],\n strip_prefix = \"time-core-0.1.4\",\n build_file = Label(\"@crates//crates:BUILD.time-core-0.1.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__time-macros-0.2.22\",\n sha256 = \"3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/time-macros/0.2.22/download\"],\n strip_prefix = \"time-macros-0.2.22\",\n build_file = Label(\"@crates//crates:BUILD.time-macros-0.2.22.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tinystr-0.8.1\",\n sha256 = \"5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tinystr/0.8.1/download\"],\n strip_prefix = \"tinystr-0.8.1\",\n build_file = Label(\"@crates//crates:BUILD.tinystr-0.8.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-1.46.1\",\n sha256 = \"0cc3a2344dafbe23a245241fe8b09735b521110d30fcefbbd5feb1797ca35d17\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio/1.46.1/download\"],\n strip_prefix = \"tokio-1.46.1\",\n build_file = Label(\"@crates//crates:BUILD.tokio-1.46.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-macros-2.5.0\",\n sha256 = \"6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-macros/2.5.0/download\"],\n strip_prefix = \"tokio-macros-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.tokio-macros-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tokio-util-0.7.15\",\n sha256 = \"66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tokio-util/0.7.15/download\"],\n strip_prefix = \"tokio-util-0.7.15\",\n build_file = Label(\"@crates//crates:BUILD.tokio-util-0.7.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-0.4.13\",\n sha256 = \"b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower/0.4.13/download\"],\n strip_prefix = \"tower-0.4.13\",\n build_file = Label(\"@crates//crates:BUILD.tower-0.4.13.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-0.5.2\",\n sha256 = \"d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower/0.5.2/download\"],\n strip_prefix = \"tower-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.tower-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-http-0.5.2\",\n sha256 = \"1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-http/0.5.2/download\"],\n strip_prefix = \"tower-http-0.5.2\",\n build_file = Label(\"@crates//crates:BUILD.tower-http-0.5.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-layer-0.3.3\",\n sha256 = \"121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-layer/0.3.3/download\"],\n strip_prefix = \"tower-layer-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-layer-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tower-service-0.3.3\",\n sha256 = \"8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tower-service/0.3.3/download\"],\n strip_prefix = \"tower-service-0.3.3\",\n build_file = Label(\"@crates//crates:BUILD.tower-service-0.3.3.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-0.1.41\",\n sha256 = \"784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing/0.1.41/download\"],\n strip_prefix = \"tracing-0.1.41\",\n build_file = Label(\"@crates//crates:BUILD.tracing-0.1.41.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-attributes-0.1.30\",\n sha256 = \"81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-attributes/0.1.30/download\"],\n strip_prefix = \"tracing-attributes-0.1.30\",\n build_file = Label(\"@crates//crates:BUILD.tracing-attributes-0.1.30.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__tracing-core-0.1.34\",\n sha256 = \"b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/tracing-core/0.1.34/download\"],\n strip_prefix = \"tracing-core-0.1.34\",\n build_file = Label(\"@crates//crates:BUILD.tracing-core-0.1.34.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__try-lock-0.2.5\",\n sha256 = \"e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/try-lock/0.2.5/download\"],\n strip_prefix = \"try-lock-0.2.5\",\n build_file = Label(\"@crates//crates:BUILD.try-lock-0.2.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__typenum-1.18.0\",\n sha256 = \"1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/typenum/1.18.0/download\"],\n strip_prefix = \"typenum-1.18.0\",\n build_file = Label(\"@crates//crates:BUILD.typenum-1.18.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__unicode-ident-1.0.18\",\n sha256 = \"5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/unicode-ident/1.0.18/download\"],\n strip_prefix = \"unicode-ident-1.0.18\",\n build_file = Label(\"@crates//crates:BUILD.unicode-ident-1.0.18.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__url-2.5.4\",\n sha256 = \"32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/url/2.5.4/download\"],\n strip_prefix = \"url-2.5.4\",\n build_file = Label(\"@crates//crates:BUILD.url-2.5.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8_iter-1.0.4\",\n sha256 = \"b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8_iter/1.0.4/download\"],\n strip_prefix = \"utf8_iter-1.0.4\",\n build_file = Label(\"@crates//crates:BUILD.utf8_iter-1.0.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__utf8parse-0.2.2\",\n sha256 = \"06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/utf8parse/0.2.2/download\"],\n strip_prefix = \"utf8parse-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.utf8parse-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__uuid-1.17.0\",\n sha256 = \"3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/uuid/1.17.0/download\"],\n strip_prefix = \"uuid-1.17.0\",\n build_file = Label(\"@crates//crates:BUILD.uuid-1.17.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__vcpkg-0.2.15\",\n sha256 = \"accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/vcpkg/0.2.15/download\"],\n strip_prefix = \"vcpkg-0.2.15\",\n build_file = Label(\"@crates//crates:BUILD.vcpkg-0.2.15.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__version_check-0.9.5\",\n sha256 = \"0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/version_check/0.9.5/download\"],\n strip_prefix = \"version_check-0.9.5\",\n build_file = Label(\"@crates//crates:BUILD.version_check-0.9.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__walkdir-2.5.0\",\n sha256 = \"29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/walkdir/2.5.0/download\"],\n strip_prefix = \"walkdir-2.5.0\",\n build_file = Label(\"@crates//crates:BUILD.walkdir-2.5.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__want-0.3.1\",\n sha256 = \"bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/want/0.3.1/download\"],\n strip_prefix = \"want-0.3.1\",\n build_file = Label(\"@crates//crates:BUILD.want-0.3.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.11.1-wasi-snapshot-preview1\",\n sha256 = \"ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.11.1+wasi-snapshot-preview1/download\"],\n strip_prefix = \"wasi-0.11.1+wasi-snapshot-preview1\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.11.1+wasi-snapshot-preview1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasi-0.14.2-wasi-0.2.4\",\n sha256 = \"9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasi/0.14.2+wasi-0.2.4/download\"],\n strip_prefix = \"wasi-0.14.2+wasi-0.2.4\",\n build_file = Label(\"@crates//crates:BUILD.wasi-0.14.2+wasi-0.2.4.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-0.2.100\",\n sha256 = \"1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-backend-0.2.100\",\n sha256 = \"2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-backend/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-backend-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-backend-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-0.2.100\",\n sha256 = \"7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-macro-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-macro-support-0.2.100\",\n sha256 = \"8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-macro-support/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-macro-support-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-macro-support-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wasm-bindgen-shared-0.2.100\",\n sha256 = \"1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wasm-bindgen-shared/0.2.100/download\"],\n strip_prefix = \"wasm-bindgen-shared-0.2.100\",\n build_file = Label(\"@crates//crates:BUILD.wasm-bindgen-shared-0.2.100.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__winapi-util-0.1.9\",\n sha256 = \"cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/winapi-util/0.1.9/download\"],\n strip_prefix = \"winapi-util-0.1.9\",\n build_file = Label(\"@crates//crates:BUILD.winapi-util-0.1.9.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.48.0\",\n sha256 = \"677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.48.0/download\"],\n strip_prefix = \"windows-sys-0.48.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.48.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.52.0\",\n sha256 = \"282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.52.0/download\"],\n strip_prefix = \"windows-sys-0.52.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.52.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.59.0\",\n sha256 = \"1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.59.0/download\"],\n strip_prefix = \"windows-sys-0.59.0\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.59.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-sys-0.60.2\",\n sha256 = \"f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-sys/0.60.2/download\"],\n strip_prefix = \"windows-sys-0.60.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-sys-0.60.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.48.5\",\n sha256 = \"9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.48.5/download\"],\n strip_prefix = \"windows-targets-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.52.6\",\n sha256 = \"9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.52.6/download\"],\n strip_prefix = \"windows-targets-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows-targets-0.53.2\",\n sha256 = \"c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows-targets/0.53.2/download\"],\n strip_prefix = \"windows-targets-0.53.2\",\n build_file = Label(\"@crates//crates:BUILD.windows-targets-0.53.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.48.5\",\n sha256 = \"2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.52.6\",\n sha256 = \"32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_gnullvm-0.53.0\",\n sha256 = \"86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_aarch64_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.48.5\",\n sha256 = \"dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.52.6\",\n sha256 = \"09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_aarch64_msvc-0.53.0\",\n sha256 = \"c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_aarch64_msvc/0.53.0/download\"],\n strip_prefix = \"windows_aarch64_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_aarch64_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.48.5\",\n sha256 = \"a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.48.5/download\"],\n strip_prefix = \"windows_i686_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.52.6\",\n sha256 = \"8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnu-0.53.0\",\n sha256 = \"c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnu/0.53.0/download\"],\n strip_prefix = \"windows_i686_gnu-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnu-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.52.6\",\n sha256 = \"0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_gnullvm-0.53.0\",\n sha256 = \"9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_i686_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.48.5\",\n sha256 = \"8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.48.5/download\"],\n strip_prefix = \"windows_i686_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.52.6\",\n sha256 = \"240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.52.6/download\"],\n strip_prefix = \"windows_i686_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_i686_msvc-0.53.0\",\n sha256 = \"581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_i686_msvc/0.53.0/download\"],\n strip_prefix = \"windows_i686_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_i686_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.48.5\",\n sha256 = \"53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.52.6\",\n sha256 = \"147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnu-0.53.0\",\n sha256 = \"2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnu/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_gnu-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnu-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.48.5\",\n sha256 = \"0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.52.6\",\n sha256 = \"24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_gnullvm-0.53.0\",\n sha256 = \"0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_gnullvm/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_gnullvm-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_gnullvm-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.48.5\",\n sha256 = \"ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.48.5/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.48.5\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.48.5.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.52.6\",\n sha256 = \"589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.52.6/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.52.6\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.52.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__windows_x86_64_msvc-0.53.0\",\n sha256 = \"271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/windows_x86_64_msvc/0.53.0/download\"],\n strip_prefix = \"windows_x86_64_msvc-0.53.0\",\n build_file = Label(\"@crates//crates:BUILD.windows_x86_64_msvc-0.53.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__wit-bindgen-rt-0.39.0\",\n sha256 = \"6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/wit-bindgen-rt/0.39.0/download\"],\n strip_prefix = \"wit-bindgen-rt-0.39.0\",\n build_file = Label(\"@crates//crates:BUILD.wit-bindgen-rt-0.39.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__writeable-0.6.1\",\n sha256 = \"ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/writeable/0.6.1/download\"],\n strip_prefix = \"writeable-0.6.1\",\n build_file = Label(\"@crates//crates:BUILD.writeable-0.6.1.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-0.8.0\",\n sha256 = \"5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke/0.8.0/download\"],\n strip_prefix = \"yoke-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.yoke-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__yoke-derive-0.8.0\",\n sha256 = \"38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/yoke-derive/0.8.0/download\"],\n strip_prefix = \"yoke-derive-0.8.0\",\n build_file = Label(\"@crates//crates:BUILD.yoke-derive-0.8.0.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-0.8.26\",\n sha256 = \"1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy/0.8.26/download\"],\n strip_prefix = \"zerocopy-0.8.26\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-0.8.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerocopy-derive-0.8.26\",\n sha256 = \"9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerocopy-derive/0.8.26/download\"],\n strip_prefix = \"zerocopy-derive-0.8.26\",\n build_file = Label(\"@crates//crates:BUILD.zerocopy-derive-0.8.26.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-0.1.6\",\n sha256 = \"50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom/0.1.6/download\"],\n strip_prefix = \"zerofrom-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerofrom-derive-0.1.6\",\n sha256 = \"d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerofrom-derive/0.1.6/download\"],\n strip_prefix = \"zerofrom-derive-0.1.6\",\n build_file = Label(\"@crates//crates:BUILD.zerofrom-derive-0.1.6.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerotrie-0.2.2\",\n sha256 = \"36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerotrie/0.2.2/download\"],\n strip_prefix = \"zerotrie-0.2.2\",\n build_file = Label(\"@crates//crates:BUILD.zerotrie-0.2.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-0.11.2\",\n sha256 = \"4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec/0.11.2/download\"],\n strip_prefix = \"zerovec-0.11.2\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-0.11.2.bazel\"),\n )\n\n maybe(\n http_archive,\n name = \"crates__zerovec-derive-0.11.1\",\n sha256 = \"5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f\",\n type = \"tar.gz\",\n urls = [\"https://static.crates.io/crates/zerovec-derive/0.11.1/download\"],\n strip_prefix = \"zerovec-derive-0.11.1\",\n build_file = Label(\"@crates//crates:BUILD.zerovec-derive-0.11.1.bazel\"),\n )\n\n return [\n struct(repo=\"crates__aide-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__async-trait-0.1.88\", is_dev_dep = False),\n struct(repo=\"crates__axum-0.7.9\", is_dev_dep = False),\n struct(repo=\"crates__axum-jsonschema-0.8.0\", is_dev_dep = False),\n struct(repo=\"crates__clap-4.5.41\", is_dev_dep = False),\n struct(repo=\"crates__crossbeam-channel-0.5.15\", is_dev_dep = False),\n struct(repo=\"crates__hyper-1.6.0\", is_dev_dep = False),\n struct(repo=\"crates__log-0.4.27\", is_dev_dep = False),\n struct(repo=\"crates__num_cpus-1.17.0\", is_dev_dep = False),\n struct(repo=\"crates__prost-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__prost-build-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__prost-types-0.13.5\", is_dev_dep = False),\n struct(repo=\"crates__rusqlite-0.31.0\", is_dev_dep = False),\n struct(repo=\"crates__rust-embed-8.7.2\", is_dev_dep = False),\n struct(repo=\"crates__schemars-0.8.22\", is_dev_dep = False),\n struct(repo=\"crates__serde-1.0.219\", is_dev_dep = False),\n struct(repo=\"crates__serde_json-1.0.140\", is_dev_dep = False),\n struct(repo=\"crates__simple_logger-4.3.3\", is_dev_dep = False),\n struct(repo=\"crates__tempfile-3.20.0\", is_dev_dep = False),\n struct(repo=\"crates__thiserror-1.0.69\", is_dev_dep = False),\n struct(repo=\"crates__tokio-1.46.1\", is_dev_dep = False),\n struct(repo=\"crates__tower-0.4.13\", is_dev_dep = False),\n struct(repo=\"crates__tower-http-0.5.2\", is_dev_dep = False),\n struct(repo=\"crates__uuid-1.17.0\", is_dev_dep = False),\n ]\n" } } }, diff --git a/generated_number/pippin b/generated_number/pippin new file mode 100644 index 0000000..3e932fe --- /dev/null +++ b/generated_number/pippin @@ -0,0 +1 @@ +34 \ No newline at end of file diff --git a/plans/cli-service-build-unification.md b/plans/cli-service-build-unification.md new file mode 100644 index 0000000..6def826 --- /dev/null +++ b/plans/cli-service-build-unification.md @@ -0,0 +1,336 @@ +# CLI-Service Build Unification + +## Problem Statement + +The current DataBuild architecture has significant duplication and architectural inconsistencies between CLI and Service build orchestration: + +### Current Duplication Issues + +1. **Event Emission Logic**: Service HTTP handlers and CLI binaries contain duplicate orchestration event emission code +2. **Mode Detection**: Analysis and execution binaries (`analyze.rs` and `execute.rs`) use `DATABUILD_CLI_MODE` environment variable to conditionally emit different events +3. **Test Complexity**: End-to-end tests must account for different event patterns between CLI and Service for identical logical operations + +### Specific Code References + +- **CLI Mode Detection in Analysis**: `databuild/graph/analyze.rs:555-587` - Emits "Build request received" and "Starting build planning" events only in CLI mode +- **CLI Mode Detection in Execution**: `databuild/graph/execute.rs:413-428` and `execute.rs:753-779` - Emits execution start/completion events only in CLI mode +- **Service Orchestration**: `databuild/service/handlers.rs` - HTTP handlers emit orchestration events independently + +### Architectural Problems + +1. **Single Responsibility Violation**: Analysis and execution binaries serve dual purposes as both shared library functions and CLI entry points +2. **Consistency Risk**: Separate implementations of orchestration logic create risk of drift between CLI and Service behavior +3. **Maintenance Burden**: Changes to orchestration requirements must be implemented in multiple places + +## Current Architecture Analysis + +### Service Flow +``` +HTTP Request → Service Handler → Orchestration Events → Analysis → Execution → Completion Events +``` + +The Service has a natural coordination point in the HTTP handler that manages the entire build lifecycle and emits appropriate orchestration events. + +### CLI Flow +``` +Shell Script → Analysis Binary (CLI mode) → Execution Binary (CLI mode) → Orchestration Events +``` + +The CLI lacks a natural coordination point, forcing the shared analysis/execution binaries to detect CLI mode and emit orchestration events themselves. + +### Event Flow Comparison + +**Service Events** (coordinated): +1. Build request received +2. Starting build planning +3. Analysis events (partitions scheduled, jobs configured) +4. Starting build execution +5. Execution events (jobs scheduled/completed, partitions available) +6. Build request completed + +**CLI Events** (mode-dependent): +- Same events as Service, but emitted conditionally based on `DATABUILD_CLI_MODE` +- Creates awkward coupling between orchestration concerns and domain logic + +## Proposed Shared Library Design + +### Core Orchestrator API + +```rust +pub struct BuildOrchestrator { + event_log: Box, + build_request_id: String, + requested_partitions: Vec, +} + +impl BuildOrchestrator { + pub fn new( + event_log: Box, + build_request_id: String, + requested_partitions: Vec + ) -> Self; + + // Lifecycle events + pub async fn start_build(&self) -> Result<(), Error>; + pub async fn start_planning(&self) -> Result<(), Error>; + pub async fn start_execution(&self) -> Result<(), Error>; + pub async fn complete_build(&self, result: BuildResult) -> Result<(), Error>; + + // Domain events (pass-through to existing logic) + pub async fn emit_partition_scheduled(&self, partition: &PartitionRef) -> Result<(), Error>; + pub async fn emit_job_scheduled(&self, job: &JobEvent) -> Result<(), Error>; + pub async fn emit_job_completed(&self, job: &JobEvent) -> Result<(), Error>; + pub async fn emit_partition_available(&self, partition: &PartitionEvent) -> Result<(), Error>; + pub async fn emit_delegation(&self, partition: &str, target_build: &str, message: &str) -> Result<(), Error>; +} + +pub enum BuildResult { + Success { jobs_completed: usize }, + Failed { jobs_completed: usize, jobs_failed: usize }, + FailFast { trigger_job: String }, +} +``` + +### Event Emission Strategy + +The orchestrator will emit standardized events at specific lifecycle points: + +1. **Build Lifecycle Events**: High-level orchestration (received, planning, executing, completed) +2. **Domain Events**: Pass-through wrapper for existing analysis/execution events +3. **Consistent Timing**: All events emitted through orchestrator ensure proper sequencing + +### Error Handling + +```rust +#[derive(Debug, thiserror::Error)] +pub enum OrchestrationError { + #[error("Event log error: {0}")] + EventLog(#[from] databuild::event_log::Error), + + #[error("Build coordination error: {0}")] + Coordination(String), + + #[error("Invalid build state transition: {current} -> {requested}")] + InvalidStateTransition { current: String, requested: String }, +} +``` + +### Testing Interface + +```rust +#[cfg(test)] +impl BuildOrchestrator { + pub fn with_mock_event_log(build_request_id: String) -> (Self, MockEventLog); + pub fn emitted_events(&self) -> &[BuildEvent]; +} +``` + +## Implementation Phases + +### Phase 1: Create Shared Orchestration Library + +**Files to Create**: +- `databuild/orchestration/mod.rs` - Core orchestrator implementation +- `databuild/orchestration/events.rs` - Event type definitions and helpers +- `databuild/orchestration/error.rs` - Error types +- `databuild/orchestration/tests.rs` - Unit tests for orchestrator + +**Key Implementation Points**: +- Extract common event emission patterns from Service and CLI +- Ensure orchestrator is async-compatible with existing event log interface +- Design for testability with dependency injection + +### Phase 2: Refactor Service to Use Orchestrator + +**Files to Modify**: +- `databuild/service/handlers.rs` - Replace direct event emission with orchestrator calls +- `databuild/service/mod.rs` - Integration with orchestrator lifecycle + +**Implementation**: +- Replace existing event emission code directly with orchestrator calls +- Ensure proper error handling and async integration + +### Phase 3: Create New CLI Wrapper + +**Files to Create**: +- `databuild/cli/main.rs` - New CLI entry point using orchestrator +- `databuild/cli/error.rs` - CLI-specific error handling + +**Implementation**: +```rust +// databuild/cli/main.rs +#[tokio::main] +async fn main() -> Result<(), CliError> { + let args = parse_cli_args(); + let event_log = create_build_event_log(&args.event_log_uri).await?; + let build_request_id = args.build_request_id.unwrap_or_else(|| Uuid::new_v4().to_string()); + + let orchestrator = BuildOrchestrator::new(event_log, build_request_id, args.partitions.clone()); + + // Emit orchestration events + orchestrator.start_build().await?; + orchestrator.start_planning().await?; + + // Run analysis + let graph = run_analysis(&args.partitions, &orchestrator).await?; + + orchestrator.start_execution().await?; + + // Run execution + let result = run_execution(graph, &orchestrator).await?; + + orchestrator.complete_build(result).await?; + + Ok(()) +} +``` + +### Phase 4: Remove CLI Mode Detection + +**Files to Modify**: +- `databuild/graph/analyze.rs` - Remove lines 555-587 (CLI mode orchestration events) +- `databuild/graph/execute.rs` - Remove lines 413-428 and 753-779 (CLI mode orchestration events) + +**Verification**: +- Analysis and execution binaries become pure domain functions +- No more environment variable mode detection +- All orchestration handled by wrapper/service + +### Phase 5: Update Bazel Rules + +**Files to Modify**: +- `databuild/rules.bzl` - Update `_databuild_graph_build_impl` to use new CLI wrapper instead of direct analysis/execution pipeline + +**Before**: +```bash +$(rlocation _main/{analyze_path}) $@ | $(rlocation _main/{exec_path}) +``` + +**After**: +```bash +$(rlocation _main/{cli_wrapper_path}) $@ +``` + +### Phase 6: Update Tests + +**Files to Modify**: +- `tests/end_to_end/simple_test.sh` - Remove separate CLI/Service event validation +- `tests/end_to_end/podcast_simple_test.sh` - Same simplification +- All tests expect identical event patterns from CLI and Service + +## Migration Strategy + +### Direct Replacement Approach + +Since we don't need backwards compatibility, we can implement a direct replacement: +- Replace existing CLI mode detection immediately +- Refactor Service handlers to use orchestrator directly +- Update Bazel rules to use new CLI wrapper +- Update tests to expect unified behavior + +### Testing Strategy + +1. **Unit Tests**: Comprehensive orchestrator testing with mock event logs +2. **Integration Tests**: Existing end-to-end tests pass with unified implementation +3. **Event Verification**: Ensure orchestrator produces expected events for all scenarios + +## File Changes Required + +### New Files +- `databuild/orchestration/mod.rs` - 200+ lines, core orchestrator +- `databuild/orchestration/events.rs` - 100+ lines, event helpers +- `databuild/orchestration/error.rs` - 50+ lines, error types +- `databuild/orchestration/tests.rs` - 300+ lines, comprehensive tests +- `databuild/cli/main.rs` - 150+ lines, CLI wrapper +- `databuild/cli/error.rs` - 50+ lines, CLI error handling + +### Modified Files +- `databuild/service/handlers.rs` - Replace ~50 lines of event emission with orchestrator calls +- `databuild/graph/analyze.rs` - Remove ~30 lines of CLI mode detection +- `databuild/graph/execute.rs` - Remove ~60 lines of CLI mode detection +- `databuild/rules.bzl` - Update ~10 lines for new CLI wrapper +- `tests/end_to_end/simple_test.sh` - Simplify ~20 lines of event validation +- `tests/end_to_end/podcast_simple_test.sh` - Same simplification + +### Build Configuration +- Update `databuild/BUILD.bazel` to include orchestration module +- Update `databuild/cli/BUILD.bazel` for new CLI binary +- Modify example graphs to use new CLI wrapper + +## Benefits & Risk Analysis + +### Benefits + +1. **Maintainability**: Single source of truth for orchestration logic eliminates duplication +2. **Consistency**: Guaranteed identical events across CLI and Service interfaces +3. **Extensibility**: Foundation for SDK, additional CLI commands, monitoring integration +4. **Testing**: Simplified test expectations, better unit test coverage of orchestration +5. **Architecture**: Clean separation between orchestration and domain logic + +### Implementation Risks + +1. **Regression**: Changes to critical path could introduce subtle bugs +2. **Performance**: Additional abstraction layer could impact latency +3. **Integration**: Bazel build changes could break example workflows + +### Risk Mitigation + +1. **Phased Implementation**: Implement in stages with verification at each step +2. **Comprehensive Testing**: Thorough unit and integration testing +3. **Event Verification**: Ensure identical event patterns to current behavior + +## Future Architecture Extensions + +### SDK Integration + +The unified orchestrator provides a natural integration point for external SDKs: + +```rust +// Future SDK usage +let databuild_client = DatabuildClient::new(endpoint); +let orchestrator = databuild_client.create_orchestrator(partitions).await?; + +orchestrator.start_build().await?; +let result = databuild_client.execute_build(orchestrator).await?; +``` + +### Additional CLI Commands + +Orchestrator enables consistent event emission across CLI commands: + +```bash +databuild validate --partitions "data/users" --dry-run +databuild status --build-id "abc123" +databuild retry --build-id "abc123" --failed-jobs-only +``` + +### Monitoring Integration + +Standardized events provide foundation for observability: + +```rust +impl BuildOrchestrator { + pub fn with_tracing_span(&self, span: tracing::Span) -> Self; + pub fn emit_otel_metrics(&self) -> Result<(), Error>; +} +``` + +### CI/CD Pipeline Integration + +Orchestrator events enable standardized build reporting across environments: + +```yaml +# GitHub Actions integration +- name: DataBuild + uses: databuild/github-action@v1 + with: + partitions: "data/daily_reports" + event-log: "${{ env.DATABUILD_EVENT_LOG }}" + # Automatic event collection for build status reporting +``` + +## Conclusion + +This unification addresses fundamental architectural inconsistencies while providing a foundation for future extensibility. The phased implementation approach minimizes risk while ensuring backward compatibility throughout the transition. + +The shared orchestrator eliminates the current awkward CLI mode detection pattern and establishes DataBuild as a platform that can support multiple interfaces with guaranteed consistency. \ No newline at end of file diff --git a/plans/integration-test-v2.md b/plans/integration-test-v2.md new file mode 100644 index 0000000..8fe6754 --- /dev/null +++ b/plans/integration-test-v2.md @@ -0,0 +1,148 @@ +# Integration Test Plan for DataBuild Delegation System + +## Overview +Create comprehensive integration tests for the basic_graph example that trigger delegation scenarios and verify Build Event Log (BEL) entries to ensure the delegation system works correctly and provides proper traceability. + +## Current Test Infrastructure Analysis + +**Existing Pattern**: The current test suite in `/tests/end_to_end/` follows a mature pattern: +- **Common utilities**: `lib/test_utils.sh`, `lib/db_utils.sh`, `lib/service_utils.sh` +- **Test isolation**: Separate SQLite databases per test to prevent interference +- **CLI vs Service validation**: Tests ensure both paths produce identical events +- **Event analysis**: Detailed breakdown of job/partition/request event counts +- **Robust service management**: Start/stop with proper cleanup and health checks + +**Target System**: basic_graph example with two jobs: +- `generate_number_job`: Produces partitions like `generated_number/pippin` +- `sum_job`: Depends on multiple generated numbers, produces `sum/pippin_salem_sadie` + +## New Test Implementation Plan + +### 1. Create Delegation-Specific Test: `basic_graph_delegation_test.sh` + +**Test Scenarios**: +- **Historical Delegation**: Run same partition twice, verify second run delegates to first +- **Multi-partition Jobs**: Test delegation behavior when jobs produce multiple partitions +- **Mixed Availability**: Test jobs where some target partitions exist, others don't +- **BEL Verification**: Validate specific delegation events and job status transitions + +**Core Test Cases**: + +1. **Single Partition Historical Delegation** + - Build `generated_number/pippin` (first run - normal execution) + - Build `generated_number/pippin` again (second run - should delegate) + - Verify BEL contains: `DelegationEvent` + `JOB_SKIPPED` for second run + +2. **Multi-Partition Delegation Scenarios** + - Build `generated_number/pippin`, `generated_number/salem`, `generated_number/sadie` + - Build `sum/pippin_salem_sadie` (should delegate to existing partitions) + - Verify delegation events point to correct source build requests + +3. **Partial Delegation Scenario** + - Build `generated_number/pippin`, `generated_number/salem` + - Request `generated_number/pippin`, `generated_number/salem`, `generated_number/sadie` + - Verify: delegations for pippin/salem, normal execution for sadie + +4. **Cross-Run Delegation Chain** + - Run 1: Build `generated_number/pippin` + - Run 2: Build `generated_number/salem` + - Run 3: Build `sum/pippin_salem_sadie` (requires sadie, should delegate pippin/salem) + - Verify delegation traceability to correct source builds + +### 2. BEL Validation Utilities + +**New functions in `lib/db_utils.sh`**: +- `get_delegation_events()`: Extract delegation events for specific partition +- `verify_job_skipped()`: Check job was properly skipped with delegation +- `get_delegation_source_build()`: Validate delegation points to correct build request +- `compare_delegation_behavior()`: Compare CLI vs Service delegation consistency + +**Event Validation Logic**: +```bash +# For historical delegation, verify event sequence: +# 1. DelegationEvent(partition_ref, delegated_to_build_request_id, message) +# 2. JobEvent(status=JOB_SKIPPED, message="Job skipped - all target partitions already available") +# 3. No JobEvent(JOB_SCHEDULED/RUNNING/COMPLETED) for delegated job + +# For successful delegation: +# - Success rate should be 100% (JOB_SKIPPED counts as success) +# - Partition should show as available without re-execution +# - Build request should complete successfully +``` + +### 3. Performance and Reliability Validation + +**Delegation Efficiency Tests**: +- Time comparison: first run vs delegated run (should be significantly faster) +- Resource usage: ensure delegated runs don't spawn job processes +- Concurrency: multiple builds requesting same partition simultaneously + +**Error Scenarios**: +- Source build request failure handling +- Corrupted delegation data +- Stale partition detection + +### 4. Integration with Existing Test Suite + +**File Structure**: +``` +tests/end_to_end/ +├── basic_graph_delegation_test.sh # New delegation-specific tests +├── basic_graph_test.sh # Existing functionality tests (enhanced) +├── lib/ +│ ├── delegation_utils.sh # New delegation validation utilities +│ ├── db_utils.sh # Enhanced with delegation functions +│ └── test_utils.sh # Existing utilities +└── BUILD # Updated to include new test +``` + +**Bazel Integration**: +- Add `basic_graph_delegation_test` as new `sh_test` target +- Include in `run_e2e_tests.sh` execution +- Tag with `["delegation", "e2e"]` for selective running + +### 5. CLI vs Service Delegation Consistency + +**Validation Approach**: +- Run identical delegation scenarios through both CLI and Service +- Compare BEL entries for identical delegation behavior +- Ensure both paths produce same success rates and event counts +- Validate API responses include delegation information + +### 6. Documentation and Debugging Support + +**Test Output Enhancement**: +- Clear delegation event logging during test execution +- Detailed failure diagnostics showing expected vs actual delegation behavior +- BEL dump utilities for debugging delegation issues +- Performance metrics (execution time, event counts) + +## Expected Outcomes + +**Success Criteria**: +1. **100% Success Rate**: Delegated builds show 100% success rate in dashboard +2. **Event Consistency**: CLI and Service produce identical delegation events +3. **Traceability**: All delegations link to correct source build requests +4. **Performance**: Delegated runs complete in <5 seconds vs 30+ seconds for full execution +5. **Multi-partition Correctness**: Complex jobs with mixed partition availability handled properly + +**Regression Prevention**: +- Automated validation prevents delegation system regressions +- Comprehensive BEL verification ensures audit trail integrity +- Performance benchmarks detect delegation efficiency degradation + +## Implementation Priority + +1. **High**: Core delegation test cases (historical, multi-partition) +2. **High**: BEL validation utilities and event verification +3. **Medium**: Performance benchmarking and efficiency validation +4. **Medium**: Error scenario testing and edge cases +5. **Low**: Advanced concurrency and stress testing + +This plan provides a comprehensive testing strategy that validates both the functional correctness and performance benefits of the delegation system while ensuring long-term reliability and debuggability. + +## Implementation Notes + +This plan was created following the user's request to improve system reliability and testability for the DataBuild delegation system. The focus is on the basic_graph example because it provides a simpler, more predictable test environment compared to the podcast_reviews example, while still covering all the essential delegation scenarios. + +The delegation system currently shows some issues (67% success rate instead of 100%) that these tests should help identify and prevent regression of once fixed. The comprehensive BEL validation will ensure that the delegation events provide proper audit trails and traceability as intended by the system design. \ No newline at end of file diff --git a/run_e2e_tests.sh b/run_e2e_tests.sh index e0a4be3..180050e 100755 --- a/run_e2e_tests.sh +++ b/run_e2e_tests.sh @@ -98,6 +98,15 @@ main() { "$SCRIPT_DIR/examples/basic_graph/bazel-bin/basic_graph.build" \ "$SCRIPT_DIR/examples/basic_graph/bazel-bin/basic_graph.service" + # Run delegation test for basic graph + log_info "Running test: Basic Graph Delegation Test" + if ! (cd "$SCRIPT_DIR/examples/basic_graph" && \ + "$SCRIPT_DIR/tests/end_to_end/delegation_test.sh" \ + "bazel-bin/basic_graph.build"); then + test_fail "Test failed: Basic Graph Delegation Test" + fi + test_pass "Test passed: Basic Graph Delegation Test" + # Test 2: Podcast Reviews log_info "=== Podcast Reviews End-to-End Tests ===" @@ -117,6 +126,15 @@ main() { fi test_pass "Test passed: Podcast Reviews Simple Test" + # Run delegation test for podcast reviews + log_info "Running test: Podcast Reviews Delegation Test" + if ! (cd "$SCRIPT_DIR/examples/podcast_reviews" && \ + "$SCRIPT_DIR/tests/end_to_end/delegation_test.sh" \ + "bazel-bin/podcast_reviews_graph.build"); then + test_fail "Test failed: Podcast Reviews Delegation Test" + fi + test_pass "Test passed: Podcast Reviews Delegation Test" + # Test 3: Core DataBuild Tests (if any exist) log_info "=== Core DataBuild Tests ===" @@ -130,7 +148,9 @@ main() { # Summary log_info "=== Test Summary ===" test_pass "Basic Graph CLI and Service builds work correctly" + test_pass "Basic Graph delegation prevents duplicate builds" test_pass "Podcast Reviews CLI build works correctly" + test_pass "Podcast Reviews delegation prevents duplicate builds" test_pass "Build event logging functions properly" test_pass "Service APIs respond correctly" @@ -142,6 +162,8 @@ main() { log_info " ✅ Both CLI and Service approaches work consistently" log_info " ✅ Complex pipeline jobs (podcast reviews) execute successfully" log_info " ✅ Event logging to SQLite databases works" + log_info " ✅ Build delegation prevents duplicate execution of completed partitions" + log_info " ✅ Second builds delegate to existing partitions and run much faster" } # Handle cleanup on exit diff --git a/tests/end_to_end/BUILD b/tests/end_to_end/BUILD index 70a45e3..e4d2356 100644 --- a/tests/end_to_end/BUILD +++ b/tests/end_to_end/BUILD @@ -9,6 +9,23 @@ filegroup( visibility = ["//visibility:public"], ) +# Delegation test that verifies second builds properly delegate to existing partitions +sh_test( + name = "delegation_test", + srcs = ["delegation_test.sh"], + data = [ + "//examples/basic_graph:basic_graph.build", + ":test_utils", + ], + size = "medium", + timeout = "moderate", + env = { + "PATH": "/usr/bin:/bin:/usr/local/bin", + }, + tags = ["e2e", "delegation"], + args = ["$(location //examples/basic_graph:basic_graph.build)"], +) + # Simple shell script test that validates the test runner sh_test( name = "e2e_runner_test", @@ -22,6 +39,7 @@ sh_test( "simple_test.sh", "basic_graph_test.sh", "podcast_reviews_test.sh", + "delegation_test.sh", ], size = "small", timeout = "short", diff --git a/tests/end_to_end/delegation_test.sh b/tests/end_to_end/delegation_test.sh new file mode 100755 index 0000000..0cf5896 --- /dev/null +++ b/tests/end_to_end/delegation_test.sh @@ -0,0 +1,135 @@ +#!/bin/bash + +# End-to-end test for build delegation functionality +# Tests that running the same build twice results in proper delegation on the second run +set -euo pipefail + +CLI_BUILD="${1:-}" +PARTITION_REF="${2:-}" + +if [[ -z "$CLI_BUILD" ]]; then + echo "Usage: $0 [partition_ref]" + exit 1 +fi + +# Auto-detect partition based on binary name if not provided +if [[ -z "$PARTITION_REF" ]]; then + if [[ "$CLI_BUILD" == *"basic_graph"* ]]; then + PARTITION_REF="generated_number/pippin" + elif [[ "$CLI_BUILD" == *"podcast"* ]]; then + PARTITION_REF="daily_summaries/category=comedy/date=2020-01-01" + else + echo "[ERROR] Could not auto-detect partition reference. Please provide one as second argument." + exit 1 + fi +fi + +TEST_DB="/tmp/delegation_test.db" + +echo "[INFO] Testing delegation functionality..." + +# Clean up any existing state +rm -f "$TEST_DB" /tmp/*generated_number* 2>/dev/null || true +export DATABUILD_BUILD_EVENT_LOG="sqlite://$TEST_DB" + +echo "[INFO] Running first build (should execute all jobs)..." +START_TIME=$(date +%s%N) +if ! "$CLI_BUILD" "$PARTITION_REF" > /tmp/delegation_first_build.log 2>&1; then + echo "[ERROR] First build failed" + cat /tmp/delegation_first_build.log + exit 1 +fi +FIRST_BUILD_TIME=$(($(date +%s%N) - START_TIME)) +echo "[INFO] First build completed in $(($FIRST_BUILD_TIME / 1000000))ms" + +# Verify first build created events and partitions +if [[ ! -f "$TEST_DB" ]]; then + echo "[ERROR] Database not created after first build" + exit 1 +fi + +FIRST_BUILD_EVENTS=$(sqlite3 "$TEST_DB" "SELECT COUNT(*) FROM build_events;" 2>/dev/null || echo "0") +FIRST_JOB_EVENTS=$(sqlite3 "$TEST_DB" "SELECT COUNT(*) FROM job_events;" 2>/dev/null || echo "0") +PARTITION_AVAILABLE_COUNT=$(sqlite3 "$TEST_DB" "SELECT COUNT(*) FROM partition_events WHERE status = '4';" 2>/dev/null || echo "0") + +echo "[INFO] First build: $FIRST_BUILD_EVENTS total events, $FIRST_JOB_EVENTS job events, $PARTITION_AVAILABLE_COUNT partitions available" + +if [[ "$PARTITION_AVAILABLE_COUNT" -eq 0 ]]; then + echo "[ERROR] No partitions marked as available after first build" + sqlite3 "$TEST_DB" "SELECT partition_ref, status FROM partition_events ORDER BY rowid;" + exit 1 +fi + +echo "[INFO] Running second build (should delegate to existing partitions)..." +START_TIME=$(date +%s%N) +if ! "$CLI_BUILD" "$PARTITION_REF" > /tmp/delegation_second_build.log 2>&1; then + echo "[ERROR] Second build failed" + cat /tmp/delegation_second_build.log + exit 1 +fi +SECOND_BUILD_TIME=$(($(date +%s%N) - START_TIME)) +echo "[INFO] Second build completed in $(($SECOND_BUILD_TIME / 1000000))ms" + +# Verify second build was much faster (delegation working) +SPEED_RATIO=$((FIRST_BUILD_TIME / SECOND_BUILD_TIME)) +if [[ "$SPEED_RATIO" -lt 3 ]]; then + echo "[WARNING] Second build not significantly faster than first (ratio: $SPEED_RATIO). May indicate delegation not working optimally." +fi + +# Count events after second build +SECOND_BUILD_EVENTS=$(sqlite3 "$TEST_DB" "SELECT COUNT(*) FROM build_events;" 2>/dev/null || echo "0") +SECOND_JOB_EVENTS=$(sqlite3 "$TEST_DB" "SELECT COUNT(*) FROM job_events;" 2>/dev/null || echo "0") +TOTAL_JOB_EVENTS=$((SECOND_JOB_EVENTS - FIRST_JOB_EVENTS)) + +echo "[INFO] Second build added: $((SECOND_BUILD_EVENTS - FIRST_BUILD_EVENTS)) total events, $TOTAL_JOB_EVENTS job events" + +# Verify delegation occurred by checking for JobSkipped events +SKIPPED_JOBS=$(sqlite3 "$TEST_DB" "SELECT COUNT(*) FROM job_events WHERE status = '6';" 2>/dev/null || echo "0") +DELEGATION_EVENTS=$(sqlite3 "$TEST_DB" "SELECT COUNT(*) FROM delegation_events;" 2>/dev/null || echo "0") + +echo "[INFO] Delegation results: $SKIPPED_JOBS jobs skipped, $DELEGATION_EVENTS delegation events" + +if [[ "$SKIPPED_JOBS" -eq 0 ]]; then + echo "[ERROR] No jobs were skipped in second build - delegation not working" + echo "[DEBUG] Job event status breakdown:" + sqlite3 "$TEST_DB" "SELECT status, COUNT(*) FROM job_events GROUP BY status ORDER BY status;" 2>/dev/null || echo "Failed to query job events" + exit 1 +fi + +# Verify no duplicate partition building occurred +DUPLICATE_PARTITIONS=$(sqlite3 "$TEST_DB" " + SELECT partition_ref, COUNT(*) as build_count + FROM partition_events + WHERE status = '4' + GROUP BY partition_ref + HAVING build_count > 1 +" 2>/dev/null || echo "") + +if [[ -n "$DUPLICATE_PARTITIONS" ]]; then + echo "[ERROR] Partitions were built multiple times (delegation failed):" + echo "$DUPLICATE_PARTITIONS" + exit 1 +fi + +# Verify the target partition was properly delegated +TARGET_PARTITION_BUILDS=$(sqlite3 "$TEST_DB" " + SELECT COUNT(*) + FROM partition_events + WHERE partition_ref = '$PARTITION_REF' AND status = '4' +" 2>/dev/null || echo "0") + +if [[ "$TARGET_PARTITION_BUILDS" -ne 1 ]]; then + echo "[ERROR] Target partition '$PARTITION_REF' was built $TARGET_PARTITION_BUILDS times instead of 1" + sqlite3 "$TEST_DB" "SELECT be.build_request_id, pe.partition_ref, pe.status, be.timestamp FROM partition_events pe JOIN build_events be ON pe.event_id = be.event_id WHERE pe.partition_ref = '$PARTITION_REF' ORDER BY be.timestamp;" + exit 1 +fi + +echo "[INFO] ✅ Delegation test passed!" +echo "[INFO] Summary:" +echo "[INFO] - First build: $(($FIRST_BUILD_TIME / 1000000))ms, created $PARTITION_AVAILABLE_COUNT available partitions" +echo "[INFO] - Second build: $(($SECOND_BUILD_TIME / 1000000))ms, delegated $SKIPPED_JOBS jobs" +echo "[INFO] - Speed improvement: ${SPEED_RATIO}x faster" +echo "[INFO] - No duplicate partition building detected" + +# Clean up +rm -f "$TEST_DB" /tmp/delegation_*.log /tmp/*generated_number* 2>/dev/null || true \ No newline at end of file diff --git a/tests/end_to_end/podcast_simple_test.sh b/tests/end_to_end/podcast_simple_test.sh index 38032d4..9987b11 100755 --- a/tests/end_to_end/podcast_simple_test.sh +++ b/tests/end_to_end/podcast_simple_test.sh @@ -38,7 +38,8 @@ echo "[INFO] Testing Service build for podcast reviews..." SERVICE_DB_PATH="/tmp/podcast_reviews_graph_service.db" rm -f "$SERVICE_DB_PATH" -# Start service +# Start service with its own database +export DATABUILD_BUILD_EVENT_LOG="sqlite://$SERVICE_DB_PATH" SERVICE_PORT=58082 "$SERVICE_BINARY" --port="$SERVICE_PORT" --host="127.0.0.1" > /tmp/podcast_service.log 2>&1 & SERVICE_PID=$! @@ -90,7 +91,7 @@ for i in {1..60}; do echo "[ERROR] Service build failed: $STATUS_RESPONSE" exit 1 ;; - "running"|"RUNNING"|"pending"|"PENDING"|"planning"|"PLANNING") + "running"|"RUNNING"|"pending"|"PENDING"|"planning"|"PLANNING"|"executing"|"EXECUTING") echo "[INFO] Build status: $STATUS" sleep 2 ;; @@ -136,11 +137,12 @@ if [[ "$CLI_EVENTS" -gt 0 ]] && [[ "$SERVICE_EVENTS" -gt 0 ]]; then echo "[INFO] Partition events: CLI=$CLI_PARTITION_EVENTS, Service=$SERVICE_PARTITION_EVENTS" echo "[INFO] Request events: CLI=$CLI_REQUEST_EVENTS, Service=$SERVICE_REQUEST_EVENTS" - # Validate core events are identical (job, partition, and request events should all match now) + # Validate that CLI and Service produce identical event patterns if [[ "$CLI_JOB_EVENTS" -eq "$SERVICE_JOB_EVENTS" ]] && [[ "$CLI_PARTITION_EVENTS" -eq "$SERVICE_PARTITION_EVENTS" ]] && [[ "$CLI_REQUEST_EVENTS" -eq "$SERVICE_REQUEST_EVENTS" ]]; then - echo "[INFO] ✅ All build events (job, partition, and request) are identical" + echo "[INFO] ✅ Core build events (job, partition, and request) are identical" else - echo "[ERROR] ❌ Build events differ between CLI and Service - this indicates a problem" + echo "[ERROR] ❌ Core build events differ - CLI and Service should produce identical events" + echo "[ERROR] This indicates the CLI is not properly coordinating analysis and execution phases" exit 1 fi @@ -149,6 +151,7 @@ if [[ "$CLI_EVENTS" -gt 0 ]] && [[ "$SERVICE_EVENTS" -gt 0 ]]; then echo "[INFO] ✅ Total event counts are identical: $CLI_EVENTS events each" else echo "[ERROR] ❌ Total event counts differ: CLI=$CLI_EVENTS, Service=$SERVICE_EVENTS" + echo "[ERROR] CLI and Service should produce identical event patterns for the same operations" exit 1 fi diff --git a/tests/end_to_end/simple_test.sh b/tests/end_to_end/simple_test.sh index 689641d..5dd92cd 100755 --- a/tests/end_to_end/simple_test.sh +++ b/tests/end_to_end/simple_test.sh @@ -12,8 +12,14 @@ if [[ -z "$CLI_BUILD" ]] || [[ -z "$SERVICE_BINARY" ]]; then fi echo "[INFO] Testing CLI build..." +# Clean up any existing partition state and databases to prevent delegation +rm -f /tmp/simple_test_cli.db /tmp/basic_graph_service.db +rm -f /tmp/*generated_number* 2>/dev/null || true +# Kill any existing service processes that might hold database locks +killall basic_graph.service 2>/dev/null || true +killall build_graph_service 2>/dev/null || true +sleep 1 export DATABUILD_BUILD_EVENT_LOG="sqlite:///tmp/simple_test_cli.db" -rm -f /tmp/simple_test_cli.db # Test CLI build if ! "$CLI_BUILD" "generated_number/pippin" > /tmp/cli_output.log 2>&1; then @@ -36,9 +42,11 @@ fi echo "[INFO] Testing Service build..." # The service uses a hardcoded database path SERVICE_DB_PATH="/tmp/basic_graph_service.db" +# Clean up service database (already cleaned above, but being explicit) rm -f "$SERVICE_DB_PATH" -# Start service +# Start service with its own database +export DATABUILD_BUILD_EVENT_LOG="sqlite://$SERVICE_DB_PATH" SERVICE_PORT=58080 "$SERVICE_BINARY" --port="$SERVICE_PORT" --host="127.0.0.1" > /tmp/service.log 2>&1 & SERVICE_PID=$! @@ -92,7 +100,7 @@ for i in {1..30}; do echo "[ERROR] Service build failed: $STATUS_RESPONSE" exit 1 ;; - "running"|"RUNNING"|"pending"|"PENDING"|"planning"|"PLANNING") + "running"|"RUNNING"|"pending"|"PENDING"|"planning"|"PLANNING"|"executing"|"EXECUTING") echo "[INFO] Build status: $STATUS" sleep 2 ;; @@ -138,11 +146,21 @@ if [[ "$CLI_EVENTS" -gt 0 ]] && [[ "$SERVICE_EVENTS" -gt 0 ]]; then echo "[INFO] Partition events: CLI=$CLI_PARTITION_EVENTS, Service=$SERVICE_PARTITION_EVENTS" echo "[INFO] Request events: CLI=$CLI_REQUEST_EVENTS, Service=$SERVICE_REQUEST_EVENTS" - # Validate core events are identical + # Validate that CLI and Service produce identical event patterns if [[ "$CLI_JOB_EVENTS" -eq "$SERVICE_JOB_EVENTS" ]] && [[ "$CLI_PARTITION_EVENTS" -eq "$SERVICE_PARTITION_EVENTS" ]] && [[ "$CLI_REQUEST_EVENTS" -eq "$SERVICE_REQUEST_EVENTS" ]]; then - echo "[INFO] ✅ Core build events (job and partition) are identical" + echo "[INFO] ✅ Core build events (job, partition, and request) are identical" else - echo "[ERROR] ❌ Core build events differ - this indicates a problem" + echo "[ERROR] ❌ Core build events differ - CLI and Service should produce identical events" + echo "[ERROR] This indicates the CLI is not properly coordinating analysis and execution phases" + exit 1 + fi + + # Validate total event counts are identical + if [[ "$CLI_EVENTS" -eq "$SERVICE_EVENTS" ]]; then + echo "[INFO] ✅ Total event counts are identical: $CLI_EVENTS events each" + else + echo "[ERROR] ❌ Total event counts differ: CLI=$CLI_EVENTS, Service=$SERVICE_EVENTS" + echo "[ERROR] CLI and Service should produce identical event patterns for the same operations" exit 1 fi diff --git a/tests/end_to_end/validate_runner.sh b/tests/end_to_end/validate_runner.sh index 7cda174..1d830bf 100755 --- a/tests/end_to_end/validate_runner.sh +++ b/tests/end_to_end/validate_runner.sh @@ -6,7 +6,10 @@ set -euo pipefail echo "[INFO] Validating E2E test runner setup" # Check if the test runner exists -RUNNER_PATH="/Users/stuart/Projects/databuild/run_e2e_tests.sh" +# Find the runner relative to the workspace root +SCRIPT_DIR="$(dirname "${BASH_SOURCE[0]}")" +WORKSPACE_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" +RUNNER_PATH="$WORKSPACE_ROOT/run_e2e_tests.sh" if [[ ! -f "$RUNNER_PATH" ]]; then echo "[ERROR] E2E test runner not found at: $RUNNER_PATH" exit 1