From 828c3cff6a234c759c910edc6336997172ec3217 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Tue, 26 Nov 2024 16:40:45 -0800 Subject: [PATCH 01/33] Rewrite --- .dockerignore | 1 - .../{pytype-neuron.yaml => pytype-base.yaml} | 2 +- .gitignore | 3 - {miner/miner => base/base}/__init__.py | 0 base/base/checkpoint.py | 17 + {neuron/neuron => base/base}/config.py | 9 +- {neuron/neuron => base/base}/contest.py | 69 +- {neuron/neuron => base/base}/device.py | 21 - .../base/inputs_api.py | 16 +- .../base}/network_commitments.py | 3 - .../neuron => base/base}/output_comparator.py | 24 +- base/base/submissions.py | 133 ++ {neuron => base}/pyproject.toml | 33 +- base/testing/__init__.py | 0 base/testing/benchmarker.py | 145 ++ .../testing}/blacklist.sh | 8 +- base/testing/clear_cache.sh | 9 + .../testing}/clone.sh | 0 .../testing}/download_huggingface_models.sh | 4 +- base/testing/inference_sandbox.py | 236 ++++ .../testing}/libnetwork_jail.so | Bin .../testing}/start_inference.sh | 0 base/testing/sync_uv.sh | 5 + .../testing}/vram_monitor.py | 5 +- miner/miner/submit.py | 204 +-- miner/pyproject.toml | 6 +- miner/uv.lock | 796 ++++------- neuron/neuron/__init__.py | 5 - neuron/neuron/checkpoint.py | 59 - neuron/neuron/submission_tester/__init__.py | 4 - .../neuron/submission_tester/clear_cache.sh | 11 - .../dependency_blacklist.txt | 1 - .../submission_tester/inference_sandbox.py | 144 -- .../setup_inference_sandbox.py | 155 --- neuron/neuron/submission_tester/sync_uv.sh | 9 - neuron/neuron/submission_tester/testing.py | 218 --- neuron/neuron/submissions.py | 96 -- pipelines/pipelines/models.py | 1 - pipelines/pyproject.toml | 9 +- pyproject.toml | 16 - validator/base_validator/__init__.py | 5 - validator/base_validator/api_data.py | 30 + validator/base_validator/auto_updater.py | 17 +- validator/base_validator/metrics.py | 30 - validator/base_validator/telemetry.py | 6 + validator/generate_compose.py | 1 - validator/pyproject.toml | 22 +- validator/submission_tester/Dockerfile | 36 +- validator/submission_tester/__init__.py | 1 - validator/submission_tester/api.py | 126 +- validator/submission_tester/benchmarker.py | 163 --- validator/submission_tester/entrypoint.sh | 2 +- validator/submission_tester/start.sh | 4 +- validator/submission_tester/update.sh | 13 +- validator/uv.lock | 1221 +++++------------ validator/weight_setting/Dockerfile | 39 +- validator/weight_setting/benchmarking_api.py | 123 +- validator/weight_setting/contest_state.py | 88 ++ validator/weight_setting/entrypoint.sh | 2 +- validator/weight_setting/start.sh | 2 +- validator/weight_setting/state_manager.py | 46 + .../weight_setting/telemetry_attributes.py | 15 +- validator/weight_setting/validator.py | 936 ++----------- validator/weight_setting/validator_args.py | 21 + validator/weight_setting/wandb_args.py | 38 - validator/weight_setting/wandb_manager.py | 114 ++ validator/weight_setting/weight_setter.py | 125 ++ validator/weight_setting/winner_selection.py | 102 +- 68 files changed, 2084 insertions(+), 3721 deletions(-) delete mode 100644 .dockerignore rename .github/workflows/{pytype-neuron.yaml => pytype-base.yaml} (90%) rename {miner/miner => base/base}/__init__.py (100%) create mode 100644 base/base/checkpoint.py rename {neuron/neuron => base/base}/config.py (71%) rename {neuron/neuron => base/base}/contest.py (73%) rename {neuron/neuron => base/base}/device.py (77%) rename neuron/neuron/random_inputs.py => base/base/inputs_api.py (57%) rename {neuron/neuron => base/base}/network_commitments.py (99%) rename {neuron/neuron => base/base}/output_comparator.py (85%) create mode 100644 base/base/submissions.py rename {neuron => base}/pyproject.toml (54%) create mode 100644 base/testing/__init__.py create mode 100644 base/testing/benchmarker.py rename {neuron/neuron/submission_tester => base/testing}/blacklist.sh (78%) create mode 100755 base/testing/clear_cache.sh rename {neuron/neuron/submission_tester => base/testing}/clone.sh (100%) rename {neuron/neuron/submission_tester => base/testing}/download_huggingface_models.sh (76%) create mode 100644 base/testing/inference_sandbox.py rename {neuron/neuron/submission_tester => base/testing}/libnetwork_jail.so (100%) rename {neuron/neuron/submission_tester => base/testing}/start_inference.sh (100%) create mode 100755 base/testing/sync_uv.sh rename {neuron/neuron/submission_tester => base/testing}/vram_monitor.py (87%) delete mode 100644 neuron/neuron/__init__.py delete mode 100644 neuron/neuron/checkpoint.py delete mode 100644 neuron/neuron/submission_tester/__init__.py delete mode 100755 neuron/neuron/submission_tester/clear_cache.sh delete mode 100644 neuron/neuron/submission_tester/dependency_blacklist.txt delete mode 100644 neuron/neuron/submission_tester/inference_sandbox.py delete mode 100644 neuron/neuron/submission_tester/setup_inference_sandbox.py delete mode 100755 neuron/neuron/submission_tester/sync_uv.sh delete mode 100644 neuron/neuron/submission_tester/testing.py delete mode 100644 neuron/neuron/submissions.py delete mode 100644 pyproject.toml create mode 100644 validator/base_validator/api_data.py delete mode 100644 validator/base_validator/metrics.py delete mode 100644 validator/submission_tester/benchmarker.py create mode 100644 validator/weight_setting/contest_state.py create mode 100644 validator/weight_setting/state_manager.py create mode 100644 validator/weight_setting/validator_args.py delete mode 100644 validator/weight_setting/wandb_args.py create mode 100644 validator/weight_setting/wandb_manager.py create mode 100644 validator/weight_setting/weight_setter.py diff --git a/.dockerignore b/.dockerignore deleted file mode 100644 index 0300decc..00000000 --- a/.dockerignore +++ /dev/null @@ -1 +0,0 @@ -**/.venv diff --git a/.github/workflows/pytype-neuron.yaml b/.github/workflows/pytype-base.yaml similarity index 90% rename from .github/workflows/pytype-neuron.yaml rename to .github/workflows/pytype-base.yaml index fb9a9480..dc4d0344 100644 --- a/.github/workflows/pytype-neuron.yaml +++ b/.github/workflows/pytype-base.yaml @@ -15,6 +15,6 @@ jobs: uses: astral-sh/setup-uv@v3 - name: Test Types - working-directory: neuron + working-directory: main run: | uv run pytype diff --git a/.gitignore b/.gitignore index f1ab62af..1019162b 100644 --- a/.gitignore +++ b/.gitignore @@ -161,7 +161,4 @@ cython_debug/ .idea/ huggingface/ -pip/ -miner/model/ -miner/baseline_cache.json validator/compose.yaml diff --git a/miner/miner/__init__.py b/base/base/__init__.py similarity index 100% rename from miner/miner/__init__.py rename to base/base/__init__.py diff --git a/base/base/checkpoint.py b/base/base/checkpoint.py new file mode 100644 index 00000000..28b2c9f9 --- /dev/null +++ b/base/base/checkpoint.py @@ -0,0 +1,17 @@ +from datetime import datetime +from typing import TypeAlias +from zoneinfo import ZoneInfo + +from base.contest import Submission, Benchmark + +TIMEZONE = ZoneInfo("America/Los_Angeles") +SPEC_VERSION = 7 + +Uid: TypeAlias = int +Key: TypeAlias = str + +Submissions: TypeAlias = dict[Key, Submission] +Benchmarks: TypeAlias = dict[Key, Benchmark] + +def current_time() -> datetime: + return datetime.now(tz=TIMEZONE) diff --git a/neuron/neuron/config.py b/base/base/config.py similarity index 71% rename from neuron/neuron/config.py rename to base/base/config.py index c2fdc9e2..4d8fe8dc 100644 --- a/neuron/neuron/config.py +++ b/base/base/config.py @@ -1,9 +1,8 @@ from argparse import ArgumentParser -from typing import Callable, Any +from typing import Callable from fiber.constants import FINNEY_NETWORK - def get_config(add_args: Callable[[ArgumentParser], None] | None = None): argument_parser = ArgumentParser() @@ -28,11 +27,7 @@ def get_config(add_args: Callable[[ArgumentParser], None] | None = None): argument_parser.add_argument("--netuid", type=int, required=True, help="Network UID") - # Deprecated arguments that won't be used - argument_parser.add_argument("--logging.debug", action="store_true", help="Enable debug logging", default=False) - argument_parser.add_argument("--logging.trace", action="store_true", help="Enable trace logging", default=False) - if add_args: add_args(argument_parser) - return vars(argument_parser.parse_args()) + return vars(argument_parser.parse_known_args()[0]) diff --git a/neuron/neuron/contest.py b/base/base/contest.py similarity index 73% rename from neuron/neuron/contest.py rename to base/base/contest.py index 0c4b3f06..eb3dd5e0 100644 --- a/neuron/neuron/contest.py +++ b/base/base/contest.py @@ -7,11 +7,10 @@ from pydantic import BaseModel from .device import Device, CudaDevice, Gpu -from .output_comparator import OutputComparator, ImageOutputComparator +from .output_comparator import OutputComparator, CudaImageOutputComparator SIMILARITY_SCORE_THRESHOLD = 0.7 - class MetricType(IntEnum): SIMILARITY_SCORE = 0 GENERATION_TIME = 1 @@ -20,46 +19,49 @@ class MetricType(IntEnum): WATTS_USED = 4 LOAD_TIME = 5 +class ContestId(IntEnum): + FLUX_NVIDIA_4090 = 0 + SDXL_NEWDREAM_NVIDIA_4090 = 1 + +class RepositoryInfo(BaseModel): + url: str + revision: str -class MetricData(BaseModel): +class Submission(BaseModel): + repository_info: RepositoryInfo + contest_id: ContestId + block: int + + def contest(self) -> "Contest": + return find_contest(self.contest_id) + +class Metrics(BaseModel): generation_time: float size: int vram_used: float watts_used: float load_time: float - -class CheckpointBenchmark(BaseModel): - model: MetricData +class Benchmark(BaseModel): + metrics: Metrics average_similarity: float min_similarity: float - -class ModelRepositoryInfo(BaseModel): - url: str - revision: str - - -class ContestId(IntEnum): - FLUX_NVIDIA_4090 = 0 - SDXL_NEWDREAM_NVIDIA_4090 = 1 - - @dataclass class Contest: id: ContestId device: Device output_comparator: Callable[[], OutputComparator] - baseline_repository: ModelRepositoryInfo + baseline_repository: RepositoryInfo metric_weights: dict[MetricType, int] def __init__( - self, - contest_id: ContestId, - device: Device, - output_comparator: Callable[[], OutputComparator], - baseline_repository: ModelRepositoryInfo, - metric_weights: dict[MetricType, int] + self, + contest_id: ContestId, + device: Device, + output_comparator: Callable[[], OutputComparator], + baseline_repository: RepositoryInfo, + metric_weights: dict[MetricType, int] ): self.id = contest_id self.device = device @@ -67,7 +69,7 @@ def __init__( self.baseline_repository = baseline_repository self.metric_weights = metric_weights - def calculate_score(self, baseline: MetricData, benchmark: CheckpointBenchmark) -> float: + def calculate_score(self, baseline: Metrics, benchmark: Benchmark) -> float: if benchmark.min_similarity < SIMILARITY_SCORE_THRESHOLD: return 0.0 @@ -92,13 +94,12 @@ def normalize(baseline_value: float, benchmark_value: float, metric_type: Metric return score * similarity * self.metric_weights.get(MetricType.SIMILARITY_SCORE, 0) / total_weight - CONTESTS = [ Contest( contest_id=ContestId.FLUX_NVIDIA_4090, device=CudaDevice(gpu=Gpu.NVIDIA_RTX_4090), - output_comparator=partial(ImageOutputComparator, "cuda"), - baseline_repository=ModelRepositoryInfo(url="https://github.com/womboai/flux-schnell-edge-inference", revision="fbfb8f0"), + output_comparator=partial(CudaImageOutputComparator), + baseline_repository=RepositoryInfo(url="https://github.com/womboai/flux-schnell-edge-inference", revision="fbfb8f0"), metric_weights={ MetricType.SIMILARITY_SCORE: 3, MetricType.VRAM_USED: 3, @@ -108,8 +109,8 @@ def normalize(baseline_value: float, benchmark_value: float, metric_type: Metric Contest( contest_id=ContestId.SDXL_NEWDREAM_NVIDIA_4090, device=CudaDevice(gpu=Gpu.NVIDIA_RTX_4090), - output_comparator=partial(ImageOutputComparator, "cuda"), - baseline_repository=ModelRepositoryInfo(url="https://github.com/womboai/sdxl-newdream-20-inference", revision="1b3f9ea"), + output_comparator=partial(CudaImageOutputComparator), + baseline_repository=RepositoryInfo(url="https://github.com/womboai/sdxl-newdream-20-inference", revision="1b3f9ea"), metric_weights={ MetricType.SIMILARITY_SCORE: 1, MetricType.GENERATION_TIME: 1, @@ -117,7 +118,6 @@ def normalize(baseline_value: float, benchmark_value: float, metric_type: Metric ), ] - def find_contest(contest_id: ContestId): for contest in CONTESTS: if contest.id != contest_id: @@ -127,10 +127,9 @@ def find_contest(contest_id: ContestId): raise RuntimeError(f"Unknown contest ID requested {contest_id}") - def find_compatible_contests() -> list[ContestId]: return [contest.id for contest in CONTESTS if contest.device.is_compatible()] - -CURRENT_CONTEST: Contest = find_contest(ContestId.FLUX_NVIDIA_4090) -ACTIVE_CONTESTS = { ContestId.FLUX_NVIDIA_4090 } +ACTIVE_CONTESTS = [ + ContestId.FLUX_NVIDIA_4090 +] diff --git a/neuron/neuron/device.py b/base/base/device.py similarity index 77% rename from neuron/neuron/device.py rename to base/base/device.py index 85191d68..7b1670fe 100644 --- a/neuron/neuron/device.py +++ b/base/base/device.py @@ -1,11 +1,9 @@ from abc import ABC, abstractmethod from enum import Enum - class Gpu(Enum): NVIDIA_RTX_4090 = "NVIDIA GeForce RTX 4090" - class Device(ABC): @abstractmethod def get_vram_used(self): @@ -19,11 +17,6 @@ def get_joules(self): def is_compatible(self): ... - @abstractmethod - def validate(self): - ... - - class CudaDevice(Device): _gpu: Gpu @@ -57,15 +50,6 @@ def is_compatible(self): return device_name == self._gpu.value - def validate(self): - import torch - - device_name = torch.cuda.get_device_name() - - if not self.is_compatible(): - raise ContestDeviceValidationError(f"Incompatible device {device_name} when {self._gpu.name} is required.") - - class MpsDevice(Device): def get_vram_used(self): import torch @@ -80,11 +64,6 @@ def is_compatible(self): return torch.backends.mps.is_available() - def validate(self): - if not self.is_compatible(): - raise ContestDeviceValidationError("MPS is not available but is required.") - - class ContestDeviceValidationError(Exception): def __init__(self, message: str): super().__init__(message) diff --git a/neuron/neuron/random_inputs.py b/base/base/inputs_api.py similarity index 57% rename from neuron/neuron/random_inputs.py rename to base/base/inputs_api.py index 28baaad0..8a0b3758 100644 --- a/neuron/neuron/random_inputs.py +++ b/base/base/inputs_api.py @@ -1,15 +1,12 @@ import os -from zoneinfo import ZoneInfo import requests from pydantic import RootModel from pipelines import TextToImageRequest -TIMEZONE = ZoneInfo("America/Los_Angeles") INPUTS_ENDPOINT = os.getenv("INPUTS_ENDPOINT", "https://edge-inputs.api.wombo.ai") - def random_inputs() -> list[TextToImageRequest]: response = requests.get( f"{INPUTS_ENDPOINT}/current_batch", headers={ @@ -20,3 +17,16 @@ def random_inputs() -> list[TextToImageRequest]: response.raise_for_status() return RootModel[list[TextToImageRequest]].model_validate_json(response.text).root + +def blacklisted_keys() -> dict: + response = requests.get( + f"{INPUTS_ENDPOINT}/blacklist", headers={ + "Content-Type": "application/json" + }, + ) + + response.raise_for_status() + return response.json() + +def is_blacklisted(blacklist: dict, hotkey: str, coldkey: str): + return hotkey in blacklist["hotkeys"] or coldkey in blacklist["coldkeys"] diff --git a/neuron/neuron/network_commitments.py b/base/base/network_commitments.py similarity index 99% rename from neuron/neuron/network_commitments.py rename to base/base/network_commitments.py index 692e1eee..48369fbe 100644 --- a/neuron/neuron/network_commitments.py +++ b/base/base/network_commitments.py @@ -1,10 +1,8 @@ from struct import pack, unpack - _UINT_16_SIZE = 2 _UINT_32_SIZE = 4 - class Encoder: _data: bytearray @@ -37,7 +35,6 @@ def finish(self): return bytes(self._data) - class Decoder: _position: int _data: bytes diff --git a/neuron/neuron/output_comparator.py b/base/base/output_comparator.py similarity index 85% rename from neuron/neuron/output_comparator.py rename to base/base/output_comparator.py index 6823229e..35c6c4c0 100644 --- a/neuron/neuron/output_comparator.py +++ b/base/base/output_comparator.py @@ -2,8 +2,7 @@ from io import BytesIO from typing import ContextManager -from transformers import CLIPProcessor, CLIPVisionModelWithProjection - +from transformers import CLIPProcessor, CLIPVisionModelWithProjection, PreTrainedModel class OutputComparator(ContextManager, ABC): @abstractmethod @@ -15,8 +14,10 @@ def __wrapped_compare(self, baseline: bytes, optimized: bytes): __call__ = __wrapped_compare - class ImageOutputComparator(OutputComparator): + clip: PreTrainedModel + processor: CLIPProcessor + def __init__(self, device: str): self.device = device self.clip = CLIPVisionModelWithProjection.from_pretrained("laion/CLIP-ViT-bigG-14-laion2B-39B-b160k").to(self.device) @@ -66,8 +67,19 @@ def __enter__(self): return self def __exit__(self, exc_type, exc_value, traceback): - import torch - del self.clip del self.processor - getattr(torch, self.device).empty_cache() + +class CudaImageOutputComparator(ImageOutputComparator): + def __init__(self): + super().__init__("cuda") + + def __exit__(self, exc_type, exc_value, traceback): + import torch + import gc + + super().__exit__(exc_type, exc_value, traceback) + + gc.collect() + torch.cuda.synchronize() + torch.cuda.empty_cache() diff --git a/base/base/submissions.py b/base/base/submissions.py new file mode 100644 index 00000000..7180a3ac --- /dev/null +++ b/base/base/submissions.py @@ -0,0 +1,133 @@ +from typing import Annotated + +from fiber.chain.commitments import publish_raw_commitment, _deserialize_commitment_field +from fiber.chain.metagraph import Metagraph +from fiber.logging_utils import get_logger +from pydantic import BaseModel, Field +from substrateinterface import SubstrateInterface, Keypair +from substrateinterface.storage import StorageKey + +from .checkpoint import SPEC_VERSION, Submissions +from .contest import RepositoryInfo, find_contest, Submission, ContestId, ACTIVE_CONTESTS +from .inputs_api import is_blacklisted, blacklisted_keys +from .network_commitments import Encoder, Decoder + +logger = get_logger(__name__) + +REVISION_LENGTH = 7 + +class CheckpointSubmission(BaseModel): + repository: str + revision: Annotated[str, Field(min_length=REVISION_LENGTH, max_length=REVISION_LENGTH)] + contest_id: ContestId + + def encode(self, encoder: Encoder): + repository = self.repository.replace("https://", "") + parts = repository.split("/") + provider = parts[0] + owner = parts[1] + repository_name = parts[2] + + encoder.write_str(provider) + encoder.write_str(f"{owner}/{repository_name}") + encoder.write_sized_str(self.revision) + encoder.write_uint16(self.contest_id.value) + + @classmethod + def decode(cls, decoder: Decoder): + provider = decoder.read_str() + repository = decoder.read_str() + revision = decoder.read_sized_str(REVISION_LENGTH) + contest_id = ContestId(decoder.read_uint16()) + + return cls( + repository=f"https://{provider}/{repository}", + revision=revision, + contest_id=contest_id, + ) + +def make_submission( + substrate: SubstrateInterface, + netuid: int, + keypair: Keypair, + submissions: list[CheckpointSubmission], +): + encoder = Encoder() + + encoder.write_uint16(SPEC_VERSION) + + for submission in submissions: + submission.encode(encoder) + + data = encoder.finish() + + publish_raw_commitment( + substrate, + keypair, + netuid, + data, + wait_for_finalization=False, + ) + +def get_submissions( + substrate: SubstrateInterface, + metagraph: Metagraph, + block: int +) -> Submissions: + submissions: Submissions = {} + storage_keys: list[StorageKey] = [] + + blacklist = blacklisted_keys() + hotkeys = [hotkey for hotkey, node in metagraph.nodes.items() if not is_blacklisted(blacklist, hotkey, node.coldkey)] + for hotkey in hotkeys: + storage_keys.append(substrate.create_storage_key( + "Commitments", + "CommitmentOf", + [metagraph.netuid, hotkey] + )) + + commitments = substrate.query_multi( + storage_keys=storage_keys, + block_hash=substrate.get_block_hash(block), + ) + + for storage, commitment in commitments: + hotkey = storage.params[1] + try: + if not commitment or not commitment.value: + continue + + fields = commitment.value["info"]["fields"] + if not fields: + continue + + field = _deserialize_commitment_field(fields[0]) + if field is None: + continue + + decoder = Decoder(field[1]) + spec_version = decoder.read_uint16() + if spec_version != SPEC_VERSION: + continue + + while not decoder.eof: + info = CheckpointSubmission.decode(decoder) + + if info.contest_id not in ACTIVE_CONTESTS: + continue + + if info.repository == find_contest(info.contest_id).baseline_repository.url: + continue + + repository_info = RepositoryInfo(url=info.repository, revision=info.revision) + submitted_block = int(commitment.value["block"]) + submissions[hotkey] = Submission( + repository_info=repository_info, + contest_id=info.contest_id, + block=submitted_block + ) + except Exception as e: + logger.error(f"Failed to get submission from miner {hotkey}: {e}") + continue + + return submissions diff --git a/neuron/pyproject.toml b/base/pyproject.toml similarity index 54% rename from neuron/pyproject.toml rename to base/pyproject.toml index 6479c34b..53551a71 100644 --- a/neuron/pyproject.toml +++ b/base/pyproject.toml @@ -3,26 +3,21 @@ requires = ["setuptools >= 75.0"] build-backend = "setuptools.build_meta" [project] -name = "edge-maxxing-neuron" +name = "edge-maxxing-base" description = "The base neuron which validators & miners inherent from" requires-python = ">=3.10,<3.13" version = "1.0.0" dependencies = [ - "fiber @ git+https://github.com/womboai/fiber@weights", - "GitPython==3.1.43", - "torch==2.5.1", - "pynvml==11.5.3", - "diffusers==0.31.0", - "transformers==4.46.2", - "accelerate==1.1.0", - "omegaconf==2.3.0", - "torchvision==0.20.1", - "scikit-image==0.24.0", - "opencv-python==4.10.0.84", - "ImageHash==4.3.1", - "toml==0.10.2", - "opentelemetry-instrumentation>=0.49b2", "edge-maxxing-pipelines==1.0.0", + "fiber @ git+https://github.com/rayonlabs/fiber.git@1.0.0#egg=fiber[chain]", + "opentelemetry-instrumentation>=0.49b2", + "transformers>=4.46.3", + "diffusers>=0.31.0", + "accelerate>=1.1.1", + "pynvml>=11.5.3", + "scikit-image>=0.24.0", + "opencv-python>=4.10.0.84", + "gitpython>=3.1.43", ] [tool.uv.sources] @@ -34,9 +29,13 @@ dev = [ ] [tool.pytype] -inputs = ["neuron"] +inputs = [ + "base", + "tester", +] [tool.setuptools] packages = [ - "neuron", + "base", + "tester", ] diff --git a/base/testing/__init__.py b/base/testing/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/base/testing/benchmarker.py b/base/testing/benchmarker.py new file mode 100644 index 00000000..ec42f9b8 --- /dev/null +++ b/base/testing/benchmarker.py @@ -0,0 +1,145 @@ +from concurrent.futures import CancelledError +from pathlib import Path +from random import choice +from statistics import mean +from threading import Event, Thread +from time import perf_counter + +from fiber.logging_utils import get_logger +from opentelemetry import trace + +from base.checkpoint import Key, Benchmarks +from base.contest import Contest, RepositoryInfo, Benchmark +from base.inputs_api import random_inputs +from base_validator.api_data import BenchmarkState +from pipelines import TextToImageRequest +from .inference_sandbox import BenchmarkOutput, InferenceSandbox + +logger = get_logger(__name__) +tracer = trace.get_tracer(__name__) + +class Benchmarker: + _thread: Thread | None + _stop_flag: Event = Event() + + _sandbox_directory: Path + _sandbox_args: list[str] + + start_timestamp: float = 0 + state: BenchmarkState = BenchmarkState.NOT_STARTED + benchmarks: Benchmarks = {} + invalid_submissions: set[Key] = {} + baseline: BenchmarkOutput | None = None + submission_times: list[float] = [] + + def __init__(self, sandbox_directory: Path, sandbox_args: list[str]): + self._sandbox_directory = sandbox_directory + self._sandbox_args = sandbox_args + + @tracer.start_as_current_span("compare") + def compare( + self, + contest: Contest, + benchmark_output: BenchmarkOutput, + stop_flag: Event, + ) -> Benchmark: + similarities: list[float] = [] + with contest.output_comparator() as comparator: + for baseline_output, optimized_output in zip(self.baseline.outputs, benchmark_output.outputs): + if stop_flag.is_set(): + raise CancelledError() + + similarities.append(comparator(baseline_output, optimized_output)) + + average_similarity = mean(similarities) + min_similarity = min(similarities) + + return Benchmark( + metrics=benchmark_output.metrics, + average_similarity=average_similarity, + min_similarity=min_similarity, + ) + + def _is_done(self, submissions: dict[Key, RepositoryInfo]) -> bool: + return len(self.benchmarks) + len(self.invalid_submissions) == len(submissions) + + @tracer.start_as_current_span("benchmark") + def _benchmark_submission( + self, + contest: Contest, + inputs: list[TextToImageRequest], + repository_info: RepositoryInfo + ) -> BenchmarkOutput: + return InferenceSandbox( + sandbox_args=self._sandbox_args, + sandbox_directory=self._sandbox_directory, + contest=contest, + repository_info=repository_info, + inputs=inputs, + stop_flag=self._stop_flag, + ).benchmark() + + @tracer.start_as_current_span("benchmark_baseline") + def _benchmark_baseline(self, contest: Contest, inputs: list[TextToImageRequest]): + while not self.baseline and not self._stop_flag.is_set(): + try: + self._benchmark_submission(contest, inputs, contest.baseline_repository) + except CancelledError: + logger.warning("Benchmarking was canceled while testing the baseline") + return + except Exception as e: + logger.error("Failed to generate baseline samples, retrying in 10 minutes", exc_info=e) + self._stop_flag.wait(600) + + def benchmark_submissions(self, contest: Contest, submissions: dict[Key, RepositoryInfo]): + self.state = BenchmarkState.IN_PROGRESS + self.benchmarks.clear() + self.invalid_submissions.clear() + self.baseline = None + self.submission_times.clear() + + inputs = random_inputs() + self._benchmark_baseline(contest, inputs) + + while not self._is_done(submissions) and self.baseline and not self._stop_flag.is_set(): + start_time = perf_counter() + key = choice(list(submissions.keys() - self.benchmarks.keys())) + submission = submissions[key] + try: + benchmark_output = self._benchmark_submission(contest, inputs, submission) + benchmark = self.compare(contest, benchmark_output, self._stop_flag) + self.benchmarks[key] = benchmark + except Exception as e: + logger.error(f"Failed to benchmark submission '{submission}': '{e}'", exc_info=e) + self.invalid_submissions.add(key) + finally: + self.submission_times.append(perf_counter() - start_time) + + if self._is_done(submissions): + self.state = BenchmarkState.FINISHED + else: + self.state = BenchmarkState.NOT_STARTED + + def start_benchmarking(self, contest: Contest, submissions: dict[Key, RepositoryInfo]): + if not submissions: + logger.warning("No submissions to benchmark") + return + + logger.info(f"Started benchmarking for {len(submissions)} submissions") + + if self._thread and self._thread.is_alive(): + logger.info("Attempting to cancel previous benchmarking") + self._stop_flag.set() + self._thread.join(timeout=60) + if self._thread.is_alive(): + logger.warning("Benchmarking was not stopped gracefully.") + else: + logger.info("Benchmarking was stopped gracefully.") + + self._stop_flag.clear() + self._thread = Thread( + target=self.benchmark_submissions, + args=(contest, submissions,), + daemon=True, + ) + self._thread.start() diff --git a/neuron/neuron/submission_tester/blacklist.sh b/base/testing/blacklist.sh similarity index 78% rename from neuron/neuron/submission_tester/blacklist.sh rename to base/testing/blacklist.sh index 011ae26e..e7f936c6 100755 --- a/neuron/neuron/submission_tester/blacklist.sh +++ b/base/testing/blacklist.sh @@ -2,10 +2,8 @@ set -e -BLACKLISTED_DEPENDENCIES=$1 - find . -type f -not -path '*/\.git/*' -not -path '*/.venv/*' -not -path '*/models/*' -print0 | while IFS= read -r -d '' file; do - for dependency in $BLACKLISTED_DEPENDENCIES; do + for dependency in "$@"; do if [[ "$file" == *"$dependency"* ]]; then echo "Found blacklisted dependency '$dependency' in filename '$file'" exit 1 @@ -13,11 +11,11 @@ find . -type f -not -path '*/\.git/*' -not -path '*/.venv/*' -not -path '*/model done while IFS= read -r line; do - for dependency in $BLACKLISTED_DEPENDENCIES; do + for dependency in "$@"; do if [[ "$line" == *"$dependency"* ]]; then echo "Found blacklisted dependency '$dependency' in file '$file'" exit 1 fi done done < "$file" -done \ No newline at end of file +done diff --git a/base/testing/clear_cache.sh b/base/testing/clear_cache.sh new file mode 100755 index 00000000..0c7974c3 --- /dev/null +++ b/base/testing/clear_cache.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +set -e + +cd ~/.cache + +find huggingface -mindepth 1 -delete || true +find pip -mindepth 1 -delete || true +find uv -mindepth 1 -delete || true diff --git a/neuron/neuron/submission_tester/clone.sh b/base/testing/clone.sh similarity index 100% rename from neuron/neuron/submission_tester/clone.sh rename to base/testing/clone.sh diff --git a/neuron/neuron/submission_tester/download_huggingface_models.sh b/base/testing/download_huggingface_models.sh similarity index 76% rename from neuron/neuron/submission_tester/download_huggingface_models.sh rename to base/testing/download_huggingface_models.sh index b8d4c2c5..291067b0 100755 --- a/neuron/neuron/submission_tester/download_huggingface_models.sh +++ b/base/testing/download_huggingface_models.sh @@ -2,9 +2,7 @@ set -e -MODELS=$1 - -for model in $MODELS +for model in "$@" do HF_HUB_ENABLE_HF_TRANSFER=1 ~/.local/bin/huggingface-cli download "$model" done \ No newline at end of file diff --git a/base/testing/inference_sandbox.py b/base/testing/inference_sandbox.py new file mode 100644 index 00000000..9b0dcdee --- /dev/null +++ b/base/testing/inference_sandbox.py @@ -0,0 +1,236 @@ +import shutil +from concurrent.futures import CancelledError +from multiprocessing.connection import Client +from os.path import abspath +from pathlib import Path +from subprocess import run, Popen, PIPE +from threading import Event +from time import perf_counter + +import toml +from fiber.logging_utils import get_logger +from huggingface_hub import HfApi +from opentelemetry import trace +from pydantic import BaseModel + +from base.checkpoint import SPEC_VERSION +from base.contest import RepositoryInfo, Contest, Metrics +from pipelines import TextToImageRequest +from .vram_monitor import VRamMonitor + +CLEAR_CACHE = abspath(Path(__file__).parent / "clear_cache.sh") +CLONE = abspath(Path(__file__).parent / "clone.sh") +BLACKLIST = abspath(Path(__file__).parent / "blacklist.sh") +SYNC_UV = abspath(Path(__file__).parent / "sync_uv.sh") +DOWNLOAD_HUGGINGFACE_MODELS = abspath(Path(__file__).parent / "download_huggingface_models.sh") + +NETWORK_JAIL = abspath(Path(__file__).parent / "libnetwork_jail.so") +START_INFERENCE_SCRIPT = abspath(Path(__file__).parent / "start_inference.sh") + +STORAGE_THRESHOLD_GB = 50 +MAX_HF_MODEL_SIZE_GB = 100 +MAX_REPO_SIZE_MB = 16 + +LOAD_TIMEOUT = 240 + +BLACKLISTED_DEPENDENCIES = [ + "pyarmor" +] + +logger = get_logger(__name__) +tracer = trace.get_tracer(__name__) +hf_api = HfApi() + +class InvalidSubmissionError(Exception): + ... + +class BenchmarkOutput(BaseModel): + metrics: Metrics + outputs: list[bytes] + +class InferenceSandbox: + _sandbox_args: list[str] + _sandbox_directory: Path + _contest: Contest + _repository_info: RepositoryInfo + _inputs: list[TextToImageRequest] + _stop_flag: Event + _socket_path: Path + + def __init__( + self, + sandbox_args: list[str], + sandbox_directory: Path, + contest: Contest, + repository_info: RepositoryInfo, + inputs: list[TextToImageRequest], + stop_flag: Event, + ): + self._sandbox_args = sandbox_args + self._sandbox_directory = sandbox_directory + self._contest = contest + self._repository_info = repository_info + self._inputs = inputs + self._stop_flag = stop_flag + self._socket_path = self._sandbox_directory / "inferences.sock" + + def _run(self, script: str, args: list[str]): + if self._stop_flag.is_set(): + raise CancelledError() + + process = run( + [ + *self._sandbox_args, + script, + *args, + ], + capture_output=True, + encoding='utf-8', + cwd=self._sandbox_directory.absolute(), + ) + logger.info(process.stdout) + logger.info(process.stderr) + if process.returncode: + raise InvalidSubmissionError(f"Failed to run {script}") + + @tracer.start_as_current_span("check_space") + def _check_space(self): + free_space = shutil.disk_usage("/").free + if free_space < STORAGE_THRESHOLD_GB * 1024 ** 3: + self._run(CLEAR_CACHE, []) + new_free_space = shutil.disk_usage("/").free + logger.info(f"Cleared {(new_free_space - free_space) / 1024 ** 3:.2f} GB of caches") + + @tracer.start_as_current_span("clone_repository") + def _clone(self) -> int: + self._run(CLONE, [self._repository_info.url, self._repository_info.revision]) + + repo_size = sum( + file.stat().st_size for file in self._sandbox_directory.rglob("*") + if ".git" not in file.parts and ".venv" not in file.parts + ) + if repo_size > MAX_REPO_SIZE_MB * 1024 ** 2: + raise InvalidSubmissionError(f"Size of repository exceeds {MAX_REPO_SIZE_MB} MB") + + return repo_size + + @tracer.start_as_current_span("check_blacklist") + def _check_blacklist(self): + self._run(BLACKLIST, BLACKLISTED_DEPENDENCIES) + + @tracer.start_as_current_span("sync_uv") + def _sync_uv(self): + self._run(SYNC_UV, []) + + @tracer.start_as_current_span("download_huggingface_models") + def _download_huggingface_models(self, models: list[str]) -> int: + try: + total_model_size = 0 + for model in models: + model_info = hf_api.model_info(repo_id=model, files_metadata=True) + for sibling in model_info.siblings: + total_model_size += sibling.size + except Exception as e: + raise InvalidSubmissionError("Failed to get model info") from e + + if total_model_size > MAX_HF_MODEL_SIZE_GB * 1024 ** 3: + raise InvalidSubmissionError(f"Size of all Hugging Face models exceeds {MAX_HF_MODEL_SIZE_GB} GB") + + self._run(DOWNLOAD_HUGGINGFACE_MODELS, models) + + return total_model_size + + @tracer.start_as_current_span("setup") + def _setup_sandbox(self) -> int: + self._check_space() + repository_size = self._clone() + + try: + with open(self._sandbox_directory / "pyproject.toml", 'r') as file: + pyproject = toml.load(file) + version = int(pyproject["project"]["version"]) + models = pyproject["tool"]["edge-maxxing"]["models"] + except Exception as e: + raise InvalidSubmissionError("Failed to read submission info") from e + + if version != SPEC_VERSION: + raise InvalidSubmissionError(f"Submission is at version {version} while expected version is {SPEC_VERSION}") + + self._check_blacklist() + self._sync_uv() + huggingface_models_size = self._download_huggingface_models(models) + + return repository_size + huggingface_models_size + + @tracer.start_as_current_span("wait_for_socket") + def wait_for_socket(self) -> float: + start = perf_counter() + for _ in range(LOAD_TIMEOUT): + if self._socket_path.exists(): + break + self._stop_flag.wait(0.1) + if self._stop_flag.is_set(): + raise CancelledError() + else: + raise InvalidSubmissionError(f"Timed out after {LOAD_TIMEOUT} seconds") + return perf_counter() - start + + @tracer.start_as_current_span("start_inference") + def benchmark(self) -> BenchmarkOutput: + size = self._setup_sandbox() + start_vram = self._contest.device.get_vram_used() + + metrics: list[Metrics] = [] + outputs: list[bytes] = [] + + with Popen( + [ + *self._sandbox_args, + START_INFERENCE_SCRIPT, + NETWORK_JAIL + ], + cwd=self._sandbox_directory, + stdout=PIPE, + stderr=PIPE, + text=True, + ): + load_time = self.wait_for_socket() + with Client(abspath(self._socket_path)) as client: + for request in self._inputs: + start_joules = self._contest.device.get_joules() + vram_monitor = VRamMonitor(self._contest) + + client.send(request.model_dump_json().encode("utf-8")) + + start = perf_counter() + + output = client.recv_bytes() + + generation_time = perf_counter() - start + joules_used = self._contest.device.get_joules() - start_joules + watts_used = joules_used / generation_time + vram_used = vram_monitor.complete() + + metrics.append(Metrics( + generation_time=generation_time, + size=size, + vram_used=vram_used, + watts_used=watts_used, + load_time=load_time, + )) + outputs.append(output) + + average_generation_time = sum(metric.generation_time for metric in metrics) / len(metrics) + vram_used = max(metric.vram_used for metric in metrics) - start_vram + watts_used = max(metric.watts_used for metric in metrics) + + return BenchmarkOutput( + metrics=Metrics( + generation_time=average_generation_time, + size=size, + vram_used=vram_used, + watts_used=watts_used, + load_time=load_time, + ), + outputs=outputs, + ) diff --git a/neuron/neuron/submission_tester/libnetwork_jail.so b/base/testing/libnetwork_jail.so similarity index 100% rename from neuron/neuron/submission_tester/libnetwork_jail.so rename to base/testing/libnetwork_jail.so diff --git a/neuron/neuron/submission_tester/start_inference.sh b/base/testing/start_inference.sh similarity index 100% rename from neuron/neuron/submission_tester/start_inference.sh rename to base/testing/start_inference.sh diff --git a/base/testing/sync_uv.sh b/base/testing/sync_uv.sh new file mode 100755 index 00000000..e96f3b75 --- /dev/null +++ b/base/testing/sync_uv.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +set -e + +~/.local/bin/uv sync diff --git a/neuron/neuron/submission_tester/vram_monitor.py b/base/testing/vram_monitor.py similarity index 87% rename from neuron/neuron/submission_tester/vram_monitor.py rename to base/testing/vram_monitor.py index 094ecb88..91de9d38 100644 --- a/neuron/neuron/submission_tester/vram_monitor.py +++ b/base/testing/vram_monitor.py @@ -1,7 +1,6 @@ from threading import Thread, Event -from time import sleep -from .. import Contest +from base.contest import Contest SAMPLE_RATE_MS = 10 @@ -21,7 +20,7 @@ def __init__(self, contest: Contest): def _monitor(self): while not self._stop_flag.is_set(): self._vram_usage = max(self._vram_usage, self._contest.device.get_vram_used()) - sleep(SAMPLE_RATE_MS / 1000) + self._stop_flag.wait(SAMPLE_RATE_MS / 1000) def complete(self) -> int: self._stop_flag.set() diff --git a/miner/miner/submit.py b/miner/miner/submit.py index 74135eef..68714baf 100644 --- a/miner/miner/submit.py +++ b/miner/miner/submit.py @@ -1,55 +1,40 @@ -import base64 -import json import re -import shutil from argparse import ArgumentParser from pathlib import Path +from tempfile import TemporaryDirectory from fiber.chain.chain_utils import load_hotkey_keypair from fiber.chain.interface import get_substrate from fiber.logging_utils import get_logger from git import GitCommandError, cmd +from substrateinterface import Keypair -from neuron import ( - CheckpointSubmission, - get_config, - find_contest, - Contest, - CURRENT_CONTEST, - CONTESTS, - ContestId, - REVISION_LENGTH, - make_submission, - random_inputs, - ModelRepositoryInfo, - TextToImageRequest, - GenerationOutput, - BENCHMARKS_VERSION, -) -from neuron.submission_tester import ( - generate_baseline, - compare_checkpoints, - BaselineBenchmark, - MetricData, -) - -VALID_PROVIDER_REGEX = r'^[a-zA-Z0-9-.]+$' -VALID_REPO_REGEX = r'^[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+$' -VALID_REVISION_REGEX = r"^[a-f0-9]{7}$" +from base.config import get_config +from base.contest import Contest, find_contest, CONTESTS, ContestId, ACTIVE_CONTESTS +from base.submissions import CheckpointSubmission, make_submission +from testing.benchmarker import Benchmarker -MODEL_DIRECTORY = Path("model") -BASELINE_CACHE_JSON = Path("baseline_cache.json") +VALID_REPO_REGEX = r"^https:\/\/[a-zA-Z0-9.-]+\/[a-zA-Z0-9._-]+\/[a-zA-Z0-9._-]+$" +VALID_REVISION_REGEX = r"^[a-f0-9]{7}$" logger = get_logger(__name__) +def start_benchmarking(contest: Contest, keypair: Keypair, submission: CheckpointSubmission): + if not contest.device.is_compatible(): + logger.warning("Benchmarking on an incompatible device. Results will not be accurate.") -def add_extra_args(argument_parser: ArgumentParser): - argument_parser.add_argument( - "--provider", - type=str, - help="The git provider containing the repository", - ) + with TemporaryDirectory() as temp_dir: + benchmarker = Benchmarker( + sandbox_directory=Path(temp_dir), + sandbox_args=[] + ) + + benchmarker.benchmark_submissions( + contest=contest, + submissions={keypair.ss58_address: submission}, + ) +def add_extra_args(argument_parser: ArgumentParser): argument_parser.add_argument( "--repository", type=str, @@ -75,92 +60,7 @@ def add_extra_args(argument_parser: ArgumentParser): default=False, ) - -def load_baseline_cache(inputs: list[TextToImageRequest]) -> BaselineBenchmark | None: - try: - if not BASELINE_CACHE_JSON.exists(): - return None - - with open(BASELINE_CACHE_JSON, "r") as f: - data = json.load(f) - - benchmarks_version = data["benchmarks_version"] - if BENCHMARKS_VERSION != benchmarks_version: - logger.info(f"Baseline cache is outdated, regenerating baseline") - return None - - cached_inputs = [TextToImageRequest(**input_data) for input_data in data["inputs"]] - if cached_inputs != inputs: - logger.info("Contest inputs have changed, regenerating baseline") - return None - - metrics = MetricData(**data["metrics"]) - outputs = [ - GenerationOutput( - output=base64.b64decode(output_data["output"]), - generation_time=output_data["generation_time"], - vram_used=output_data["vram_used"], - watts_used=output_data["watts_used"] - ) - for output_data in data["outputs"] - ] - return BaselineBenchmark(inputs=inputs, outputs=outputs, metric_data=metrics) - except Exception as e: - logger.error(f"Failed to load baseline cache: {e}. Clearing.") - return None - - -def save_baseline_cache(baseline: BaselineBenchmark): - with open(BASELINE_CACHE_JSON, "w") as f: - data = { - "benchmarks_version": BENCHMARKS_VERSION, - "inputs": [request.model_dump(exclude_none=True) for request in baseline.inputs], - "outputs": [ - { - "output": base64.b64encode(output.output).decode('utf-8'), - "generation_time": output.generation_time, - "vram_used": output.vram_used, - "watts_used": output.watts_used - } - for output in baseline.outputs - ], - "metrics": baseline.metric_data.model_dump(exclude_none=True), - } - json.dump(data, f, indent=4) - - -def start_benchmarking(contest: Contest, submission: CheckpointSubmission): - logger.info("Generating baseline samples to compare") - if not MODEL_DIRECTORY.exists(): - MODEL_DIRECTORY.mkdir() - inputs = random_inputs() - - baseline = load_baseline_cache(inputs) - if baseline is None: - baseline = generate_baseline( - contest=contest, - inputs=inputs, - sandbox_directory=MODEL_DIRECTORY, - switch_user=False, - ) - save_baseline_cache(baseline) - else: - logger.info("Using cached baseline") - - logger.info("Comparing submission to baseline") - compare_checkpoints( - contest=contest, - submission=ModelRepositoryInfo(url=submission.get_repo_link(), revision=submission.revision), - inputs=inputs, - baseline=baseline, - sandbox_directory=MODEL_DIRECTORY, - switch_user=False, - ) - - shutil.rmtree(MODEL_DIRECTORY) - - -def validate(provider: str, repository: str, revision: str, contest: Contest): +def validate(repository: str, revision: str, contest: Contest): if not re.match(VALID_REPO_REGEX, repository): raise ValueError(f"Invalid repository URL: {repository}") @@ -173,45 +73,25 @@ def validate(provider: str, repository: str, revision: str, contest: Contest): if repository in contest.baseline_repository.url: raise ValueError(f"Cannot submit baseline repository: {repository}") - if revision == contest.baseline_repository.revision: - raise ValueError(f"Cannot submit baseline revision: {revision}") - git = cmd.Git() try: - git.ls_remote(f"https://{provider}/{repository}", revision) + git.ls_remote(repository, revision) except GitCommandError as e: raise ValueError(f"Invalid repository or revision: {e}") - -def get_latest_revision(provider: str, repository: str): +def get_latest_revision(repository: str): git = cmd.Git() - return git.ls_remote(f"https://{provider}/{repository}").split()[0][:REVISION_LENGTH] - + return git.ls_remote(repository).split()[0] def get_submission(config) -> CheckpointSubmission: - provider = config["provider"] repository = config["repository"] revision = config["revision"] contest_name = config["contest"] - contest: Contest | None = None - - if contest_name: - try: - contest = find_contest(ContestId[contest_name]) - except ValueError: - exit(f"Unknown contest: {contest_name}") - - if not provider: - while True: - provider = input("Enter git provider (such as github.com or huggingface.co): ") - if re.match(VALID_PROVIDER_REGEX, provider): - break - else: - print("Invalid git provider.") + contest: Contest | None = find_contest(contest_name) if contest_name else None if not repository: while True: - repository = input("Enter repository URL (format: /): ") + repository = input("Enter repository URL (format: https:////): ") if re.match(VALID_REPO_REGEX, repository): break else: @@ -220,7 +100,7 @@ def get_submission(config) -> CheckpointSubmission: if not revision: while True: try: - revision = input("Enter short revision hash (leave blank to fetch latest): ") or get_latest_revision(provider, repository) + revision = input("Enter short revision hash (leave blank to fetch latest): ") or get_latest_revision(repository) except GitCommandError as e: exit(f"Failed to get latest revision: {e}") if re.match(VALID_REVISION_REGEX, revision): @@ -229,13 +109,14 @@ def get_submission(config) -> CheckpointSubmission: print("Invalid revision hash. Should be 7 characters long.") if not contest: + default_contest = ACTIVE_CONTESTS[0] while True: print("\nAvailable contests:") for c in CONTESTS: print(f"\t- {c.id.name}") - contest_id = input(f"Enter the contest (default: {CURRENT_CONTEST.id.name}): ") or CURRENT_CONTEST.id.name + contest_id = input(f"Enter the contest (default: {default_contest.id.name}): ") or default_contest.id.name try: - contest = find_contest(ContestId[contest_id]) + contest = find_contest(ContestId(contest_id)) break except ValueError: print(f"Unknown contest: {contest_id}") @@ -243,34 +124,35 @@ def get_submission(config) -> CheckpointSubmission: print(f"Invalid contest: {contest_id}") try: - validate(provider, repository, revision, contest) + validate(repository, revision, contest) except ValueError as e: exit(f"Validation failed: {e}") return CheckpointSubmission( - provider=provider, repository=repository, revision=revision, - contest=contest.id, + contest_id=contest.id, ) - -def main(): +def submit(): config = get_config(add_extra_args) substrate = get_substrate( subtensor_network=config["subtensor.network"], - subtensor_address=config["subtensor.chain_endpoint"] + subtensor_address=config["subtensor.chain_endpoint"], ) - keypair = load_hotkey_keypair(wallet_name=config["wallet.name"], hotkey_name=config["wallet.hotkey"]) + keypair = load_hotkey_keypair( + wallet_name=config["wallet.name"], + hotkey_name=config["wallet.hotkey"], + ) submission = get_submission(config) enable_benchmarking = config["benchmarking.on"] if enable_benchmarking or input("Benchmark submission before submitting? (y/N): ").strip().lower() in ("yes", "y"): try: - start_benchmarking(find_contest(submission.contest), submission) + start_benchmarking(find_contest(submission.contest), keypair, submission) except Exception as e: exit(f"Benchmarking failed, submission cancelled: {e}") @@ -293,6 +175,8 @@ def main(): logger.info(f"Submitted {submission} as the info for this miner") +def main(): + submit() if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/miner/pyproject.toml b/miner/pyproject.toml index e24eb4b1..ecc94e55 100644 --- a/miner/pyproject.toml +++ b/miner/pyproject.toml @@ -8,11 +8,11 @@ description = "The miner which provides optimized models and checkpoints" requires-python = ">=3.10,<3.13" version = "1.0.0" dependencies = [ - "edge-maxxing-neuron==1.0.0" + "edge-maxxing-base==1.0.0" ] [tool.uv.sources] -edge-maxxing-neuron = { path = "../neuron", editable = true } +edge-maxxing-base = { path = "../base", editable = true } [dependency-groups] dev = [ @@ -23,7 +23,7 @@ dev = [ inputs = ["miner"] [project.scripts] -submit_model = 'miner.submit:main' +submit_model = "miner.submit:main" [tool.setuptools] packages = [ diff --git a/miner/uv.lock b/miner/uv.lock index 3f775ff6..55147964 100644 --- a/miner/uv.lock +++ b/miner/uv.lock @@ -14,7 +14,7 @@ resolution-markers = [ [[package]] name = "accelerate" -version = "1.1.0" +version = "1.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, @@ -25,8 +25,9 @@ dependencies = [ { name = "safetensors" }, { name = "torch" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/51/0b/179cc63d3a4f52e8cb233f2153a3e5a417522c85ea4b1dd25f6f2b377369/accelerate-1.1.1.tar.gz", hash = "sha256:0d39dfac557052bc735eb2703a0e87742879e1e40b88af8a2f9a93233d4cd7db", size = 335346 } wheels = [ - { url = "https://files.pythonhosted.org/packages/73/e7/e61feefda1b483f0d53a320909051252175ccbfea29ab99bd62df6083c81/accelerate-1.1.0-py3-none-any.whl", hash = "sha256:babee98bd3692cfb0537db3f96f36b5d4e29809776b406d32aaf593d4eeb574c", size = 333182 }, + { url = "https://files.pythonhosted.org/packages/d1/d5/0050b2820a1e709ffa623f9a9e8ae42d0903535f2150613cbfeb7f16932a/accelerate-1.1.1-py3-none-any.whl", hash = "sha256:61edd81762131b8d4bede008643fa1e1f3bf59bec710ebda9771443e24feae02", size = 333211 }, ] [[package]] @@ -38,27 +39,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, ] -[[package]] -name = "antlr4-python3-runtime" -version = "4.9.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b", size = 117034 } - -[[package]] -name = "anyio" -version = "4.6.2.post1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, - { name = "idna" }, - { name = "sniffio" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9f/09/45b9b7a6d4e45c6bcb5bf61d19e3ab87df68e0601fa8c5293de3542546cc/anyio-4.6.2.post1.tar.gz", hash = "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c", size = 173422 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e4/f5/f2b75d2fc6f1a260f340f0e7c6a060f4dd2961cc16884ed851b0d18da06a/anyio-4.6.2.post1-py3-none-any.whl", hash = "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d", size = 90377 }, -] - [[package]] name = "attrs" version = "24.2.0" @@ -186,18 +166,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, ] -[[package]] -name = "click" -version = "8.1.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/96/d3/f04c7bfcf5c1862a2a5b845c6b2b360488cf47af55dfa79c98f6a6bf98b5/click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de", size = 336121 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/2e/d53fa4befbf2cfa713304affc7ca780ce4fc1fd8710527771b58311a3229/click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", size = 97941 }, -] - [[package]] name = "colorama" version = "0.4.6" @@ -207,39 +175,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] -[[package]] -name = "cryptography" -version = "43.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/69/ec/9fb9dcf4f91f0e5e76de597256c43eedefd8423aa59be95c70c4c3db426a/cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e", size = 686873 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/46/dcd2eb6840b9452e7fbc52720f3dc54a85eb41e68414733379e8f98e3275/cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74", size = 6239718 }, - { url = "https://files.pythonhosted.org/packages/e8/23/b0713319edff1d8633775b354f8b34a476e4dd5f4cd4b91e488baec3361a/cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895", size = 3808466 }, - { url = "https://files.pythonhosted.org/packages/77/9d/0b98c73cebfd41e4fb0439fe9ce08022e8d059f51caa7afc8934fc1edcd9/cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22", size = 3998060 }, - { url = "https://files.pythonhosted.org/packages/ae/71/e073795d0d1624847f323481f7d84855f699172a632aa37646464b0e1712/cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47", size = 3792596 }, - { url = "https://files.pythonhosted.org/packages/83/25/439a8ddd8058e7f898b7d27c36f94b66c8c8a2d60e1855d725845f4be0bc/cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf", size = 4008355 }, - { url = "https://files.pythonhosted.org/packages/c7/a2/1607f1295eb2c30fcf2c07d7fd0c3772d21dcdb827de2b2730b02df0af51/cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55", size = 3899133 }, - { url = "https://files.pythonhosted.org/packages/5e/64/f41f42ddc9c583737c9df0093affb92c61de7d5b0d299bf644524afe31c1/cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431", size = 4096946 }, - { url = "https://files.pythonhosted.org/packages/cd/cd/d165adcf3e707d6a049d44ade6ca89973549bed0ab3686fa49efdeefea53/cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc", size = 2616826 }, - { url = "https://files.pythonhosted.org/packages/f9/b7/38924229e84c41b0e88d7a5eed8a29d05a44364f85fbb9ddb3984b746fd2/cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778", size = 3078700 }, - { url = "https://files.pythonhosted.org/packages/66/d7/397515233e6a861f921bd0365b162b38e0cc513fcf4f1bdd9cc7bc5a3384/cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66", size = 6242814 }, - { url = "https://files.pythonhosted.org/packages/58/aa/99b2c00a4f54c60d210d6d1759c720ecf28305aa32d6fb1bb1853f415be6/cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5", size = 3809467 }, - { url = "https://files.pythonhosted.org/packages/76/eb/ab783b47b3b9b55371b4361c7ec695144bde1a3343ff2b7a8c1d8fe617bb/cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e", size = 3998617 }, - { url = "https://files.pythonhosted.org/packages/a3/62/62770f34290ebb1b6542bd3f13b3b102875b90aed4804e296f8d2a5ac6d7/cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5", size = 3794003 }, - { url = "https://files.pythonhosted.org/packages/0f/6c/b42660b3075ff543065b2c1c5a3d9bedaadcff8ebce2ee981be2babc2934/cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f", size = 4008774 }, - { url = "https://files.pythonhosted.org/packages/f7/74/028cea86db9315ba3f991e307adabf9f0aa15067011137c38b2fb2aa16eb/cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0", size = 3900098 }, - { url = "https://files.pythonhosted.org/packages/bd/f6/e4387edb55563e2546028ba4c634522fe727693d3cdd9ec0ecacedc75411/cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b", size = 4096867 }, - { url = "https://files.pythonhosted.org/packages/ce/61/55560405e75432bdd9f6cf72fa516cab623b83a3f6d230791bc8fc4afeee/cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf", size = 2616481 }, - { url = "https://files.pythonhosted.org/packages/e6/3d/696e7a0f04555c58a2813d47aaa78cb5ba863c1f453c74a4f45ae772b054/cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709", size = 3081462 }, - { url = "https://files.pythonhosted.org/packages/c6/3a/9c7d864bbcca2df77a601366a6ae3937cd78d0f21ad98441f3424592aea7/cryptography-43.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70", size = 3156882 }, - { url = "https://files.pythonhosted.org/packages/17/cd/d43859b09d726a905d882b6e464ccf02aa2dca2c3e76c44a0c5b169f0144/cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66", size = 3722095 }, - { url = "https://files.pythonhosted.org/packages/2e/ce/c7b912d95f0ded80ad3b50a0a6b31de813c25d9ffadbe1b26bf22d2c4518/cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f", size = 3928750 }, - { url = "https://files.pythonhosted.org/packages/ca/25/7b53082e4c373127c1fb190f70c5aca7bf7a03ac11f67ba15473bc6d9a0e/cryptography-43.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f", size = 3002487 }, -] - [[package]] name = "cytoolz" version = "1.0.0" @@ -342,82 +277,69 @@ wheels = [ ] [[package]] -name = "edge-maxxing-miner" -version = "1.0.0" -source = { editable = "." } -dependencies = [ - { name = "edge-maxxing-neuron" }, -] - -[package.dev-dependencies] -dev = [ - { name = "pytype" }, -] - -[package.metadata] -requires-dist = [{ name = "edge-maxxing-neuron", editable = "../neuron" }] - -[package.metadata.requires-dev] -dev = [{ name = "pytype", specifier = "==2024.10.11" }] - -[[package]] -name = "edge-maxxing-neuron" +name = "edge-maxxing-base" version = "1.0.0" -source = { editable = "../neuron" } +source = { editable = "../base" } dependencies = [ { name = "accelerate" }, { name = "diffusers" }, { name = "edge-maxxing-pipelines" }, { name = "fiber" }, { name = "gitpython" }, - { name = "imagehash" }, - { name = "omegaconf" }, { name = "opencv-python" }, { name = "opentelemetry-instrumentation" }, { name = "pynvml" }, { name = "scikit-image" }, - { name = "toml" }, - { name = "torch" }, - { name = "torchvision" }, { name = "transformers" }, ] [package.metadata] requires-dist = [ - { name = "accelerate", specifier = "==1.1.0" }, - { name = "diffusers", specifier = "==0.31.0" }, + { name = "accelerate", specifier = ">=1.1.1" }, + { name = "diffusers", specifier = ">=0.31.0" }, { name = "edge-maxxing-pipelines", editable = "../pipelines" }, - { name = "fiber", git = "https://github.com/womboai/fiber?rev=weights" }, - { name = "gitpython", specifier = "==3.1.43" }, - { name = "imagehash", specifier = "==4.3.1" }, - { name = "omegaconf", specifier = "==2.3.0" }, - { name = "opencv-python", specifier = "==4.10.0.84" }, + { name = "fiber", git = "https://github.com/rayonlabs/fiber.git?rev=1.0.0" }, + { name = "gitpython", specifier = ">=3.1.43" }, + { name = "opencv-python", specifier = ">=4.10.0.84" }, { name = "opentelemetry-instrumentation", specifier = ">=0.49b2" }, - { name = "pynvml", specifier = "==11.5.3" }, - { name = "scikit-image", specifier = "==0.24.0" }, - { name = "toml", specifier = "==0.10.2" }, - { name = "torch", specifier = "==2.5.1" }, - { name = "torchvision", specifier = "==0.20.1" }, - { name = "transformers", specifier = "==4.46.2" }, + { name = "pynvml", specifier = ">=11.5.3" }, + { name = "scikit-image", specifier = ">=0.24.0" }, + { name = "transformers", specifier = ">=4.46.3" }, ] [package.metadata.requires-dev] dev = [{ name = "pytype", specifier = "==2024.10.11" }] [[package]] -name = "edge-maxxing-pipelines" +name = "edge-maxxing-miner" version = "1.0.0" -source = { editable = "../pipelines" } +source = { editable = "." } dependencies = [ - { name = "pydantic" }, + { name = "edge-maxxing-base" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pytype" }, ] [package.metadata] -requires-dist = [{ name = "pydantic", specifier = ">=2" }] +requires-dist = [{ name = "edge-maxxing-base", editable = "../base" }] [package.metadata.requires-dev] dev = [{ name = "pytype", specifier = "==2024.10.11" }] +[[package]] +name = "edge-maxxing-pipelines" +version = "1.0.0" +source = { editable = "../pipelines" } +dependencies = [ + { name = "pydantic" }, +] + +[package.metadata] +requires-dist = [{ name = "pydantic", specifier = ">=2.9.2" }] + [[package]] name = "eth-hash" version = "0.7.0" @@ -467,44 +389,17 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0c/e8/1c15f2f97ac144b7d7cb851d72b52aa717b284251981ec74773e99573e26/eth_utils-2.3.2-py3-none-any.whl", hash = "sha256:4470be372674a25b8440b69cb35bda634a079876930853814ea307248c3d198b", size = 77767 }, ] -[[package]] -name = "exceptiongroup" -version = "1.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/09/35/2495c4ac46b980e4ca1f6ad6db102322ef3ad2410b79fdde159a4b0f3b92/exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc", size = 28883 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/02/cc/b7e31358aac6ed1ef2bb790a9746ac2c69bcb3c8588b41616914eb106eaf/exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", size = 16453 }, -] - -[[package]] -name = "fastapi" -version = "0.112.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pydantic" }, - { name = "starlette" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/0a/50/c535521c0cdb8b78da923bfffca7eb38429828de1770bbd8820b55f3779f/fastapi-0.112.0.tar.gz", hash = "sha256:d262bc56b7d101d1f4e8fc0ad2ac75bb9935fec504d2b7117686cec50710cf05", size = 289904 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/26/34/d0dca5f1fc0113723a425c913a886709698c4110f960c0990905804e0b2c/fastapi-0.112.0-py3-none-any.whl", hash = "sha256:3487ded9778006a45834b8c816ec4a48d522e2631ca9e75ec5a774f1b052f821", size = 93135 }, -] - [[package]] name = "fiber" -version = "0.0.4" -source = { git = "https://github.com/womboai/fiber?rev=weights#4c72538bb365d1479e9b7ad82916332e1de9fba2" } +version = "1.0.0" +source = { git = "https://github.com/rayonlabs/fiber.git?rev=1.0.0#199d6432b748c2a93c3ee0c34db72418b19c6d7f" } dependencies = [ { name = "colorama" }, - { name = "cryptography" }, { name = "eth-typing" }, - { name = "fastapi" }, - { name = "httpx" }, - { name = "netaddr" }, + { name = "pydantic" }, { name = "python-dotenv" }, { name = "substrate-interface" }, { name = "tenacity" }, - { name = "uvicorn" }, ] [[package]] @@ -549,44 +444,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/bd/cc3a402a6439c15c3d4294333e13042b915bbeab54edc457c723931fed3f/GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff", size = 207337 }, ] -[[package]] -name = "h11" -version = "0.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, -] - -[[package]] -name = "httpcore" -version = "1.0.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b6/44/ed0fa6a17845fb033bd885c03e842f08c1b9406c86a2e60ac1ae1b9206a6/httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f", size = 85180 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f", size = 78011 }, -] - -[[package]] -name = "httpx" -version = "0.27.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, - { name = "sniffio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/3da5bdf4408b8b2800061c339f240c1802f2e82d55e50bd39c5a881f47f0/httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5", size = 126413 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/7b/ddacf6dcebb42466abd03f368782142baa82e08fc0c1f8eaa05b4bae87d5/httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5", size = 75590 }, -] - [[package]] name = "huggingface-hub" version = "0.26.2" @@ -614,21 +471,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] -[[package]] -name = "imagehash" -version = "4.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, - { name = "pillow" }, - { name = "pywavelets" }, - { name = "scipy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6c/f4/9821fe373a4788bca43f00491b008f930de0b12a60ff631852d1f984b966/ImageHash-4.3.1.tar.gz", hash = "sha256:7038d1b7f9e0585beb3dd8c0a956f02b95a346c0b5f24a9e8cc03ebadaf0aa70", size = 296989 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/b4/19a746a986c6e38595fa5947c028b1b8e287773dcad766e648897ad2a4cf/ImageHash-4.3.1-py2.py3-none-any.whl", hash = "sha256:5ad9a5cde14fe255745a8245677293ac0d67f09c330986a351f34b614ba62fb5", size = 296543 }, -] - [[package]] name = "imageio" version = "2.36.0" @@ -644,11 +486,11 @@ wheels = [ [[package]] name = "immutabledict" -version = "4.2.0" +version = "4.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/55/f4/710c84db4d77767176342913ac6b25f43aaed6d0a0bdb9168a8d2936d9c7/immutabledict-4.2.0.tar.gz", hash = "sha256:e003fd81aad2377a5a758bf7e1086cf3b70b63e9a5cc2f46bce8d0a2b4727c5f", size = 6165 } +sdist = { url = "https://files.pythonhosted.org/packages/e0/c5/4240186fbabc58fba41bbe17c5f0cd37ffd4c0b85a5029ab104f946df175/immutabledict-4.2.1.tar.gz", hash = "sha256:d91017248981c72eb66c8ff9834e99c2f53562346f23e7f51e7a5ebcf66a3bcc", size = 6228 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/13/3cf4ac5b3403f3456e645c4533883ef67b1bb0c72e56b79c707715f57a74/immutabledict-4.2.0-py3-none-any.whl", hash = "sha256:d728b2c2410d698d95e6200237feb50a695584d20289ad3379a439aa3d90baba", size = 4702 }, + { url = "https://files.pythonhosted.org/packages/59/56/25ca7b848164b7d93dbd5fc97dd7751700c93e324fe854afbeb562ee2f98/immutabledict-4.2.1-py3-none-any.whl", hash = "sha256:c56a26ced38c236f79e74af3ccce53772827cef5c3bce7cab33ff2060f756373", size = 4700 }, ] [[package]] @@ -701,31 +543,37 @@ wheels = [ [[package]] name = "libcst" -version = "1.5.0" +version = "1.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4d/c4/5577b92173199299e0d32404aa92a156d353d6ec0f74148f6e418e0defef/libcst-1.5.0.tar.gz", hash = "sha256:8478abf21ae3861a073e898d80b822bd56e578886331b33129ba77fec05b8c24", size = 772970 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/85/44/c8f1e0d83bbdabc240c05d5bedddfd4e095a0031b8df473d8eb004f12554/libcst-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:23d0e07fd3ed11480f8993a1e99d58a45f914a711b14f858b8db08ae861a8a34", size = 2112640 }, - { url = "https://files.pythonhosted.org/packages/20/d5/3d5819da92a8f997ecf0b5a77d65865d4d2aa4209b34e32835b555218689/libcst-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d92c5ae2e2dc9356ad7e3d05077d9b7e5065423e45788fd86729c88729e45c6e", size = 2026866 }, - { url = "https://files.pythonhosted.org/packages/74/19/d2ebded5990f2f5ab4c86412df75338b9d8b386fbb5e430669f287bc8d9c/libcst-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96adc45e96476350df6b8a5ddbb1e1d6a83a7eb3f13087e52eb7cd2f9b65bcc7", size = 2203742 }, - { url = "https://files.pythonhosted.org/packages/87/98/d47a9a88df48cc33db7e1219cd7c29bfdfd8d695634f3f2e86ff04bbd58d/libcst-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5978fd60c66794bb60d037b2e6427ea52d032636e84afce32b0f04e1cf500a", size = 2253801 }, - { url = "https://files.pythonhosted.org/packages/b8/ca/7fdcbab8f8e8c46336099af7929d0f0e5873222830010aae0160d16544c1/libcst-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6502aeb11412afc759036160c686be1107eb5a4466db56b207c786b9b4da7c4", size = 2324610 }, - { url = "https://files.pythonhosted.org/packages/24/fb/db7c696b7bf8e295aa9bf37091fbd1bad35e491be44926da2b20907c3452/libcst-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cccfc0a78e110c0d0a9d2c6fdeb29feb5274c9157508a8baef7edf352420f6d", size = 2030364 }, - { url = "https://files.pythonhosted.org/packages/b5/82/5b9d1f89bdba4106de6080ab3384157581af4f0b94e04a7150b917b5b945/libcst-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:585b3aa705b3767d717d2100935d8ef557275ecdd3fac81c3e28db0959efb0ea", size = 2112655 }, - { url = "https://files.pythonhosted.org/packages/17/4d/c6ed4323e77717edf3f47af8cabbdd4a7de7983fc5a1cc20130947f65f9d/libcst-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8935dd3393e30c2f97344866a4cb14efe560200e232166a8db1de7865c2ef8b2", size = 2026906 }, - { url = "https://files.pythonhosted.org/packages/eb/ad/10cffc6a69da4320cc75f7f031a48292b61ad5ba0ba94fa9f963cb0b5f67/libcst-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc80ea16c7d44e38f193e4d4ef7ff1e0ba72d8e60e8b61ac6f4c87f070a118bd", size = 2203824 }, - { url = "https://files.pythonhosted.org/packages/e8/88/016b3feb75a3b16896e27691439c3bd493ae7d896bb4e31d6bd4c2e5c20b/libcst-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02be4aab728261bb76d16e77c9a457884cebb60d09c8edee844de43b0e08aff7", size = 2253854 }, - { url = "https://files.pythonhosted.org/packages/69/8e/5a60d53493e259743fd574abe442dd7f3b497ebb58dee168473a03f90d3e/libcst-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8fcd78be4d9ce3c36d0c5d0bdd384e0c7d5f72970a9e4ebd56070141972b4ad", size = 2324725 }, - { url = "https://files.pythonhosted.org/packages/65/86/ddf0d593f4ef5994f456e00e99a1eb28b661aab5df960034199f4d8bbeb4/libcst-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:52b6aadfe54e3ae52c3b815eaaa17ba4da9ff010d5e8adf6a70697872886dd10", size = 2030364 }, - { url = "https://files.pythonhosted.org/packages/a7/23/9cdb3362ad75490108a03abeaae8d7f7fb0d86586d806102ae9d9690d6b8/libcst-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:83bc5fbe34d33597af1d5ea113dcb9b5dd5afe5a5f4316bac4293464d5e3971a", size = 2108563 }, - { url = "https://files.pythonhosted.org/packages/48/ec/4a1a34c3dbe6d51815700a0c14991f4124f10e82f9959d4fb5a9b0b06c74/libcst-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f10124bf99a0b075eae136ef0ce06204e5f6b8da4596a9c4853a0663e80ddf3", size = 2024056 }, - { url = "https://files.pythonhosted.org/packages/da/b7/1976377c19f9477267daac2ea8e2d5a72ce12d5b523ff147d404fb7ae74e/libcst-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48e581af6127c5af4c9f483e5986d94f0c6b2366967ee134f0a8eba0aa4c8c12", size = 2199473 }, - { url = "https://files.pythonhosted.org/packages/63/c4/e056f3f34642f294421bd4a4d4b40aeccaf153a456bcb4d7e54f4337143f/libcst-1.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dba93cca0a5c6d771ed444c44d21ce8ea9b277af7036cea3743677aba9fbbb8", size = 2251411 }, - { url = "https://files.pythonhosted.org/packages/e8/d6/574fc6c8b0ca81586ee05f284ef6987730b841b31ce246ef9d3c45f17ec4/libcst-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b5c4d87721a7bab265c202575809b810815ab81d5e2e7a5d4417a087975840", size = 2323144 }, - { url = "https://files.pythonhosted.org/packages/b1/92/5cb62834eec397f4b3218c03acc28b6b8470f87c8dad9e9b0fd738c3948c/libcst-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:b48bf71d52c1e891a0948465a94d9817b5fc1ec1a09603566af90585f3b11948", size = 2029603 }, +sdist = { url = "https://files.pythonhosted.org/packages/27/a6/a19b587108b15d3e0bfa8d0944265809581c8b8e161e22c9c9060afbbf4a/libcst-1.5.1.tar.gz", hash = "sha256:71cb294db84df9e410208009c732628e920111683c2f2b2e0c5b71b98464f365", size = 773387 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/46/468a892cdc218272925c3fc4b3ae81cd81f24eabe29a35ba5d017ee35ee1/libcst-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab83633e61ee91df575a3838b1e73c371f19d4916bf1816554933235553d41ea", size = 2124113 }, + { url = "https://files.pythonhosted.org/packages/8c/b7/b8e7b24629b32e4ba4822e3291c19dc63f2f95fea40230e630ec8df0d3f1/libcst-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b58a49895d95ec1fd34fad041a142d98edf9b51fcaf632337c13befeb4d51c7c", size = 2032570 }, + { url = "https://files.pythonhosted.org/packages/d3/db/1e064189f75bc68091fa4fe5b0b062493384544e47d8d50520d00d7bfe1c/libcst-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d9ec764aa781ef35ab96b693569ac3dced16df9feb40ee6c274d13e86a1472e", size = 2173960 }, + { url = "https://files.pythonhosted.org/packages/02/86/b03471cae3e8372e8e5350f90645136106bc9780d87bb46939dc68c938b5/libcst-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99bbffd8596d192bc0e844a4cf3c4fc696979d4e20ab1c0774a01768a59b47ed", size = 2264452 }, + { url = "https://files.pythonhosted.org/packages/3b/66/729dcfbf82d64646f11b3875270177ad35057fe1908bc29366a6d530dddb/libcst-1.5.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec6ee607cfe4cc4cc93e56e0188fdb9e50399d61a1262d58229752946f288f5e", size = 2341370 }, + { url = "https://files.pythonhosted.org/packages/db/23/177ca265dcaf2af4665ca359dd9967f9000dc74fc78fd3b6a231301ab972/libcst-1.5.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:72132756f985a19ef64d702a821099d4afc3544974662772b44cbc55b7279727", size = 2219726 }, + { url = "https://files.pythonhosted.org/packages/48/b9/2b292403ea5343143dfb93ad04da17752db3c77e7796e1f5eee00247b2c3/libcst-1.5.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:40b75bf2d70fc0bc26b1fa73e61bdc46fef59f5c71aedf16128e7c33db8d5e40", size = 2325121 }, + { url = "https://files.pythonhosted.org/packages/f6/57/1d6ee6d1456baa856fe33c07e3f6b76219ba0af7afe51a85b0b016e4d18c/libcst-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:56c944acaa781b8e586df3019374f5cf117054d7fc98f85be1ba84fe810005dc", size = 2031807 }, + { url = "https://files.pythonhosted.org/packages/14/c1/83f7ff3a225ad09527b8d15b410e1bba168bafe0d134d93645b1d8b69859/libcst-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db7711a762b0327b581be5a963908fecd74412bdda34db34553faa521563c22d", size = 2123894 }, + { url = "https://files.pythonhosted.org/packages/5b/70/7b765a0a8db8084703fe408ed1c583c434e99b8ec3e7c6192732a1959eb8/libcst-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa524bd012aaae1f485fd44490ef5abf708b14d2addc0f06b28de3e4585c4b9e", size = 2032548 }, + { url = "https://files.pythonhosted.org/packages/3c/01/d4111674d3cfe817c12ef79f8d39b2058a3bd8cd01a307a7db62118cd0ed/libcst-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ffb8135c09e41e8cf710b152c33e9b7f1d0d0b9f242bae0c502eb082fdb1fb", size = 2173948 }, + { url = "https://files.pythonhosted.org/packages/4e/3b/0e7698e7715d2ed44512718dd6f45d5d698498b5c9fa906b4028a369a7f6/libcst-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76a8ac7a84f9b6f678a668bff85b360e0a93fa8d7f25a74a206a28110734bb2a", size = 2264422 }, + { url = "https://files.pythonhosted.org/packages/0d/c4/a76444a28015fb7327cfdbde7d3f88f633e88fce2fe910c7aaa7d4780422/libcst-1.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89c808bdb5fa9ca02df41dd234cbb0e9de0d2e0c029c7063d5435a9f6781cc10", size = 2341569 }, + { url = "https://files.pythonhosted.org/packages/54/1c/3f116e3baa47f71929467b404643c09e31af7acb77de8d2b3fe5d1b06212/libcst-1.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40fbbaa8b839bfbfa5b300623ca2b6b0768b58bbc31b341afbc99110c9bee232", size = 2219836 }, + { url = "https://files.pythonhosted.org/packages/ea/f7/746b6d91125cf1f398889d1b4488b10cc3df6b35d9762c2131294a1e8217/libcst-1.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c7021e3904d8d088c369afc3fe17c279883e583415ef07edacadba76cfbecd27", size = 2325108 }, + { url = "https://files.pythonhosted.org/packages/fc/82/260932412cd9d6c1ac60283889adc18c21ffc55c8b5b63309b95bc277f76/libcst-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:f053a5deb6a214972dbe9fa26ecd8255edb903de084a3d7715bf9e9da8821c50", size = 2031804 }, + { url = "https://files.pythonhosted.org/packages/8f/0c/eac92358d05e75516f15654fb1550c9af165ce5a19f2b8adf44916ebebc4/libcst-1.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:666813950b8637af0c0e96b1ca46f5d5f183d2fe50bbac2186f5b283a99f3529", size = 2122234 }, + { url = "https://files.pythonhosted.org/packages/b3/26/6925af831f039e27eb380ba64448f33aea255ab6ecae6b5deec6ec637197/libcst-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7b58b36022ae77a5a00002854043ae95c03e92f6062ad08473eff326f32efa0", size = 2031324 }, + { url = "https://files.pythonhosted.org/packages/e0/87/1b593bdddcb0d38d2232dab96b1f92deb2481c72063394f0394f680ff5b3/libcst-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb13d7c598fe9a798a1d22eae56ab3d3d599b38b83436039bd6ae229fc854d7", size = 2172432 }, + { url = "https://files.pythonhosted.org/packages/88/27/966f9fe2652aa496a85503333559937e58979eef674f9803c995d6704c44/libcst-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5987daff8389b0df60b5c20499ff4fb73fc03cb3ae1f6a746eefd204ed08df85", size = 2263445 }, + { url = "https://files.pythonhosted.org/packages/ff/79/f172226edbdd5b3a31d3c270e4407b35e3f5b0c6e404967e42314f1b434e/libcst-1.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00f3d2f32ee081bad3394546b0b9ac5e31686d3b5cfe4892d716d2ba65f9ec08", size = 2343044 }, + { url = "https://files.pythonhosted.org/packages/91/f2/664ae80583c66bcc3a2debcc8bab04e6843c3a6ac02e94050dddb5e5909c/libcst-1.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ff21005c33b634957a98db438e882522febf1cacc62fa716f29e163a3f5871a", size = 2217129 }, + { url = "https://files.pythonhosted.org/packages/8b/df/b6b506d50f0a00a49d4e6217fd521c208cbf8693687cd0ac5880507ca6d1/libcst-1.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:15697ea9f1edbb9a263364d966c72abda07195d1c1a6838eb79af057f1040770", size = 2322129 }, + { url = "https://files.pythonhosted.org/packages/eb/84/9c79a0aa5334f39a86844d32ef474491a817e9eefaa8f23fc81e7ad07d8b/libcst-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:cedd4c8336e01c51913113fbf5566b8f61a86d90f3d5cc5b1cb5049575622c5f", size = 2032278 }, ] [[package]] @@ -813,15 +661,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3f/76/30d8f152299f65c85c46a2cbeaf95ad1d18516b5ce730acdaef696d4cfe6/msgspec-0.18.6-cp312-cp312-win_amd64.whl", hash = "sha256:1003c20bfe9c6114cc16ea5db9c5466e49fae3d7f5e2e59cb70693190ad34da0", size = 187184 }, ] -[[package]] -name = "netaddr" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/90/188b2a69654f27b221fba92fda7217778208532c962509e959a9cee5229d/netaddr-1.3.0.tar.gz", hash = "sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a", size = 2260504 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/cc/f4fe2c7ce68b92cbf5b2d379ca366e1edae38cccaad00f69f529b460c3ef/netaddr-1.3.0-py3-none-any.whl", hash = "sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe", size = 2262023 }, -] - [[package]] name = "networkx" version = "3.4.2" @@ -833,24 +672,26 @@ wheels = [ [[package]] name = "ninja" -version = "1.11.1.1" +version = "1.11.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/37/2c/d717d13a413d6f7579cdaa1e28e6e2c98de95461549b08d311c8a5bf4c51/ninja-1.11.1.1.tar.gz", hash = "sha256:9d793b08dd857e38d0b6ffe9e6b7145d7c485a42dcfea04905ca0cdb6017cc3c", size = 132392 } +sdist = { url = "https://files.pythonhosted.org/packages/b4/49/4f1a79f99f4c3eb5d22f943bba14832923bb44423254d5089d38a9f6da63/ninja-1.11.1.2.tar.gz", hash = "sha256:4fbd07b2b4232543726abafdd350453a2fabef4527664ca0e491c578aee5f857", size = 129009 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/6e/04ed11bb244039908f6f212cb5f3e97933e238655248e4ce307c1687ba1f/ninja-1.11.1.1-py2.py3-none-macosx_10_9_universal2.macosx_10_9_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:376889c76d87b95b5719fdd61dd7db193aa7fd4432e5d52d2e44e4c497bdbbee", size = 270611 }, - { url = "https://files.pythonhosted.org/packages/2c/52/0e5423311eb9939b6f9354059a6d88a6211eb4fa1c7a4ef303ecee1c1fe0/ninja-1.11.1.1-py2.py3-none-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:ecf80cf5afd09f14dcceff28cb3f11dc90fb97c999c89307aea435889cb66877", size = 324256 }, - { url = "https://files.pythonhosted.org/packages/6d/92/8d7aebd4430ab5ff65df2bfee6d5745f95c004284db2d8ca76dcbfd9de47/ninja-1.11.1.1-py2.py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:84502ec98f02a037a169c4b0d5d86075eaf6afc55e1879003d6cab51ced2ea4b", size = 307194 }, - { url = "https://files.pythonhosted.org/packages/01/c8/96424839fd127b4492229acf50763ed9940d864ca35d17d151934aef1f6f/ninja-1.11.1.1-py2.py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:73b93c14046447c7c5cc892433d4fae65d6364bec6685411cb97a8bcf815f93a", size = 155643 }, - { url = "https://files.pythonhosted.org/packages/6b/fa/5ca8e65a98cdb9a71d4f1e38cac7bd757bbb9555a5aef5a4d293aa890e5c/ninja-1.11.1.1-py2.py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18302d96a5467ea98b68e1cae1ae4b4fb2b2a56a82b955193c637557c7273dbd", size = 179538 }, - { url = "https://files.pythonhosted.org/packages/45/ef/60086f02cbc6882da00a02c81d645cefd8d2d65b01fade41b873d8dd85a2/ninja-1.11.1.1-py2.py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aad34a70ef15b12519946c5633344bc775a7656d789d9ed5fdb0d456383716ef", size = 156217 }, - { url = "https://files.pythonhosted.org/packages/1c/00/2fd13ac6aafdb566f00d6b541101fca54e58ae58bf96c00f9780df019607/ninja-1.11.1.1-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:d491fc8d89cdcb416107c349ad1e3a735d4c4af5e1cb8f5f727baca6350fdaea", size = 372069 }, - { url = "https://files.pythonhosted.org/packages/ad/5d/6e97c8a25167d4867694c7fb0b9bdbc9b096d6479c8e56c5bd41b49613f6/ninja-1.11.1.1-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:7563ce1d9fe6ed5af0b8dd9ab4a214bf4ff1f2f6fd6dc29f480981f0f8b8b249", size = 418859 }, - { url = "https://files.pythonhosted.org/packages/43/78/34af88d753389a9412438d16142c77e587e0d69152faf0bbf99701063dd8/ninja-1.11.1.1-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:9df724344202b83018abb45cb1efc22efd337a1496514e7e6b3b59655be85205", size = 419782 }, - { url = "https://files.pythonhosted.org/packages/3b/74/de0633f8bced3b188942fca64a950e8f2206c60c10c97af465b356ae9b25/ninja-1.11.1.1-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:3e0f9be5bb20d74d58c66cc1c414c3e6aeb45c35b0d0e41e8d739c2c0d57784f", size = 415476 }, - { url = "https://files.pythonhosted.org/packages/9a/f3/3e4a56ff77739d1582749b93497bdebf11e003fbc7a66363ef6c772ebd0a/ninja-1.11.1.1-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:76482ba746a2618eecf89d5253c0d1e4f1da1270d41e9f54dfbd91831b0f6885", size = 379229 }, - { url = "https://files.pythonhosted.org/packages/c5/ee/53df34fcc9c0b1db62b2f2e2c848e28d9354e1c7f0dce029ee50b16ca157/ninja-1.11.1.1-py2.py3-none-win32.whl", hash = "sha256:fa2ba9d74acfdfbfbcf06fad1b8282de8a7a8c481d9dee45c859a8c93fcc1082", size = 265049 }, - { url = "https://files.pythonhosted.org/packages/b6/2f/a3bc50fa63fc4fe9348e15b53dc8c87febfd4e0c660fcf250c4b19a3aa3b/ninja-1.11.1.1-py2.py3-none-win_amd64.whl", hash = "sha256:95da904130bfa02ea74ff9c0116b4ad266174fafb1c707aa50212bc7859aebf1", size = 312958 }, - { url = "https://files.pythonhosted.org/packages/73/2a/f5b7b3b7ecd5cf4e31375580bf5c6a01a328ed1ebdfff90fab463e3f4bc7/ninja-1.11.1.1-py2.py3-none-win_arm64.whl", hash = "sha256:185e0641bde601e53841525c4196278e9aaf4463758da6dd1e752c0a0f54136a", size = 272686 }, + { url = "https://files.pythonhosted.org/packages/2b/e6/097a441e1910399ed536d36258f6d1b5fce6c5caf6c4f0611b41e7a18c3e/ninja-1.11.1.2-py3-none-macosx_10_9_universal2.whl", hash = "sha256:1cfbb845095ea09da8c089375a8f999e75f4817d01506297c66181b533175647", size = 279133 }, + { url = "https://files.pythonhosted.org/packages/7b/87/d33b00c6168915b343fde8877a6852692ba6f7d3ebee07f251a2dc338563/ninja-1.11.1.2-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ab4068ff7ff1f895485ad604116165b05d6810c802170a7f22c09dd678d5587d", size = 472101 }, + { url = "https://files.pythonhosted.org/packages/62/54/787bb70e6af2f1b1853af9bab62a5e7cb35b957d72daf253b7f3c653c005/ninja-1.11.1.2-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:33d258809c8eda81f9d80e18a081a6eef3215e5fd1ba8902400d786641994e89", size = 422889 }, + { url = "https://files.pythonhosted.org/packages/27/9f/1a021b766134f4ea91346fbbf7653e17a483242929c9c579b769830bdcd6/ninja-1.11.1.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed25892c16e49e66383a8db6a67a9f33b41230fc485426094d7da51e2255ec2b", size = 157046 }, + { url = "https://files.pythonhosted.org/packages/a8/e3/e05286d374e69272bd0a00517f76effe026207cb07a9d269cc3abdfe4bdd/ninja-1.11.1.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:232767144401847db62e8392047866698bb3678158a1ae4400a97111110e90f2", size = 180014 }, + { url = "https://files.pythonhosted.org/packages/22/b4/0fb29155c05685a8a4d20489b90c340dd781db5c14b5586075fcbdf748e4/ninja-1.11.1.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9200247cf4c1643a67d079836b8dd31a362e34e618b50b5e3a5c0d0171efc442", size = 157099 }, + { url = "https://files.pythonhosted.org/packages/e7/85/d67805c3d47c902f7b1a1a5b75317f4d45af7bb7132c342adf47eafc66b8/ninja-1.11.1.2-py3-none-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0c9c36f6e6f8946c7271b0ed14d98fc3ea467a0c0954fb73f5f656c42667d943", size = 130093 }, + { url = "https://files.pythonhosted.org/packages/eb/40/9a7fc0e417b1aab20f91be957418d2e5952db9f9b72f4396a8a097310964/ninja-1.11.1.2-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:3e815e4147832b17ec38417efcb31df51671ae273f083409304c7cc32a14dd1a", size = 372508 }, + { url = "https://files.pythonhosted.org/packages/0e/db/8c4843e8454e1ec2e6651b5caef31762e46fbaf3a71e6817e7d9cd28b5cb/ninja-1.11.1.2-py3-none-musllinux_1_1_i686.whl", hash = "sha256:ecf3df324b56fdfb0872990a71e706efdae286e010310816c72b6bf24431711b", size = 419368 }, + { url = "https://files.pythonhosted.org/packages/c3/e0/17ccb830c1638966d75a19a59e0ce55aadb4cf5c2cae5bcf97f74511c33e/ninja-1.11.1.2-py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:cb6b476eb4e84c0efcfd3ab04f660dedce8adb854b56b043639312f3af176df6", size = 420305 }, + { url = "https://files.pythonhosted.org/packages/30/e4/7d02c7a633c36a9aa7433fb742931a62f0a3aa72b484ed23d73cc6415286/ninja-1.11.1.2-py3-none-musllinux_1_1_s390x.whl", hash = "sha256:508fb93395a5c82a4d99d30fce0cbaf5cb2bd33e5c1dc9faaa080e199802dbc9", size = 416060 }, + { url = "https://files.pythonhosted.org/packages/0d/11/4dc053f20c64f5a340d72f948bbad22818d242afd54e826e0c95ca3779fe/ninja-1.11.1.2-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:52af7f45750c5c288d566fd0c927ed9bb0d8f2e50803709f582a42bcc4ec167b", size = 379729 }, + { url = "https://files.pythonhosted.org/packages/ab/57/adaa8052ae4854c5f8e228baa1a77aad68093bc1aedf32597fa5e7714118/ninja-1.11.1.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:99fc4b87299242e10d7edd1c7737fdfb1269019e32f9f4267630887f6183a49e", size = 434886 }, + { url = "https://files.pythonhosted.org/packages/41/81/b80ab3c02a2e25f71334e821852856cfc32d1339ccd7fe0858c556d8af4f/ninja-1.11.1.2-py3-none-win32.whl", hash = "sha256:949e23cb2e79a33ea37d23a07d26846d2e75464e8e6940f8751fe964bc141dfa", size = 255983 }, + { url = "https://files.pythonhosted.org/packages/72/97/4109961b899ff2decfc0439de442cbe846c94210f263260a211cbee2b29d/ninja-1.11.1.2-py3-none-win_amd64.whl", hash = "sha256:0bca4179119426a3c3c9d5661c3b244d68781064e50907a1e066bc55edc18e06", size = 296510 }, + { url = "https://files.pythonhosted.org/packages/6d/cc/9deb2b6385c7188ad873ed17afdb5f25931e1c07c8a2e2c452e25cd288e1/ninja-1.11.1.2-py3-none-win_arm64.whl", hash = "sha256:ee7b1924c28e6cab5b866f7b229f07777d25d8cfccbbedf3da5ffb4f72f57877", size = 270558 }, ] [[package]] @@ -1015,19 +856,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/87/20/199b8713428322a2f22b722c62b8cc278cc53dffa9705d744484b5035ee9/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a", size = 99144 }, ] -[[package]] -name = "omegaconf" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "antlr4-python3-runtime" }, - { name = "pyyaml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/09/48/6388f1bb9da707110532cb70ec4d2822858ddfb44f1cdf1233c20a80ea4b/omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7", size = 3298120 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/94/1843518e420fa3ed6919835845df698c7e27e183cb997394e4a670973a65/omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b", size = 79500 }, -] - [[package]] name = "opencv-python" version = "4.10.0.84" @@ -1088,11 +916,11 @@ wheels = [ [[package]] name = "packaging" -version = "24.1" +version = "24.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", size = 148788 } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", size = 53985 }, + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, ] [[package]] @@ -1160,39 +988,58 @@ wheels = [ [[package]] name = "py-bip39-bindings" -version = "0.1.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/8a/5e22cbd00b799b33ce0a45ae3715c9ea3fcd263f877544819e7d03753c49/py_bip39_bindings-0.1.11.tar.gz", hash = "sha256:ebc128ccf3a0750d758557e094802f0975c3760a939f8a8b76392d7dbe6b52a1", size = 18103 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/0c/ab1bb098eaca1954c02ff1ef625817e7580907273d0f10de29eb4bac4f31/py_bip39_bindings-0.1.11-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:324a7363f8b49201ebe1cc72d970017ec5139f8a5ddf605fa2774904eb7f08a1", size = 399429 }, - { url = "https://files.pythonhosted.org/packages/c0/87/3d9903a85f9b5b3d57eb04ec484bf148e12a8dcb255160d3071cabb3861c/py_bip39_bindings-0.1.11-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:77173b83c7ade4ca3c91fae0da9c9b1bc5f4c6819baa2276feacd5abec6005fa", size = 792362 }, - { url = "https://files.pythonhosted.org/packages/09/c1/2bda881db1c8fedc009bdd70db5ec6ccc840331f03726946907b417ce9fe/py_bip39_bindings-0.1.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84e5177fb3d3b9607f5d7d526a89f91b35687fcc34b643fc96cd168a0ae025cb", size = 413986 }, - { url = "https://files.pythonhosted.org/packages/7f/df/32db1f9e09757f292c9d88d487b58cdae741ab4bd1567571725c27d4cbf4/py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ecd1cfb17f0b1bb56f0b1de5c533ff9830a60b5d657846b8cf500ff9fca8b3", size = 1225281 }, - { url = "https://files.pythonhosted.org/packages/c1/0b/b83a9d6d60a5941b1c01ff4df6e4a7994c665f3167038dc26338814d57f1/py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3408dc0809fca5691f9c02c8292d62590d90de4f02a4b2dcab35817fa857a71", size = 1227053 }, - { url = "https://files.pythonhosted.org/packages/50/45/180a09137e318ff1b41e5a7641e383a7a1605876256b915e2761a3b6c8f8/py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_28_armv7l.whl", hash = "sha256:d6f0eda277c6d0ef28cc83fd3f59a0f745394ea1e2807f2fea49186084b3d47d", size = 1180932 }, - { url = "https://files.pythonhosted.org/packages/8d/a9/b63d8cddbcbd31bbfa85475bd286779f56c5c313c84b7cd47f0f60a7c204/py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:963357db40dc7a816d55097a85929cae18c6174c5bedf0410f6e72181270b2b1", size = 1264074 }, - { url = "https://files.pythonhosted.org/packages/69/86/4702ca3849aeb2730311632937219e6fb6d492ff5aef1bad4c1ef23efb33/py_bip39_bindings-0.1.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:be06dc751be86cbd72cd71e318979d3ab27cee12fd84d1e5e4e84575c5c9355d", size = 1252036 }, - { url = "https://files.pythonhosted.org/packages/66/f5/e39751148880e2d422a609608c228734d2f56f36635ad4958fe2f36417d6/py_bip39_bindings-0.1.11-cp310-none-win32.whl", hash = "sha256:b4e05b06831874fa8715bdb128ea776674ad708858a4b3b1a27e5710859b086d", size = 296768 }, - { url = "https://files.pythonhosted.org/packages/d5/67/fc950648f9ea9c3db6bbd55c3384dd6a5a1814b59948ba5f80b8bee7de96/py_bip39_bindings-0.1.11-cp310-none-win_amd64.whl", hash = "sha256:e01a03e858a648d294bcf063368bf09027efa282f5192abddaf7af69c5e2a574", size = 283551 }, - { url = "https://files.pythonhosted.org/packages/44/b6/0bd5bf1c4cb00e000a9c909280aa7f8654208ee136e2cd1f3650a8de59ed/py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:27cce22727e28705a660464689ade6d2cdad4e622bead5bde2ffa53c4f605ee5", size = 399429 }, - { url = "https://files.pythonhosted.org/packages/22/44/b6ffdc17cc499b72821a1d777fb465af842d5b7373f1825a45dce551fedc/py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:cdf35d031587296dcbdb22dbc67f2eaf5b5df9d5036b77fbeb93affbb9eec8d3", size = 792364 }, - { url = "https://files.pythonhosted.org/packages/15/8d/0883d814a26f922b331218c777ecaec61919aebf9c54d4991f919b21ab8a/py_bip39_bindings-0.1.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2fd5b926686207752d5f2e2ff164a9489b3613239d0967362f10c2fbd64eb018", size = 413967 }, - { url = "https://files.pythonhosted.org/packages/72/30/e3c76035b83c9552bbeee90645411a3d52983067badbd8a5854a823701f9/py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba84c38962bffdaea0e499245731d669cc21d1280f81ace8ff60ed3550024570", size = 1225281 }, - { url = "https://files.pythonhosted.org/packages/38/c9/3b73fe8ffd285387c4fe7b60ccd0072ee16d5153409619c472852ec88acc/py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9024ec3c4a3db005b355f9a00602cede290dec5e9c7cf7dd06a26f620b0cf99", size = 1227054 }, - { url = "https://files.pythonhosted.org/packages/7e/2f/d096e6e08439e5b3c1f41e95c5828700012c130611a64fe9e82a43b0ca45/py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_28_armv7l.whl", hash = "sha256:ce028c8aef51dec2a85f298461b2988cca28740bf3cc23472c3469d3f853714e", size = 1180933 }, - { url = "https://files.pythonhosted.org/packages/0b/8f/00c2239452f26e180229d74acd63ac0c027f8eb9a5fb90b879c6c1192102/py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:51882cd0fa7529173b3543c089c24c775f1876ddf48f10e60f2ed07ad2af5cae", size = 1264074 }, - { url = "https://files.pythonhosted.org/packages/1a/7a/524e38494a0ffb7ca211225acde0324cf216f081dffae7fd55446b009889/py_bip39_bindings-0.1.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ee776f3b33b2d71fee48679951f117e3d1f052449ec2fcb184f3c64a4c77e4f", size = 1252039 }, - { url = "https://files.pythonhosted.org/packages/e9/a0/68bbb9e9326266a9acca2558d6556e22df31bcf4d2235ee1cdaf362add82/py_bip39_bindings-0.1.11-cp311-none-win32.whl", hash = "sha256:d8b722e49562810f94eb61c9efa172f327537c74c37da3e86b161f7f444c51bf", size = 296767 }, - { url = "https://files.pythonhosted.org/packages/0a/47/4c5d0ff9949b725696b1b10b5b87f6c6d3c333d8458b354b7c8536272eef/py_bip39_bindings-0.1.11-cp311-none-win_amd64.whl", hash = "sha256:be934052497f07605768e2c7184e4f4269b3e2e77930131dfc9bdbb791e6fdf4", size = 283550 }, - { url = "https://files.pythonhosted.org/packages/cb/a5/0d29c79ee79475ceca80ca19b5975917827af6ce4dd2711ed197822a12ea/py_bip39_bindings-0.1.11-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:afa9c5762cfaec01141f478a9c3132de01ec3890ff2e5a4013c79d3ba3aff8bb", size = 798236 }, - { url = "https://files.pythonhosted.org/packages/47/fd/a4baff5368ef8be569064e5aef1319c4e75b24a80c70c0f3a871727c6a38/py_bip39_bindings-0.1.11-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a3af7c1f955c6bbd613c6b38d022f7c73896acaf0ecc972ac0dee4b952e14568", size = 406227 }, - { url = "https://files.pythonhosted.org/packages/78/44/fe4a107204690d18691a2db7cacfd6043331f6982dc59962d9e220d46711/py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6aed3e86f105a36676e8dd0c8bc3f611a81b7ba4309b22a77fdc0f63b260e094", size = 1215916 }, - { url = "https://files.pythonhosted.org/packages/0d/53/0cbfe92fde6925244280eaed3ede0f16cb498c8764023acc155225d5f9e4/py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d202f051cf063abae3acd0b74454d9d7b1dbeaf466ef7cb47a34ccedac845b62", size = 451663 }, - { url = "https://files.pythonhosted.org/packages/44/9b/4c3c8c6decdc7472323a66e98e1d37c43dcbf798c944791eafeb63ff8411/py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae120b5542fecf97aa3fdb6a526bac1004cb641bc9cc0d0030c6735dc2156072", size = 1206493 }, - { url = "https://files.pythonhosted.org/packages/94/47/71ed526077a4e58ac4ec5dbb43637faa33cc02a0ada912a3fd8f20c193b9/py_bip39_bindings-0.1.11-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:baf896aabb3bec42803015e010c121c8a3210b20184f37aaa6e400ae8e877e60", size = 483935 }, - { url = "https://files.pythonhosted.org/packages/be/e3/7da98b60d113334e2eb95028289410f8a1771e755fa7ad3de1ae2fa9d951/py_bip39_bindings-0.1.11-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e4d45324c598197dbddac10a0298197ca2587fa7b09d1450697517988a29d515", size = 481093 }, - { url = "https://files.pythonhosted.org/packages/c1/38/d54060bda276a062e2327e169b6660b27beb4f75ab7a9e216dd11b9ae703/py_bip39_bindings-0.1.11-cp312-none-win32.whl", hash = "sha256:92abce265b0f2d8c5830441aff06b7b4f9426088a3de39624b12f3f9ff9fc2eb", size = 296429 }, - { url = "https://files.pythonhosted.org/packages/86/12/256aa92f70a8bdf2a00dc84f6c75c86abadeca1c990e02c8345933889952/py_bip39_bindings-0.1.11-cp312-none-win_amd64.whl", hash = "sha256:6794187229eb0b04d0770f0fba936f0c5c598f552848a398ed5af9a61638cacb", size = 284888 }, +version = "0.1.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/a1/65aeab0f95b64d4f95034b3a6e32a44d156e300c1b00c3c6087235cb4658/py_bip39_bindings-0.1.12.tar.gz", hash = "sha256:56f446e665a4511e9e7dab807a908ca692247a257e141f76633110e3d30e53af", size = 15882 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/c1/e1161b3251975009fabf0e4d67895554ed4612d8416b9d5b060532754d6f/py_bip39_bindings-0.1.12-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:830a1cd07b46f84d07b9807ea1e378e947d95f9f69a1b4acc5012cf2e9336e47", size = 393630 }, + { url = "https://files.pythonhosted.org/packages/98/ae/ed9c88c076944f43f5632f9b748413a6bc25232042732b7a1d186b80f82d/py_bip39_bindings-0.1.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ad84b1ca46329f23c808889d97bd79cc8a2c48e0b9fbf0ecefd16ba8c4e54761", size = 383959 }, + { url = "https://files.pythonhosted.org/packages/d1/47/57b56e586f9c4c6215c13857eb91d7518b7ec2c31b11b6cb0fa0cebf8638/py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3772e233a03a322cd7d6587c393f24a6f98059fbeb723b05c536489671a9ae8a", size = 449117 }, + { url = "https://files.pythonhosted.org/packages/05/88/ed9df4cd6329dd19e87d27f403c0ad6fc7ec20f514aeba168a143aebdf1e/py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f28937f25cc9fcae37992460be1281e8d55973f8998c7d72e7b5047d3ead375a", size = 456616 }, + { url = "https://files.pythonhosted.org/packages/c7/63/5baa949d175fcddaf1722c163f2b450ea3ea8906f3931b03e73efb403db8/py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:332d6340201341dd87b1d5764ba40fd3b011b1f152145104d733c378a2af2970", size = 494949 }, + { url = "https://files.pythonhosted.org/packages/76/d0/11705b72d6b0c50f206d42b8af0bd9f07c3ac373ed36ab3c0779170f8308/py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79daf697315084d1f91e865fae042e067c818c790dfdc6d2e65b8f9d119fc703", size = 457494 }, + { url = "https://files.pythonhosted.org/packages/ca/6a/f7858f0d707a821671d3d59ed79012dafad3a22ec04a6f1044094000ad83/py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7764520c8b347ff4f3ead955f2044644ab89dc82e61f3bf5b9baa45ff03b389b", size = 472489 }, + { url = "https://files.pythonhosted.org/packages/ec/cf/d51cf3312bbc2ac77ef5928441df0b86a714148956492d88d51192adc8fe/py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:09ca55cde30aea939c86cdadca13d7b500da414070b95fc5bf93ebdb0ec14cd7", size = 631968 }, + { url = "https://files.pythonhosted.org/packages/ed/13/55648daa439408969e3258c4e6fd0bb20998b1ac5ed69f56621926bb23cb/py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6e4e36c2474b946dab0c1019ac38be797073d9336e4735d574cd38cc506e5857", size = 711894 }, + { url = "https://files.pythonhosted.org/packages/5c/62/70f1836c31ad0a0548142e5177f3f20fd6ef5f03481fb0b1a461789f2ea3/py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:534609eef941e401aaba7fc54903e219bbe9bd652d02df1d275f242e28833aa0", size = 637331 }, + { url = "https://files.pythonhosted.org/packages/65/d4/c0873ba047b345ad793834eb96d003c186490a652ab8b52b0e492ef1958a/py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:260b61bbbed75afe4f5e2caeaefa0d844650c5bcde02dadbd963d73253554475", size = 619105 }, + { url = "https://files.pythonhosted.org/packages/d0/e1/09fe0a4f7e4ded8e373857429758dd8773d5c5f456a46faf6843699cee1a/py_bip39_bindings-0.1.12-cp310-none-win32.whl", hash = "sha256:b13e44670e34e2d28d1856bba82a362ed4b84822c73bdd23f57e941da0f7d489", size = 297595 }, + { url = "https://files.pythonhosted.org/packages/f0/57/616985f9adb6008b174682f1f3c26a8736a689124351677e103c25b97c06/py_bip39_bindings-0.1.12-cp310-none-win_amd64.whl", hash = "sha256:09a1ed423242dccd5016eec18e74c80236d468ef2e85d3297615ddb4e792cd77", size = 287992 }, + { url = "https://files.pythonhosted.org/packages/22/c1/b25c23e06132731f4475e94d1313464af1fd3ade5779a96b8491b187cced/py_bip39_bindings-0.1.12-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:200ce6173c330af830177944d18402b4861f1dd1b52a410a6c02d95f69f04b92", size = 393687 }, + { url = "https://files.pythonhosted.org/packages/59/5e/61c0cad53f737293563d8c1724b79ad949e5eaedcbcbea6918ce893e5682/py_bip39_bindings-0.1.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:808f1042c31e8373bcd56be45fbebbeae2ab2e90b91178bc4d5cfad13f235f34", size = 383994 }, + { url = "https://files.pythonhosted.org/packages/8a/d6/64e8a2d7287499668531034e93459b04bb891c3063e821850b6d901f316d/py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da4c11662304beb093dfaa24f5a3b036d4e76c21de7dafd2bd43d0e78325b377", size = 449261 }, + { url = "https://files.pythonhosted.org/packages/0b/7a/80238608da59e1ec23df49b7cd7891a7a0ef22c3693ff5263783340440bb/py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4af354d2e138304c20fffa0820aa79f9b4ee4de3f1db4e4b77cd0fdf72c39fc2", size = 456701 }, + { url = "https://files.pythonhosted.org/packages/17/82/ee1b319fafa3abd5c9e7c4b9093193bfe645bc4eb9effd97147fe0e5de77/py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a337fd6eaf16bf8c42752d9a25fd58bb303499da5d6428b466eff7ddb642237", size = 494967 }, + { url = "https://files.pythonhosted.org/packages/99/1e/e7c8940e097d99266cb9b5c4c40ca2e52afd27f768b3d1ec0f125b0b2ce1/py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d72041b34d6a7ba5e83009cb96c59c48b356eb3831a0ab627421e1fcdec83c9a", size = 457601 }, + { url = "https://files.pythonhosted.org/packages/ff/28/ec02fc1bf84acbd1595d603cd7c6a2926159175cea3be1166988322190cd/py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e48ab058ac4cfdcb6bdaefc8bb555a6d36b11673589332d6336495d388a4902", size = 472536 }, + { url = "https://files.pythonhosted.org/packages/a2/0a/22916b1f8ae4187781ee38acf3470808a1a7b5adc3f435cdd112dbb21189/py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cbd4865d3ef310fbad03197511423376ff8fea162d8d14c4259ee086be249b74", size = 631996 }, + { url = "https://files.pythonhosted.org/packages/67/96/2a3dd14b9b7e07a5624c6cf02c66583e20734e5c5d789fcf9400c9c87bf4/py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:b7eafc0ab28d5835789abc82d2443aec7154c0bca8b627597ab7b4761bb3d8ac", size = 711992 }, + { url = "https://files.pythonhosted.org/packages/ca/df/8d534cc41a699bf0b766aa298704fa44bd981013f9882e0330c2fb70af9e/py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:97e739430d3b7801a4afd0e767c82554b92ba727b52c8c3a1ed9f9b676c176e3", size = 637395 }, + { url = "https://files.pythonhosted.org/packages/dd/d0/ae98b03e8f10ad0793b713b2afa723b74995f5c09dfee9d760dbb41399ed/py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6c3a446e7cb339f8d58659bf0bbf8b549482c2eefc37c7573b84150de4423d7", size = 619253 }, + { url = "https://files.pythonhosted.org/packages/9c/f3/d6f5e73456f6bf4001bf67c0e568ab2697d1fc176cf1b0e2fc4fdea0de24/py_bip39_bindings-0.1.12-cp311-none-win32.whl", hash = "sha256:6e9c09a916ac890ea629ad8334b02e43ce7d1887426d74c7c69f82d0820f66db", size = 297592 }, + { url = "https://files.pythonhosted.org/packages/d7/81/3119950191dcc80db45cb7ddce0d1b5fd19bad49ec1e40218e72aaf71c61/py_bip39_bindings-0.1.12-cp311-none-win_amd64.whl", hash = "sha256:f3480cb2e99b7d0ffae676d2d59a844623cee4c73fbed5c9bb3069b9a9845859", size = 287993 }, + { url = "https://files.pythonhosted.org/packages/8d/bb/fc724925bdd20fd70e43a5fc05f39d1ff4b6e63e63b2c992b000d69a4c4e/py_bip39_bindings-0.1.12-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a65facd53ff11314a1e2411fced145daa3a07448c40d8aff87b22dec703d631c", size = 393595 }, + { url = "https://files.pythonhosted.org/packages/53/24/bbd57790c3780dac0d48bff43d78aaefb17aa6793b5d44ec6825e6d700b5/py_bip39_bindings-0.1.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd1490d168409763b846df691e14756c1461b1edf62343ad72c4b1e00918798d", size = 384102 }, + { url = "https://files.pythonhosted.org/packages/a3/c4/1bad1232180de5368ddc08845e72d9bd6eb90ef135708aad08ed5692bb3e/py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21bc7bfb907ebb4805b83f4e674dbe2745dd505d22472eefb65dec09c679a718", size = 449147 }, + { url = "https://files.pythonhosted.org/packages/8f/b8/a4eb574670d0a3840c3a20f5cc2889cec572ad83810067d7fad67e3a98ea/py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1aa1cf5a76ea8280f2f684593f1456d8f459f200f13e7e1c351e27001310ae1", size = 456974 }, + { url = "https://files.pythonhosted.org/packages/d5/4f/b02c27f405f63c729b2bfa392044d5c182126907c360012da47118982aee/py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:950a127bf0a71be0a163bcce16d9cbb227e80da4f12ffcc0effecd9743c806d7", size = 495143 }, + { url = "https://files.pythonhosted.org/packages/7c/6f/d91908e5967198d83993c924660b18c03eb1ea560f6539d9f376ab4b42a3/py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7ad2ed21601f40037e912e87725bb3e3aef1635fdd84eae21d5bbb0034d5727", size = 457718 }, + { url = "https://files.pythonhosted.org/packages/10/1b/ad82b7592294ab909d514838173124b8f302d347ce4c630b7cc37bc652bc/py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aed015ca58ae7e9912e7cead85feba9ce7ccabd6605d76c436615fbc035278a5", size = 472972 }, + { url = "https://files.pythonhosted.org/packages/6b/7c/430613e33c23b4fd883f582682afdd48eeeeb4f474c8d1e005f858ad8326/py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5f6aab32cd3cc0fd7fb72247bada0cb269c3fc120dbdf12cfa06af1e5d3243", size = 632513 }, + { url = "https://files.pythonhosted.org/packages/4a/20/cd62358b12c07952ffe64688edf2c37558f90785e6f3f050a23ba3798080/py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d4f62d125f9cd9a3bf183d1cc3d0ff794e78185098c61c6392221a00e15dc4c7", size = 712629 }, + { url = "https://files.pythonhosted.org/packages/13/ee/e1752b352c79a42b1af500bb6fe251e41782ce55d7d76be8d40f9f5b7f38/py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:25f3f6ab788d14a56691cbef8ad3345040c358fced832338b81fb87e9951ea5e", size = 638350 }, + { url = "https://files.pythonhosted.org/packages/9f/fa/02c2d18bebe763057b9dffb2d6a5be03f633bc6e3316e9ebeb0ebd40ed22/py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fdf3c4d3acbb772c5e90da1f24db39b889d9e69b442925ebe56244a89fc24f9", size = 619254 }, + { url = "https://files.pythonhosted.org/packages/b1/9c/065d10300d3ac983300e398c33261d39935d77908c9a7c6bb4a110c75095/py_bip39_bindings-0.1.12-cp312-none-win32.whl", hash = "sha256:c7af72b8afcac625d69acd40f714963725d8078bee57c36844ae1b924d6490d2", size = 297450 }, + { url = "https://files.pythonhosted.org/packages/52/22/fd753b852d46ef18919df826771a5a7e4c5660e2afb6424510634ce3e454/py_bip39_bindings-0.1.12-cp312-none-win_amd64.whl", hash = "sha256:1dedf9899cb9cc6000373858ea9d7069ff4d961d4c53f6624496ff31fb4398f8", size = 288392 }, + { url = "https://files.pythonhosted.org/packages/71/24/ab48e19a9769d01996a225570f2b1f0600fe0a62adbe77713356ea2de923/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60e46ecd3bee23f4e458303ace7c86c592cff2d28860808a5e46398f915035a", size = 449305 }, + { url = "https://files.pythonhosted.org/packages/15/14/597ba2bb300c588da62cdcdceba5a5a1d31c35157699c11e8e6dbd7f4c28/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:71afa142cf045b4d7743a96aef66f030342a8f287a83733c6841d3b005954c52", size = 457324 }, + { url = "https://files.pythonhosted.org/packages/e7/8a/115dbfd71a72739b6d6b68a3d2fc2c2e6a5c8ad8ebf20c73f18f1feb1f9d/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c65ba92ec43ef78c5926506437b62d959ac4e343f8bf2cfc8ed799c3a6495f23", size = 494969 }, + { url = "https://files.pythonhosted.org/packages/62/6c/7d50300b72c03ec63af8e1ea997b448ef8cf2f1a9393cb243b3a7dda5289/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf3a5ec5095f56dbf0ab8258d722d860746e807c5ace99ea5ab92000268a750b", size = 457309 }, + { url = "https://files.pythonhosted.org/packages/ae/dc/42ff2c5228a5fa5897a26fa58f2e9973625b91931fb34730057d26fa2ae2/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6232b0b8dfecd73bbc4dc4865f1c0b10d00df63dc19ad7448b5e5e45fdd279e7", size = 472550 }, + { url = "https://files.pythonhosted.org/packages/c4/18/af32c6fda144e053c106b52ef7775035f9ec981bd4987f66bf13c78e14cf/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:fd13f3ba45ea56f2db85a66c1d8b03337ec8977b0a00a02448f4f65112638177", size = 633101 }, + { url = "https://files.pythonhosted.org/packages/81/a9/15fdabfe8d0a9e14d0570e6c2b3d9e6144166dd82d76206f68bae4968c2a/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:bc00a31943d3d6d6a1ab61321d0c14675f4f1452165ab712c90c8368f754648a", size = 712410 }, + { url = "https://files.pythonhosted.org/packages/38/e6/03c897d0c87c48f1d78a1fe15276891f0f603d94665d55aa8d250a250af5/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d9f96bb10320a1ddd354ea639c434cfb1e594d4a1cb9425a476f06fc04aa18d2", size = 638118 }, + { url = "https://files.pythonhosted.org/packages/97/89/d65013ba2cad7eb43e439a4b274b10b208a933e723e71ee390b817966e34/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e106a1d6d1106cf40a49b3e17748c89fd9561a3aeeb98725dca9ce751c780e16", size = 620020 }, ] [[package]] @@ -1253,38 +1100,58 @@ wheels = [ [[package]] name = "py-sr25519-bindings" -version = "0.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f7/81/3c6f3c6e37f51ec49a3dbf98162a5008c321d8a137b07b3b8521b71bf1b8/py_sr25519_bindings-0.2.0.tar.gz", hash = "sha256:0c2fe92b7cdcebf6c5611a90054f8ba6ea90b68b8832896d2dc565537bc40b0c", size = 19597 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/b9/78cbf176b9da94eaf440443d7f788fa8a524954dd6c08ed52c6709b4a780/py_sr25519_bindings-0.2.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:86cc1a571852a4f2ade827ebf211e066b23ab805d3e864cbe213a3d8cd53f7d5", size = 307576 }, - { url = "https://files.pythonhosted.org/packages/1a/77/5f4902441bce6cfd3f609ccdefa0d6fe1be996ef4937a3bca9f8fc4a0594/py_sr25519_bindings-0.2.0-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:453c9088e39dd04b07bf3ada6c473a5349c4dfd965009a35124b2c807117eda8", size = 610775 }, - { url = "https://files.pythonhosted.org/packages/89/3d/d641c5165b98c861842196380a18049fd67bbdc58146193aa5c6f536c3ec/py_sr25519_bindings-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f12122a18b688e4a4bf0e74d3969d9e3f6f83d2b01fe88ab5f19c969e95192a2", size = 581871 }, - { url = "https://files.pythonhosted.org/packages/18/6e/6328c4ec57b94acb6fc72f9aa373776132fa13960b8d5febddd03c15d39f/py_sr25519_bindings-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2815ecc958f6edbad79fee76899bd33b8950caa7106c1db08c828ec90e16fa7", size = 1101905 }, - { url = "https://files.pythonhosted.org/packages/cd/e9/ee49788c1aa6736517782b094e5aef27435d43ef7d410ae0fc7c7bd7709a/py_sr25519_bindings-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfe52e73d7f0237820f7a935397d5004733a1d890464701f2c3c71be6033c442", size = 1123248 }, - { url = "https://files.pythonhosted.org/packages/b6/31/b19576a2d3e914d236b1bd542ad3ee20e5c603acb3c1af7dc7f8a76044f8/py_sr25519_bindings-0.2.0-cp310-cp310-manylinux_2_28_armv7l.whl", hash = "sha256:df7e2fad636831919bfa479cd4b6fffdd429cde778da72b1834c1434dadaf982", size = 1115581 }, - { url = "https://files.pythonhosted.org/packages/ec/20/d673c954a7cbb50112e8255ce77ea7721bc81ad24ef66e46300a532e5341/py_sr25519_bindings-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4ebeb2aac26a39160f2fad8ffc40ff98da835af57618c0446637bf182b9c927", size = 1171562 }, - { url = "https://files.pythonhosted.org/packages/69/18/6d2f5476e68f594c8ad0f5d6e0405de01cb0309148456b6481f2432d9b2d/py_sr25519_bindings-0.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:942a6b52e871d6e152dda80a60ed338dccedc69b6375e080e496bf886f2556c0", size = 1130581 }, - { url = "https://files.pythonhosted.org/packages/09/5e/494f4dae3a01612c291710d93e6c7225a19f40f3fca3626be34722507fee/py_sr25519_bindings-0.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b24307c34a06209d0e34ca15ab4c0275617538dfdac1eac8aa25e792fa9f4108", size = 1144892 }, - { url = "https://files.pythonhosted.org/packages/e5/09/827ea815f5759b7c02bfa8b20b5633e7b345986af0aafb89720e9f19630c/py_sr25519_bindings-0.2.0-cp310-none-win32.whl", hash = "sha256:2e06a2d1119a2ad063f11448bb27ec4f4ba77416043d98ae28ef30624cf0e12d", size = 217214 }, - { url = "https://files.pythonhosted.org/packages/61/e7/7291c24825b6e43ba96dc77a3f3ede218bf306f01bcfa5a785b9c92feaee/py_sr25519_bindings-0.2.0-cp310-none-win_amd64.whl", hash = "sha256:16b36d9fe8bda873ab8376f3a4d0894b8d4ab2d702665afc3ab3ca69f0dc9495", size = 198163 }, - { url = "https://files.pythonhosted.org/packages/a5/8f/98250f99cc70184fbed486dae8a3c5622bca643603515cfebd1ff41e7c05/py_sr25519_bindings-0.2.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:54e8c41081a4c23eca4b19f52de2514c48ddec6f49844dff7ad4cfac0bc11712", size = 307576 }, - { url = "https://files.pythonhosted.org/packages/9c/92/717787c821b27867d653026ad56689218e031de29d47e9534acc0f994b07/py_sr25519_bindings-0.2.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c73bd1a87849db9cd0e664b2d2e14208183dd8d11ac083d70e688fc28283a71", size = 610780 }, - { url = "https://files.pythonhosted.org/packages/61/ba/c1b80ffdc7c16295f8d1ecf03af2f0ad394dd652f5633dd517d266d0332b/py_sr25519_bindings-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47d21382ea24f7f25e72cdddaca2f013ce46cc7983bcfebc611c795cea177eff", size = 1101905 }, - { url = "https://files.pythonhosted.org/packages/59/e6/9691bffadfeb6db2ed86d498b6aa8e6bc139672db526adf0d0c5d94cedaf/py_sr25519_bindings-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c1448cf55bbf6f52d2e24766a8a84ba6d77100a991897e8519711ccd7409830", size = 1123248 }, - { url = "https://files.pythonhosted.org/packages/c4/d6/239bb46109fd88588d8081bd83a1711a18d450cd2da0ad708a86d790687f/py_sr25519_bindings-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:392b8b9875c89c9302930ad3d59567b62176f33adeee96a55ff61ba17fb7aac2", size = 1171562 }, - { url = "https://files.pythonhosted.org/packages/1d/ff/6570292df23edf108a8415556a81c374bd609ae82025d5a768d311b05abb/py_sr25519_bindings-0.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7b56b5cbbfb36b41ddfa462989a03386590ac036f3a755ef64fffeb2fed88654", size = 1130583 }, - { url = "https://files.pythonhosted.org/packages/9a/47/88087d43f66de9d421a42830df90de7723b7049206fdec50c6bf4d3e71a3/py_sr25519_bindings-0.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8f06ea3237e06666e3a4ff4719b4fba415472943831b229428753c37d5ecd1b4", size = 1144894 }, - { url = "https://files.pythonhosted.org/packages/57/01/ed81620a93c7339f62fdacba6d6a86c4e11a9f912d4c3b4a036f27167dec/py_sr25519_bindings-0.2.0-cp311-none-win_amd64.whl", hash = "sha256:d62af30b2022f5fa787e46c06823c35a21abe791bf55012f498f9ba8e4baabc8", size = 200379 }, - { url = "https://files.pythonhosted.org/packages/c4/57/4aaeb2dea9e6b0de21f380bded496d95e1851a0d3feb1aa9e8f09610597e/py_sr25519_bindings-0.2.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:ceafa0c31b49f2128461eb2c6ea18dc5d0bfae7218a100be7153f271e46bac49", size = 695813 }, - { url = "https://files.pythonhosted.org/packages/5e/ab/9e894bab69aaeaa7cc52c3e2a77e5ee98e25f89bb00dba8fce79dc103478/py_sr25519_bindings-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c8dedb8525556591738a64310875df70ea67886e5a40f2799bd96ef8848936cf", size = 350785 }, - { url = "https://files.pythonhosted.org/packages/1b/2d/bdc61a8271fc871bf22ef215caca5e54e19a8a565b9c403b316860ce549e/py_sr25519_bindings-0.2.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ce149796923696f5cfc6263f135674a14fe2d513fd35b2bfa73226b940aff648", size = 1163591 }, - { url = "https://files.pythonhosted.org/packages/b1/20/8cef884f1d6791cbb0bc5101b949f03ed7b0bc93b0ca30f5352e0a50a82a/py_sr25519_bindings-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20d71ca3ba22f98f4c208d509f735fe4eb5aa9e3547a507733a95828adde6cab", size = 371547 }, - { url = "https://files.pythonhosted.org/packages/ca/ab/875e55a22f30e2b58e978355cd6dcd90ec86394f6d30887b58107437e4e7/py_sr25519_bindings-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8e20ee0856e8a60682566df955b81e7631670136607da627ab6892df34790d", size = 1122414 }, - { url = "https://files.pythonhosted.org/packages/73/3d/ebbfe44cd0106c360296a29f0cd9e59831a33dda18d0424c4c0c16465a12/py_sr25519_bindings-0.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0efd5487e3f6d6053cfc4a891b10f729d69263897270d0354f409ee2106fc9b7", size = 404291 }, - { url = "https://files.pythonhosted.org/packages/b4/82/f32f2d5162cf932063b3bb3a499416ae4d6665cdf73d39db90756dc595e8/py_sr25519_bindings-0.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ae7f2164d510458740145d20912d5d7a5c45e8fcde7cebd4057f60811ecc276f", size = 399144 }, - { url = "https://files.pythonhosted.org/packages/ac/32/124d3b0073b3c18be2cb2f15a75bcbb39ced862b8402916bcfc93cc38349/py_sr25519_bindings-0.2.0-cp312-none-win32.whl", hash = "sha256:92382456c6f176c07e0d554c71d483853387885ce17714f8a4b50fdcf7552297", size = 251644 }, - { url = "https://files.pythonhosted.org/packages/7f/ee/7bc554af65df98da93b7357da885299ce77ca65f4731c8c833f70275e418/py_sr25519_bindings-0.2.0-cp312-none-win_amd64.whl", hash = "sha256:48ee4e14a77f815f3996beecb7d7abf422b756e9163ee4df739c1aded8a3e8ba", size = 234175 }, +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/55/e5c27d1387f6cb3a6bf7714e1e0c4a62edc3b006710e2d081e8bdfa4123f/py_sr25519_bindings-0.2.1.tar.gz", hash = "sha256:1b96d3dde43adcf86ab427a9fd72b2c6291dca36eb40747df631588c16f01c1a", size = 18439 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/bc/d9c0e997def0884b81ef2fdea5f3f65fae0974dd60ca0639ff0eb04d5ae2/py_sr25519_bindings-0.2.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10489c399768dc4ac91c90a6c8da60aeb77a48b21a81944244d41b0d4c4be2f", size = 331167 }, + { url = "https://files.pythonhosted.org/packages/cd/33/1d9d0345a7c71b6296927f29fb6500e460187c381d7d4fffa57e6ab1f77b/py_sr25519_bindings-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8358a7b3048765008a79733447dfdcafdce3f66859c98634055fee6868252e12", size = 306032 }, + { url = "https://files.pythonhosted.org/packages/68/61/66811bb11031a48c54b7cdfaf75731e86cf136449a10ca3287e9963092bd/py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:202af5a516614907ddaef073104ae6d0a98ec96743d11cb87faa09d2b235a6b4", size = 340111 }, + { url = "https://files.pythonhosted.org/packages/4c/f0/a0cf86f6b424303c1ab51e55470006da83950b39c35716e9206f2260882e/py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0b0d977c9ba6063d7807dda84264f10b1951736ba528b4d4078e5c9989051b1", size = 367989 }, + { url = "https://files.pythonhosted.org/packages/f5/8d/0053fb7afef406ba3aca08ff51d0c0afc31b3c7a3874c824a92c0a5366e8/py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e6c46cbbb87eb9db3c7deebd71c296d67c0725d9379ee737255e22c15c64bae", size = 384040 }, + { url = "https://files.pythonhosted.org/packages/a6/c6/59ba7e7edb8e496ad8ae2777d102cacb41aae7d5fb05c2ed6972fdd0d55f/py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9368e9ca0bc1c967db0dd5cfc401f23d364064e99a48d21ea12a068612ccce7e", size = 365611 }, + { url = "https://files.pythonhosted.org/packages/8f/ca/30ab71b4357e9380b4bd8ed65338cf9ec36970798fe8b8e0f3273c3aed71/py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9f1ade92569b0281ff24476bd93333865370d86746b2d7949545f1ca70ac4e14", size = 385332 }, + { url = "https://files.pythonhosted.org/packages/15/bc/1846c1600eb2004e49bf7bd07fbfcb73c61b8f17d5ab6478874b1abd0d94/py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7286da1662afc300038441620092a0ae527430f7c50b0768e826d46893dd5095", size = 523820 }, + { url = "https://files.pythonhosted.org/packages/b7/8b/bfd727048597181a83cc43282a61f9d7eebc1aed317e4999c58763cdf1dd/py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1afbf451ecb78d5a1fa3be0f1cafb914aa2d4464ce15374bbff495cc384b1947", size = 627704 }, + { url = "https://files.pythonhosted.org/packages/23/87/fd02d1a53d9287d31ecef4842cfe7df84377a797c297d8497052fa9f5068/py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:873c0ec12fed805f4086e36ebbb673c95af09e4007ea66d5a9bbd2cc29dfa076", size = 551535 }, + { url = "https://files.pythonhosted.org/packages/14/86/7054e137d105de5408c2510c0d457b69756cdd4d4fbdb77aa2ba71b164b8/py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5917f8584cf6a81e32f03547d9fbd8c783db2372d49bd9ff8c5c57d969ea1039", size = 529596 }, + { url = "https://files.pythonhosted.org/packages/b0/ef/6701c33c8f243dfc143e55ead788727b1d99865915fe82e72019dfd16109/py_sr25519_bindings-0.2.1-cp310-none-win32.whl", hash = "sha256:09f184393e01d0d2b62d3782a6d18dd0824a225444e0171c08e03f8cf3920e7b", size = 217893 }, + { url = "https://files.pythonhosted.org/packages/70/9c/bca6f55663f573eee619a2100af35797449362e906316e01b8e5ddb612f2/py_sr25519_bindings-0.2.1-cp310-none-win_amd64.whl", hash = "sha256:2d548a8ea057c6f150572059475761101ba8ef15e3b349d2d0cb108652f6aaf8", size = 224183 }, + { url = "https://files.pythonhosted.org/packages/b7/e5/62067ff055a940bcbb02467f7fb63fd85a89cc12153f8c78199ce5c71fb9/py_sr25519_bindings-0.2.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4941e6e0e180f7e72565043ed3ba7190455c9feaa2ab9ee6038904f2b4bb6c5b", size = 331203 }, + { url = "https://files.pythonhosted.org/packages/0a/6c/48a6e1289012b4ab704ccec5315a7c1f1694909b5cc332a36ec87ab03608/py_sr25519_bindings-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b63d7cf5bb4d9b986d7f7012c80b92be70311dc9b75862f7880e03b71a29543d", size = 306083 }, + { url = "https://files.pythonhosted.org/packages/e6/da/b7ab72a15e950779edf376b344b6de43aacc7250e319ff23996ef96cda5b/py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6752bf3b109446d99f3a368e3ba805812fc5bc09e52ef1c82f5a47e43b19973", size = 340172 }, + { url = "https://files.pythonhosted.org/packages/15/7f/4defee54893a3947936f3b5b8b1fe8cb10bb6d01cf87240345f511636e8d/py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0368dcdf5ec8d2bb9c13273c78c3c5b033211d37a70a2f1d2080f29a7d118340", size = 368044 }, + { url = "https://files.pythonhosted.org/packages/44/a9/b6ddb161bb28f7da1b261d8e6d59d9669a15bdbfe8bfff0ff15f9a28f0a6/py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2618b02b4a3babac07b8bb61fe9550f911f038bb079665682ca76b2e664e5258", size = 384053 }, + { url = "https://files.pythonhosted.org/packages/7a/66/5d4c78ad9766cd46e5439e9fb84cb10bc47b9c4929c8ea99ee880f405f50/py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab1bc4dc524efefaecf3a85f4a0ff05c1ca9509d4d64056199984550f3c98b3", size = 365700 }, + { url = "https://files.pythonhosted.org/packages/07/ef/f96d4e2472af62768ffd81df2170f643de87b0ab831e405a4572b9959379/py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ccdc89d5e3ae0dd163c8150ec76b6bb3291c1cec9746eb79e9544b3423f35f9", size = 385360 }, + { url = "https://files.pythonhosted.org/packages/9e/91/ea5e750e5f2896412fcbbe32da3be8ffab50f4221df7fe3ab367c51a99ac/py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ae6545c414cfa5d7207c9c77aaa576bb374982fb2105a7a9c2764afa5621f6d4", size = 523867 }, + { url = "https://files.pythonhosted.org/packages/7c/d0/e56f6753b264dd4c3f40364879429af7127c8b235c7a2f6d5fbb69137004/py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:7046774e39e0166d3c12632969c9d1713e6ad9ca8206bbe82923ba6935b0a01f", size = 627828 }, + { url = "https://files.pythonhosted.org/packages/63/19/7a8d5cca0a498da55b0457be98f03e428e4981b563e5d1c8c92dfc7d136e/py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cba9a8821176895b080ea761e5ab9cd8727660bf401478a6532a30ae3429573d", size = 551658 }, + { url = "https://files.pythonhosted.org/packages/58/4e/083694bded9ce2d8d598f086aa4ca67f2b9c5d9bfd79ca46f04c95e9322b/py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c31aba05819e5b6b26746dc1b078cf680bd471f135c55e376e95c7774e22e936", size = 529627 }, + { url = "https://files.pythonhosted.org/packages/3d/cc/837b57c938d2b1d0e6f296dc09a3e65b0d762b2387301f8a51452d679391/py_sr25519_bindings-0.2.1-cp311-none-win32.whl", hash = "sha256:d4bfb9c9a5c46563ccf12e74862ee95d2961556ba7aca62c9e4d6e4f7c37b4e0", size = 217894 }, + { url = "https://files.pythonhosted.org/packages/5e/43/3f91ccad4b8d96ddf9a26b00be11de6ad0d260ab26e17ad8f98088512c3a/py_sr25519_bindings-0.2.1-cp311-none-win_amd64.whl", hash = "sha256:4f0d5c065d5e6122e53e771035aa335534363b451358b408d211df1c46773617", size = 224191 }, + { url = "https://files.pythonhosted.org/packages/fa/6f/5dca831fe2617075237d49868d1bd4f025d0dbd23676d7dec3aaf39642cd/py_sr25519_bindings-0.2.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:01ef73c0b3d3f703b54ee69c0f5ff4aa54b4233212c466fd497c7a84d170963a", size = 330633 }, + { url = "https://files.pythonhosted.org/packages/3e/86/569b69e01a962e0c3cd63465e5faad589e54f0c27bfaed5436fef283d56c/py_sr25519_bindings-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7ce8ac85e5ea82825a863f3f6f071e5ead610d7675820eb8ffe772267445ec0b", size = 306030 }, + { url = "https://files.pythonhosted.org/packages/a1/ae/ad0d1fff92966b4ca020abc3ea12e3e1f34c3a937bab28fa0e6bf893d587/py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f59ac8c03c8ef819db063627f4a8247aab0db11d88b21562abbe371612cf66ab", size = 340266 }, + { url = "https://files.pythonhosted.org/packages/b0/7e/93903b1a0789fe1e7f2bb17f4992b55549dfbc8dd8dc3fa4d57c08b72250/py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d2c11fc77b57308e3ada9a40e7c343027129b582d3091ebd992c99b1832ac8c1", size = 367790 }, + { url = "https://files.pythonhosted.org/packages/f4/79/842a46cc48c33ff0d08f95db6b327fdd5972fd68d733634322762dd74702/py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92af2831d6896f0b3fef792d1f2da780fabf6c78dac12535b394cbdb51c0d257", size = 383790 }, + { url = "https://files.pythonhosted.org/packages/0d/33/aeeacf174483ae6163bfb8993c0dabdb15875272e59658123d2dcf55f39a/py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc99f7f310b7641e510810c1d6a6b51792ab2ccefac3ab288445a9fcbc9a8265", size = 365962 }, + { url = "https://files.pythonhosted.org/packages/85/bb/c41e0115115336acad5b05d577bf463fa69975ed84dcf50011ac4e07eb89/py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1dc4995a352a6e5851a41cb0ea37d8c9083d173515b7fd2f381b014f57dc1cda", size = 386028 }, + { url = "https://files.pythonhosted.org/packages/cd/d0/48744d7ec55853dc7ec6889f7b85b4f9d21349f09a9ccc8fd988a67f0a46/py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f103dc5c420057c4447bd6ebf28b2b68ff3ab8da85a5f7ff39c405293de80c78", size = 524320 }, + { url = "https://files.pythonhosted.org/packages/50/4f/9462c0525bd64417c56e788b9543a34c08583bf7eabf81797bf5545b924d/py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:902ee675497b8d356a2abe2abc4278cd76c503f76d06ef2bcd797c1df59e84b7", size = 628052 }, + { url = "https://files.pythonhosted.org/packages/a7/2a/873f8e7425fd424f9d4aa6eddbbe767889d2aee639372fd9516d6b352c93/py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5dd9748f4bd9a3bc4d5c1245f6edcc723075b1470b4c36add4474df4c53604e8", size = 552273 }, + { url = "https://files.pythonhosted.org/packages/0e/e2/bb29457851816c1637bdd7176ac419073faeecf452dcfae54b50ddb81bc1/py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c24bc55699d12948571969c26e65138a942bdaca062171288c40c44b9a4f266", size = 530013 }, + { url = "https://files.pythonhosted.org/packages/4b/70/21d32090ca207738a3979620865e2a48ccbed64871cffafb24c6febe234d/py_sr25519_bindings-0.2.1-cp312-none-win32.whl", hash = "sha256:d4799c9a8f280abdfe564d397bad45da380275c8d22604e059bd7b3d5af404b5", size = 218181 }, + { url = "https://files.pythonhosted.org/packages/bb/df/06a61ef52a6889d6879bfa8a5877688f62854c8eab491ad7af60e797a3ef/py_sr25519_bindings-0.2.1-cp312-none-win_amd64.whl", hash = "sha256:0746befd71d1766d8747910cfeb2cec2be2c859c3b3618eda1dc3cb4a1b85175", size = 224095 }, + { url = "https://files.pythonhosted.org/packages/bf/21/d5a2b0d2b518fa530cd7b08d8906390c9b3eb2476b8d04f3b9eeae848207/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50f8b34fed2c98814dcd414379ef43bf63cd4c05d7d90b83c590cca60fe804d6", size = 340467 }, + { url = "https://files.pythonhosted.org/packages/1e/92/38b9b6ae88eee7ffbe99fd0a577b82ff0ea2b030c92e85696355f1e1f0f4/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:141b0f8fb99cb249984f7c9ec67dd1768aae4d137d47ea0eca027d669503e132", size = 368253 }, + { url = "https://files.pythonhosted.org/packages/d5/c5/90eb85986e929e4e004a5c1f4f1f158bf792426d7ace5a2d59ed3557dc8e/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45cfef18bdfde67d445650a388bfafecbd1844a64c19087e9e4267548998c100", size = 384131 }, + { url = "https://files.pythonhosted.org/packages/31/04/a4575abaaf793836bd43f976288ab637edce45a0e523472d44681a3fe98c/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:639410c0258a543bb84b0518616af724716737054ac5c78daa4d956d17841b17", size = 365591 }, + { url = "https://files.pythonhosted.org/packages/b8/fb/1d32c088d5c297c4c9f6d6887cec43a5f4bb677b058291555cd1ede6d870/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a98e5a395445046f37fc4e365556ce06fa344e3b711de0564ac3fd2b351a1b3e", size = 385688 }, + { url = "https://files.pythonhosted.org/packages/9e/84/f2aa8a575d4dfc9d066dda65f571b814ac662cb81fbacaefd5244bb3df7b/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:7935b79a91aa72db42b5015117018554980c320256e63bc930b8bd148a0765a4", size = 524790 }, + { url = "https://files.pythonhosted.org/packages/33/eb/5f2cba82b804cda52625570875aaea108b9a1c7c01b3ea8a33f34b656420/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:cedf5d0669c23ddab8804982f665c7e99b13e8452db78128f231217b8528c31a", size = 628076 }, + { url = "https://files.pythonhosted.org/packages/c8/87/32b480bc5dfabf8e4ba43ced626d5ce40c0132fbb512ea22fbea63cf6447/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:9ea24db07992f756409729adad1e3ec9aa0a9d4fece5da90768a56ac1563f0f4", size = 552147 }, + { url = "https://files.pythonhosted.org/packages/0b/7f/88d3a788c85727076f512fae958d464f49046cdd9a88958cf39b2b47ceb4/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e8b7e42cd4a5177dd83bbcdef77591fd72d3da02616545011ebcdd872f8cc39d", size = 530561 }, ] [[package]] @@ -1489,41 +1356,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/10/52422fdb5a6b4a04938f47a76c655325775b7dd8cc71bd3557aae87b40e1/pytype-2024.10.11-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb98711679e631b01b09b09185504fbf38d60f119280918e244a602cf843b0fe", size = 4695132 }, ] -[[package]] -name = "pywavelets" -version = "1.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/94/0a/c235e7dd60d136b14cd8793c440e8d22e7880df5588162feb02d6d6118a3/pywavelets-1.7.0.tar.gz", hash = "sha256:b47250e5bb853e37db5db423bafc82847f4cde0ffdf7aebb06336a993bc174f6", size = 3934767 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/ef/ab21d4963ff9810e38194a934a45d92145a07b4e491e9e5d91cc5bf87401/pywavelets-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d99156b461f914cafbe6ee3b511612a83e90061addbe1f2660f522e9841fbdc4", size = 4320477 }, - { url = "https://files.pythonhosted.org/packages/19/3f/931e03737d6a216b1b390ef9a47191f8dd977484efdde2bca5b87ca5c3b3/pywavelets-1.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:953b877c43f1fa53204b1b0eedd04efa6739378a873e79fa34ee5296d47a9ca1", size = 4289715 }, - { url = "https://files.pythonhosted.org/packages/1d/47/32324220b427b07bfcdfbd88a37ffdacdba8423b219ca4ebd85043c11b91/pywavelets-1.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fc5e0e592678e43c18dd169b0d8471e9a5ffb5eb7ff4bdc8f447c882f78aa8b", size = 4446534 }, - { url = "https://files.pythonhosted.org/packages/d6/60/056374044b41f6e2ccca8239d1c9e422e3906f54c7cd08d55a19d98e2a28/pywavelets-1.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a469a7e73f5ab1d59b52a525a89a4a280426d1ba08eb081261f8bc6775f101d6", size = 4481597 }, - { url = "https://files.pythonhosted.org/packages/0b/16/137ff09a8295ca9beefdd89f7afc97647963f08a62016696d500781cdf98/pywavelets-1.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3740c84de06fab5081c8f08994f12f9ee94dc2eb4d818eaeace3bdb0b838e2fc", size = 4473799 }, - { url = "https://files.pythonhosted.org/packages/28/49/a16de31134a4161eb017b9b330a5f334bd62edabb70def6b8e17d4247a5e/pywavelets-1.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1a550fdbe134040c04f1bb46cfe13a1a903c5dce13090b681106e4db99feba81", size = 4516569 }, - { url = "https://files.pythonhosted.org/packages/45/54/85649111f4ccadf45edbec3bee4ab0380b38cb2bf0067214b14800e3b873/pywavelets-1.7.0-cp310-cp310-win32.whl", hash = "sha256:d5fc7fbad53379c30b2c9d46c235130a4b96e0597653e32e7680a310da06bd07", size = 4178657 }, - { url = "https://files.pythonhosted.org/packages/ce/d1/91298a86da6680aad9064b0b18475fd224ca47ff6646823a920addcabfff/pywavelets-1.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:0b37212b7524438f694cb619cc4a0a3dc54ad77b63a18d0e8e6364f525fffd91", size = 4250753 }, - { url = "https://files.pythonhosted.org/packages/df/30/4ab2547017bd6af02d916ce87e7fc55d08dbfe466b0440bea79a71b16ae4/pywavelets-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:392553248aed33eac6f38647acacdba94dd6a8f283319c2d9852de7a871d6d0f", size = 4315611 }, - { url = "https://files.pythonhosted.org/packages/1e/77/b2c9976cbc7c378c72a8e7cff08a2ed49e26ef58e1a8fcaa523aadae5419/pywavelets-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae3ae86ba69d75327b1c5cd368138fb9329bc7eb7418d6b0ce9504c5070974ef", size = 4286338 }, - { url = "https://files.pythonhosted.org/packages/7c/bd/e65c7d3a8e7e7b79ee77499fc1637c65c738c458a7f6469433b6050935c4/pywavelets-1.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d81d2486e4f9b65f7c6cab252f3e706c8e8e72bbd0311f72c1a5ec56c947d257", size = 4446349 }, - { url = "https://files.pythonhosted.org/packages/45/e9/3a047a49a6fd0917ba3e436ff93825f8cecc3cb55720d798bc71433a5433/pywavelets-1.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05dc2930cf9b7f61a24b2fe52b18e9d6046012fc46fc360355222781a95a1378", size = 4482899 }, - { url = "https://files.pythonhosted.org/packages/05/e8/63037524d8cc82f0fee1b744f41eaee9a8bd93c80de9b437a179fb258f0a/pywavelets-1.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8565de589f42283bca17ddca298f1188a26ef8ee75cadc4a4744cadf5a79cfdf", size = 4486261 }, - { url = "https://files.pythonhosted.org/packages/9f/70/1e83a42a4084de2f3440a7af79adec69e52e679b13eb0ff8d787af330037/pywavelets-1.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8bdab6b1781f01c087c54782d656a4fc1df77796c241f122445adcbb24892839", size = 4516539 }, - { url = "https://files.pythonhosted.org/packages/e7/14/1c197e0f2f657fd18c6db0281377ac8928abf232ab954a44efce82048670/pywavelets-1.7.0-cp311-cp311-win32.whl", hash = "sha256:c7b47d94aefe6e03085f4d9ce74f6133741164d470ac2839af9906686c6c2ed1", size = 4176201 }, - { url = "https://files.pythonhosted.org/packages/81/49/ba85ea2acf08a113a17da37e6b8cdaa432ad3946fe6cc480fe98f20b5231/pywavelets-1.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e3c8c0fa44f4de7bf05c5d12883b227aaf6dcf46deb3f6f5a9fa5bb79c33283", size = 4251738 }, - { url = "https://files.pythonhosted.org/packages/72/48/b6dbb1124bfa15e2d16dc2c199562d0a9c3d7e7333348b29d05f68cdf146/pywavelets-1.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:badb7dc70ecd8042ddd98fdd41803d5e5b28bf7c90910bb1751906812326ab54", size = 4317328 }, - { url = "https://files.pythonhosted.org/packages/9c/cf/b5b1706d7054d792bdf678c894f4ad8f8cdaa789f82b7eaa48b80aa45ba0/pywavelets-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:74e838e0225783f37ae346e60a9f783b4a31adc5731b9cb6d687ee5c93bd87b7", size = 4287220 }, - { url = "https://files.pythonhosted.org/packages/05/a3/90cad7bfbd765f39bcd96af3efdefcf6fd05a49b7e81fc281f1be7a8e637/pywavelets-1.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ad14d8b5a412a621406276b8ae8ee1e369ba7a7f8e517fb87355bcb8106820f", size = 4420514 }, - { url = "https://files.pythonhosted.org/packages/53/b6/08d5ea524a5ed25e1f94fba428ac605f0f774bea4a8cf14dbdc7947a2bc5/pywavelets-1.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bd2611076f5d2c4ad940421bbb3c450b6a53d8ca24bde02662455dc67c70dac", size = 4453780 }, - { url = "https://files.pythonhosted.org/packages/f3/34/ad1502dc37295249000d3644c5bd183f5c063e9cebb3a37a9422121d77c1/pywavelets-1.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40ebb994b332d48db3b0564e3c335c4f8ba236283939f5167de099766cf16517", size = 4448531 }, - { url = "https://files.pythonhosted.org/packages/f5/52/8e756c9783e7e7c43058cc3e9e9633935206ac77ff13580d489669d84b98/pywavelets-1.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a2a8cc39901f09d82fc94007026f9aed63876e334ae043eb26caa601aee2551", size = 4477268 }, - { url = "https://files.pythonhosted.org/packages/ce/74/15942502ec146c0e06d3f62ebeeeb2cfa873b57413a44238171cc3658387/pywavelets-1.7.0-cp312-cp312-win32.whl", hash = "sha256:0cd599c78fc240cbadb63344d73912fc79e8dccbb0db8a8bd5143df400c3a519", size = 4171601 }, - { url = "https://files.pythonhosted.org/packages/d6/bf/dc8836f983876a43cb15791f0ff15dab6631f423ca6ba55c068d8764ddf8/pywavelets-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:29a912c074977db6adf3782dfbd414945805039b755d0c23979bc823f1b4e9c3", size = 4247115 }, -] - [[package]] name = "pyyaml" version = "6.0.2" @@ -1561,56 +1393,56 @@ wheels = [ [[package]] name = "regex" -version = "2024.9.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/38/148df33b4dbca3bd069b963acab5e0fa1a9dbd6820f8c322d0dd6faeff96/regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd", size = 399403 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/63/12/497bd6599ce8a239ade68678132296aec5ee25ebea45fc8ba91aa60fceec/regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408", size = 482488 }, - { url = "https://files.pythonhosted.org/packages/c1/24/595ddb9bec2a9b151cdaf9565b0c9f3da9f0cb1dca6c158bc5175332ddf8/regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d", size = 287443 }, - { url = "https://files.pythonhosted.org/packages/69/a8/b2fb45d9715b1469383a0da7968f8cacc2f83e9fbbcd6b8713752dd980a6/regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5", size = 284561 }, - { url = "https://files.pythonhosted.org/packages/88/87/1ce4a5357216b19b7055e7d3b0efc75a6e426133bf1e7d094321df514257/regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c", size = 783177 }, - { url = "https://files.pythonhosted.org/packages/3c/65/b9f002ab32f7b68e7d1dcabb67926f3f47325b8dbc22cc50b6a043e1d07c/regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8", size = 823193 }, - { url = "https://files.pythonhosted.org/packages/22/91/8339dd3abce101204d246e31bc26cdd7ec07c9f91598472459a3a902aa41/regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35", size = 809950 }, - { url = "https://files.pythonhosted.org/packages/cb/19/556638aa11c2ec9968a1da998f07f27ec0abb9bf3c647d7c7985ca0b8eea/regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71", size = 782661 }, - { url = "https://files.pythonhosted.org/packages/d1/e9/7a5bc4c6ef8d9cd2bdd83a667888fc35320da96a4cc4da5fa084330f53db/regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8", size = 772348 }, - { url = "https://files.pythonhosted.org/packages/f1/0b/29f2105bfac3ed08e704914c38e93b07c784a6655f8a015297ee7173e95b/regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a", size = 697460 }, - { url = "https://files.pythonhosted.org/packages/71/3a/52ff61054d15a4722605f5872ad03962b319a04c1ebaebe570b8b9b7dde1/regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d", size = 769151 }, - { url = "https://files.pythonhosted.org/packages/97/07/37e460ab5ca84be8e1e197c3b526c5c86993dcc9e13cbc805c35fc2463c1/regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137", size = 777478 }, - { url = "https://files.pythonhosted.org/packages/65/7b/953075723dd5ab00780043ac2f9de667306ff9e2a85332975e9f19279174/regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6", size = 845373 }, - { url = "https://files.pythonhosted.org/packages/40/b8/3e9484c6230b8b6e8f816ab7c9a080e631124991a4ae2c27a81631777db0/regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca", size = 845369 }, - { url = "https://files.pythonhosted.org/packages/b7/99/38434984d912edbd2e1969d116257e869578f67461bd7462b894c45ed874/regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a", size = 773935 }, - { url = "https://files.pythonhosted.org/packages/ab/67/43174d2b46fa947b7b9dfe56b6c8a8a76d44223f35b1d64645a732fd1d6f/regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0", size = 261624 }, - { url = "https://files.pythonhosted.org/packages/c4/2a/4f9c47d9395b6aff24874c761d8d620c0232f97c43ef3cf668c8b355e7a7/regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623", size = 274020 }, - { url = "https://files.pythonhosted.org/packages/86/a1/d526b7b6095a0019aa360948c143aacfeb029919c898701ce7763bbe4c15/regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df", size = 482483 }, - { url = "https://files.pythonhosted.org/packages/32/d9/bfdd153179867c275719e381e1e8e84a97bd186740456a0dcb3e7125c205/regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268", size = 287442 }, - { url = "https://files.pythonhosted.org/packages/33/c4/60f3370735135e3a8d673ddcdb2507a8560d0e759e1398d366e43d000253/regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad", size = 284561 }, - { url = "https://files.pythonhosted.org/packages/b1/51/91a5ebdff17f9ec4973cb0aa9d37635efec1c6868654bbc25d1543aca4ec/regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679", size = 791779 }, - { url = "https://files.pythonhosted.org/packages/07/4a/022c5e6f0891a90cd7eb3d664d6c58ce2aba48bff107b00013f3d6167069/regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4", size = 832605 }, - { url = "https://files.pythonhosted.org/packages/ac/1c/3793990c8c83ca04e018151ddda83b83ecc41d89964f0f17749f027fc44d/regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664", size = 818556 }, - { url = "https://files.pythonhosted.org/packages/e9/5c/8b385afbfacb853730682c57be56225f9fe275c5bf02ac1fc88edbff316d/regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50", size = 792808 }, - { url = "https://files.pythonhosted.org/packages/9b/8b/a4723a838b53c771e9240951adde6af58c829fb6a6a28f554e8131f53839/regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199", size = 781115 }, - { url = "https://files.pythonhosted.org/packages/83/5f/031a04b6017033d65b261259c09043c06f4ef2d4eac841d0649d76d69541/regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4", size = 778155 }, - { url = "https://files.pythonhosted.org/packages/fd/cd/4660756070b03ce4a66663a43f6c6e7ebc2266cc6b4c586c167917185eb4/regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd", size = 784614 }, - { url = "https://files.pythonhosted.org/packages/93/8d/65b9bea7df120a7be8337c415b6d256ba786cbc9107cebba3bf8ff09da99/regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f", size = 853744 }, - { url = "https://files.pythonhosted.org/packages/96/a7/fba1eae75eb53a704475baf11bd44b3e6ccb95b316955027eb7748f24ef8/regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96", size = 855890 }, - { url = "https://files.pythonhosted.org/packages/45/14/d864b2db80a1a3358534392373e8a281d95b28c29c87d8548aed58813910/regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1", size = 781887 }, - { url = "https://files.pythonhosted.org/packages/4d/a9/bfb29b3de3eb11dc9b412603437023b8e6c02fb4e11311863d9bf62c403a/regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9", size = 261644 }, - { url = "https://files.pythonhosted.org/packages/c7/ab/1ad2511cf6a208fde57fafe49829cab8ca018128ab0d0b48973d8218634a/regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf", size = 274033 }, - { url = "https://files.pythonhosted.org/packages/6e/92/407531450762bed778eedbde04407f68cbd75d13cee96c6f8d6903d9c6c1/regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7", size = 483590 }, - { url = "https://files.pythonhosted.org/packages/8e/a2/048acbc5ae1f615adc6cba36cc45734e679b5f1e4e58c3c77f0ed611d4e2/regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231", size = 288175 }, - { url = "https://files.pythonhosted.org/packages/8a/ea/909d8620329ab710dfaf7b4adee41242ab7c9b95ea8d838e9bfe76244259/regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d", size = 284749 }, - { url = "https://files.pythonhosted.org/packages/ca/fa/521eb683b916389b4975337873e66954e0f6d8f91bd5774164a57b503185/regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64", size = 795181 }, - { url = "https://files.pythonhosted.org/packages/28/db/63047feddc3280cc242f9c74f7aeddc6ee662b1835f00046f57d5630c827/regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42", size = 835842 }, - { url = "https://files.pythonhosted.org/packages/e3/94/86adc259ff8ec26edf35fcca7e334566c1805c7493b192cb09679f9c3dee/regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766", size = 823533 }, - { url = "https://files.pythonhosted.org/packages/29/52/84662b6636061277cb857f658518aa7db6672bc6d1a3f503ccd5aefc581e/regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a", size = 797037 }, - { url = "https://files.pythonhosted.org/packages/c3/2a/cd4675dd987e4a7505f0364a958bc41f3b84942de9efaad0ef9a2646681c/regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9", size = 784106 }, - { url = "https://files.pythonhosted.org/packages/6f/75/3ea7ec29de0bbf42f21f812f48781d41e627d57a634f3f23947c9a46e303/regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d", size = 782468 }, - { url = "https://files.pythonhosted.org/packages/d3/67/15519d69b52c252b270e679cb578e22e0c02b8dd4e361f2b04efcc7f2335/regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822", size = 790324 }, - { url = "https://files.pythonhosted.org/packages/9c/71/eff77d3fe7ba08ab0672920059ec30d63fa7e41aa0fb61c562726e9bd721/regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0", size = 860214 }, - { url = "https://files.pythonhosted.org/packages/81/11/e1bdf84a72372e56f1ea4b833dd583b822a23138a616ace7ab57a0e11556/regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a", size = 859420 }, - { url = "https://files.pythonhosted.org/packages/ea/75/9753e9dcebfa7c3645563ef5c8a58f3a47e799c872165f37c55737dadd3e/regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a", size = 787333 }, - { url = "https://files.pythonhosted.org/packages/bc/4e/ba1cbca93141f7416624b3ae63573e785d4bc1834c8be44a8f0747919eca/regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776", size = 262058 }, - { url = "https://files.pythonhosted.org/packages/6e/16/efc5f194778bf43e5888209e5cec4b258005d37c613b67ae137df3b89c53/regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009", size = 273526 }, +version = "2024.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/3c/4651f6b130c6842a8f3df82461a8950f923925db8b6961063e82744bddcc/regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91", size = 482674 }, + { url = "https://files.pythonhosted.org/packages/15/51/9f35d12da8434b489c7b7bffc205c474a0a9432a889457026e9bc06a297a/regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0", size = 287684 }, + { url = "https://files.pythonhosted.org/packages/bd/18/b731f5510d1b8fb63c6b6d3484bfa9a59b84cc578ac8b5172970e05ae07c/regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e", size = 284589 }, + { url = "https://files.pythonhosted.org/packages/78/a2/6dd36e16341ab95e4c6073426561b9bfdeb1a9c9b63ab1b579c2e96cb105/regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde", size = 782511 }, + { url = "https://files.pythonhosted.org/packages/1b/2b/323e72d5d2fd8de0d9baa443e1ed70363ed7e7b2fb526f5950c5cb99c364/regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e", size = 821149 }, + { url = "https://files.pythonhosted.org/packages/90/30/63373b9ea468fbef8a907fd273e5c329b8c9535fee36fc8dba5fecac475d/regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2", size = 809707 }, + { url = "https://files.pythonhosted.org/packages/f2/98/26d3830875b53071f1f0ae6d547f1d98e964dd29ad35cbf94439120bb67a/regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf", size = 781702 }, + { url = "https://files.pythonhosted.org/packages/87/55/eb2a068334274db86208ab9d5599ffa63631b9f0f67ed70ea7c82a69bbc8/regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c", size = 771976 }, + { url = "https://files.pythonhosted.org/packages/74/c0/be707bcfe98254d8f9d2cff55d216e946f4ea48ad2fd8cf1428f8c5332ba/regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86", size = 697397 }, + { url = "https://files.pythonhosted.org/packages/49/dc/bb45572ceb49e0f6509f7596e4ba7031f6819ecb26bc7610979af5a77f45/regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67", size = 768726 }, + { url = "https://files.pythonhosted.org/packages/5a/db/f43fd75dc4c0c2d96d0881967897926942e935d700863666f3c844a72ce6/regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d", size = 775098 }, + { url = "https://files.pythonhosted.org/packages/99/d7/f94154db29ab5a89d69ff893159b19ada89e76b915c1293e98603d39838c/regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2", size = 839325 }, + { url = "https://files.pythonhosted.org/packages/f7/17/3cbfab1f23356fbbf07708220ab438a7efa1e0f34195bf857433f79f1788/regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008", size = 843277 }, + { url = "https://files.pythonhosted.org/packages/7e/f2/48b393b51900456155de3ad001900f94298965e1cad1c772b87f9cfea011/regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62", size = 773197 }, + { url = "https://files.pythonhosted.org/packages/45/3f/ef9589aba93e084cd3f8471fded352826dcae8489b650d0b9b27bc5bba8a/regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e", size = 261714 }, + { url = "https://files.pythonhosted.org/packages/42/7e/5f1b92c8468290c465fd50c5318da64319133231415a8aa6ea5ab995a815/regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519", size = 274042 }, + { url = "https://files.pythonhosted.org/packages/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669 }, + { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684 }, + { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589 }, + { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121 }, + { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275 }, + { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257 }, + { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727 }, + { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667 }, + { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963 }, + { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700 }, + { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592 }, + { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929 }, + { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213 }, + { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734 }, + { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052 }, + { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781 }, + { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455 }, + { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759 }, + { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976 }, + { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077 }, + { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160 }, + { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896 }, + { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997 }, + { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725 }, + { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481 }, + { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896 }, + { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138 }, + { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692 }, + { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135 }, + { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567 }, ] [[package]] @@ -1763,11 +1595,11 @@ wheels = [ [[package]] name = "setuptools" -version = "75.3.0" +version = "75.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ed/22/a438e0caa4576f8c383fa4d35f1cc01655a46c75be358960d815bfbb12bd/setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686", size = 1351577 } +sdist = { url = "https://files.pythonhosted.org/packages/43/54/292f26c208734e9a7f067aea4a7e282c080750c4546559b58e2e45413ca0/setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6", size = 1337429 } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/12/282ee9bce8b58130cb762fbc9beabd531549952cac11fc56add11dcb7ea0/setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd", size = 1251070 }, + { url = "https://files.pythonhosted.org/packages/55/21/47d163f615df1d30c094f6c8bbb353619274edccf0327b185cc2493c2c33/setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d", size = 1224032 }, ] [[package]] @@ -1788,27 +1620,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a7/a5/10f97f73544edcdef54409f1d839f6049a0d79df68adbc1ceb24d1aaca42/smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da", size = 24282 }, ] -[[package]] -name = "sniffio" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, -] - -[[package]] -name = "starlette" -version = "0.37.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/61/b5/6bceb93ff20bd7ca36e6f7c540581abb18f53130fabb30ba526e26fd819b/starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823", size = 2843736 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/18/31fa32ed6c68ba66220204ef0be798c349d0a20c1901f9d4a794e08c76d8/starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee", size = 71908 }, -] - [[package]] name = "substrate-interface" version = "1.7.10" @@ -1879,56 +1690,27 @@ wheels = [ [[package]] name = "tokenizers" -version = "0.20.3" +version = "0.20.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/da/25/b1681c1c30ea3ea6e584ae3fffd552430b12faa599b558c4c4783f56d7ff/tokenizers-0.20.3.tar.gz", hash = "sha256:2278b34c5d0dd78e087e1ca7f9b1dcbf129d80211afa645f214bd6e051037539", size = 340513 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/51/421bb0052fc4333f7c1e3231d8c6607552933d919b628c8fabd06f60ba1e/tokenizers-0.20.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:31ccab28dbb1a9fe539787210b0026e22debeab1662970f61c2d921f7557f7e4", size = 2674308 }, - { url = "https://files.pythonhosted.org/packages/a6/e9/f651f8d27614fd59af387f4dfa568b55207e5fac8d06eec106dc00b921c4/tokenizers-0.20.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c6361191f762bda98c773da418cf511cbaa0cb8d0a1196f16f8c0119bde68ff8", size = 2559363 }, - { url = "https://files.pythonhosted.org/packages/e3/e8/0e9f81a09ab79f409eabfd99391ca519e315496694671bebca24c3e90448/tokenizers-0.20.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f128d5da1202b78fa0a10d8d938610472487da01b57098d48f7e944384362514", size = 2892896 }, - { url = "https://files.pythonhosted.org/packages/b0/72/15fdbc149e05005e99431ecd471807db2241983deafe1e704020f608f40e/tokenizers-0.20.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:79c4121a2e9433ad7ef0769b9ca1f7dd7fa4c0cd501763d0a030afcbc6384481", size = 2802785 }, - { url = "https://files.pythonhosted.org/packages/26/44/1f8aea48f9bb117d966b7272484671b33a509f6217a8e8544d79442c90db/tokenizers-0.20.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7850fde24197fe5cd6556e2fdba53a6d3bae67c531ea33a3d7c420b90904141", size = 3086060 }, - { url = "https://files.pythonhosted.org/packages/2e/83/82ba40da99870b3a0b801cffaf4f099f088a84c7e07d32cc6ca751ce08e6/tokenizers-0.20.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b357970c095dc134978a68c67d845a1e3803ab7c4fbb39195bde914e7e13cf8b", size = 3096760 }, - { url = "https://files.pythonhosted.org/packages/f3/46/7a025404201d937f86548928616c0a164308aa3998e546efdf798bf5ee9c/tokenizers-0.20.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a333d878c4970b72d6c07848b90c05f6b045cf9273fc2bc04a27211721ad6118", size = 3380165 }, - { url = "https://files.pythonhosted.org/packages/aa/49/15fae66ac62e49255eeedbb7f4127564b2c3f3aef2009913f525732d1a08/tokenizers-0.20.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fd9fee817f655a8f50049f685e224828abfadd436b8ff67979fc1d054b435f1", size = 2994038 }, - { url = "https://files.pythonhosted.org/packages/f4/64/693afc9ba2393c2eed85c02bacb44762f06a29f0d1a5591fa5b40b39c0a2/tokenizers-0.20.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e7816808b402129393a435ea2a509679b41246175d6e5e9f25b8692bfaa272b", size = 8977285 }, - { url = "https://files.pythonhosted.org/packages/be/7e/6126c18694310fe07970717929e889898767c41fbdd95b9078e8aec0f9ef/tokenizers-0.20.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba96367db9d8a730d3a1d5996b4b7babb846c3994b8ef14008cd8660f55db59d", size = 9294890 }, - { url = "https://files.pythonhosted.org/packages/71/7d/5e3307a1091c8608a1e58043dff49521bc19553c6e9548c7fac6840cc2c4/tokenizers-0.20.3-cp310-none-win32.whl", hash = "sha256:ee31ba9d7df6a98619426283e80c6359f167e2e9882d9ce1b0254937dbd32f3f", size = 2196883 }, - { url = "https://files.pythonhosted.org/packages/47/62/aaf5b2a526b3b10c20985d9568ff8c8f27159345eaef3347831e78cd5894/tokenizers-0.20.3-cp310-none-win_amd64.whl", hash = "sha256:a845c08fdad554fe0871d1255df85772f91236e5fd6b9287ef8b64f5807dbd0c", size = 2381637 }, - { url = "https://files.pythonhosted.org/packages/c6/93/6742ef9206409d5ce1fdf44d5ca1687cdc3847ba0485424e2c731e6bcf67/tokenizers-0.20.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:585b51e06ca1f4839ce7759941e66766d7b060dccfdc57c4ca1e5b9a33013a90", size = 2674224 }, - { url = "https://files.pythonhosted.org/packages/aa/14/e75ece72e99f6ef9ae07777ca9fdd78608f69466a5cecf636e9bd2f25d5c/tokenizers-0.20.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:61cbf11954f3b481d08723ebd048ba4b11e582986f9be74d2c3bdd9293a4538d", size = 2558991 }, - { url = "https://files.pythonhosted.org/packages/46/54/033b5b2ba0c3ae01e026c6f7ced147d41a2fa1c573d00a66cb97f6d7f9b3/tokenizers-0.20.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef820880d5e4e8484e2fa54ff8d297bb32519eaa7815694dc835ace9130a3eea", size = 2892476 }, - { url = "https://files.pythonhosted.org/packages/e6/b0/cc369fb3297d61f3311cab523d16d48c869dc2f0ba32985dbf03ff811041/tokenizers-0.20.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:67ef4dcb8841a4988cd00dd288fb95dfc8e22ed021f01f37348fd51c2b055ba9", size = 2802775 }, - { url = "https://files.pythonhosted.org/packages/1a/74/62ad983e8ea6a63e04ed9c5be0b605056bf8aac2f0125f9b5e0b3e2b89fa/tokenizers-0.20.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff1ef8bd47a02b0dc191688ccb4da53600df5d4c9a05a4b68e1e3de4823e78eb", size = 3086138 }, - { url = "https://files.pythonhosted.org/packages/6b/ac/4637ba619db25094998523f9e6f5b456e1db1f8faa770a3d925d436db0c3/tokenizers-0.20.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:444d188186eab3148baf0615b522461b41b1f0cd58cd57b862ec94b6ac9780f1", size = 3098076 }, - { url = "https://files.pythonhosted.org/packages/58/ce/9793f2dc2ce529369807c9c74e42722b05034af411d60f5730b720388c7d/tokenizers-0.20.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37c04c032c1442740b2c2d925f1857885c07619224a533123ac7ea71ca5713da", size = 3379650 }, - { url = "https://files.pythonhosted.org/packages/50/f6/2841de926bc4118af996eaf0bdf0ea5b012245044766ffc0347e6c968e63/tokenizers-0.20.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:453c7769d22231960ee0e883d1005c93c68015025a5e4ae56275406d94a3c907", size = 2994005 }, - { url = "https://files.pythonhosted.org/packages/a3/b2/00915c4fed08e9505d37cf6eaab45b12b4bff8f6719d459abcb9ead86a4b/tokenizers-0.20.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4bb31f7b2847e439766aaa9cc7bccf7ac7088052deccdb2275c952d96f691c6a", size = 8977488 }, - { url = "https://files.pythonhosted.org/packages/e9/ac/1c069e7808181ff57bcf2d39e9b6fbee9133a55410e6ebdaa89f67c32e83/tokenizers-0.20.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:843729bf0f991b29655a069a2ff58a4c24375a553c70955e15e37a90dd4e045c", size = 9294935 }, - { url = "https://files.pythonhosted.org/packages/50/47/722feb70ee68d1c4412b12d0ea4acc2713179fd63f054913990f9e259492/tokenizers-0.20.3-cp311-none-win32.whl", hash = "sha256:efcce3a927b1e20ca694ba13f7a68c59b0bd859ef71e441db68ee42cf20c2442", size = 2197175 }, - { url = "https://files.pythonhosted.org/packages/75/68/1b4f928b15a36ed278332ac75d66d7eb65d865bf344d049c452c18447bf9/tokenizers-0.20.3-cp311-none-win_amd64.whl", hash = "sha256:88301aa0801f225725b6df5dea3d77c80365ff2362ca7e252583f2b4809c4cc0", size = 2381616 }, - { url = "https://files.pythonhosted.org/packages/07/00/92a08af2a6b0c88c50f1ab47d7189e695722ad9714b0ee78ea5e1e2e1def/tokenizers-0.20.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:49d12a32e190fad0e79e5bdb788d05da2f20d8e006b13a70859ac47fecf6ab2f", size = 2667951 }, - { url = "https://files.pythonhosted.org/packages/ec/9a/e17a352f0bffbf415cf7d73756f5c73a3219225fc5957bc2f39d52c61684/tokenizers-0.20.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:282848cacfb9c06d5e51489f38ec5aa0b3cd1e247a023061945f71f41d949d73", size = 2555167 }, - { url = "https://files.pythonhosted.org/packages/27/37/d108df55daf4f0fcf1f58554692ff71687c273d870a34693066f0847be96/tokenizers-0.20.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abe4e08c7d0cd6154c795deb5bf81d2122f36daf075e0c12a8b050d824ef0a64", size = 2898389 }, - { url = "https://files.pythonhosted.org/packages/b2/27/32f29da16d28f59472fa7fb38e7782069748c7e9ab9854522db20341624c/tokenizers-0.20.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ca94fc1b73b3883c98f0c88c77700b13d55b49f1071dfd57df2b06f3ff7afd64", size = 2795866 }, - { url = "https://files.pythonhosted.org/packages/29/4e/8a9a3c89e128c4a40f247b501c10279d2d7ade685953407c4d94c8c0f7a7/tokenizers-0.20.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef279c7e239f95c8bdd6ff319d9870f30f0d24915b04895f55b1adcf96d6c60d", size = 3085446 }, - { url = "https://files.pythonhosted.org/packages/b4/3b/a2a7962c496ebcd95860ca99e423254f760f382cd4bd376f8895783afaf5/tokenizers-0.20.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16384073973f6ccbde9852157a4fdfe632bb65208139c9d0c0bd0176a71fd67f", size = 3094378 }, - { url = "https://files.pythonhosted.org/packages/1f/f4/a8a33f0192a1629a3bd0afcad17d4d221bbf9276da4b95d226364208d5eb/tokenizers-0.20.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:312d522caeb8a1a42ebdec87118d99b22667782b67898a76c963c058a7e41d4f", size = 3385755 }, - { url = "https://files.pythonhosted.org/packages/9e/65/c83cb3545a65a9eaa2e13b22c93d5e00bd7624b354a44adbdc93d5d9bd91/tokenizers-0.20.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2b7cb962564785a83dafbba0144ecb7f579f1d57d8c406cdaa7f32fe32f18ad", size = 2997679 }, - { url = "https://files.pythonhosted.org/packages/55/e9/a80d4e592307688a67c7c59ab77e03687b6a8bd92eb5db763a2c80f93f57/tokenizers-0.20.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:124c5882ebb88dadae1fc788a582299fcd3a8bd84fc3e260b9918cf28b8751f5", size = 8989296 }, - { url = "https://files.pythonhosted.org/packages/90/af/60c957af8d2244321124e893828f1a4817cde1a2d08d09d423b73f19bd2f/tokenizers-0.20.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2b6e54e71f84c4202111a489879005cb14b92616a87417f6c102c833af961ea2", size = 9303621 }, - { url = "https://files.pythonhosted.org/packages/be/a9/96172310ee141009646d63a1ca267c099c462d747fe5ef7e33f74e27a683/tokenizers-0.20.3-cp312-none-win32.whl", hash = "sha256:83d9bfbe9af86f2d9df4833c22e94d94750f1d0cd9bfb22a7bb90a86f61cdb1c", size = 2188979 }, - { url = "https://files.pythonhosted.org/packages/bd/68/61d85ae7ae96dde7d0974ff3538db75d5cdc29be2e4329cd7fc51a283e22/tokenizers-0.20.3-cp312-none-win_amd64.whl", hash = "sha256:44def74cee574d609a36e17c8914311d1b5dbcfe37c55fd29369d42591b91cf2", size = 2380725 }, - { url = "https://files.pythonhosted.org/packages/29/cd/ff1586dd572aaf1637d59968df3f6f6532fa255f4638fbc29f6d27e0b690/tokenizers-0.20.3-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e919f2e3e68bb51dc31de4fcbbeff3bdf9c1cad489044c75e2b982a91059bd3c", size = 2672044 }, - { url = "https://files.pythonhosted.org/packages/b5/9e/7a2c00abbc8edb021ee0b1f12aab76a7b7824b49f94bcd9f075d0818d4b0/tokenizers-0.20.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b8e9608f2773996cc272156e305bd79066163a66b0390fe21750aff62df1ac07", size = 2558841 }, - { url = "https://files.pythonhosted.org/packages/8e/c1/6af62ef61316f33ecf785bbb2bee4292f34ea62b491d4480ad9b09acf6b6/tokenizers-0.20.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39270a7050deaf50f7caff4c532c01b3c48f6608d42b3eacdebdc6795478c8df", size = 2897936 }, - { url = "https://files.pythonhosted.org/packages/9a/0b/c076b2ff3ee6dc70c805181fbe325668b89cfee856f8dfa24cc9aa293c84/tokenizers-0.20.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e005466632b1c5d2d2120f6de8aa768cc9d36cd1ab7d51d0c27a114c91a1e6ee", size = 3082688 }, - { url = "https://files.pythonhosted.org/packages/0a/60/56510124933136c2e90879e1c81603cfa753ae5a87830e3ef95056b20d8f/tokenizers-0.20.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a07962340b36189b6c8feda552ea1bfeee6cf067ff922a1d7760662c2ee229e5", size = 2998924 }, - { url = "https://files.pythonhosted.org/packages/68/60/4107b618b7b9155cb34ad2e0fc90946b7e71f041b642122fb6314f660688/tokenizers-0.20.3-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:55046ad3dd5f2b3c67501fcc8c9cbe3e901d8355f08a3b745e9b57894855f85b", size = 8989514 }, - { url = "https://files.pythonhosted.org/packages/e8/bd/48475818e614b73316baf37ac1e4e51b578bbdf58651812d7e55f43b88d8/tokenizers-0.20.3-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:efcf0eb939988b627558aaf2b9dc3e56d759cad2e0cfa04fcab378e4b48fc4fd", size = 9303476 }, +sdist = { url = "https://files.pythonhosted.org/packages/1a/98/0df883ea6201e35e286a97f5fb2a601bfb5b52e4165f7688a76e4553eeec/tokenizers-0.20.4.tar.gz", hash = "sha256:db50ac15e92981227f499268541306824f49e97dbeec05d118ebdc7c2d22322c", size = 343020 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/a1/c8285e835dd185307f40bc4a308224dc357ee4d25f3fd83ef013101a5060/tokenizers-0.20.4-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:25f59ebc5b79e7bbafe86bfec62696468016627157d8a9ceba5092486796a156", size = 2649933 }, + { url = "https://files.pythonhosted.org/packages/bb/26/a4b8dfe37c92205a4ba267d35ed7a6ca0ae1cbb2a1ed8acf84813cf48704/tokenizers-0.20.4-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:f41df992797ad0ff9472e8a2c7a3ef7178667935d984639b73da7d19b33ea4e2", size = 2568327 }, + { url = "https://files.pythonhosted.org/packages/66/aa/70de5a7c96621c1962e8399245efac6d6ab3bbe873457b9beb26c406c4f0/tokenizers-0.20.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7786004e180fab72e6e873e982ccd18b3cfa31521d397b6c024cc19175abf91b", size = 2907735 }, + { url = "https://files.pythonhosted.org/packages/b7/d1/e70b4497da0e97111ef75eba32526a98bf04268ce2a7388d9759ec89acdb/tokenizers-0.20.4-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:075635cd7e6936cc4b3a13901c1a05690d5b533ce3d0f035dee21117dd4f04ae", size = 2807025 }, + { url = "https://files.pythonhosted.org/packages/d0/29/8dff1d57d1d1bcae5f0d701759ca3f503ca31ecd443f75571d6ef3083043/tokenizers-0.20.4-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa392bae7f0a36e4c97ad43100390ad84f2a1bfff6742604774210f7d7a4fa13", size = 3095142 }, + { url = "https://files.pythonhosted.org/packages/65/49/e4647d5e496e64f2f639aeba9df134f59b648822a90d63ceb7b4b309ba4a/tokenizers-0.20.4-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eee647ccba9cbd36b5ec4e8e73d25dbd586ec06de7a43ff83a3dad9fec466a29", size = 3117482 }, + { url = "https://files.pythonhosted.org/packages/f6/c9/34c6a304529a0b3375533e0ccc4ffd4bcfa401cb57cdab5997efaf9836fc/tokenizers-0.20.4-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:735ffc9bba65d20f8ab5f82dfbab262bb066afc7dee3684c5e5435e7a5da445d", size = 3405409 }, + { url = "https://files.pythonhosted.org/packages/b9/1c/cc1ca0c4e4c5763b2d872935de7149633765d158f0d1a46b48d73f3a9c58/tokenizers-0.20.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05c2bab579c1f31292b48bb79b6334b5346c1ec87dac81089e6098b8a20b2fd4", size = 3008371 }, + { url = "https://files.pythonhosted.org/packages/ef/bf/135de1cf1c10f53a10c8db5f067e7cf71adebd79ed2b5cf5729eded209af/tokenizers-0.20.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3e960ad5c467a95e5665e518151ed9024e7aa111d2c54ff1938162cc7c2b8959", size = 8976494 }, + { url = "https://files.pythonhosted.org/packages/24/56/61b8c0cd217a5be05c4206263afdfa937848796696fee7cc14fab6c94a49/tokenizers-0.20.4-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:e59a405459ed31b73426b364752c2e7c73f4a94210a63fd7acd161a774af7bd2", size = 8916105 }, + { url = "https://files.pythonhosted.org/packages/94/08/2d541e0e437e87e5cae903c55fc832fd032812c85e095bb7833d5fe65dfd/tokenizers-0.20.4-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:84bf8b4a7bbf1c6bb78775ae309a5c69d08dadf7b88125d6d19ccb4738a87350", size = 9162400 }, + { url = "https://files.pythonhosted.org/packages/9e/62/41dc66bda0b1d45f36f324d01a3c4389caac0526d4b4ccc2d2006c7722b1/tokenizers-0.20.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a6d392a20ca70692aaba8a636677b57f6c67655879773ba2b6be8cb4a19ce6b8", size = 9357955 }, + { url = "https://files.pythonhosted.org/packages/a1/1c/0c9ebd40b4e6bb51b178cff6b148e985a728fc899d12f4a6ebe49044d4e2/tokenizers-0.20.4-cp39-abi3-win32.whl", hash = "sha256:60ea37c885a9bb8efa53b7542ea83561cd00eb3ffb47a77f5ae622d9f7f66ffe", size = 2202648 }, + { url = "https://files.pythonhosted.org/packages/e0/e3/c7e4adf727ddcdefc1831945bf95fe07dd6b4b879613a62b5719be539ce4/tokenizers-0.20.4-cp39-abi3-win_amd64.whl", hash = "sha256:6cba92b87969ddf5a7e2f2293577c30129d8c22c6f68e8c626d3e76b8d52412c", size = 2393731 }, ] [[package]] @@ -1990,45 +1772,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/57/6c/bf52ff061da33deb9f94f4121fde7ff3058812cb7d2036c97bc167793bd1/torch-2.5.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:8c712df61101964eb11910a846514011f0b6f5920c55dbf567bff8a34163d5b1", size = 63858109 }, ] -[[package]] -name = "torchvision" -version = "0.20.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, - { name = "pillow" }, - { name = "torch" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/59/aea68d755da1451e1a0d894528a7edc9b58eb30d33e274bf21bef28dad1a/torchvision-0.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4878fefb96ef293d06c27210918adc83c399d9faaf34cda5a63e129f772328f1", size = 1787552 }, - { url = "https://files.pythonhosted.org/packages/a2/f6/7ff89a9f8703f623f5664afd66c8600e3f09fe188e1e0b7e6f9a8617f865/torchvision-0.20.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:8ffbdf8bf5b30eade22d459f5a313329eeadb20dc75efa142987b53c007098c3", size = 7238975 }, - { url = "https://files.pythonhosted.org/packages/f7/ce/4c31e9b96cc4f9fec746b258d2aa35f8d1247f4f58d63f9c505ea5eb254d/torchvision-0.20.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:75f8a4d51a593c4bab6c9bf7d75bdd88691b00a53b07656678bc55a3a753dd73", size = 14265343 }, - { url = "https://files.pythonhosted.org/packages/17/11/b5ce67715bbbec8798fb48c4a20ac28828aec1710ac01091a3eddcb8e075/torchvision-0.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:22c2fa44e20eb404b85e42b22b453863a14b0927d25e550fd4f84eea97fa5b39", size = 1562413 }, - { url = "https://files.pythonhosted.org/packages/28/57/4d7ad90be612f5ac6c4bdafcb0ff13e818e14a340a88c8ca00d9ed8c2dad/torchvision-0.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:344b339e15e6bbb59ee0700772616d0afefd209920c762b1604368d8c3458322", size = 1787548 }, - { url = "https://files.pythonhosted.org/packages/de/e9/e190ecec448d5a2abad8348cf085fcb39962a491e3f40dcb023721e04feb/torchvision-0.20.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:86f6523dee420000fe14c3527f6c8e0175139fda7d995b187f54a0b0ebec7eb6", size = 7241222 }, - { url = "https://files.pythonhosted.org/packages/b1/a3/cbb8177e5e379f0c040b00c6f80f14d323a97e30495d7115d169b101b2f7/torchvision-0.20.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:a40d766345927639da322c693934e5f91b1ba2218846c7104b868dea2314ce8e", size = 14267510 }, - { url = "https://files.pythonhosted.org/packages/69/55/ce836703ff77bb21582c3098d5311f8ddde7eadc7eab04be9561961f4725/torchvision-0.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:5b501d5c04b034d2ecda96a31ed050e383cf8201352e4c9276ca249cbecfded0", size = 1562402 }, - { url = "https://files.pythonhosted.org/packages/c5/eb/4ba19616378f2bc085999432fded2b7dfdbdccc6dd0fc293203452508100/torchvision-0.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1a31256ff945d64f006bb306813a7c95a531fe16bfb2535c837dd4c104533d7a", size = 1787553 }, - { url = "https://files.pythonhosted.org/packages/d4/75/00a852275ade58d3dc474530f7a7b6bc999a817148f0eb59d4fde12eb955/torchvision-0.20.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:17cd78adddf81dac57d7dccc9277a4d686425b1c55715f308769770cb26cad5c", size = 7240323 }, - { url = "https://files.pythonhosted.org/packages/af/f0/ca1445406eb12cbeb7a41fc833a1941ede78e7c55621198b83ecd7bcfd0f/torchvision-0.20.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:9f853ba4497ac4691815ad41b523ee23cf5ba4f87b1ce869d704052e233ca8b7", size = 14266936 }, - { url = "https://files.pythonhosted.org/packages/c3/18/00993d420b1d6e88582e51d4bc82c824c99a2e9c045d50eaf9b34fff729a/torchvision-0.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:4a330422c36dbfc946d3a6c1caec3489db07ecdf3675d83369adb2e5a0ca17c4", size = 1562392 }, -] - [[package]] name = "tqdm" -version = "4.66.6" +version = "4.67.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "platform_system == 'Windows'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/34/bef135b27fe1864993a5284ad001157ee9b5538e859ac90f5b0e8cc8c9ec/tqdm-4.66.6.tar.gz", hash = "sha256:4bdd694238bef1485ce839d67967ab50af8f9272aab687c0d7702a01da0be090", size = 169533 } +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/73/02342de9c2d20922115f787e101527b831c0cffd2105c946c4a4826bcfd4/tqdm-4.66.6-py3-none-any.whl", hash = "sha256:223e8b5359c2efc4b30555531f09e9f2f3589bcd7fdd389271191031b49b7a63", size = 78326 }, + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, ] [[package]] name = "transformers" -version = "4.46.2" +version = "4.46.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, @@ -2042,9 +1800,9 @@ dependencies = [ { name = "tokenizers" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/05/6f/8f964f61983e3989c8ff23b5c21464807c6bc6236f36cdd41108222556d9/transformers-4.46.2.tar.gz", hash = "sha256:3d85410881e1c074be767877bf33c83231ec11529f274a6044ecb20c157ba14e", size = 8611717 } +sdist = { url = "https://files.pythonhosted.org/packages/37/5a/58f96c83e566f907ae39f16d4401bbefd8bb85c60bd1e6a95c419752ab90/transformers-4.46.3.tar.gz", hash = "sha256:8ee4b3ae943fe33e82afff8e837f4b052058b07ca9be3cb5b729ed31295f72cc", size = 8627944 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/ad/c9b96572ab7994e73c64588f8875741823f2daba70e746547fff9a2d9a54/transformers-4.46.2-py3-none-any.whl", hash = "sha256:c921f4406b78e6518c97b618c5acd1cf8a4f2315b6b727f4bf9e01496eef849c", size = 10034514 }, + { url = "https://files.pythonhosted.org/packages/51/51/b87caa939fedf307496e4dbf412f4b909af3d9ca8b189fc3b65c1faa456f/transformers-4.46.3-py3-none-any.whl", hash = "sha256:a12ef6f52841fd190a3e5602145b542d03507222f2c64ebb7ee92e8788093aef", size = 10034536 }, ] [[package]] @@ -2078,20 +1836,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 }, ] -[[package]] -name = "uvicorn" -version = "0.30.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "h11" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c3/ad/02b1b412e43605aa6aac8d0392c383ff3f6ae8267b7864e48e3b5f3f601e/uvicorn-0.30.5.tar.gz", hash = "sha256:ac6fdbd4425c5fd17a9fe39daf4d4d075da6fdc80f653e5894cdc2fd98752bee", size = 42835 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/67/d8/1bcb5e6508d14c6c9912cd964b286f04392298ffb3e4218f4a1292d64e76/uvicorn-0.30.5-py3-none-any.whl", hash = "sha256:b2d86de274726e9878188fa07576c9ceeff90a839e2b6e25c917fe05f5a6c835", size = 62805 }, -] - [[package]] name = "websocket-client" version = "1.8.0" @@ -2197,9 +1941,9 @@ wheels = [ [[package]] name = "zipp" -version = "3.20.2" +version = "3.21.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", size = 24199 } +sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545 } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", size = 9200 }, + { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630 }, ] diff --git a/neuron/neuron/__init__.py b/neuron/neuron/__init__.py deleted file mode 100644 index a043c549..00000000 --- a/neuron/neuron/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -from .checkpoint import * -from .submissions import * -from .config import * -from .contest import * -from .random_inputs import * diff --git a/neuron/neuron/checkpoint.py b/neuron/neuron/checkpoint.py deleted file mode 100644 index b78ec6ad..00000000 --- a/neuron/neuron/checkpoint.py +++ /dev/null @@ -1,59 +0,0 @@ -from dataclasses import dataclass -from typing import TypeAlias, Annotated - -from pydantic import BaseModel, Field - -from .contest import ContestId, ModelRepositoryInfo -from .network_commitments import Encoder, Decoder - -Uid: TypeAlias = int -Key: TypeAlias = str - -BENCHMARKS_VERSION = 15 -SPEC_VERSION = 7 -REVISION_LENGTH = 7 - - -@dataclass -class GenerationOutput: - output: bytes - generation_time: float - vram_used: float - watts_used: float - - -class CheckpointSubmission(BaseModel): - provider: str - repository: str - revision: Annotated[str, Field(min_length=REVISION_LENGTH, max_length=REVISION_LENGTH)] - contest: ContestId - - def encode(self, encoder: Encoder): - encoder.write_str(self.provider) - encoder.write_str(self.repository) - encoder.write_sized_str(self.revision) - encoder.write_uint16(self.contest.value) - - @classmethod - def decode(cls, decoder: Decoder): - provider = decoder.read_str() - repository = decoder.read_str() - revision = decoder.read_sized_str(REVISION_LENGTH) - contest_id = ContestId(decoder.read_uint16()) - - return cls( - provider=provider, - repository=repository, - revision=revision, - contest=contest_id, - ) - - def get_repo_link(self): - return f"https://{self.provider}/{self.repository}" - - -@dataclass -class MinerModelInfo: - repository: ModelRepositoryInfo - contest_id: ContestId - block: int diff --git a/neuron/neuron/submission_tester/__init__.py b/neuron/neuron/submission_tester/__init__.py deleted file mode 100644 index 7518e063..00000000 --- a/neuron/neuron/submission_tester/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .setup_inference_sandbox import * -from .inference_sandbox import * -from .testing import * -from .vram_monitor import * diff --git a/neuron/neuron/submission_tester/clear_cache.sh b/neuron/neuron/submission_tester/clear_cache.sh deleted file mode 100755 index 8674737b..00000000 --- a/neuron/neuron/submission_tester/clear_cache.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -set -e - -cd ~/.cache - -find huggingface -type f -delete || true -find pip -type f -delete || true -find pypoetry -type f -delete || true -find uv -type f -delete || true -find lfs-cache -type f -delete || true diff --git a/neuron/neuron/submission_tester/dependency_blacklist.txt b/neuron/neuron/submission_tester/dependency_blacklist.txt deleted file mode 100644 index cbfcaa48..00000000 --- a/neuron/neuron/submission_tester/dependency_blacklist.txt +++ /dev/null @@ -1 +0,0 @@ -pyarmor \ No newline at end of file diff --git a/neuron/neuron/submission_tester/inference_sandbox.py b/neuron/neuron/submission_tester/inference_sandbox.py deleted file mode 100644 index 76dffb56..00000000 --- a/neuron/neuron/submission_tester/inference_sandbox.py +++ /dev/null @@ -1,144 +0,0 @@ -import os -from io import TextIOWrapper -from multiprocessing.connection import Client, Connection -from os.path import abspath -from pathlib import Path -from subprocess import Popen, TimeoutExpired, PIPE -from threading import Thread -from time import perf_counter, sleep -from typing import Generic, TypeVar - -from fiber.logging_utils import get_logger -from opentelemetry import trace -from pydantic import BaseModel - -from .setup_inference_sandbox import setup_sandbox, InvalidSubmissionError, NETWORK_JAIL -from ..contest import ModelRepositoryInfo - -logger = get_logger(__name__) -tracer = trace.get_tracer(__name__) - -RequestT = TypeVar("RequestT", bound=BaseModel) - -SANDBOX = "sandbox" -START_INFERENCE_SCRIPT = abspath(Path(__file__).parent / "start_inference.sh") - - -class InferenceSandbox(Generic[RequestT]): - _repository: ModelRepositoryInfo - - _client: Connection - _process: Popen - load_time: float - - @tracer.start_as_current_span("init_inference_sandbox") - def __init__( - self, - repository_info: ModelRepositoryInfo, - baseline: bool, - sandbox_directory: Path, - switch_user: bool, - load_timeout: int, - ): - self._repository = repository_info - self._baseline = baseline - self._sandbox_directory = sandbox_directory - self._switch_user = switch_user - - try: - with tracer.start_span("setup_sandbox"): - self._file_size = setup_sandbox( - sandbox_args=self.sandbox_args(SANDBOX), - sandbox_directory=self._sandbox_directory, - baseline=baseline, - url=repository_info.url, - revision=repository_info.revision, - ) - except InvalidSubmissionError as e: - self.fail(str(e)) - - with tracer.start_span("start_inference_process") as inference_span: - self._process = Popen( - [ - *self.sandbox_args(SANDBOX), - START_INFERENCE_SCRIPT, - NETWORK_JAIL - ], - cwd=self._sandbox_directory, - stdout=PIPE, - stderr=PIPE, - text=True, - ) - - Thread(target=self._stream_logs, args=(self._process.stdout,), daemon=True).start() - Thread(target=self._stream_logs, args=(self._process.stderr,), daemon=True).start() - - logger.info("Inference process starting") - - socket_path = abspath(self._sandbox_directory / "inferences.sock") - start = perf_counter() - for _ in range(load_timeout): - if os.path.exists(socket_path): break - sleep(1) - self._check_exit() - else: - self.fail(f"Timed out after {load_timeout} seconds") - - logger.info("Connecting to socket") - try: - self._client = Client(socket_path) - except ConnectionRefusedError: - self.fail("Failed to connect to socket") - self.load_time = perf_counter() - start - inference_span.set_attribute("load_time_seconds", self.load_time) - - def _check_exit(self): - if self._process.poll(): - self.fail(f"Inference crashed with exit code {self._process.returncode}") - - def __enter__(self): - self._process.__enter__() - self._client.__enter__() - - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - self._client.__exit__(exc_type, exc_val, exc_tb) - - self._process.terminate() - - try: - self._process.wait(timeout=30) - except TimeoutExpired: - self._process.kill() - logger.warning(f"Forcefully killed inference process") - - self._process.__exit__(exc_type, exc_val, exc_tb) - - def __call__(self, request: RequestT): - self._check_exit() - - data = request.model_dump_json().encode("utf-8") - - self._client.send_bytes(data) - - return self._client.recv_bytes() - - @property - def model_size(self): - return self._file_size - - def fail(self, reason: str): - raise InvalidSubmissionError(reason) if not self._baseline else RuntimeError(reason) - - def sandbox_args(self, user: str) -> list[str]: - return [ - "/bin/sudo", - "-u", - user, - ] if self._switch_user else [] - - @staticmethod - def _stream_logs(stream: TextIOWrapper): - for line in iter(stream.readline, ""): - logger.info(line.rstrip()) diff --git a/neuron/neuron/submission_tester/setup_inference_sandbox.py b/neuron/neuron/submission_tester/setup_inference_sandbox.py deleted file mode 100644 index 6e39274f..00000000 --- a/neuron/neuron/submission_tester/setup_inference_sandbox.py +++ /dev/null @@ -1,155 +0,0 @@ -import shutil -from os.path import abspath -from pathlib import Path -from subprocess import run, CalledProcessError - -import toml -from fiber.logging_utils import get_logger -from huggingface_hub import HfApi -from opentelemetry import trace - -from ..checkpoint import SPEC_VERSION - -DEPENDENCY_BLACKLIST = abspath(Path(__file__).parent / "dependency_blacklist.txt") - -CLEAR_CACHE_SCRIPT = abspath(Path(__file__).parent / "clear_cache.sh") -CLONE_SCRIPT = abspath(Path(__file__).parent / "clone.sh") -BLACKLIST_SCRIPT = abspath(Path(__file__).parent / "blacklist.sh") -SYNC_UV = abspath(Path(__file__).parent / "sync_uv.sh") -DOWNLOAD_HUGGINGFACE_MODELS = abspath(Path(__file__).parent / "download_huggingface_models.sh") -NETWORK_JAIL = abspath(Path(__file__).parent / "libnetwork_jail.so") - -STORAGE_THRESHOLD_GB = 50 -MAX_HF_MODEL_SIZE_GB = 100 -MAX_REPO_SIZE_MB = 16 - -with open(DEPENDENCY_BLACKLIST, 'r') as blacklist_file: - BLACKLISTED_DEPENDENCIES = " ".join(blacklist_file.read().splitlines()) - -logger = get_logger(__name__) -tracer = trace.get_tracer(__name__) -hf_api = HfApi() - - -class InvalidSubmissionError(Exception): - ... - - -def _run(script: str, sandbox_args: list[str], sandbox_directory: Path, args: list[str], error_message: str): - process = None - try: - process = run( - [ - *sandbox_args, - script, - *args, - ], - capture_output=True, - encoding='utf-8', - cwd=sandbox_directory.absolute(), - ) - process.check_returncode() - except CalledProcessError as e: - raise InvalidSubmissionError(error_message) from e - finally: - if process: - logger.info(process.stdout) - logger.info(process.stderr) - - -def setup_sandbox(sandbox_args: list[str], sandbox_directory: Path, baseline: bool, url: str, revision: str) -> int: - with tracer.start_as_current_span("setup_sandbox") as span: - span.set_attributes({ - "repo.url": url, - "repo.revision": revision - }) - - with tracer.start_as_current_span("check_disk_space") as disk_span: - free_space = shutil.disk_usage("/").free - disk_span.set_attribute("disk.free_space_gb", free_space / 1024 ** 3) - if free_space < STORAGE_THRESHOLD_GB * 1024 ** 3: - disk_span.set_attribute("cache.cleared", True) - with tracer.start_span("clear_cache") as cache_span: - _run( - CLEAR_CACHE_SCRIPT, - sandbox_args, - sandbox_directory, - [], - "Failed to clear caches" - ) - new_free_space = shutil.disk_usage("/").free - cache_span.set_attribute("cache.freed_space_gb", (new_free_space - free_space) / 1024 ** 3) - - with tracer.start_span("clone_repository") as clone_span: - clone_span.set_attributes({ - "repo.url": url, - "repo.revision": revision - }) - - _run( - CLONE_SCRIPT, - sandbox_args, - sandbox_directory, - [url, revision], - "Failed to clone repository" - ) - - repo_size = sum(file.stat().st_size for file in sandbox_directory.rglob("*") if ".git" not in file.parts and ".venv" not in file.parts) - clone_span.set_attribute("repo.size_mb", repo_size / 1024 ** 2) - if repo_size > MAX_REPO_SIZE_MB * 1024 ** 2: - raise InvalidSubmissionError(f"Size of repository exceeds {MAX_REPO_SIZE_MB} MB") - - try: - with open(sandbox_directory / "pyproject.toml", 'r') as file: - pyproject = toml.load(file) - version = int(pyproject["project"]["version"]) - models = pyproject["tool"]["edge-maxxing"]["models"] - except Exception as e: - raise InvalidSubmissionError("Failed to read submission info") from e - - clone_span.set_attribute("submission.version", version) - if version != SPEC_VERSION: - raise InvalidSubmissionError(f"Submission is at version {version} while expected version is {SPEC_VERSION}") - - if not baseline: - with tracer.start_span("check_blacklist"): - _run( - BLACKLIST_SCRIPT, - sandbox_args, - sandbox_directory, - [BLACKLISTED_DEPENDENCIES], - "Detected a blacklisted dependency" - ) - - with tracer.start_span("sync_uv"): - _run( - SYNC_UV, - sandbox_args, - sandbox_directory, - [], - "Failed to sync uv" - ) - - with tracer.start_span("download_huggingface_models") as hf_span: - try: - total_model_size = 0 - for model in models: - model_info = hf_api.model_info(repo_id=model, files_metadata=True) - for sibling in model_info.siblings: - total_model_size += sibling.size - except Exception as e: - raise InvalidSubmissionError("Failed to get model info") from e - - hf_span.set_attribute("models.total_size_gb", total_model_size / 1024 ** 3) - if total_model_size > MAX_HF_MODEL_SIZE_GB * 1024 ** 3: - raise InvalidSubmissionError(f"Size of all Hugging Face models exceeds {MAX_HF_MODEL_SIZE_GB} GB") - - _run( - DOWNLOAD_HUGGINGFACE_MODELS, - sandbox_args, - sandbox_directory, - [" ".join(models)], - "Failed to download Hugging Face models" - ) - - return repo_size + total_model_size diff --git a/neuron/neuron/submission_tester/sync_uv.sh b/neuron/neuron/submission_tester/sync_uv.sh deleted file mode 100755 index f50349e8..00000000 --- a/neuron/neuron/submission_tester/sync_uv.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -set -e - -if ! ~/.local/bin/uv sync; then - echo "First sync attempt failed. Clearing caches and retrying..." - ~/.local/bin/uv cache clean - ~/.local/bin/uv sync -fi \ No newline at end of file diff --git a/neuron/neuron/submission_tester/testing.py b/neuron/neuron/submission_tester/testing.py deleted file mode 100644 index 4ac50ed0..00000000 --- a/neuron/neuron/submission_tester/testing.py +++ /dev/null @@ -1,218 +0,0 @@ -import os -from concurrent.futures import CancelledError -from pathlib import Path -from statistics import mean -from threading import Event -from time import perf_counter - -from pydantic import BaseModel - -from fiber.logging_utils import get_logger -from opentelemetry import trace - -from pipelines import TextToImageRequest -from . import InvalidSubmissionError -from .inference_sandbox import InferenceSandbox -from .vram_monitor import VRamMonitor -from .. import ( - GenerationOutput, - ModelRepositoryInfo, - OutputComparator, - CheckpointBenchmark, - MetricData, - Contest, -) - -SANDBOX_DIRECTORY = Path("/sandbox") -DEFAULT_LOAD_TIMEOUT = 1000 -MIN_LOAD_TIMEOUT = 240 - -debug = int(os.getenv("VALIDATOR_DEBUG") or 0) > 0 -logger = get_logger(__name__) -tracer = trace.get_tracer(__name__) - - -class BaselineBenchmark(BaseModel): - inputs: list[TextToImageRequest] - outputs: list[GenerationOutput] - metric_data: MetricData - - -@tracer.start_as_current_span("generate") -def generate( - contest: Contest, - container: InferenceSandbox, - request: TextToImageRequest, -) -> GenerationOutput: - start_joules = contest.device.get_joules() - vram_monitor = VRamMonitor(contest) - start = perf_counter() - - output = container(request) - - generation_time = perf_counter() - start - joules_used = contest.device.get_joules() - start_joules - watts_used = joules_used / generation_time - vram_used = vram_monitor.complete() - - return GenerationOutput( - output=output, - generation_time=generation_time, - vram_used=vram_used, - watts_used=watts_used, - ) - - -@tracer.start_as_current_span("generate_baseline") -def generate_baseline( - contest: Contest, - inputs: list[TextToImageRequest], - sandbox_directory: Path = SANDBOX_DIRECTORY, - switch_user: bool = True, - cancelled_event: Event | None = None, -) -> BaselineBenchmark: - outputs: list[GenerationOutput] = [] - - start_vram = contest.device.get_vram_used() - with InferenceSandbox( - repository_info=contest.baseline_repository, - baseline=True, - sandbox_directory=sandbox_directory, - switch_user=switch_user, - load_timeout=DEFAULT_LOAD_TIMEOUT, - ) as sandbox: - size = sandbox.model_size - - for index, request in enumerate(inputs): - if cancelled_event and cancelled_event.is_set(): - raise CancelledError() - - with tracer.start_span(f"generate_sample_{index + 1}") as sample_span: - output = generate(contest, sandbox, request) - outputs.append(output) - - sample_span.set_attributes({ - "generation.time_seconds": output.generation_time, - "generation.vram_used": output.vram_used, - "generation.watts_used": output.watts_used, - }) - - generation_time = mean(output.generation_time for output in outputs) - vram_used = max(output.vram_used for output in outputs) - start_vram - watts_used = max(output.watts_used for output in outputs) - - return BaselineBenchmark( - inputs=inputs, - outputs=outputs, - metric_data=MetricData( - generation_time=generation_time, - size=size, - vram_used=vram_used, - watts_used=watts_used, - load_time=sandbox.load_time, - ), - ) - - -@tracer.start_as_current_span("compare_checkpoints") -def compare_checkpoints( - contest: Contest, - submission: ModelRepositoryInfo, - inputs: list[TextToImageRequest], - baseline: BaselineBenchmark, - sandbox_directory: Path = SANDBOX_DIRECTORY, - switch_user: bool = True, - load_timeout: int = DEFAULT_LOAD_TIMEOUT, - cancelled_event: Event | None = None, -) -> CheckpointBenchmark | None: - outputs: list[GenerationOutput] = [] - - start_vram = contest.device.get_vram_used() - with InferenceSandbox( - repository_info=submission, - baseline=False, - sandbox_directory=sandbox_directory, - switch_user=switch_user, - load_timeout=max(load_timeout, MIN_LOAD_TIMEOUT if not debug else DEFAULT_LOAD_TIMEOUT), - ) as sandbox: - size = sandbox.model_size - - try: - for index, request in enumerate(inputs): - logger.info(f"Sample {index + 1}, prompt {request.prompt} and seed {request.seed}") - - if cancelled_event and cancelled_event.is_set(): - raise CancelledError() - - with tracer.start_span(f"generate_sample_{index + 1}") as sample_span: - output = generate(contest, sandbox, request) - outputs.append(output) - - sample_span.set_attributes({ - "generation.time_seconds": output.generation_time, - "generation.vram_used": output.vram_used, - "generation.watts_used": output.watts_used, - }) - except (CancelledError, TimeoutError): - raise - except Exception as e: - raise InvalidSubmissionError(f"Failed to run inference") from e - - average_time = sum(output.generation_time for output in outputs) / len(outputs) - vram_used = max(output.vram_used for output in outputs) - start_vram - watts_used = max(output.watts_used for output in outputs) - - with tracer.start_span("compare_outputs"): - with contest.output_comparator() as output_comparator: - def calculate_similarity(comparator: OutputComparator, baseline_output: GenerationOutput, optimized_output: GenerationOutput): - try: - if cancelled_event and cancelled_event.is_set(): - raise CancelledError() - - return comparator( - baseline_output.output, - optimized_output.output, - ) - except (CancelledError, TimeoutError): - raise - except: - logger.info( - f"Submission {submission.url}'s output couldn't be compared in similarity", - exc_info=True, - ) - - return 0.0 - - similarities = [ - calculate_similarity(output_comparator, baseline_output, output) - for baseline_output, output in zip(baseline.outputs, outputs) - ] - - average_similarity = mean(similarities) - min_similarity = min(similarities) - - benchmark = CheckpointBenchmark( - model=MetricData( - generation_time=average_time, - size=size, - vram_used=vram_used, - watts_used=watts_used, - load_time=sandbox.load_time, - ), - average_similarity=average_similarity, - min_similarity=min_similarity, - ) - - logger.info( - f"Tested {len(inputs)} Samples\n" - f"Score: {contest.calculate_score(baseline.metric_data, benchmark)}\n" - f"Average Similarity: {average_similarity}\n" - f"Min Similarity: {min_similarity}\n" - f"Average Generation Time: {average_time}s\n" - f"Model Size: {size}b\n" - f"Model Load Time: {sandbox.load_time}s\n" - f"Max VRAM Usage: {vram_used}b\n" - f"Max Power Usage: {watts_used}W" - ) - - return benchmark diff --git a/neuron/neuron/submissions.py b/neuron/neuron/submissions.py deleted file mode 100644 index 9b2b694c..00000000 --- a/neuron/neuron/submissions.py +++ /dev/null @@ -1,96 +0,0 @@ -from fiber.chain.commitments import publish_raw_commitment, _deserialize_commitment_field -from fiber.logging_utils import get_logger -from substrateinterface import SubstrateInterface, Keypair -from substrateinterface.storage import StorageKey - -from .checkpoint import CheckpointSubmission, SPEC_VERSION, Key, MinerModelInfo -from .contest import ModelRepositoryInfo, find_contest, ACTIVE_CONTESTS -from .network_commitments import Encoder, Decoder - - -logger = get_logger(__name__) - - -def make_submission( - substrate: SubstrateInterface, - netuid: int, - keypair: Keypair, - submissions: list[CheckpointSubmission], -): - encoder = Encoder() - - encoder.write_uint16(SPEC_VERSION) - - for submission in submissions: - submission.encode(encoder) - - data = encoder.finish() - - publish_raw_commitment( - substrate, - keypair, - netuid, - data, - wait_for_finalization=False, - ) - - -def get_submissions( - substrate: SubstrateInterface, - hotkeys: list[Key], - netuid: int, - block: int -) -> list[MinerModelInfo | None]: - submissions: list[MinerModelInfo | None] = [None] * len(hotkeys) - - storage_keys: list[StorageKey] = [] - for hotkey in hotkeys: - storage_keys.append(substrate.create_storage_key( - "Commitments", - "CommitmentOf", - [netuid, hotkey] - )) - - commitments = substrate.query_multi( - storage_keys=storage_keys, - block_hash=substrate.get_block_hash(block), - ) - - for storage, commitment in commitments: - hotkey = storage.params[1] - try: - if not commitment or not commitment.value: - continue - - fields = commitment.value["info"]["fields"] - if not fields: - continue - - field = _deserialize_commitment_field(fields[0]) - if field is None: - continue - - decoder = Decoder(field[1]) - spec_version = decoder.read_uint16() - if spec_version != SPEC_VERSION: - continue - - while not decoder.eof: - info = CheckpointSubmission.decode(decoder) - repository_url = info.get_repo_link() - - if info.contest not in ACTIVE_CONTESTS: - continue - - if repository_url == find_contest(info.contest).baseline_repository.url: - continue - - repository = ModelRepositoryInfo(url=repository_url, revision=info.revision) - submitted_block = int(commitment.value["block"]) - submissions[hotkeys.index(hotkey)] = MinerModelInfo(repository, info.contest, submitted_block) - except Exception as e: - logger.error(f"Failed to get submission from miner {hotkey}") - logger.error(f"Submission parsing error", exc_info=e) - continue - - return submissions \ No newline at end of file diff --git a/pipelines/pipelines/models.py b/pipelines/pipelines/models.py index 67b49c52..480a8a68 100644 --- a/pipelines/pipelines/models.py +++ b/pipelines/pipelines/models.py @@ -1,6 +1,5 @@ from pydantic import BaseModel - class TextToImageRequest(BaseModel): prompt: str negative_prompt: str | None = None diff --git a/pipelines/pyproject.toml b/pipelines/pyproject.toml index 1528444c..6b600fad 100644 --- a/pipelines/pyproject.toml +++ b/pipelines/pyproject.toml @@ -8,12 +8,7 @@ description = "Holder for models & constants to be accessed by multiple reposito requires-python = ">=3.10,<3.13" version = "1.0.0" dependencies = [ - "pydantic>=2" -] - -[tool.uv] -dev-dependencies = [ - "pytype==2024.10.11", + "pydantic>=2.9.2" ] [tool.pytype] @@ -21,5 +16,5 @@ inputs = ["pipelines"] [tool.setuptools] packages = [ - "pipelines", + "pipelines" ] diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 0d718131..00000000 --- a/pyproject.toml +++ /dev/null @@ -1,16 +0,0 @@ -[build-system] -requires = ["setuptools >= 75.0"] -build-backend = "setuptools.build_meta" - -[project] -name = "edge-maxxing" -description = "A Bittensor subnet designed to incentivice optimization of checkpoints and models" -requires-python = ">=3.10,<3.13" -version = "1.0.0" - -[tool.setuptools] -packages = [ - "neuron", - "validator", - "miner" -] diff --git a/validator/base_validator/__init__.py b/validator/base_validator/__init__.py index 59fe705b..e69de29b 100644 --- a/validator/base_validator/__init__.py +++ b/validator/base_validator/__init__.py @@ -1,5 +0,0 @@ -from .metrics import * -from .auto_updater import * -from .telemetry import * - -API_VERSION = "5.4.0" diff --git a/validator/base_validator/api_data.py b/validator/base_validator/api_data.py new file mode 100644 index 00000000..089aeec6 --- /dev/null +++ b/validator/base_validator/api_data.py @@ -0,0 +1,30 @@ +from enum import Enum + +from pydantic import BaseModel + +from base.checkpoint import Key, Uid, Benchmarks +from base.contest import ContestId, RepositoryInfo + +class ApiMetadata(BaseModel): + version: str + compatible_contests: set[ContestId] + +class BenchmarkState(Enum): + NOT_STARTED = 0 + IN_PROGRESS = 1 + FINISHED = 2 + +class BenchmarkingResults(BaseModel): + state: BenchmarkState + benchmarks: Benchmarks + invalid_submissions: set[Key] + average_benchmark_time: float | None + +class BenchmarkingStartRequest(BaseModel): + contest_id: ContestId + submissions: dict[Key, RepositoryInfo] + +class BenchmarkingInitializeRequest(BaseModel): + uid: Uid + signature: str + substrate_url: str diff --git a/validator/base_validator/auto_updater.py b/validator/base_validator/auto_updater.py index 8c7e5766..c16e3a67 100644 --- a/validator/base_validator/auto_updater.py +++ b/validator/base_validator/auto_updater.py @@ -1,9 +1,10 @@ import os import signal -import time from threading import Event, Thread -from fiber.logging_utils import get_logger +from time import localtime, sleep + import git +from fiber.logging_utils import get_logger UPDATE_RATE_MINUTES = 10 @@ -15,20 +16,20 @@ class AutoUpdater: def __init__(self): self._stop_flag = Event() - self._thread = Thread(target=self._monitor, daemon=True) + self._thread = Thread(target=self._monitor) self._check_for_updates() self._thread.start() def _monitor(self): while not self._stop_flag.is_set(): try: - current_time = time.localtime() + current_time = localtime() if current_time.tm_min % UPDATE_RATE_MINUTES == 0: self._check_for_updates() - time.sleep(60) + self._stop_flag.wait(60) else: sleep_minutes = UPDATE_RATE_MINUTES - current_time.tm_min % UPDATE_RATE_MINUTES - time.sleep(sleep_minutes * 60 - current_time.tm_sec) + self._stop_flag.wait(sleep_minutes * 60 - current_time.tm_sec) except Exception as e: logger.error(f"Error occurred while checking for updates, attempting to fix the issue by restarting", exc_info=e) self._restart() @@ -48,15 +49,13 @@ def _check_for_updates(self): else: logger.info("Already up to date.") - def _restart(self): self._stop_flag.set() - time.sleep(5) os.kill(os.getpid(), signal.SIGTERM) logger.info("Waiting for process to terminate...") for _ in range(60): - time.sleep(1) + sleep(1) try: os.kill(os.getpid(), 0) except ProcessLookupError: diff --git a/validator/base_validator/metrics.py b/validator/base_validator/metrics.py deleted file mode 100644 index 4f0d87f3..00000000 --- a/validator/base_validator/metrics.py +++ /dev/null @@ -1,30 +0,0 @@ -from enum import Enum - -from pydantic import BaseModel - -from neuron import Key -from neuron.contest import CheckpointBenchmark, MetricData, ContestId, ModelRepositoryInfo - - -class BenchmarkState(Enum): - NOT_STARTED = 0 - IN_PROGRESS = 1 - FINISHED = 2 - - -class BenchmarkResults(BaseModel): - state: BenchmarkState - results: dict[Key, CheckpointBenchmark | None] - invalid: dict[Key, str] - baseline_metrics: MetricData | None - average_benchmark_time: float | None - - -class ApiMetadata(BaseModel): - version: str - compatible_contests: list[ContestId] - - -class BenchmarkingStartRequest(BaseModel): - contest_id: ContestId - submissions: dict[Key, ModelRepositoryInfo] diff --git a/validator/base_validator/telemetry.py b/validator/base_validator/telemetry.py index a82e57ab..f62a408c 100644 --- a/validator/base_validator/telemetry.py +++ b/validator/base_validator/telemetry.py @@ -8,8 +8,14 @@ ENDPOINT = "http://98.81.78.238:4317" +initialized = False def init_open_telemetry_logging(attributes: Attributes): + global initialized + if initialized: + return + initialized = True + logger_provider = LoggerProvider(resource=Resource.create(attributes=attributes)) set_logger_provider(logger_provider) diff --git a/validator/generate_compose.py b/validator/generate_compose.py index ef3fc1b0..5f12313d 100644 --- a/validator/generate_compose.py +++ b/validator/generate_compose.py @@ -70,6 +70,5 @@ def main(): ) ) - if __name__ == '__main__': main() diff --git a/validator/pyproject.toml b/validator/pyproject.toml index 575b67b3..f4aa2e9b 100644 --- a/validator/pyproject.toml +++ b/validator/pyproject.toml @@ -6,17 +6,14 @@ build-backend = "setuptools.build_meta" name = "edge-maxxing-validator" description = "The validator which checks models and checkpoints provided by miners" requires-python = ">=3.10,<3.13" -version = "1.0.0" +version = "5.5.0" dependencies = [ - "wandb==0.18.5", - "websockets==13.1", - "aiohttp==3.10.10", - "safetensors==0.4.5", - "edge-maxxing-neuron==1.0.0", + "edge-maxxing-base==1.0.0", "opentelemetry-api>=1.28.2", "opentelemetry-sdk>=1.28.2", "opentelemetry-exporter-otlp>=1.28.2", "opentelemetry-distro>=0.49b2", + "wandb>=0.18.7", "opentelemetry-instrumentation-asyncio>=0.49b2", "opentelemetry-instrumentation-dbapi>=0.49b2", "opentelemetry-instrumentation-logging>=0.49b2", @@ -35,10 +32,11 @@ dependencies = [ "opentelemetry-instrumentation-system-metrics>=0.49b2", "opentelemetry-instrumentation-tortoiseorm>=0.49b2", "opentelemetry-instrumentation-urllib3>=0.49b2", + "fastapi>=0.115.5", ] [tool.uv.sources] -edge-maxxing-neuron = { path = "../neuron", editable = true } +edge-maxxing-base = { path = "../base", editable = true } [dependency-groups] dev = [ @@ -46,14 +44,18 @@ dev = [ ] [tool.pytype] -inputs = ["base_validator", "submission_tester", "weight_setting"] +inputs = [ + "base_validator", + "weight_setting", + "submission_tester", +] [project.scripts] -start_validator = 'weight_setting.validator:main' +start_validator = "weight_setting.validator:main" [tool.setuptools] packages = [ "base_validator", + "weight_setting", "submission_tester", - "weight_setting" ] diff --git a/validator/submission_tester/Dockerfile b/validator/submission_tester/Dockerfile index 44d554d6..371dc41c 100644 --- a/validator/submission_tester/Dockerfile +++ b/validator/submission_tester/Dockerfile @@ -1,36 +1,18 @@ FROM pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime -RUN apt-get update && apt-get install -y curl - WORKDIR /api -COPY neuron/pyproject.toml neuron/ -COPY neuron/neuron/__init__.py neuron/neuron/ -COPY pipelines/pyproject.toml pipelines/ -COPY pipelines/pipelines/__init__.py pipelines/pipelines/ - -COPY validator/pyproject.toml validator/ -COPY validator/uv.lock validator/ - -COPY validator/base_validator/__init__.py validator/base_validator/ -COPY validator/submission_tester/__init__.py validator/submission_tester/ -COPY validator/weight_setting/__init__.py validator/weight_setting/ - -COPY validator/submission_tester/update.sh validator/submission_tester/ - +COPY validator/api/update.sh validator/api/ RUN cd validator && ./submission_tester/update.sh +USER api -COPY README.md . -COPY validator/submission_tester/start.sh validator/submission_tester/ - -COPY --chown=api:api .git .git -COPY validator/base_validator validator/base_validator -COPY validator/submission_tester validator/submission_tester -COPY neuron/neuron neuron/neuron -COPY pipelines/pipelines pipelines/pipelines +COPY pipelines . +COPY base . +COPY validator . +COPY .git .git -WORKDIR /api/validator +WORKDIR /api/validator/submission_tester +USER root EXPOSE 8000 - -ENTRYPOINT ["submission_tester/entrypoint.sh"] +ENTRYPOINT ["entrypoint.sh"] diff --git a/validator/submission_tester/__init__.py b/validator/submission_tester/__init__.py index 489dadd8..e69de29b 100644 --- a/validator/submission_tester/__init__.py +++ b/validator/submission_tester/__init__.py @@ -1 +0,0 @@ -from .api import app diff --git a/validator/submission_tester/api.py b/validator/submission_tester/api.py index 474a8999..02abfd5d 100644 --- a/validator/submission_tester/api.py +++ b/validator/submission_tester/api.py @@ -1,25 +1,22 @@ import os -import time from contextlib import asynccontextmanager +from importlib.metadata import version +from pathlib import Path +from time import time_ns from typing import Annotated -from fastapi import Body -from fastapi import FastAPI, Request, Header, HTTPException +from fastapi import FastAPI, HTTPException +from fastapi.params import Header, Body from fiber.logging_utils import get_logger -from starlette import status +from starlette.requests import Request +from starlette.status import HTTP_403_FORBIDDEN, HTTP_400_BAD_REQUEST, HTTP_429_TOO_MANY_REQUESTS from substrateinterface import Keypair -from base_validator import ( - API_VERSION, - BenchmarkState, - BenchmarkResults, - AutoUpdater, - ApiMetadata, BenchmarkingStartRequest, - init_open_telemetry_logging, -) -from neuron import CURRENT_CONTEST -from neuron import find_compatible_contests, find_contest -from .benchmarker import Benchmarker +from base.contest import find_compatible_contests, find_contest, CONTESTS +from base_validator.api_data import BenchmarkingStartRequest, BenchmarkingResults, ApiMetadata, BenchmarkingInitializeRequest +from base_validator.auto_updater import AutoUpdater +from base_validator.telemetry import init_open_telemetry_logging +from testing.benchmarker import Benchmarker hotkey = os.getenv("VALIDATOR_HOTKEY_SS58_ADDRESS") debug = int(os.getenv("VALIDATOR_DEBUG") or 0) > 0 @@ -29,42 +26,39 @@ keypair = Keypair(ss58_address=hotkey) -init_open_telemetry_logging({ - "neuron.hotkey": hotkey, - "api.version": API_VERSION, -}) +api_version = version("edge-maxxing-validator") logger = get_logger(__name__) - @asynccontextmanager async def lifespan(_: FastAPI): AutoUpdater() - compatible_contests = find_compatible_contests() if not debug else [CURRENT_CONTEST.id] + compatible_contests = find_compatible_contests() if not debug else [contest.id for contest in CONTESTS] if not compatible_contests: raise RuntimeError("Device is not compatible with any contests") yield { - "benchmarker": Benchmarker(), + "benchmarker": Benchmarker( + sandbox_directory=Path("/sandbox"), + sandbox_args=["/bin/sudo", "-u", "sandbox"] + ), "compatible_contests": compatible_contests, } - app = FastAPI(lifespan=lifespan) - def _authenticate_request(nonce: int, signature: str): if debug: return - current_timestamp = time.time_ns() + current_timestamp = time_ns() if current_timestamp - nonce > 2_000_000_000: logger.info(f"Got request with nonce {nonce}, which is {current_timestamp - nonce} nanoseconds old.") raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, + status_code=HTTP_403_FORBIDDEN, detail="Invalid nonce", ) @@ -72,14 +66,13 @@ def _authenticate_request(nonce: int, signature: str): logger.info(f"Got invalid signature for nonce {nonce}: {signature}") raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, + status_code=HTTP_403_FORBIDDEN, detail="Invalid signature", ) - @app.post("/start") -def start_benchmarking( - benchmarking_start_request: Annotated[BenchmarkingStartRequest, Body()], +def start( + start_request: Annotated[BenchmarkingStartRequest, Body()], x_nonce: Annotated[int, Header()], signature: Annotated[str, Header()], request: Request, @@ -88,61 +81,58 @@ def start_benchmarking( benchmarker: Benchmarker = request.state.benchmarker - with benchmarker.lock: - timestamp = time.time_ns() - - try: - contest = find_contest(benchmarking_start_request.contest_id) - if not debug: - contest.device.validate() - except Exception as e: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail=str(e), - ) - - if timestamp - benchmarker.start_timestamp < 120_000_000_000: - raise HTTPException( - status_code=status.HTTP_429_TOO_MANY_REQUESTS, - detail="Started recently", - ) - - benchmarker.start_timestamp = timestamp + contest = find_contest(start_request.contest_id) + if not debug and not contest.device.is_compatible(): + raise HTTPException( + status_code=HTTP_400_BAD_REQUEST, + detail=str("API is not compatible with contest"), + ) - benchmarker.start_benchmarking(contest, benchmarking_start_request.submissions) + timestamp = time_ns() + if timestamp - benchmarker.start_timestamp < 10_000_000_000: + raise HTTPException( + status_code=HTTP_429_TOO_MANY_REQUESTS, + detail="Started recently", + ) + benchmarker.start_timestamp = timestamp + benchmarker.start_benchmarking(contest, start_request.submissions) @app.get("/state") -def state(request: Request) -> BenchmarkResults: +def state(request: Request) -> BenchmarkingResults: benchmarker: Benchmarker = request.state.benchmarker - benchmark_state: BenchmarkState - - if not benchmarker.thread: - benchmark_state = BenchmarkState.NOT_STARTED - elif benchmarker.done: - benchmark_state = BenchmarkState.FINISHED - else: - benchmark_state = BenchmarkState.IN_PROGRESS - average_benchmark_time = ( sum(benchmarker.submission_times) / len(benchmarker.submission_times) if benchmarker.submission_times else None ) - return BenchmarkResults( - state=benchmark_state, - results=benchmarker.benchmarks, - invalid=benchmarker.invalid, - baseline_metrics=benchmarker.get_baseline_metrics(), + return BenchmarkingResults( + state=benchmarker.state, + benchmarks=benchmarker.benchmarks, + invalid_submissions=benchmarker.invalid_submissions, average_benchmark_time=average_benchmark_time, ) - @app.get("/metadata") def metadata(request: Request) -> ApiMetadata: return ApiMetadata( - version=API_VERSION, + version=api_version, compatible_contests=request.state.compatible_contests, ) + +@app.post("/initialize") +def initialize( + init_request: Annotated[BenchmarkingInitializeRequest, Body()], + x_nonce: Annotated[int, Header()], + signature: Annotated[str, Header()], +): + _authenticate_request(x_nonce, signature) + + init_open_telemetry_logging({ + "neuron.uid": init_request.uid, + "neuron.signature": init_request.signature, + "subtensor.chain_endpoint": init_request.substrate_url, + "api.version": api_version, + }) diff --git a/validator/submission_tester/benchmarker.py b/validator/submission_tester/benchmarker.py deleted file mode 100644 index e10d0a1e..00000000 --- a/validator/submission_tester/benchmarker.py +++ /dev/null @@ -1,163 +0,0 @@ -from concurrent.futures import CancelledError -from random import choice -from threading import Lock, Event, Thread -from time import perf_counter, sleep -from typing import cast - -from fiber.logging_utils import get_logger -from opentelemetry import trace - -from neuron import ( - Key, - ModelRepositoryInfo, - random_inputs, - Contest, -) -from neuron.submission_tester import ( - CheckpointBenchmark, - BaselineBenchmark, - MetricData, - compare_checkpoints, - generate_baseline, - InvalidSubmissionError, -) -from pipelines import TextToImageRequest - -logger = get_logger(__name__) -tracer = trace.get_tracer(__name__) - - -class Benchmarker: - contest: Contest | None - submissions: dict[Key, ModelRepositoryInfo] - benchmarks: dict[Key, CheckpointBenchmark | None] - invalid: dict[Key, str] - baseline: BaselineBenchmark | None - inputs: list[TextToImageRequest] - started: bool - done: bool - start_timestamp: int - submission_times: list[float] - thread: Thread | None - lock: Lock - cancelled_event: Event - - def __init__(self): - self.contest = None - self.submissions = {} - self.benchmarks = {} - self.invalid = {} - self.baseline = None - self.inputs = [] - self.done = False - self.start_timestamp = 0 - self.thread = None - self.lock = Lock() - self.submission_times = [] - self.cancelled_event = Event() - - def _benchmark_submission(self, hotkey: Key): - with tracer.start_as_current_span("benchmark_submission") as span: - submission = self.submissions[hotkey] - span.set_attributes({ - "submission.hotkey": str(hotkey), - "submission.url": submission.url, - "submission.revision": submission.revision - }) - - start_time = perf_counter() - - try: - self.benchmarks[hotkey] = compare_checkpoints( - contest=self.contest, - submission=submission, - inputs=self.inputs, - baseline=self.baseline, - load_timeout=int(cast(MetricData, self.get_baseline_metrics()).load_time * 2), - cancelled_event=self.cancelled_event, - ) - except InvalidSubmissionError as e: - logger.error(f"Skipping invalid submission '{submission}': '{e}'") - self.benchmarks[hotkey] = None - self.invalid[hotkey] = str(e) - except CancelledError: - logger.warning(f"Benchmarking was canceled while testing '{submission}'") - raise - except Exception as e: - span.record_exception(e) - finally: - duration = perf_counter() - start_time - self.submission_times.append(duration) - span.set_attribute("benchmark.duration_seconds", duration) - - def _start_benchmarking(self, contest: Contest, submissions: dict[Key, ModelRepositoryInfo]): - with tracer.start_as_current_span("start_benchmarking") as span: - span.set_attribute("submissions.total", len(submissions)) - - self.contest = contest - self.submissions = submissions - self.benchmarks.clear() - self.invalid.clear() - self.submission_times.clear() - self.inputs = random_inputs() - self.done = False - self.baseline = None - - with tracer.start_span("generate_baseline"): - while not self.baseline and not self.cancelled_event.is_set(): - try: - logger.info("Generating baseline samples to compare") - self.baseline = generate_baseline( - contest=contest, - inputs=self.inputs, - cancelled_event=self.cancelled_event - ) - except CancelledError: - logger.warning("Benchmarking was canceled while testing the baseline") - return - except Exception as e: - logger.error("Failed to generate baseline samples, retrying in 10 minutes", exc_info=e) - sleep(600) - - with tracer.start_span("benchmark_submissions") as bench_span: - while len(self.benchmarks) != len(self.submissions) and self.baseline and not self.cancelled_event.is_set(): - hotkey = choice(list(self.submissions.keys() - self.benchmarks.keys())) - self._benchmark_submission(hotkey) - - valid_submissions = len([benchmark for benchmark in self.benchmarks.values() if benchmark]) - bench_span.set_attributes({ - "progress.total": len(self.benchmarks), - "progress.valid": valid_submissions, - }) - logger.info(f"{len(self.benchmarks)}/{len(self.submissions)} submissions benchmarked. {valid_submissions} valid.") - - logger.info("Benchmarking complete") - self.done = True - - @tracer.start_as_current_span("start_benchmarking") - def start_benchmarking(self, contest: Contest, submissions: dict[Key, ModelRepositoryInfo]): - if not submissions: - logger.warning("No submissions to benchmark") - return - - logger.info(f"Starting benchmarking for {len(submissions)} submissions") - - if self.thread and self.thread.is_alive(): - logger.info("Attempting to cancel previous benchmarking") - self.cancelled_event.set() - self.thread.join(timeout=60) - if self.thread.is_alive(): - logger.warning("Benchmarking was not stopped gracefully.") - else: - logger.info("Benchmarking was stopped gracefully.") - - self.cancelled_event.clear() - self.thread = Thread( - target=self._start_benchmarking, - args=(contest, submissions,), - daemon=True, - ) - self.thread.start() - - def get_baseline_metrics(self) -> MetricData | None: - return self.baseline.metric_data if self.baseline else None diff --git a/validator/submission_tester/entrypoint.sh b/validator/submission_tester/entrypoint.sh index 18f75c81..cc17952d 100755 --- a/validator/submission_tester/entrypoint.sh +++ b/validator/submission_tester/entrypoint.sh @@ -2,4 +2,4 @@ chown -R sandbox:sandbox /home/sandbox/.cache/huggingface -./submission_tester/start.sh --host 0.0.0.0 --port 8000 submission_tester:app +./start.sh --host 0.0.0.0 --port 8000 submission_tester:app diff --git a/validator/submission_tester/start.sh b/validator/submission_tester/start.sh index 86f96881..92f4b841 100755 --- a/validator/submission_tester/start.sh +++ b/validator/submission_tester/start.sh @@ -2,10 +2,10 @@ set -e -./submission_tester/update.sh +./update.sh sudo -u api /home/api/.local/bin/uv run opentelemetry-instrument \ --service_name edge-maxxing-api \ --exporter_otlp_endpoint http://98.81.78.238:4317 \ - --resource_attributes "neuron.type=validator" \ + --resource_attributes "neuron.type=validator,neuron.hotkey=$VALIDATOR_HOTKEY_SS58_ADDRESS" \ uvicorn "$@" diff --git a/validator/submission_tester/update.sh b/validator/submission_tester/update.sh index da505c94..884b58fa 100755 --- a/validator/submission_tester/update.sh +++ b/validator/submission_tester/update.sh @@ -6,9 +6,11 @@ apt-get update DEBIAN_FRONTEND=noninteractive apt-get -y install sudo pipx git git-lfs build-essential python3-dev python3-opencv if ! id -u api &>/dev/null; then - useradd --shell=/bin/false --create-home --home-dir /home/sandbox sandbox || true useradd --create-home --home-dir /home/api api || true fi +if ! id -u sandbox &>/dev/null; then + useradd --shell=/bin/false --create-home --home-dir /home/sandbox sandbox || true +fi chown -R api:api /api @@ -20,21 +22,24 @@ rm -rf /sandbox mkdir /sandbox chown sandbox:sandbox /sandbox +if [ -z "$CUDA_VISIBLE_DEVICES" ]; then + unset CUDA_VISIBLE_DEVICES +fi + echo "root ALL=(ALL:ALL) ALL" > /etc/sudoers echo "api ALL = (sandbox) NOPASSWD: ALL" >> /etc/sudoers echo "Defaults env_keep += \"VALIDATOR_HOTKEY_SS58_ADDRESS VALIDATOR_DEBUG CUDA_VISIBLE_DEVICES\"" >> /etc/sudoers -git config --system --add safe.directory '*' git config --system advice.detachedHead false +git config --system --add safe.directory '*' git config --system rebase.autostash true git config --system rebase.autosquash true git config --system pull.autostash true sudo -u api pipx ensurepath sudo -u api pipx install uv -sudo -u api /home/api/.local/bin/uv sync +sudo -u api /home/api/.local/bin/uv sync --compile-bytecode sudo -u sandbox pipx ensurepath sudo -u sandbox pipx install uv sudo -u sandbox pipx install huggingface-hub[cli,hf_transfer] -sudo -u sandbox pipx upgrade-all diff --git a/validator/uv.lock b/validator/uv.lock index 8d2aa6b8..d0a7c7fa 100644 --- a/validator/uv.lock +++ b/validator/uv.lock @@ -2,28 +2,28 @@ version = 1 requires-python = ">=3.10, <3.13" resolution-markers = [ "python_full_version < '3.11' and platform_system == 'Darwin' and sys_platform != 'linux'", - "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'linux'", - "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_system != 'Darwin' and sys_platform != 'linux') or (python_full_version < '3.11' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'linux')", - "python_full_version == '3.11.*' and platform_system == 'Darwin' and sys_platform != 'linux'", - "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'linux'", - "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_system != 'Darwin' and sys_platform != 'linux') or (python_full_version == '3.11.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'linux')", - "python_full_version >= '3.12' and platform_system == 'Darwin' and sys_platform != 'linux'", - "python_full_version >= '3.12' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'linux'", - "(python_full_version >= '3.12' and platform_machine != 'aarch64' and platform_system != 'Darwin' and sys_platform != 'linux') or (python_full_version >= '3.12' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'linux')", "python_full_version < '3.11' and platform_system == 'Darwin' and sys_platform == 'linux'", + "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'linux'", "python_full_version < '3.11' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'linux'", + "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_system != 'Darwin' and sys_platform != 'linux') or (python_full_version < '3.11' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'linux')", "(python_full_version < '3.11' and platform_machine != 'aarch64' and platform_system != 'Darwin' and sys_platform == 'linux') or (python_full_version < '3.11' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'linux')", + "python_full_version == '3.11.*' and platform_system == 'Darwin' and sys_platform != 'linux'", "python_full_version == '3.11.*' and platform_system == 'Darwin' and sys_platform == 'linux'", + "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'linux'", "python_full_version == '3.11.*' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'linux'", + "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_system != 'Darwin' and sys_platform != 'linux') or (python_full_version == '3.11.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'linux')", "(python_full_version == '3.11.*' and platform_machine != 'aarch64' and platform_system != 'Darwin' and sys_platform == 'linux') or (python_full_version == '3.11.*' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'linux')", + "python_full_version >= '3.12' and platform_system == 'Darwin' and sys_platform != 'linux'", "python_full_version >= '3.12' and platform_system == 'Darwin' and sys_platform == 'linux'", + "python_full_version >= '3.12' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform != 'linux'", "python_full_version >= '3.12' and platform_machine == 'aarch64' and platform_system == 'Linux' and sys_platform == 'linux'", + "(python_full_version >= '3.12' and platform_machine != 'aarch64' and platform_system != 'Darwin' and sys_platform != 'linux') or (python_full_version >= '3.12' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform != 'linux')", "(python_full_version >= '3.12' and platform_machine != 'aarch64' and platform_system != 'Darwin' and sys_platform == 'linux') or (python_full_version >= '3.12' and platform_system != 'Darwin' and platform_system != 'Linux' and sys_platform == 'linux')", ] [[package]] name = "accelerate" -version = "1.1.0" +version = "1.1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "huggingface-hub" }, @@ -34,91 +34,9 @@ dependencies = [ { name = "safetensors" }, { name = "torch" }, ] +sdist = { url = "https://files.pythonhosted.org/packages/51/0b/179cc63d3a4f52e8cb233f2153a3e5a417522c85ea4b1dd25f6f2b377369/accelerate-1.1.1.tar.gz", hash = "sha256:0d39dfac557052bc735eb2703a0e87742879e1e40b88af8a2f9a93233d4cd7db", size = 335346 } wheels = [ - { url = "https://files.pythonhosted.org/packages/73/e7/e61feefda1b483f0d53a320909051252175ccbfea29ab99bd62df6083c81/accelerate-1.1.0-py3-none-any.whl", hash = "sha256:babee98bd3692cfb0537db3f96f36b5d4e29809776b406d32aaf593d4eeb574c", size = 333182 }, -] - -[[package]] -name = "aiohappyeyeballs" -version = "2.4.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/69/2f6d5a019bd02e920a3417689a89887b39ad1e350b562f9955693d900c40/aiohappyeyeballs-2.4.3.tar.gz", hash = "sha256:75cf88a15106a5002a8eb1dab212525c00d1f4c0fa96e551c9fbe6f09a621586", size = 21809 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f7/d8/120cd0fe3e8530df0539e71ba9683eade12cae103dd7543e50d15f737917/aiohappyeyeballs-2.4.3-py3-none-any.whl", hash = "sha256:8a7a83727b2756f394ab2895ea0765a0a8c475e3c71e98d43d76f22b4b435572", size = 14742 }, -] - -[[package]] -name = "aiohttp" -version = "3.10.10" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohappyeyeballs" }, - { name = "aiosignal" }, - { name = "async-timeout", marker = "python_full_version < '3.11'" }, - { name = "attrs" }, - { name = "frozenlist" }, - { name = "multidict" }, - { name = "yarl" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/17/7e/16e57e6cf20eb62481a2f9ce8674328407187950ccc602ad07c685279141/aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a", size = 7542993 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/dd/3d40c0e67e79c5c42671e3e268742f1ff96c6573ca43823563d01abd9475/aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f", size = 586969 }, - { url = "https://files.pythonhosted.org/packages/75/64/8de41b5555e5b43ef6d4ed1261891d33fe45ecc6cb62875bfafb90b9ab93/aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9", size = 399367 }, - { url = "https://files.pythonhosted.org/packages/96/36/27bd62ea7ce43906d1443a73691823fc82ffb8fa03276b0e2f7e1037c286/aiohttp-3.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8", size = 390720 }, - { url = "https://files.pythonhosted.org/packages/e8/4d/d516b050d811ce0dd26325c383013c104ffa8b58bd361b82e52833f68e78/aiohttp-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1", size = 1228820 }, - { url = "https://files.pythonhosted.org/packages/53/94/964d9327a3e336d89aad52260836e4ec87fdfa1207176550fdf384eaffe7/aiohttp-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a", size = 1264616 }, - { url = "https://files.pythonhosted.org/packages/0c/20/70ce17764b685ca8f5bf4d568881b4e1f1f4ea5e8170f512fdb1a33859d2/aiohttp-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd", size = 1298402 }, - { url = "https://files.pythonhosted.org/packages/d1/d1/5248225ccc687f498d06c3bca5af2647a361c3687a85eb3aedcc247ee1aa/aiohttp-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026", size = 1222205 }, - { url = "https://files.pythonhosted.org/packages/f2/a3/9296b27cc5d4feadf970a14d0694902a49a985f3fae71b8322a5f77b0baa/aiohttp-3.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b", size = 1193804 }, - { url = "https://files.pythonhosted.org/packages/d9/07/f3760160feb12ac51a6168a6da251a4a8f2a70733d49e6ceb9b3e6ee2f03/aiohttp-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d", size = 1193544 }, - { url = "https://files.pythonhosted.org/packages/7e/4c/93a70f9a4ba1c30183a6dd68bfa79cddbf9a674f162f9c62e823a74a5515/aiohttp-3.10.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7", size = 1193047 }, - { url = "https://files.pythonhosted.org/packages/ff/a3/36a1e23ff00c7a0cd696c5a28db05db25dc42bfc78c508bd78623ff62a4a/aiohttp-3.10.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a", size = 1247201 }, - { url = "https://files.pythonhosted.org/packages/55/ae/95399848557b98bb2c402d640b2276ce3a542b94dba202de5a5a1fe29abe/aiohttp-3.10.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc", size = 1264102 }, - { url = "https://files.pythonhosted.org/packages/38/f5/02e5c72c1b60d7cceb30b982679a26167e84ac029fd35a93dd4da52c50a3/aiohttp-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68", size = 1215760 }, - { url = "https://files.pythonhosted.org/packages/30/17/1463840bad10d02d0439068f37ce5af0b383884b0d5838f46fb027e233bf/aiohttp-3.10.10-cp310-cp310-win32.whl", hash = "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257", size = 362678 }, - { url = "https://files.pythonhosted.org/packages/dd/01/a0ef707d93e867a43abbffee3a2cdf30559910750b9176b891628c7ad074/aiohttp-3.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6", size = 381097 }, - { url = "https://files.pythonhosted.org/packages/72/31/3c351d17596194e5a38ef169a4da76458952b2497b4b54645b9d483cbbb0/aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f", size = 586501 }, - { url = "https://files.pythonhosted.org/packages/a4/a8/a559d09eb08478cdead6b7ce05b0c4a133ba27fcdfa91e05d2e62867300d/aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb", size = 398993 }, - { url = "https://files.pythonhosted.org/packages/c5/47/7736d4174613feef61d25332c3bd1a4f8ff5591fbd7331988238a7299485/aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871", size = 390647 }, - { url = "https://files.pythonhosted.org/packages/27/21/e9ba192a04b7160f5a8952c98a1de7cf8072ad150fa3abd454ead1ab1d7f/aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c", size = 1306481 }, - { url = "https://files.pythonhosted.org/packages/cf/50/f364c01c8d0def1dc34747b2470969e216f5a37c7ece00fe558810f37013/aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38", size = 1344652 }, - { url = "https://files.pythonhosted.org/packages/1d/c2/74f608e984e9b585649e2e83883facad6fa3fc1d021de87b20cc67e8e5ae/aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb", size = 1378498 }, - { url = "https://files.pythonhosted.org/packages/9f/a7/05a48c7c0a7a80a5591b1203bf1b64ca2ed6a2050af918d09c05852dc42b/aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7", size = 1292718 }, - { url = "https://files.pythonhosted.org/packages/7d/78/a925655018747e9790350180330032e27d6e0d7ed30bde545fae42f8c49c/aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911", size = 1251776 }, - { url = "https://files.pythonhosted.org/packages/47/9d/85c6b69f702351d1236594745a4fdc042fc43f494c247a98dac17e004026/aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092", size = 1271716 }, - { url = "https://files.pythonhosted.org/packages/7f/a7/55fc805ff9b14af818903882ece08e2235b12b73b867b521b92994c52b14/aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142", size = 1266263 }, - { url = "https://files.pythonhosted.org/packages/1f/ec/d2be2ca7b063e4f91519d550dbc9c1cb43040174a322470deed90b3d3333/aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9", size = 1321617 }, - { url = "https://files.pythonhosted.org/packages/c9/a3/b29f7920e1cd0a9a68a45dd3eb16140074d2efb1518d2e1f3e140357dc37/aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1", size = 1339227 }, - { url = "https://files.pythonhosted.org/packages/8a/81/34b67235c47e232d807b4bbc42ba9b927c7ce9476872372fddcfd1e41b3d/aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a", size = 1299068 }, - { url = "https://files.pythonhosted.org/packages/04/1f/26a7fe11b6ad3184f214733428353c89ae9fe3e4f605a657f5245c5e720c/aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94", size = 362223 }, - { url = "https://files.pythonhosted.org/packages/10/91/85dcd93f64011434359ce2666bece981f08d31bc49df33261e625b28595d/aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959", size = 381576 }, - { url = "https://files.pythonhosted.org/packages/ae/99/4c5aefe5ad06a1baf206aed6598c7cdcbc7c044c46801cd0d1ecb758cae3/aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c", size = 583536 }, - { url = "https://files.pythonhosted.org/packages/a9/36/8b3bc49b49cb6d2da40ee61ff15dbcc44fd345a3e6ab5bb20844df929821/aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28", size = 395693 }, - { url = "https://files.pythonhosted.org/packages/e1/77/0aa8660dcf11fa65d61712dbb458c4989de220a844bd69778dff25f2d50b/aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f", size = 390898 }, - { url = "https://files.pythonhosted.org/packages/38/d2/b833d95deb48c75db85bf6646de0a697e7fb5d87bd27cbade4f9746b48b1/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138", size = 1312060 }, - { url = "https://files.pythonhosted.org/packages/aa/5f/29fd5113165a0893de8efedf9b4737e0ba92dfcd791415a528f947d10299/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742", size = 1350553 }, - { url = "https://files.pythonhosted.org/packages/ad/cc/f835f74b7d344428469200105236d44606cfa448be1e7c95ca52880d9bac/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7", size = 1392646 }, - { url = "https://files.pythonhosted.org/packages/bf/fe/1332409d845ca601893bbf2d76935e0b93d41686e5f333841c7d7a4a770d/aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16", size = 1306310 }, - { url = "https://files.pythonhosted.org/packages/e4/a1/25a7633a5a513278a9892e333501e2e69c83e50be4b57a62285fb7a008c3/aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8", size = 1260255 }, - { url = "https://files.pythonhosted.org/packages/f2/39/30eafe89e0e2a06c25e4762844c8214c0c0cd0fd9ffc3471694a7986f421/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6", size = 1271141 }, - { url = "https://files.pythonhosted.org/packages/5b/fc/33125df728b48391ef1fcb512dfb02072158cc10d041414fb79803463020/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a", size = 1280244 }, - { url = "https://files.pythonhosted.org/packages/3b/61/e42bf2c2934b5caa4e2ec0b5e5fd86989adb022b5ee60c2572a9d77cf6fe/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9", size = 1316805 }, - { url = "https://files.pythonhosted.org/packages/18/32/f52a5e2ae9ad3bba10e026a63a7a23abfa37c7d97aeeb9004eaa98df3ce3/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a", size = 1343930 }, - { url = "https://files.pythonhosted.org/packages/05/be/6a403b464dcab3631fe8e27b0f1d906d9e45c5e92aca97ee007e5a895560/aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205", size = 1306186 }, - { url = "https://files.pythonhosted.org/packages/8e/fd/bb50fe781068a736a02bf5c7ad5f3ab53e39f1d1e63110da6d30f7605edc/aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628", size = 359289 }, - { url = "https://files.pythonhosted.org/packages/70/9e/5add7e240f77ef67c275c82cc1d08afbca57b77593118c1f6e920ae8ad3f/aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf", size = 379313 }, -] - -[[package]] -name = "aiosignal" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "frozenlist" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ae/67/0952ed97a9793b4958e5736f6d2b346b414a2cd63e82d05940032f45b32f/aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc", size = 19422 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/76/ac/a7305707cb852b7e16ff80eaf5692309bde30e2b1100a1fcacdc8f731d97/aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17", size = 7617 }, + { url = "https://files.pythonhosted.org/packages/d1/d5/0050b2820a1e709ffa623f9a9e8ae42d0903535f2150613cbfeb7f16932a/accelerate-1.1.1-py3-none-any.whl", hash = "sha256:61edd81762131b8d4bede008643fa1e1f3bf59bec710ebda9771443e24feae02", size = 333211 }, ] [[package]] @@ -130,12 +48,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, ] -[[package]] -name = "antlr4-python3-runtime" -version = "4.9.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3e/38/7859ff46355f76f8d19459005ca000b6e7012f2f1ca597746cbcd1fbfe5e/antlr4-python3-runtime-4.9.3.tar.gz", hash = "sha256:f224469b4168294902bb1efa80a8bf7855f24c99aef99cbefc1bcd3cce77881b", size = 117034 } - [[package]] name = "anyio" version = "4.6.2.post1" @@ -163,15 +75,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/39/e3/893e8757be2612e6c266d9bb58ad2e3651524b5b40cf56761e985a28b13e/asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47", size = 23828 }, ] -[[package]] -name = "async-timeout" -version = "4.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/87/d6/21b30a550dafea84b1b8eee21b5e23fa16d010ae006011221f33dcd8d7f8/async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f", size = 8345 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a7/fa/e01228c2938de91d47b307831c62ab9e4001e747789d0b05baf779a6488c/async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028", size = 5721 }, -] - [[package]] name = "attrs" version = "24.2.0" @@ -320,39 +223,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] -[[package]] -name = "cryptography" -version = "43.0.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/69/ec/9fb9dcf4f91f0e5e76de597256c43eedefd8423aa59be95c70c4c3db426a/cryptography-43.0.0.tar.gz", hash = "sha256:b88075ada2d51aa9f18283532c9f60e72170041bba88d7f37e49cbb10275299e", size = 686873 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d3/46/dcd2eb6840b9452e7fbc52720f3dc54a85eb41e68414733379e8f98e3275/cryptography-43.0.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:64c3f16e2a4fc51c0d06af28441881f98c5d91009b8caaff40cf3548089e9c74", size = 6239718 }, - { url = "https://files.pythonhosted.org/packages/e8/23/b0713319edff1d8633775b354f8b34a476e4dd5f4cd4b91e488baec3361a/cryptography-43.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3dcdedae5c7710b9f97ac6bba7e1052b95c7083c9d0e9df96e02a1932e777895", size = 3808466 }, - { url = "https://files.pythonhosted.org/packages/77/9d/0b98c73cebfd41e4fb0439fe9ce08022e8d059f51caa7afc8934fc1edcd9/cryptography-43.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d9a1eca329405219b605fac09ecfc09ac09e595d6def650a437523fcd08dd22", size = 3998060 }, - { url = "https://files.pythonhosted.org/packages/ae/71/e073795d0d1624847f323481f7d84855f699172a632aa37646464b0e1712/cryptography-43.0.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ea9e57f8ea880eeea38ab5abf9fbe39f923544d7884228ec67d666abd60f5a47", size = 3792596 }, - { url = "https://files.pythonhosted.org/packages/83/25/439a8ddd8058e7f898b7d27c36f94b66c8c8a2d60e1855d725845f4be0bc/cryptography-43.0.0-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:9a8d6802e0825767476f62aafed40532bd435e8a5f7d23bd8b4f5fd04cc80ecf", size = 4008355 }, - { url = "https://files.pythonhosted.org/packages/c7/a2/1607f1295eb2c30fcf2c07d7fd0c3772d21dcdb827de2b2730b02df0af51/cryptography-43.0.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cc70b4b581f28d0a254d006f26949245e3657d40d8857066c2ae22a61222ef55", size = 3899133 }, - { url = "https://files.pythonhosted.org/packages/5e/64/f41f42ddc9c583737c9df0093affb92c61de7d5b0d299bf644524afe31c1/cryptography-43.0.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:4a997df8c1c2aae1e1e5ac49c2e4f610ad037fc5a3aadc7b64e39dea42249431", size = 4096946 }, - { url = "https://files.pythonhosted.org/packages/cd/cd/d165adcf3e707d6a049d44ade6ca89973549bed0ab3686fa49efdeefea53/cryptography-43.0.0-cp37-abi3-win32.whl", hash = "sha256:6e2b11c55d260d03a8cf29ac9b5e0608d35f08077d8c087be96287f43af3ccdc", size = 2616826 }, - { url = "https://files.pythonhosted.org/packages/f9/b7/38924229e84c41b0e88d7a5eed8a29d05a44364f85fbb9ddb3984b746fd2/cryptography-43.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:31e44a986ceccec3d0498e16f3d27b2ee5fdf69ce2ab89b52eaad1d2f33d8778", size = 3078700 }, - { url = "https://files.pythonhosted.org/packages/66/d7/397515233e6a861f921bd0365b162b38e0cc513fcf4f1bdd9cc7bc5a3384/cryptography-43.0.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:7b3f5fe74a5ca32d4d0f302ffe6680fcc5c28f8ef0dc0ae8f40c0f3a1b4fca66", size = 6242814 }, - { url = "https://files.pythonhosted.org/packages/58/aa/99b2c00a4f54c60d210d6d1759c720ecf28305aa32d6fb1bb1853f415be6/cryptography-43.0.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac1955ce000cb29ab40def14fd1bbfa7af2017cca696ee696925615cafd0dce5", size = 3809467 }, - { url = "https://files.pythonhosted.org/packages/76/eb/ab783b47b3b9b55371b4361c7ec695144bde1a3343ff2b7a8c1d8fe617bb/cryptography-43.0.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:299d3da8e00b7e2b54bb02ef58d73cd5f55fb31f33ebbf33bd00d9aa6807df7e", size = 3998617 }, - { url = "https://files.pythonhosted.org/packages/a3/62/62770f34290ebb1b6542bd3f13b3b102875b90aed4804e296f8d2a5ac6d7/cryptography-43.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ee0c405832ade84d4de74b9029bedb7b31200600fa524d218fc29bfa371e97f5", size = 3794003 }, - { url = "https://files.pythonhosted.org/packages/0f/6c/b42660b3075ff543065b2c1c5a3d9bedaadcff8ebce2ee981be2babc2934/cryptography-43.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cb013933d4c127349b3948aa8aaf2f12c0353ad0eccd715ca789c8a0f671646f", size = 4008774 }, - { url = "https://files.pythonhosted.org/packages/f7/74/028cea86db9315ba3f991e307adabf9f0aa15067011137c38b2fb2aa16eb/cryptography-43.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fdcb265de28585de5b859ae13e3846a8e805268a823a12a4da2597f1f5afc9f0", size = 3900098 }, - { url = "https://files.pythonhosted.org/packages/bd/f6/e4387edb55563e2546028ba4c634522fe727693d3cdd9ec0ecacedc75411/cryptography-43.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2905ccf93a8a2a416f3ec01b1a7911c3fe4073ef35640e7ee5296754e30b762b", size = 4096867 }, - { url = "https://files.pythonhosted.org/packages/ce/61/55560405e75432bdd9f6cf72fa516cab623b83a3f6d230791bc8fc4afeee/cryptography-43.0.0-cp39-abi3-win32.whl", hash = "sha256:47ca71115e545954e6c1d207dd13461ab81f4eccfcb1345eac874828b5e3eaaf", size = 2616481 }, - { url = "https://files.pythonhosted.org/packages/e6/3d/696e7a0f04555c58a2813d47aaa78cb5ba863c1f453c74a4f45ae772b054/cryptography-43.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:0663585d02f76929792470451a5ba64424acc3cd5227b03921dab0e2f27b1709", size = 3081462 }, - { url = "https://files.pythonhosted.org/packages/c6/3a/9c7d864bbcca2df77a601366a6ae3937cd78d0f21ad98441f3424592aea7/cryptography-43.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c6d112bf61c5ef44042c253e4859b3cbbb50df2f78fa8fae6747a7814484a70", size = 3156882 }, - { url = "https://files.pythonhosted.org/packages/17/cd/d43859b09d726a905d882b6e464ccf02aa2dca2c3e76c44a0c5b169f0144/cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:844b6d608374e7d08f4f6e6f9f7b951f9256db41421917dfb2d003dde4cd6b66", size = 3722095 }, - { url = "https://files.pythonhosted.org/packages/2e/ce/c7b912d95f0ded80ad3b50a0a6b31de813c25d9ffadbe1b26bf22d2c4518/cryptography-43.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:51956cf8730665e2bdf8ddb8da0056f699c1a5715648c1b0144670c1ba00b48f", size = 3928750 }, - { url = "https://files.pythonhosted.org/packages/ca/25/7b53082e4c373127c1fb190f70c5aca7bf7a03ac11f67ba15473bc6d9a0e/cryptography-43.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:aae4d918f6b180a8ab8bf6511a419473d107df4dbb4225c7b48c5c9602c38c7f", size = 3002487 }, -] - [[package]] name = "cytoolz" version = "1.0.0" @@ -467,44 +337,34 @@ wheels = [ ] [[package]] -name = "edge-maxxing-neuron" +name = "edge-maxxing-base" version = "1.0.0" -source = { editable = "../neuron" } +source = { editable = "../base" } dependencies = [ { name = "accelerate" }, { name = "diffusers" }, { name = "edge-maxxing-pipelines" }, { name = "fiber" }, { name = "gitpython" }, - { name = "imagehash" }, - { name = "omegaconf" }, { name = "opencv-python" }, { name = "opentelemetry-instrumentation" }, { name = "pynvml" }, { name = "scikit-image" }, - { name = "toml" }, - { name = "torch" }, - { name = "torchvision" }, { name = "transformers" }, ] [package.metadata] requires-dist = [ - { name = "accelerate", specifier = "==1.1.0" }, - { name = "diffusers", specifier = "==0.31.0" }, + { name = "accelerate", specifier = ">=1.1.1" }, + { name = "diffusers", specifier = ">=0.31.0" }, { name = "edge-maxxing-pipelines", editable = "../pipelines" }, - { name = "fiber", git = "https://github.com/womboai/fiber?rev=weights" }, - { name = "gitpython", specifier = "==3.1.43" }, - { name = "imagehash", specifier = "==4.3.1" }, - { name = "omegaconf", specifier = "==2.3.0" }, - { name = "opencv-python", specifier = "==4.10.0.84" }, + { name = "fiber", git = "https://github.com/rayonlabs/fiber.git?rev=1.0.0" }, + { name = "gitpython", specifier = ">=3.1.43" }, + { name = "opencv-python", specifier = ">=4.10.0.84" }, { name = "opentelemetry-instrumentation", specifier = ">=0.49b2" }, - { name = "pynvml", specifier = "==11.5.3" }, - { name = "scikit-image", specifier = "==0.24.0" }, - { name = "toml", specifier = "==0.10.2" }, - { name = "torch", specifier = "==2.5.1" }, - { name = "torchvision", specifier = "==0.20.1" }, - { name = "transformers", specifier = "==4.46.2" }, + { name = "pynvml", specifier = ">=11.5.3" }, + { name = "scikit-image", specifier = ">=0.24.0" }, + { name = "transformers", specifier = ">=4.46.3" }, ] [package.metadata.requires-dev] @@ -519,18 +379,15 @@ dependencies = [ ] [package.metadata] -requires-dist = [{ name = "pydantic", specifier = ">=2" }] - -[package.metadata.requires-dev] -dev = [{ name = "pytype", specifier = "==2024.10.11" }] +requires-dist = [{ name = "pydantic", specifier = ">=2.9.2" }] [[package]] name = "edge-maxxing-validator" -version = "1.0.0" +version = "5.5.0" source = { editable = "." } dependencies = [ - { name = "aiohttp" }, - { name = "edge-maxxing-neuron" }, + { name = "edge-maxxing-base" }, + { name = "fastapi" }, { name = "opentelemetry-api" }, { name = "opentelemetry-distro" }, { name = "opentelemetry-exporter-otlp" }, @@ -553,9 +410,7 @@ dependencies = [ { name = "opentelemetry-instrumentation-urllib3" }, { name = "opentelemetry-instrumentation-wsgi" }, { name = "opentelemetry-sdk" }, - { name = "safetensors" }, { name = "wandb" }, - { name = "websockets" }, ] [package.dev-dependencies] @@ -565,8 +420,8 @@ dev = [ [package.metadata] requires-dist = [ - { name = "aiohttp", specifier = "==3.10.10" }, - { name = "edge-maxxing-neuron", editable = "../neuron" }, + { name = "edge-maxxing-base", editable = "../base" }, + { name = "fastapi", specifier = ">=0.115.5" }, { name = "opentelemetry-api", specifier = ">=1.28.2" }, { name = "opentelemetry-distro", specifier = ">=0.49b2" }, { name = "opentelemetry-exporter-otlp", specifier = ">=1.28.2" }, @@ -589,9 +444,7 @@ requires-dist = [ { name = "opentelemetry-instrumentation-urllib3", specifier = ">=0.49b2" }, { name = "opentelemetry-instrumentation-wsgi", specifier = ">=0.49b2" }, { name = "opentelemetry-sdk", specifier = ">=1.28.2" }, - { name = "safetensors", specifier = "==0.4.5" }, - { name = "wandb", specifier = "==0.18.5" }, - { name = "websockets", specifier = "==13.1" }, + { name = "wandb", specifier = ">=0.18.7" }, ] [package.metadata.requires-dev] @@ -657,33 +510,29 @@ wheels = [ [[package]] name = "fastapi" -version = "0.112.0" +version = "0.115.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, { name = "starlette" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/0a/50/c535521c0cdb8b78da923bfffca7eb38429828de1770bbd8820b55f3779f/fastapi-0.112.0.tar.gz", hash = "sha256:d262bc56b7d101d1f4e8fc0ad2ac75bb9935fec504d2b7117686cec50710cf05", size = 289904 } +sdist = { url = "https://files.pythonhosted.org/packages/ae/29/f71316b9273b6552a263748e49cd7b83898dc9499a663d30c7b9cb853cb8/fastapi-0.115.5.tar.gz", hash = "sha256:0e7a4d0dc0d01c68df21887cce0945e72d3c48b9f4f79dfe7a7d53aa08fbb289", size = 301047 } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/34/d0dca5f1fc0113723a425c913a886709698c4110f960c0990905804e0b2c/fastapi-0.112.0-py3-none-any.whl", hash = "sha256:3487ded9778006a45834b8c816ec4a48d522e2631ca9e75ec5a774f1b052f821", size = 93135 }, + { url = "https://files.pythonhosted.org/packages/54/c4/148d5046a96c428464557264877ae5a9338a83bbe0df045088749ec89820/fastapi-0.115.5-py3-none-any.whl", hash = "sha256:596b95adbe1474da47049e802f9a65ab2ffa9c2b07e7efee70eb8a66c9f2f796", size = 94866 }, ] [[package]] name = "fiber" -version = "0.0.4" -source = { git = "https://github.com/womboai/fiber?rev=weights#4c72538bb365d1479e9b7ad82916332e1de9fba2" } +version = "1.0.0" +source = { git = "https://github.com/rayonlabs/fiber.git?rev=1.0.0#199d6432b748c2a93c3ee0c34db72418b19c6d7f" } dependencies = [ { name = "colorama" }, - { name = "cryptography" }, { name = "eth-typing" }, - { name = "fastapi" }, - { name = "httpx" }, - { name = "netaddr" }, + { name = "pydantic" }, { name = "python-dotenv" }, { name = "substrate-interface" }, { name = "tenacity" }, - { name = "uvicorn" }, ] [[package]] @@ -695,60 +544,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b9/f8/feced7779d755758a52d1f6635d990b8d98dc0a29fa568bbe0625f18fdf3/filelock-3.16.1-py3-none-any.whl", hash = "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", size = 16163 }, ] -[[package]] -name = "frozenlist" -version = "1.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8f/ed/0f4cec13a93c02c47ec32d81d11c0c1efbadf4a471e3f3ce7cad366cbbd3/frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", size = 39930 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/54/79/29d44c4af36b2b240725dce566b20f63f9b36ef267aaaa64ee7466f4f2f8/frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a", size = 94451 }, - { url = "https://files.pythonhosted.org/packages/47/47/0c999aeace6ead8a44441b4f4173e2261b18219e4ad1fe9a479871ca02fc/frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb", size = 54301 }, - { url = "https://files.pythonhosted.org/packages/8d/60/107a38c1e54176d12e06e9d4b5d755b677d71d1219217cee063911b1384f/frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec", size = 52213 }, - { url = "https://files.pythonhosted.org/packages/17/62/594a6829ac5679c25755362a9dc93486a8a45241394564309641425d3ff6/frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5", size = 240946 }, - { url = "https://files.pythonhosted.org/packages/7e/75/6c8419d8f92c80dd0ee3f63bdde2702ce6398b0ac8410ff459f9b6f2f9cb/frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76", size = 264608 }, - { url = "https://files.pythonhosted.org/packages/88/3e/82a6f0b84bc6fb7e0be240e52863c6d4ab6098cd62e4f5b972cd31e002e8/frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17", size = 261361 }, - { url = "https://files.pythonhosted.org/packages/fd/85/14e5f9ccac1b64ff2f10c927b3ffdf88772aea875882406f9ba0cec8ad84/frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba", size = 231649 }, - { url = "https://files.pythonhosted.org/packages/ee/59/928322800306f6529d1852323014ee9008551e9bb027cc38d276cbc0b0e7/frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d", size = 241853 }, - { url = "https://files.pythonhosted.org/packages/7d/bd/e01fa4f146a6f6c18c5d34cab8abdc4013774a26c4ff851128cd1bd3008e/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2", size = 243652 }, - { url = "https://files.pythonhosted.org/packages/a5/bd/e4771fd18a8ec6757033f0fa903e447aecc3fbba54e3630397b61596acf0/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f", size = 241734 }, - { url = "https://files.pythonhosted.org/packages/21/13/c83821fa5544af4f60c5d3a65d054af3213c26b14d3f5f48e43e5fb48556/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c", size = 260959 }, - { url = "https://files.pythonhosted.org/packages/71/f3/1f91c9a9bf7ed0e8edcf52698d23f3c211d8d00291a53c9f115ceb977ab1/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab", size = 262706 }, - { url = "https://files.pythonhosted.org/packages/4c/22/4a256fdf5d9bcb3ae32622c796ee5ff9451b3a13a68cfe3f68e2c95588ce/frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5", size = 250401 }, - { url = "https://files.pythonhosted.org/packages/af/89/c48ebe1f7991bd2be6d5f4ed202d94960c01b3017a03d6954dd5fa9ea1e8/frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb", size = 45498 }, - { url = "https://files.pythonhosted.org/packages/28/2f/cc27d5f43e023d21fe5c19538e08894db3d7e081cbf582ad5ed366c24446/frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4", size = 51622 }, - { url = "https://files.pythonhosted.org/packages/79/43/0bed28bf5eb1c9e4301003b74453b8e7aa85fb293b31dde352aac528dafc/frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30", size = 94987 }, - { url = "https://files.pythonhosted.org/packages/bb/bf/b74e38f09a246e8abbe1e90eb65787ed745ccab6eaa58b9c9308e052323d/frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5", size = 54584 }, - { url = "https://files.pythonhosted.org/packages/2c/31/ab01375682f14f7613a1ade30149f684c84f9b8823a4391ed950c8285656/frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778", size = 52499 }, - { url = "https://files.pythonhosted.org/packages/98/a8/d0ac0b9276e1404f58fec3ab6e90a4f76b778a49373ccaf6a563f100dfbc/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a", size = 276357 }, - { url = "https://files.pythonhosted.org/packages/ad/c9/c7761084fa822f07dac38ac29f841d4587570dd211e2262544aa0b791d21/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869", size = 287516 }, - { url = "https://files.pythonhosted.org/packages/a1/ff/cd7479e703c39df7bdab431798cef89dc75010d8aa0ca2514c5b9321db27/frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d", size = 283131 }, - { url = "https://files.pythonhosted.org/packages/59/a0/370941beb47d237eca4fbf27e4e91389fd68699e6f4b0ebcc95da463835b/frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45", size = 261320 }, - { url = "https://files.pythonhosted.org/packages/b8/5f/c10123e8d64867bc9b4f2f510a32042a306ff5fcd7e2e09e5ae5100ee333/frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d", size = 274877 }, - { url = "https://files.pythonhosted.org/packages/fa/79/38c505601ae29d4348f21706c5d89755ceded02a745016ba2f58bd5f1ea6/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3", size = 269592 }, - { url = "https://files.pythonhosted.org/packages/19/e2/39f3a53191b8204ba9f0bb574b926b73dd2efba2a2b9d2d730517e8f7622/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a", size = 265934 }, - { url = "https://files.pythonhosted.org/packages/d5/c9/3075eb7f7f3a91f1a6b00284af4de0a65a9ae47084930916f5528144c9dd/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9", size = 283859 }, - { url = "https://files.pythonhosted.org/packages/05/f5/549f44d314c29408b962fa2b0e69a1a67c59379fb143b92a0a065ffd1f0f/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2", size = 287560 }, - { url = "https://files.pythonhosted.org/packages/9d/f8/cb09b3c24a3eac02c4c07a9558e11e9e244fb02bf62c85ac2106d1eb0c0b/frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf", size = 277150 }, - { url = "https://files.pythonhosted.org/packages/37/48/38c2db3f54d1501e692d6fe058f45b6ad1b358d82cd19436efab80cfc965/frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942", size = 45244 }, - { url = "https://files.pythonhosted.org/packages/ca/8c/2ddffeb8b60a4bce3b196c32fcc30d8830d4615e7b492ec2071da801b8ad/frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d", size = 51634 }, - { url = "https://files.pythonhosted.org/packages/79/73/fa6d1a96ab7fd6e6d1c3500700963eab46813847f01ef0ccbaa726181dd5/frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", size = 94026 }, - { url = "https://files.pythonhosted.org/packages/ab/04/ea8bf62c8868b8eada363f20ff1b647cf2e93377a7b284d36062d21d81d1/frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", size = 54150 }, - { url = "https://files.pythonhosted.org/packages/d0/9a/8e479b482a6f2070b26bda572c5e6889bb3ba48977e81beea35b5ae13ece/frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", size = 51927 }, - { url = "https://files.pythonhosted.org/packages/e3/12/2aad87deb08a4e7ccfb33600871bbe8f0e08cb6d8224371387f3303654d7/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a", size = 282647 }, - { url = "https://files.pythonhosted.org/packages/77/f2/07f06b05d8a427ea0060a9cef6e63405ea9e0d761846b95ef3fb3be57111/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", size = 289052 }, - { url = "https://files.pythonhosted.org/packages/bd/9f/8bf45a2f1cd4aa401acd271b077989c9267ae8463e7c8b1eb0d3f561b65e/frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", size = 291719 }, - { url = "https://files.pythonhosted.org/packages/41/d1/1f20fd05a6c42d3868709b7604c9f15538a29e4f734c694c6bcfc3d3b935/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", size = 267433 }, - { url = "https://files.pythonhosted.org/packages/af/f2/64b73a9bb86f5a89fb55450e97cd5c1f84a862d4ff90d9fd1a73ab0f64a5/frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", size = 283591 }, - { url = "https://files.pythonhosted.org/packages/29/e2/ffbb1fae55a791fd6c2938dd9ea779509c977435ba3940b9f2e8dc9d5316/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", size = 273249 }, - { url = "https://files.pythonhosted.org/packages/2e/6e/008136a30798bb63618a114b9321b5971172a5abddff44a100c7edc5ad4f/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", size = 271075 }, - { url = "https://files.pythonhosted.org/packages/ae/f0/4e71e54a026b06724cec9b6c54f0b13a4e9e298cc8db0f82ec70e151f5ce/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", size = 285398 }, - { url = "https://files.pythonhosted.org/packages/4d/36/70ec246851478b1c0b59f11ef8ade9c482ff447c1363c2bd5fad45098b12/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", size = 294445 }, - { url = "https://files.pythonhosted.org/packages/37/e0/47f87544055b3349b633a03c4d94b405956cf2437f4ab46d0928b74b7526/frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", size = 280569 }, - { url = "https://files.pythonhosted.org/packages/f9/7c/490133c160fb6b84ed374c266f42800e33b50c3bbab1652764e6e1fc498a/frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", size = 44721 }, - { url = "https://files.pythonhosted.org/packages/b1/56/4e45136ffc6bdbfa68c29ca56ef53783ef4c2fd395f7cbf99a2624aa9aaa/frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", size = 51329 }, - { url = "https://files.pythonhosted.org/packages/c6/c8/a5be5b7550c10858fcf9b0ea054baccab474da77d37f1e828ce043a3a5d4/frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", size = 11901 }, -] - [[package]] name = "fsspec" version = "2024.10.0" @@ -829,44 +624,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e2/1d/b1250907a727f08de6508d752f367e4b46d113d4eac9eb919ebd9da6a5d6/grpcio-1.68.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bddd04a790b69f7a7385f6a112f46ea0b34c4746f361ebafe9ca0be567c78e9", size = 4390622 }, ] -[[package]] -name = "h11" -version = "0.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, -] - -[[package]] -name = "httpcore" -version = "1.0.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "certifi" }, - { name = "h11" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b6/44/ed0fa6a17845fb033bd885c03e842f08c1b9406c86a2e60ac1ae1b9206a6/httpcore-1.0.6.tar.gz", hash = "sha256:73f6dbd6eb8c21bbf7ef8efad555481853f5f6acdeaff1edb0694289269ee17f", size = 85180 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/06/89/b161908e2f51be56568184aeb4a880fd287178d176fd1c860d2217f41106/httpcore-1.0.6-py3-none-any.whl", hash = "sha256:27b59625743b85577a8c0e10e55b50b5368a4f2cfe8cc7bcfa9cf00829c2682f", size = 78011 }, -] - -[[package]] -name = "httpx" -version = "0.27.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "certifi" }, - { name = "httpcore" }, - { name = "idna" }, - { name = "sniffio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/5c/2d/3da5bdf4408b8b2800061c339f240c1802f2e82d55e50bd39c5a881f47f0/httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5", size = 126413 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/7b/ddacf6dcebb42466abd03f368782142baa82e08fc0c1f8eaa05b4bae87d5/httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5", size = 75590 }, -] - [[package]] name = "huggingface-hub" version = "0.26.2" @@ -894,21 +651,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, ] -[[package]] -name = "imagehash" -version = "4.3.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, - { name = "pillow" }, - { name = "pywavelets" }, - { name = "scipy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/6c/f4/9821fe373a4788bca43f00491b008f930de0b12a60ff631852d1f984b966/ImageHash-4.3.1.tar.gz", hash = "sha256:7038d1b7f9e0585beb3dd8c0a956f02b95a346c0b5f24a9e8cc03ebadaf0aa70", size = 296989 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2d/b4/19a746a986c6e38595fa5947c028b1b8e287773dcad766e648897ad2a4cf/ImageHash-4.3.1-py2.py3-none-any.whl", hash = "sha256:5ad9a5cde14fe255745a8245677293ac0d67f09c330986a351f34b614ba62fb5", size = 296543 }, -] - [[package]] name = "imageio" version = "2.36.0" @@ -924,11 +666,11 @@ wheels = [ [[package]] name = "immutabledict" -version = "4.2.0" +version = "4.2.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/55/f4/710c84db4d77767176342913ac6b25f43aaed6d0a0bdb9168a8d2936d9c7/immutabledict-4.2.0.tar.gz", hash = "sha256:e003fd81aad2377a5a758bf7e1086cf3b70b63e9a5cc2f46bce8d0a2b4727c5f", size = 6165 } +sdist = { url = "https://files.pythonhosted.org/packages/e0/c5/4240186fbabc58fba41bbe17c5f0cd37ffd4c0b85a5029ab104f946df175/immutabledict-4.2.1.tar.gz", hash = "sha256:d91017248981c72eb66c8ff9834e99c2f53562346f23e7f51e7a5ebcf66a3bcc", size = 6228 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e2/13/3cf4ac5b3403f3456e645c4533883ef67b1bb0c72e56b79c707715f57a74/immutabledict-4.2.0-py3-none-any.whl", hash = "sha256:d728b2c2410d698d95e6200237feb50a695584d20289ad3379a439aa3d90baba", size = 4702 }, + { url = "https://files.pythonhosted.org/packages/59/56/25ca7b848164b7d93dbd5fc97dd7751700c93e324fe854afbeb562ee2f98/immutabledict-4.2.1-py3-none-any.whl", hash = "sha256:c56a26ced38c236f79e74af3ccce53772827cef5c3bce7cab33ff2060f756373", size = 4700 }, ] [[package]] @@ -981,31 +723,37 @@ wheels = [ [[package]] name = "libcst" -version = "1.5.0" +version = "1.5.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4d/c4/5577b92173199299e0d32404aa92a156d353d6ec0f74148f6e418e0defef/libcst-1.5.0.tar.gz", hash = "sha256:8478abf21ae3861a073e898d80b822bd56e578886331b33129ba77fec05b8c24", size = 772970 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/85/44/c8f1e0d83bbdabc240c05d5bedddfd4e095a0031b8df473d8eb004f12554/libcst-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:23d0e07fd3ed11480f8993a1e99d58a45f914a711b14f858b8db08ae861a8a34", size = 2112640 }, - { url = "https://files.pythonhosted.org/packages/20/d5/3d5819da92a8f997ecf0b5a77d65865d4d2aa4209b34e32835b555218689/libcst-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d92c5ae2e2dc9356ad7e3d05077d9b7e5065423e45788fd86729c88729e45c6e", size = 2026866 }, - { url = "https://files.pythonhosted.org/packages/74/19/d2ebded5990f2f5ab4c86412df75338b9d8b386fbb5e430669f287bc8d9c/libcst-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96adc45e96476350df6b8a5ddbb1e1d6a83a7eb3f13087e52eb7cd2f9b65bcc7", size = 2203742 }, - { url = "https://files.pythonhosted.org/packages/87/98/d47a9a88df48cc33db7e1219cd7c29bfdfd8d695634f3f2e86ff04bbd58d/libcst-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5978fd60c66794bb60d037b2e6427ea52d032636e84afce32b0f04e1cf500a", size = 2253801 }, - { url = "https://files.pythonhosted.org/packages/b8/ca/7fdcbab8f8e8c46336099af7929d0f0e5873222830010aae0160d16544c1/libcst-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6502aeb11412afc759036160c686be1107eb5a4466db56b207c786b9b4da7c4", size = 2324610 }, - { url = "https://files.pythonhosted.org/packages/24/fb/db7c696b7bf8e295aa9bf37091fbd1bad35e491be44926da2b20907c3452/libcst-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:9cccfc0a78e110c0d0a9d2c6fdeb29feb5274c9157508a8baef7edf352420f6d", size = 2030364 }, - { url = "https://files.pythonhosted.org/packages/b5/82/5b9d1f89bdba4106de6080ab3384157581af4f0b94e04a7150b917b5b945/libcst-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:585b3aa705b3767d717d2100935d8ef557275ecdd3fac81c3e28db0959efb0ea", size = 2112655 }, - { url = "https://files.pythonhosted.org/packages/17/4d/c6ed4323e77717edf3f47af8cabbdd4a7de7983fc5a1cc20130947f65f9d/libcst-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8935dd3393e30c2f97344866a4cb14efe560200e232166a8db1de7865c2ef8b2", size = 2026906 }, - { url = "https://files.pythonhosted.org/packages/eb/ad/10cffc6a69da4320cc75f7f031a48292b61ad5ba0ba94fa9f963cb0b5f67/libcst-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc80ea16c7d44e38f193e4d4ef7ff1e0ba72d8e60e8b61ac6f4c87f070a118bd", size = 2203824 }, - { url = "https://files.pythonhosted.org/packages/e8/88/016b3feb75a3b16896e27691439c3bd493ae7d896bb4e31d6bd4c2e5c20b/libcst-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02be4aab728261bb76d16e77c9a457884cebb60d09c8edee844de43b0e08aff7", size = 2253854 }, - { url = "https://files.pythonhosted.org/packages/69/8e/5a60d53493e259743fd574abe442dd7f3b497ebb58dee168473a03f90d3e/libcst-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a8fcd78be4d9ce3c36d0c5d0bdd384e0c7d5f72970a9e4ebd56070141972b4ad", size = 2324725 }, - { url = "https://files.pythonhosted.org/packages/65/86/ddf0d593f4ef5994f456e00e99a1eb28b661aab5df960034199f4d8bbeb4/libcst-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:52b6aadfe54e3ae52c3b815eaaa17ba4da9ff010d5e8adf6a70697872886dd10", size = 2030364 }, - { url = "https://files.pythonhosted.org/packages/a7/23/9cdb3362ad75490108a03abeaae8d7f7fb0d86586d806102ae9d9690d6b8/libcst-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:83bc5fbe34d33597af1d5ea113dcb9b5dd5afe5a5f4316bac4293464d5e3971a", size = 2108563 }, - { url = "https://files.pythonhosted.org/packages/48/ec/4a1a34c3dbe6d51815700a0c14991f4124f10e82f9959d4fb5a9b0b06c74/libcst-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5f10124bf99a0b075eae136ef0ce06204e5f6b8da4596a9c4853a0663e80ddf3", size = 2024056 }, - { url = "https://files.pythonhosted.org/packages/da/b7/1976377c19f9477267daac2ea8e2d5a72ce12d5b523ff147d404fb7ae74e/libcst-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48e581af6127c5af4c9f483e5986d94f0c6b2366967ee134f0a8eba0aa4c8c12", size = 2199473 }, - { url = "https://files.pythonhosted.org/packages/63/c4/e056f3f34642f294421bd4a4d4b40aeccaf153a456bcb4d7e54f4337143f/libcst-1.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dba93cca0a5c6d771ed444c44d21ce8ea9b277af7036cea3743677aba9fbbb8", size = 2251411 }, - { url = "https://files.pythonhosted.org/packages/e8/d6/574fc6c8b0ca81586ee05f284ef6987730b841b31ce246ef9d3c45f17ec4/libcst-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b5c4d87721a7bab265c202575809b810815ab81d5e2e7a5d4417a087975840", size = 2323144 }, - { url = "https://files.pythonhosted.org/packages/b1/92/5cb62834eec397f4b3218c03acc28b6b8470f87c8dad9e9b0fd738c3948c/libcst-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:b48bf71d52c1e891a0948465a94d9817b5fc1ec1a09603566af90585f3b11948", size = 2029603 }, +sdist = { url = "https://files.pythonhosted.org/packages/27/a6/a19b587108b15d3e0bfa8d0944265809581c8b8e161e22c9c9060afbbf4a/libcst-1.5.1.tar.gz", hash = "sha256:71cb294db84df9e410208009c732628e920111683c2f2b2e0c5b71b98464f365", size = 773387 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/46/468a892cdc218272925c3fc4b3ae81cd81f24eabe29a35ba5d017ee35ee1/libcst-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab83633e61ee91df575a3838b1e73c371f19d4916bf1816554933235553d41ea", size = 2124113 }, + { url = "https://files.pythonhosted.org/packages/8c/b7/b8e7b24629b32e4ba4822e3291c19dc63f2f95fea40230e630ec8df0d3f1/libcst-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b58a49895d95ec1fd34fad041a142d98edf9b51fcaf632337c13befeb4d51c7c", size = 2032570 }, + { url = "https://files.pythonhosted.org/packages/d3/db/1e064189f75bc68091fa4fe5b0b062493384544e47d8d50520d00d7bfe1c/libcst-1.5.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d9ec764aa781ef35ab96b693569ac3dced16df9feb40ee6c274d13e86a1472e", size = 2173960 }, + { url = "https://files.pythonhosted.org/packages/02/86/b03471cae3e8372e8e5350f90645136106bc9780d87bb46939dc68c938b5/libcst-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99bbffd8596d192bc0e844a4cf3c4fc696979d4e20ab1c0774a01768a59b47ed", size = 2264452 }, + { url = "https://files.pythonhosted.org/packages/3b/66/729dcfbf82d64646f11b3875270177ad35057fe1908bc29366a6d530dddb/libcst-1.5.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ec6ee607cfe4cc4cc93e56e0188fdb9e50399d61a1262d58229752946f288f5e", size = 2341370 }, + { url = "https://files.pythonhosted.org/packages/db/23/177ca265dcaf2af4665ca359dd9967f9000dc74fc78fd3b6a231301ab972/libcst-1.5.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:72132756f985a19ef64d702a821099d4afc3544974662772b44cbc55b7279727", size = 2219726 }, + { url = "https://files.pythonhosted.org/packages/48/b9/2b292403ea5343143dfb93ad04da17752db3c77e7796e1f5eee00247b2c3/libcst-1.5.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:40b75bf2d70fc0bc26b1fa73e61bdc46fef59f5c71aedf16128e7c33db8d5e40", size = 2325121 }, + { url = "https://files.pythonhosted.org/packages/f6/57/1d6ee6d1456baa856fe33c07e3f6b76219ba0af7afe51a85b0b016e4d18c/libcst-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:56c944acaa781b8e586df3019374f5cf117054d7fc98f85be1ba84fe810005dc", size = 2031807 }, + { url = "https://files.pythonhosted.org/packages/14/c1/83f7ff3a225ad09527b8d15b410e1bba168bafe0d134d93645b1d8b69859/libcst-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db7711a762b0327b581be5a963908fecd74412bdda34db34553faa521563c22d", size = 2123894 }, + { url = "https://files.pythonhosted.org/packages/5b/70/7b765a0a8db8084703fe408ed1c583c434e99b8ec3e7c6192732a1959eb8/libcst-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aa524bd012aaae1f485fd44490ef5abf708b14d2addc0f06b28de3e4585c4b9e", size = 2032548 }, + { url = "https://files.pythonhosted.org/packages/3c/01/d4111674d3cfe817c12ef79f8d39b2058a3bd8cd01a307a7db62118cd0ed/libcst-1.5.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ffb8135c09e41e8cf710b152c33e9b7f1d0d0b9f242bae0c502eb082fdb1fb", size = 2173948 }, + { url = "https://files.pythonhosted.org/packages/4e/3b/0e7698e7715d2ed44512718dd6f45d5d698498b5c9fa906b4028a369a7f6/libcst-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76a8ac7a84f9b6f678a668bff85b360e0a93fa8d7f25a74a206a28110734bb2a", size = 2264422 }, + { url = "https://files.pythonhosted.org/packages/0d/c4/a76444a28015fb7327cfdbde7d3f88f633e88fce2fe910c7aaa7d4780422/libcst-1.5.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89c808bdb5fa9ca02df41dd234cbb0e9de0d2e0c029c7063d5435a9f6781cc10", size = 2341569 }, + { url = "https://files.pythonhosted.org/packages/54/1c/3f116e3baa47f71929467b404643c09e31af7acb77de8d2b3fe5d1b06212/libcst-1.5.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40fbbaa8b839bfbfa5b300623ca2b6b0768b58bbc31b341afbc99110c9bee232", size = 2219836 }, + { url = "https://files.pythonhosted.org/packages/ea/f7/746b6d91125cf1f398889d1b4488b10cc3df6b35d9762c2131294a1e8217/libcst-1.5.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c7021e3904d8d088c369afc3fe17c279883e583415ef07edacadba76cfbecd27", size = 2325108 }, + { url = "https://files.pythonhosted.org/packages/fc/82/260932412cd9d6c1ac60283889adc18c21ffc55c8b5b63309b95bc277f76/libcst-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:f053a5deb6a214972dbe9fa26ecd8255edb903de084a3d7715bf9e9da8821c50", size = 2031804 }, + { url = "https://files.pythonhosted.org/packages/8f/0c/eac92358d05e75516f15654fb1550c9af165ce5a19f2b8adf44916ebebc4/libcst-1.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:666813950b8637af0c0e96b1ca46f5d5f183d2fe50bbac2186f5b283a99f3529", size = 2122234 }, + { url = "https://files.pythonhosted.org/packages/b3/26/6925af831f039e27eb380ba64448f33aea255ab6ecae6b5deec6ec637197/libcst-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7b58b36022ae77a5a00002854043ae95c03e92f6062ad08473eff326f32efa0", size = 2031324 }, + { url = "https://files.pythonhosted.org/packages/e0/87/1b593bdddcb0d38d2232dab96b1f92deb2481c72063394f0394f680ff5b3/libcst-1.5.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb13d7c598fe9a798a1d22eae56ab3d3d599b38b83436039bd6ae229fc854d7", size = 2172432 }, + { url = "https://files.pythonhosted.org/packages/88/27/966f9fe2652aa496a85503333559937e58979eef674f9803c995d6704c44/libcst-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5987daff8389b0df60b5c20499ff4fb73fc03cb3ae1f6a746eefd204ed08df85", size = 2263445 }, + { url = "https://files.pythonhosted.org/packages/ff/79/f172226edbdd5b3a31d3c270e4407b35e3f5b0c6e404967e42314f1b434e/libcst-1.5.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00f3d2f32ee081bad3394546b0b9ac5e31686d3b5cfe4892d716d2ba65f9ec08", size = 2343044 }, + { url = "https://files.pythonhosted.org/packages/91/f2/664ae80583c66bcc3a2debcc8bab04e6843c3a6ac02e94050dddb5e5909c/libcst-1.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1ff21005c33b634957a98db438e882522febf1cacc62fa716f29e163a3f5871a", size = 2217129 }, + { url = "https://files.pythonhosted.org/packages/8b/df/b6b506d50f0a00a49d4e6217fd521c208cbf8693687cd0ac5880507ca6d1/libcst-1.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:15697ea9f1edbb9a263364d966c72abda07195d1c1a6838eb79af057f1040770", size = 2322129 }, + { url = "https://files.pythonhosted.org/packages/eb/84/9c79a0aa5334f39a86844d32ef474491a817e9eefaa8f23fc81e7ad07d8b/libcst-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:cedd4c8336e01c51913113fbf5566b8f61a86d90f3d5cc5b1cb5049575622c5f", size = 2032278 }, ] [[package]] @@ -1093,72 +841,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3f/76/30d8f152299f65c85c46a2cbeaf95ad1d18516b5ce730acdaef696d4cfe6/msgspec-0.18.6-cp312-cp312-win_amd64.whl", hash = "sha256:1003c20bfe9c6114cc16ea5db9c5466e49fae3d7f5e2e59cb70693190ad34da0", size = 187184 }, ] -[[package]] -name = "multidict" -version = "6.1.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/d6/be/504b89a5e9ca731cd47487e91c469064f8ae5af93b7259758dcfc2b9c848/multidict-6.1.0.tar.gz", hash = "sha256:22ae2ebf9b0c69d206c003e2f6a914ea33f0a932d4aa16f236afc049d9958f4a", size = 64002 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/29/68/259dee7fd14cf56a17c554125e534f6274c2860159692a414d0b402b9a6d/multidict-6.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3380252550e372e8511d49481bd836264c009adb826b23fefcc5dd3c69692f60", size = 48628 }, - { url = "https://files.pythonhosted.org/packages/50/79/53ba256069fe5386a4a9e80d4e12857ced9de295baf3e20c68cdda746e04/multidict-6.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:99f826cbf970077383d7de805c0681799491cb939c25450b9b5b3ced03ca99f1", size = 29327 }, - { url = "https://files.pythonhosted.org/packages/ff/10/71f1379b05b196dae749b5ac062e87273e3f11634f447ebac12a571d90ae/multidict-6.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a114d03b938376557927ab23f1e950827c3b893ccb94b62fd95d430fd0e5cf53", size = 29689 }, - { url = "https://files.pythonhosted.org/packages/71/45/70bac4f87438ded36ad4793793c0095de6572d433d98575a5752629ef549/multidict-6.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1c416351ee6271b2f49b56ad7f308072f6f44b37118d69c2cad94f3fa8a40d5", size = 126639 }, - { url = "https://files.pythonhosted.org/packages/80/cf/17f35b3b9509b4959303c05379c4bfb0d7dd05c3306039fc79cf035bbac0/multidict-6.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6b5d83030255983181005e6cfbac1617ce9746b219bc2aad52201ad121226581", size = 134315 }, - { url = "https://files.pythonhosted.org/packages/ef/1f/652d70ab5effb33c031510a3503d4d6efc5ec93153562f1ee0acdc895a57/multidict-6.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3e97b5e938051226dc025ec80980c285b053ffb1e25a3db2a3aa3bc046bf7f56", size = 129471 }, - { url = "https://files.pythonhosted.org/packages/a6/64/2dd6c4c681688c0165dea3975a6a4eab4944ea30f35000f8b8af1df3148c/multidict-6.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d618649d4e70ac6efcbba75be98b26ef5078faad23592f9b51ca492953012429", size = 124585 }, - { url = "https://files.pythonhosted.org/packages/87/56/e6ee5459894c7e554b57ba88f7257dc3c3d2d379cb15baaa1e265b8c6165/multidict-6.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10524ebd769727ac77ef2278390fb0068d83f3acb7773792a5080f2b0abf7748", size = 116957 }, - { url = "https://files.pythonhosted.org/packages/36/9e/616ce5e8d375c24b84f14fc263c7ef1d8d5e8ef529dbc0f1df8ce71bb5b8/multidict-6.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ff3827aef427c89a25cc96ded1759271a93603aba9fb977a6d264648ebf989db", size = 128609 }, - { url = "https://files.pythonhosted.org/packages/8c/4f/4783e48a38495d000f2124020dc96bacc806a4340345211b1ab6175a6cb4/multidict-6.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06809f4f0f7ab7ea2cabf9caca7d79c22c0758b58a71f9d32943ae13c7ace056", size = 123016 }, - { url = "https://files.pythonhosted.org/packages/3e/b3/4950551ab8fc39862ba5e9907dc821f896aa829b4524b4deefd3e12945ab/multidict-6.1.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f179dee3b863ab1c59580ff60f9d99f632f34ccb38bf67a33ec6b3ecadd0fd76", size = 133542 }, - { url = "https://files.pythonhosted.org/packages/96/4d/f0ce6ac9914168a2a71df117935bb1f1781916acdecbb43285e225b484b8/multidict-6.1.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:aaed8b0562be4a0876ee3b6946f6869b7bcdb571a5d1496683505944e268b160", size = 130163 }, - { url = "https://files.pythonhosted.org/packages/be/72/17c9f67e7542a49dd252c5ae50248607dfb780bcc03035907dafefb067e3/multidict-6.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c8b88a2ccf5493b6c8da9076fb151ba106960a2df90c2633f342f120751a9e7", size = 126832 }, - { url = "https://files.pythonhosted.org/packages/71/9f/72d719e248cbd755c8736c6d14780533a1606ffb3fbb0fbd77da9f0372da/multidict-6.1.0-cp310-cp310-win32.whl", hash = "sha256:4a9cb68166a34117d6646c0023c7b759bf197bee5ad4272f420a0141d7eb03a0", size = 26402 }, - { url = "https://files.pythonhosted.org/packages/04/5a/d88cd5d00a184e1ddffc82aa2e6e915164a6d2641ed3606e766b5d2f275a/multidict-6.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:20b9b5fbe0b88d0bdef2012ef7dee867f874b72528cf1d08f1d59b0e3850129d", size = 28800 }, - { url = "https://files.pythonhosted.org/packages/93/13/df3505a46d0cd08428e4c8169a196131d1b0c4b515c3649829258843dde6/multidict-6.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3efe2c2cb5763f2f1b275ad2bf7a287d3f7ebbef35648a9726e3b69284a4f3d6", size = 48570 }, - { url = "https://files.pythonhosted.org/packages/f0/e1/a215908bfae1343cdb72f805366592bdd60487b4232d039c437fe8f5013d/multidict-6.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7053d3b0353a8b9de430a4f4b4268ac9a4fb3481af37dfe49825bf45ca24156", size = 29316 }, - { url = "https://files.pythonhosted.org/packages/70/0f/6dc70ddf5d442702ed74f298d69977f904960b82368532c88e854b79f72b/multidict-6.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27e5fc84ccef8dfaabb09d82b7d179c7cf1a3fbc8a966f8274fcb4ab2eb4cadb", size = 29640 }, - { url = "https://files.pythonhosted.org/packages/d8/6d/9c87b73a13d1cdea30b321ef4b3824449866bd7f7127eceed066ccb9b9ff/multidict-6.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e2b90b43e696f25c62656389d32236e049568b39320e2735d51f08fd362761b", size = 131067 }, - { url = "https://files.pythonhosted.org/packages/cc/1e/1b34154fef373371fd6c65125b3d42ff5f56c7ccc6bfff91b9b3c60ae9e0/multidict-6.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d83a047959d38a7ff552ff94be767b7fd79b831ad1cd9920662db05fec24fe72", size = 138507 }, - { url = "https://files.pythonhosted.org/packages/fb/e0/0bc6b2bac6e461822b5f575eae85da6aae76d0e2a79b6665d6206b8e2e48/multidict-6.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1a9dd711d0877a1ece3d2e4fea11a8e75741ca21954c919406b44e7cf971304", size = 133905 }, - { url = "https://files.pythonhosted.org/packages/ba/af/73d13b918071ff9b2205fcf773d316e0f8fefb4ec65354bbcf0b10908cc6/multidict-6.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec2abea24d98246b94913b76a125e855eb5c434f7c46546046372fe60f666351", size = 129004 }, - { url = "https://files.pythonhosted.org/packages/74/21/23960627b00ed39643302d81bcda44c9444ebcdc04ee5bedd0757513f259/multidict-6.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4867cafcbc6585e4b678876c489b9273b13e9fff9f6d6d66add5e15d11d926cb", size = 121308 }, - { url = "https://files.pythonhosted.org/packages/8b/5c/cf282263ffce4a596ed0bb2aa1a1dddfe1996d6a62d08842a8d4b33dca13/multidict-6.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b48204e8d955c47c55b72779802b219a39acc3ee3d0116d5080c388970b76e3", size = 132608 }, - { url = "https://files.pythonhosted.org/packages/d7/3e/97e778c041c72063f42b290888daff008d3ab1427f5b09b714f5a8eff294/multidict-6.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8fff389528cad1618fb4b26b95550327495462cd745d879a8c7c2115248e399", size = 127029 }, - { url = "https://files.pythonhosted.org/packages/47/ac/3efb7bfe2f3aefcf8d103e9a7162572f01936155ab2f7ebcc7c255a23212/multidict-6.1.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a7a9541cd308eed5e30318430a9c74d2132e9a8cb46b901326272d780bf2d423", size = 137594 }, - { url = "https://files.pythonhosted.org/packages/42/9b/6c6e9e8dc4f915fc90a9b7798c44a30773dea2995fdcb619870e705afe2b/multidict-6.1.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:da1758c76f50c39a2efd5e9859ce7d776317eb1dd34317c8152ac9251fc574a3", size = 134556 }, - { url = "https://files.pythonhosted.org/packages/1d/10/8e881743b26aaf718379a14ac58572a240e8293a1c9d68e1418fb11c0f90/multidict-6.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c943a53e9186688b45b323602298ab727d8865d8c9ee0b17f8d62d14b56f0753", size = 130993 }, - { url = "https://files.pythonhosted.org/packages/45/84/3eb91b4b557442802d058a7579e864b329968c8d0ea57d907e7023c677f2/multidict-6.1.0-cp311-cp311-win32.whl", hash = "sha256:90f8717cb649eea3504091e640a1b8568faad18bd4b9fcd692853a04475a4b80", size = 26405 }, - { url = "https://files.pythonhosted.org/packages/9f/0b/ad879847ecbf6d27e90a6eabb7eff6b62c129eefe617ea45eae7c1f0aead/multidict-6.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:82176036e65644a6cc5bd619f65f6f19781e8ec2e5330f51aa9ada7504cc1926", size = 28795 }, - { url = "https://files.pythonhosted.org/packages/fd/16/92057c74ba3b96d5e211b553895cd6dc7cc4d1e43d9ab8fafc727681ef71/multidict-6.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b04772ed465fa3cc947db808fa306d79b43e896beb677a56fb2347ca1a49c1fa", size = 48713 }, - { url = "https://files.pythonhosted.org/packages/94/3d/37d1b8893ae79716179540b89fc6a0ee56b4a65fcc0d63535c6f5d96f217/multidict-6.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6180c0ae073bddeb5a97a38c03f30c233e0a4d39cd86166251617d1bbd0af436", size = 29516 }, - { url = "https://files.pythonhosted.org/packages/a2/12/adb6b3200c363062f805275b4c1e656be2b3681aada66c80129932ff0bae/multidict-6.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:071120490b47aa997cca00666923a83f02c7fbb44f71cf7f136df753f7fa8761", size = 29557 }, - { url = "https://files.pythonhosted.org/packages/47/e9/604bb05e6e5bce1e6a5cf80a474e0f072e80d8ac105f1b994a53e0b28c42/multidict-6.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50b3a2710631848991d0bf7de077502e8994c804bb805aeb2925a981de58ec2e", size = 130170 }, - { url = "https://files.pythonhosted.org/packages/7e/13/9efa50801785eccbf7086b3c83b71a4fb501a4d43549c2f2f80b8787d69f/multidict-6.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b58c621844d55e71c1b7f7c498ce5aa6985d743a1a59034c57a905b3f153c1ef", size = 134836 }, - { url = "https://files.pythonhosted.org/packages/bf/0f/93808b765192780d117814a6dfcc2e75de6dcc610009ad408b8814dca3ba/multidict-6.1.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55b6d90641869892caa9ca42ff913f7ff1c5ece06474fbd32fb2cf6834726c95", size = 133475 }, - { url = "https://files.pythonhosted.org/packages/d3/c8/529101d7176fe7dfe1d99604e48d69c5dfdcadb4f06561f465c8ef12b4df/multidict-6.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b820514bfc0b98a30e3d85462084779900347e4d49267f747ff54060cc33925", size = 131049 }, - { url = "https://files.pythonhosted.org/packages/ca/0c/fc85b439014d5a58063e19c3a158a889deec399d47b5269a0f3b6a2e28bc/multidict-6.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a9b09aba0c5b48c53761b7c720aaaf7cf236d5fe394cd399c7ba662d5f9966", size = 120370 }, - { url = "https://files.pythonhosted.org/packages/db/46/d4416eb20176492d2258fbd47b4abe729ff3b6e9c829ea4236f93c865089/multidict-6.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e16bf3e5fc9f44632affb159d30a437bfe286ce9e02754759be5536b169b305", size = 125178 }, - { url = "https://files.pythonhosted.org/packages/5b/46/73697ad7ec521df7de5531a32780bbfd908ded0643cbe457f981a701457c/multidict-6.1.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:76f364861c3bfc98cbbcbd402d83454ed9e01a5224bb3a28bf70002a230f73e2", size = 119567 }, - { url = "https://files.pythonhosted.org/packages/cd/ed/51f060e2cb0e7635329fa6ff930aa5cffa17f4c7f5c6c3ddc3500708e2f2/multidict-6.1.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:820c661588bd01a0aa62a1283f20d2be4281b086f80dad9e955e690c75fb54a2", size = 129822 }, - { url = "https://files.pythonhosted.org/packages/df/9e/ee7d1954b1331da3eddea0c4e08d9142da5f14b1321c7301f5014f49d492/multidict-6.1.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:0e5f362e895bc5b9e67fe6e4ded2492d8124bdf817827f33c5b46c2fe3ffaca6", size = 128656 }, - { url = "https://files.pythonhosted.org/packages/77/00/8538f11e3356b5d95fa4b024aa566cde7a38aa7a5f08f4912b32a037c5dc/multidict-6.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ec660d19bbc671e3a6443325f07263be452c453ac9e512f5eb935e7d4ac28b3", size = 125360 }, - { url = "https://files.pythonhosted.org/packages/be/05/5d334c1f2462d43fec2363cd00b1c44c93a78c3925d952e9a71caf662e96/multidict-6.1.0-cp312-cp312-win32.whl", hash = "sha256:58130ecf8f7b8112cdb841486404f1282b9c86ccb30d3519faf301b2e5659133", size = 26382 }, - { url = "https://files.pythonhosted.org/packages/a3/bf/f332a13486b1ed0496d624bcc7e8357bb8053823e8cd4b9a18edc1d97e73/multidict-6.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:188215fc0aafb8e03341995e7c4797860181562380f81ed0a87ff455b70bf1f1", size = 28529 }, - { url = "https://files.pythonhosted.org/packages/99/b7/b9e70fde2c0f0c9af4cc5277782a89b66d35948ea3369ec9f598358c3ac5/multidict-6.1.0-py3-none-any.whl", hash = "sha256:48e171e52d1c4d33888e529b999e5900356b9ae588c2f09a52dcefb158b27506", size = 10051 }, -] - -[[package]] -name = "netaddr" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/90/188b2a69654f27b221fba92fda7217778208532c962509e959a9cee5229d/netaddr-1.3.0.tar.gz", hash = "sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a", size = 2260504 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/cc/f4fe2c7ce68b92cbf5b2d379ca366e1edae38cccaad00f69f529b460c3ef/netaddr-1.3.0-py3-none-any.whl", hash = "sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe", size = 2262023 }, -] - [[package]] name = "networkx" version = "3.4.2" @@ -1170,24 +852,26 @@ wheels = [ [[package]] name = "ninja" -version = "1.11.1.1" +version = "1.11.1.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/37/2c/d717d13a413d6f7579cdaa1e28e6e2c98de95461549b08d311c8a5bf4c51/ninja-1.11.1.1.tar.gz", hash = "sha256:9d793b08dd857e38d0b6ffe9e6b7145d7c485a42dcfea04905ca0cdb6017cc3c", size = 132392 } +sdist = { url = "https://files.pythonhosted.org/packages/b4/49/4f1a79f99f4c3eb5d22f943bba14832923bb44423254d5089d38a9f6da63/ninja-1.11.1.2.tar.gz", hash = "sha256:4fbd07b2b4232543726abafdd350453a2fabef4527664ca0e491c578aee5f857", size = 129009 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/6e/04ed11bb244039908f6f212cb5f3e97933e238655248e4ce307c1687ba1f/ninja-1.11.1.1-py2.py3-none-macosx_10_9_universal2.macosx_10_9_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:376889c76d87b95b5719fdd61dd7db193aa7fd4432e5d52d2e44e4c497bdbbee", size = 270611 }, - { url = "https://files.pythonhosted.org/packages/2c/52/0e5423311eb9939b6f9354059a6d88a6211eb4fa1c7a4ef303ecee1c1fe0/ninja-1.11.1.1-py2.py3-none-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:ecf80cf5afd09f14dcceff28cb3f11dc90fb97c999c89307aea435889cb66877", size = 324256 }, - { url = "https://files.pythonhosted.org/packages/6d/92/8d7aebd4430ab5ff65df2bfee6d5745f95c004284db2d8ca76dcbfd9de47/ninja-1.11.1.1-py2.py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:84502ec98f02a037a169c4b0d5d86075eaf6afc55e1879003d6cab51ced2ea4b", size = 307194 }, - { url = "https://files.pythonhosted.org/packages/01/c8/96424839fd127b4492229acf50763ed9940d864ca35d17d151934aef1f6f/ninja-1.11.1.1-py2.py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:73b93c14046447c7c5cc892433d4fae65d6364bec6685411cb97a8bcf815f93a", size = 155643 }, - { url = "https://files.pythonhosted.org/packages/6b/fa/5ca8e65a98cdb9a71d4f1e38cac7bd757bbb9555a5aef5a4d293aa890e5c/ninja-1.11.1.1-py2.py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18302d96a5467ea98b68e1cae1ae4b4fb2b2a56a82b955193c637557c7273dbd", size = 179538 }, - { url = "https://files.pythonhosted.org/packages/45/ef/60086f02cbc6882da00a02c81d645cefd8d2d65b01fade41b873d8dd85a2/ninja-1.11.1.1-py2.py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aad34a70ef15b12519946c5633344bc775a7656d789d9ed5fdb0d456383716ef", size = 156217 }, - { url = "https://files.pythonhosted.org/packages/1c/00/2fd13ac6aafdb566f00d6b541101fca54e58ae58bf96c00f9780df019607/ninja-1.11.1.1-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:d491fc8d89cdcb416107c349ad1e3a735d4c4af5e1cb8f5f727baca6350fdaea", size = 372069 }, - { url = "https://files.pythonhosted.org/packages/ad/5d/6e97c8a25167d4867694c7fb0b9bdbc9b096d6479c8e56c5bd41b49613f6/ninja-1.11.1.1-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:7563ce1d9fe6ed5af0b8dd9ab4a214bf4ff1f2f6fd6dc29f480981f0f8b8b249", size = 418859 }, - { url = "https://files.pythonhosted.org/packages/43/78/34af88d753389a9412438d16142c77e587e0d69152faf0bbf99701063dd8/ninja-1.11.1.1-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:9df724344202b83018abb45cb1efc22efd337a1496514e7e6b3b59655be85205", size = 419782 }, - { url = "https://files.pythonhosted.org/packages/3b/74/de0633f8bced3b188942fca64a950e8f2206c60c10c97af465b356ae9b25/ninja-1.11.1.1-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:3e0f9be5bb20d74d58c66cc1c414c3e6aeb45c35b0d0e41e8d739c2c0d57784f", size = 415476 }, - { url = "https://files.pythonhosted.org/packages/9a/f3/3e4a56ff77739d1582749b93497bdebf11e003fbc7a66363ef6c772ebd0a/ninja-1.11.1.1-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:76482ba746a2618eecf89d5253c0d1e4f1da1270d41e9f54dfbd91831b0f6885", size = 379229 }, - { url = "https://files.pythonhosted.org/packages/c5/ee/53df34fcc9c0b1db62b2f2e2c848e28d9354e1c7f0dce029ee50b16ca157/ninja-1.11.1.1-py2.py3-none-win32.whl", hash = "sha256:fa2ba9d74acfdfbfbcf06fad1b8282de8a7a8c481d9dee45c859a8c93fcc1082", size = 265049 }, - { url = "https://files.pythonhosted.org/packages/b6/2f/a3bc50fa63fc4fe9348e15b53dc8c87febfd4e0c660fcf250c4b19a3aa3b/ninja-1.11.1.1-py2.py3-none-win_amd64.whl", hash = "sha256:95da904130bfa02ea74ff9c0116b4ad266174fafb1c707aa50212bc7859aebf1", size = 312958 }, - { url = "https://files.pythonhosted.org/packages/73/2a/f5b7b3b7ecd5cf4e31375580bf5c6a01a328ed1ebdfff90fab463e3f4bc7/ninja-1.11.1.1-py2.py3-none-win_arm64.whl", hash = "sha256:185e0641bde601e53841525c4196278e9aaf4463758da6dd1e752c0a0f54136a", size = 272686 }, + { url = "https://files.pythonhosted.org/packages/2b/e6/097a441e1910399ed536d36258f6d1b5fce6c5caf6c4f0611b41e7a18c3e/ninja-1.11.1.2-py3-none-macosx_10_9_universal2.whl", hash = "sha256:1cfbb845095ea09da8c089375a8f999e75f4817d01506297c66181b533175647", size = 279133 }, + { url = "https://files.pythonhosted.org/packages/7b/87/d33b00c6168915b343fde8877a6852692ba6f7d3ebee07f251a2dc338563/ninja-1.11.1.2-py3-none-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ab4068ff7ff1f895485ad604116165b05d6810c802170a7f22c09dd678d5587d", size = 472101 }, + { url = "https://files.pythonhosted.org/packages/62/54/787bb70e6af2f1b1853af9bab62a5e7cb35b957d72daf253b7f3c653c005/ninja-1.11.1.2-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:33d258809c8eda81f9d80e18a081a6eef3215e5fd1ba8902400d786641994e89", size = 422889 }, + { url = "https://files.pythonhosted.org/packages/27/9f/1a021b766134f4ea91346fbbf7653e17a483242929c9c579b769830bdcd6/ninja-1.11.1.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed25892c16e49e66383a8db6a67a9f33b41230fc485426094d7da51e2255ec2b", size = 157046 }, + { url = "https://files.pythonhosted.org/packages/a8/e3/e05286d374e69272bd0a00517f76effe026207cb07a9d269cc3abdfe4bdd/ninja-1.11.1.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:232767144401847db62e8392047866698bb3678158a1ae4400a97111110e90f2", size = 180014 }, + { url = "https://files.pythonhosted.org/packages/22/b4/0fb29155c05685a8a4d20489b90c340dd781db5c14b5586075fcbdf748e4/ninja-1.11.1.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9200247cf4c1643a67d079836b8dd31a362e34e618b50b5e3a5c0d0171efc442", size = 157099 }, + { url = "https://files.pythonhosted.org/packages/e7/85/d67805c3d47c902f7b1a1a5b75317f4d45af7bb7132c342adf47eafc66b8/ninja-1.11.1.2-py3-none-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0c9c36f6e6f8946c7271b0ed14d98fc3ea467a0c0954fb73f5f656c42667d943", size = 130093 }, + { url = "https://files.pythonhosted.org/packages/eb/40/9a7fc0e417b1aab20f91be957418d2e5952db9f9b72f4396a8a097310964/ninja-1.11.1.2-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:3e815e4147832b17ec38417efcb31df51671ae273f083409304c7cc32a14dd1a", size = 372508 }, + { url = "https://files.pythonhosted.org/packages/0e/db/8c4843e8454e1ec2e6651b5caef31762e46fbaf3a71e6817e7d9cd28b5cb/ninja-1.11.1.2-py3-none-musllinux_1_1_i686.whl", hash = "sha256:ecf3df324b56fdfb0872990a71e706efdae286e010310816c72b6bf24431711b", size = 419368 }, + { url = "https://files.pythonhosted.org/packages/c3/e0/17ccb830c1638966d75a19a59e0ce55aadb4cf5c2cae5bcf97f74511c33e/ninja-1.11.1.2-py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:cb6b476eb4e84c0efcfd3ab04f660dedce8adb854b56b043639312f3af176df6", size = 420305 }, + { url = "https://files.pythonhosted.org/packages/30/e4/7d02c7a633c36a9aa7433fb742931a62f0a3aa72b484ed23d73cc6415286/ninja-1.11.1.2-py3-none-musllinux_1_1_s390x.whl", hash = "sha256:508fb93395a5c82a4d99d30fce0cbaf5cb2bd33e5c1dc9faaa080e199802dbc9", size = 416060 }, + { url = "https://files.pythonhosted.org/packages/0d/11/4dc053f20c64f5a340d72f948bbad22818d242afd54e826e0c95ca3779fe/ninja-1.11.1.2-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:52af7f45750c5c288d566fd0c927ed9bb0d8f2e50803709f582a42bcc4ec167b", size = 379729 }, + { url = "https://files.pythonhosted.org/packages/ab/57/adaa8052ae4854c5f8e228baa1a77aad68093bc1aedf32597fa5e7714118/ninja-1.11.1.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:99fc4b87299242e10d7edd1c7737fdfb1269019e32f9f4267630887f6183a49e", size = 434886 }, + { url = "https://files.pythonhosted.org/packages/41/81/b80ab3c02a2e25f71334e821852856cfc32d1339ccd7fe0858c556d8af4f/ninja-1.11.1.2-py3-none-win32.whl", hash = "sha256:949e23cb2e79a33ea37d23a07d26846d2e75464e8e6940f8751fe964bc141dfa", size = 255983 }, + { url = "https://files.pythonhosted.org/packages/72/97/4109961b899ff2decfc0439de442cbe846c94210f263260a211cbee2b29d/ninja-1.11.1.2-py3-none-win_amd64.whl", hash = "sha256:0bca4179119426a3c3c9d5661c3b244d68781064e50907a1e066bc55edc18e06", size = 296510 }, + { url = "https://files.pythonhosted.org/packages/6d/cc/9deb2b6385c7188ad873ed17afdb5f25931e1c07c8a2e2c452e25cd288e1/ninja-1.11.1.2-py3-none-win_arm64.whl", hash = "sha256:ee7b1924c28e6cab5b866f7b229f07777d25d8cfccbbedf3da5ffb4f72f57877", size = 270558 }, ] [[package]] @@ -1352,19 +1036,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/87/20/199b8713428322a2f22b722c62b8cc278cc53dffa9705d744484b5035ee9/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a", size = 99144 }, ] -[[package]] -name = "omegaconf" -version = "2.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "antlr4-python3-runtime" }, - { name = "pyyaml" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/09/48/6388f1bb9da707110532cb70ec4d2822858ddfb44f1cdf1233c20a80ea4b/omegaconf-2.3.0.tar.gz", hash = "sha256:d5d4b6d29955cc50ad50c46dc269bcd92c6e00f5f90d23ab5fee7bfca4ba4cc7", size = 3298120 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e3/94/1843518e420fa3ed6919835845df698c7e27e183cb997394e4a670973a65/omegaconf-2.3.0-py3-none-any.whl", hash = "sha256:7b4df175cdb08ba400f45cae3bdcae7ba8365db4d165fc65fd04b050ab63b46b", size = 79500 }, -] - [[package]] name = "opencv-python" version = "4.10.0.84" @@ -1820,11 +1491,11 @@ wheels = [ [[package]] name = "packaging" -version = "24.1" +version = "24.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/65/50db4dda066951078f0a96cf12f4b9ada6e4b811516bf0262c0f4f7064d4/packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", size = 148788 } +sdist = { url = "https://files.pythonhosted.org/packages/d0/63/68dbb6eb2de9cb10ee4c9c14a0148804425e13c4fb20d61cce69f53106da/packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f", size = 163950 } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/aa/cc0199a5f0ad350994d660967a8efb233fe0416e4639146c089643407ce6/packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124", size = 53985 }, + { url = "https://files.pythonhosted.org/packages/88/ef/eb23f262cca3c0c4eb7ab1933c3b1f03d021f2c48f54763065b6f0e321be/packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", size = 65451 }, ] [[package]] @@ -1884,63 +1555,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3c/a6/bc1012356d8ece4d66dd75c4b9fc6c1f6650ddd5991e421177d9f8f671be/platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb", size = 18439 }, ] -[[package]] -name = "propcache" -version = "0.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a9/4d/5e5a60b78dbc1d464f8a7bbaeb30957257afdc8512cbb9dfd5659304f5cd/propcache-0.2.0.tar.gz", hash = "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70", size = 40951 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/08/1963dfb932b8d74d5b09098507b37e9b96c835ba89ab8aad35aa330f4ff3/propcache-0.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58", size = 80712 }, - { url = "https://files.pythonhosted.org/packages/e6/59/49072aba9bf8a8ed958e576182d46f038e595b17ff7408bc7e8807e721e1/propcache-0.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b", size = 46301 }, - { url = "https://files.pythonhosted.org/packages/33/a2/6b1978c2e0d80a678e2c483f45e5443c15fe5d32c483902e92a073314ef1/propcache-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110", size = 45581 }, - { url = "https://files.pythonhosted.org/packages/43/95/55acc9adff8f997c7572f23d41993042290dfb29e404cdadb07039a4386f/propcache-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2", size = 208659 }, - { url = "https://files.pythonhosted.org/packages/bd/2c/ef7371ff715e6cd19ea03fdd5637ecefbaa0752fee5b0f2fe8ea8407ee01/propcache-0.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a", size = 222613 }, - { url = "https://files.pythonhosted.org/packages/5e/1c/fef251f79fd4971a413fa4b1ae369ee07727b4cc2c71e2d90dfcde664fbb/propcache-0.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577", size = 221067 }, - { url = "https://files.pythonhosted.org/packages/8d/e7/22e76ae6fc5a1708bdce92bdb49de5ebe89a173db87e4ef597d6bbe9145a/propcache-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850", size = 208920 }, - { url = "https://files.pythonhosted.org/packages/04/3e/f10aa562781bcd8a1e0b37683a23bef32bdbe501d9cc7e76969becaac30d/propcache-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61", size = 200050 }, - { url = "https://files.pythonhosted.org/packages/d0/98/8ac69f638358c5f2a0043809c917802f96f86026e86726b65006830f3dc6/propcache-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37", size = 202346 }, - { url = "https://files.pythonhosted.org/packages/ee/78/4acfc5544a5075d8e660af4d4e468d60c418bba93203d1363848444511ad/propcache-0.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48", size = 199750 }, - { url = "https://files.pythonhosted.org/packages/a2/8f/90ada38448ca2e9cf25adc2fe05d08358bda1b9446f54a606ea38f41798b/propcache-0.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630", size = 201279 }, - { url = "https://files.pythonhosted.org/packages/08/31/0e299f650f73903da851f50f576ef09bfffc8e1519e6a2f1e5ed2d19c591/propcache-0.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394", size = 211035 }, - { url = "https://files.pythonhosted.org/packages/85/3e/e356cc6b09064bff1c06d0b2413593e7c925726f0139bc7acef8a21e87a8/propcache-0.2.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b", size = 215565 }, - { url = "https://files.pythonhosted.org/packages/8b/54/4ef7236cd657e53098bd05aa59cbc3cbf7018fba37b40eaed112c3921e51/propcache-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336", size = 207604 }, - { url = "https://files.pythonhosted.org/packages/1f/27/d01d7799c068443ee64002f0655d82fb067496897bf74b632e28ee6a32cf/propcache-0.2.0-cp310-cp310-win32.whl", hash = "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad", size = 40526 }, - { url = "https://files.pythonhosted.org/packages/bb/44/6c2add5eeafb7f31ff0d25fbc005d930bea040a1364cf0f5768750ddf4d1/propcache-0.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99", size = 44958 }, - { url = "https://files.pythonhosted.org/packages/e0/1c/71eec730e12aec6511e702ad0cd73c2872eccb7cad39de8ba3ba9de693ef/propcache-0.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354", size = 80811 }, - { url = "https://files.pythonhosted.org/packages/89/c3/7e94009f9a4934c48a371632197406a8860b9f08e3f7f7d922ab69e57a41/propcache-0.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de", size = 46365 }, - { url = "https://files.pythonhosted.org/packages/c0/1d/c700d16d1d6903aeab28372fe9999762f074b80b96a0ccc953175b858743/propcache-0.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87", size = 45602 }, - { url = "https://files.pythonhosted.org/packages/2e/5e/4a3e96380805bf742712e39a4534689f4cddf5fa2d3a93f22e9fd8001b23/propcache-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016", size = 236161 }, - { url = "https://files.pythonhosted.org/packages/a5/85/90132481183d1436dff6e29f4fa81b891afb6cb89a7306f32ac500a25932/propcache-0.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb", size = 244938 }, - { url = "https://files.pythonhosted.org/packages/4a/89/c893533cb45c79c970834274e2d0f6d64383ec740be631b6a0a1d2b4ddc0/propcache-0.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2", size = 243576 }, - { url = "https://files.pythonhosted.org/packages/8c/56/98c2054c8526331a05f205bf45cbb2cda4e58e56df70e76d6a509e5d6ec6/propcache-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4", size = 236011 }, - { url = "https://files.pythonhosted.org/packages/2d/0c/8b8b9f8a6e1abd869c0fa79b907228e7abb966919047d294ef5df0d136cf/propcache-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504", size = 224834 }, - { url = "https://files.pythonhosted.org/packages/18/bb/397d05a7298b7711b90e13108db697732325cafdcd8484c894885c1bf109/propcache-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178", size = 224946 }, - { url = "https://files.pythonhosted.org/packages/25/19/4fc08dac19297ac58135c03770b42377be211622fd0147f015f78d47cd31/propcache-0.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d", size = 217280 }, - { url = "https://files.pythonhosted.org/packages/7e/76/c79276a43df2096ce2aba07ce47576832b1174c0c480fe6b04bd70120e59/propcache-0.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2", size = 220088 }, - { url = "https://files.pythonhosted.org/packages/c3/9a/8a8cf428a91b1336b883f09c8b884e1734c87f724d74b917129a24fe2093/propcache-0.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db", size = 233008 }, - { url = "https://files.pythonhosted.org/packages/25/7b/768a8969abd447d5f0f3333df85c6a5d94982a1bc9a89c53c154bf7a8b11/propcache-0.2.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b", size = 237719 }, - { url = "https://files.pythonhosted.org/packages/ed/0d/e5d68ccc7976ef8b57d80613ac07bbaf0614d43f4750cf953f0168ef114f/propcache-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b", size = 227729 }, - { url = "https://files.pythonhosted.org/packages/05/64/17eb2796e2d1c3d0c431dc5f40078d7282f4645af0bb4da9097fbb628c6c/propcache-0.2.0-cp311-cp311-win32.whl", hash = "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1", size = 40473 }, - { url = "https://files.pythonhosted.org/packages/83/c5/e89fc428ccdc897ade08cd7605f174c69390147526627a7650fb883e0cd0/propcache-0.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71", size = 44921 }, - { url = "https://files.pythonhosted.org/packages/7c/46/a41ca1097769fc548fc9216ec4c1471b772cc39720eb47ed7e38ef0006a9/propcache-0.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2", size = 80800 }, - { url = "https://files.pythonhosted.org/packages/75/4f/93df46aab9cc473498ff56be39b5f6ee1e33529223d7a4d8c0a6101a9ba2/propcache-0.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7", size = 46443 }, - { url = "https://files.pythonhosted.org/packages/0b/17/308acc6aee65d0f9a8375e36c4807ac6605d1f38074b1581bd4042b9fb37/propcache-0.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8", size = 45676 }, - { url = "https://files.pythonhosted.org/packages/65/44/626599d2854d6c1d4530b9a05e7ff2ee22b790358334b475ed7c89f7d625/propcache-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793", size = 246191 }, - { url = "https://files.pythonhosted.org/packages/f2/df/5d996d7cb18df076debae7d76ac3da085c0575a9f2be6b1f707fe227b54c/propcache-0.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09", size = 251791 }, - { url = "https://files.pythonhosted.org/packages/2e/6d/9f91e5dde8b1f662f6dd4dff36098ed22a1ef4e08e1316f05f4758f1576c/propcache-0.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89", size = 253434 }, - { url = "https://files.pythonhosted.org/packages/3c/e9/1b54b7e26f50b3e0497cd13d3483d781d284452c2c50dd2a615a92a087a3/propcache-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e", size = 248150 }, - { url = "https://files.pythonhosted.org/packages/a7/ef/a35bf191c8038fe3ce9a414b907371c81d102384eda5dbafe6f4dce0cf9b/propcache-0.2.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9", size = 233568 }, - { url = "https://files.pythonhosted.org/packages/97/d9/d00bb9277a9165a5e6d60f2142cd1a38a750045c9c12e47ae087f686d781/propcache-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4", size = 229874 }, - { url = "https://files.pythonhosted.org/packages/8e/78/c123cf22469bdc4b18efb78893e69c70a8b16de88e6160b69ca6bdd88b5d/propcache-0.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c", size = 225857 }, - { url = "https://files.pythonhosted.org/packages/31/1b/fd6b2f1f36d028820d35475be78859d8c89c8f091ad30e377ac49fd66359/propcache-0.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887", size = 227604 }, - { url = "https://files.pythonhosted.org/packages/99/36/b07be976edf77a07233ba712e53262937625af02154353171716894a86a6/propcache-0.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57", size = 238430 }, - { url = "https://files.pythonhosted.org/packages/0d/64/5822f496c9010e3966e934a011ac08cac8734561842bc7c1f65586e0683c/propcache-0.2.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23", size = 244814 }, - { url = "https://files.pythonhosted.org/packages/fd/bd/8657918a35d50b18a9e4d78a5df7b6c82a637a311ab20851eef4326305c1/propcache-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348", size = 235922 }, - { url = "https://files.pythonhosted.org/packages/a8/6f/ec0095e1647b4727db945213a9f395b1103c442ef65e54c62e92a72a3f75/propcache-0.2.0-cp312-cp312-win32.whl", hash = "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5", size = 40177 }, - { url = "https://files.pythonhosted.org/packages/20/a2/bd0896fdc4f4c1db46d9bc361c8c79a9bf08ccc08ba054a98e38e7ba1557/propcache-0.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3", size = 44446 }, - { url = "https://files.pythonhosted.org/packages/3d/b6/e6d98278f2d49b22b4d033c9f792eda783b9ab2094b041f013fc69bcde87/propcache-0.2.0-py3-none-any.whl", hash = "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036", size = 11603 }, -] - [[package]] name = "protobuf" version = "5.28.3" @@ -1972,39 +1586,58 @@ wheels = [ [[package]] name = "py-bip39-bindings" -version = "0.1.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/8a/5e22cbd00b799b33ce0a45ae3715c9ea3fcd263f877544819e7d03753c49/py_bip39_bindings-0.1.11.tar.gz", hash = "sha256:ebc128ccf3a0750d758557e094802f0975c3760a939f8a8b76392d7dbe6b52a1", size = 18103 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/0c/ab1bb098eaca1954c02ff1ef625817e7580907273d0f10de29eb4bac4f31/py_bip39_bindings-0.1.11-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:324a7363f8b49201ebe1cc72d970017ec5139f8a5ddf605fa2774904eb7f08a1", size = 399429 }, - { url = "https://files.pythonhosted.org/packages/c0/87/3d9903a85f9b5b3d57eb04ec484bf148e12a8dcb255160d3071cabb3861c/py_bip39_bindings-0.1.11-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:77173b83c7ade4ca3c91fae0da9c9b1bc5f4c6819baa2276feacd5abec6005fa", size = 792362 }, - { url = "https://files.pythonhosted.org/packages/09/c1/2bda881db1c8fedc009bdd70db5ec6ccc840331f03726946907b417ce9fe/py_bip39_bindings-0.1.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84e5177fb3d3b9607f5d7d526a89f91b35687fcc34b643fc96cd168a0ae025cb", size = 413986 }, - { url = "https://files.pythonhosted.org/packages/7f/df/32db1f9e09757f292c9d88d487b58cdae741ab4bd1567571725c27d4cbf4/py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ecd1cfb17f0b1bb56f0b1de5c533ff9830a60b5d657846b8cf500ff9fca8b3", size = 1225281 }, - { url = "https://files.pythonhosted.org/packages/c1/0b/b83a9d6d60a5941b1c01ff4df6e4a7994c665f3167038dc26338814d57f1/py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3408dc0809fca5691f9c02c8292d62590d90de4f02a4b2dcab35817fa857a71", size = 1227053 }, - { url = "https://files.pythonhosted.org/packages/50/45/180a09137e318ff1b41e5a7641e383a7a1605876256b915e2761a3b6c8f8/py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_28_armv7l.whl", hash = "sha256:d6f0eda277c6d0ef28cc83fd3f59a0f745394ea1e2807f2fea49186084b3d47d", size = 1180932 }, - { url = "https://files.pythonhosted.org/packages/8d/a9/b63d8cddbcbd31bbfa85475bd286779f56c5c313c84b7cd47f0f60a7c204/py_bip39_bindings-0.1.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:963357db40dc7a816d55097a85929cae18c6174c5bedf0410f6e72181270b2b1", size = 1264074 }, - { url = "https://files.pythonhosted.org/packages/69/86/4702ca3849aeb2730311632937219e6fb6d492ff5aef1bad4c1ef23efb33/py_bip39_bindings-0.1.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:be06dc751be86cbd72cd71e318979d3ab27cee12fd84d1e5e4e84575c5c9355d", size = 1252036 }, - { url = "https://files.pythonhosted.org/packages/66/f5/e39751148880e2d422a609608c228734d2f56f36635ad4958fe2f36417d6/py_bip39_bindings-0.1.11-cp310-none-win32.whl", hash = "sha256:b4e05b06831874fa8715bdb128ea776674ad708858a4b3b1a27e5710859b086d", size = 296768 }, - { url = "https://files.pythonhosted.org/packages/d5/67/fc950648f9ea9c3db6bbd55c3384dd6a5a1814b59948ba5f80b8bee7de96/py_bip39_bindings-0.1.11-cp310-none-win_amd64.whl", hash = "sha256:e01a03e858a648d294bcf063368bf09027efa282f5192abddaf7af69c5e2a574", size = 283551 }, - { url = "https://files.pythonhosted.org/packages/44/b6/0bd5bf1c4cb00e000a9c909280aa7f8654208ee136e2cd1f3650a8de59ed/py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:27cce22727e28705a660464689ade6d2cdad4e622bead5bde2ffa53c4f605ee5", size = 399429 }, - { url = "https://files.pythonhosted.org/packages/22/44/b6ffdc17cc499b72821a1d777fb465af842d5b7373f1825a45dce551fedc/py_bip39_bindings-0.1.11-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:cdf35d031587296dcbdb22dbc67f2eaf5b5df9d5036b77fbeb93affbb9eec8d3", size = 792364 }, - { url = "https://files.pythonhosted.org/packages/15/8d/0883d814a26f922b331218c777ecaec61919aebf9c54d4991f919b21ab8a/py_bip39_bindings-0.1.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2fd5b926686207752d5f2e2ff164a9489b3613239d0967362f10c2fbd64eb018", size = 413967 }, - { url = "https://files.pythonhosted.org/packages/72/30/e3c76035b83c9552bbeee90645411a3d52983067badbd8a5854a823701f9/py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba84c38962bffdaea0e499245731d669cc21d1280f81ace8ff60ed3550024570", size = 1225281 }, - { url = "https://files.pythonhosted.org/packages/38/c9/3b73fe8ffd285387c4fe7b60ccd0072ee16d5153409619c472852ec88acc/py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9024ec3c4a3db005b355f9a00602cede290dec5e9c7cf7dd06a26f620b0cf99", size = 1227054 }, - { url = "https://files.pythonhosted.org/packages/7e/2f/d096e6e08439e5b3c1f41e95c5828700012c130611a64fe9e82a43b0ca45/py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_28_armv7l.whl", hash = "sha256:ce028c8aef51dec2a85f298461b2988cca28740bf3cc23472c3469d3f853714e", size = 1180933 }, - { url = "https://files.pythonhosted.org/packages/0b/8f/00c2239452f26e180229d74acd63ac0c027f8eb9a5fb90b879c6c1192102/py_bip39_bindings-0.1.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:51882cd0fa7529173b3543c089c24c775f1876ddf48f10e60f2ed07ad2af5cae", size = 1264074 }, - { url = "https://files.pythonhosted.org/packages/1a/7a/524e38494a0ffb7ca211225acde0324cf216f081dffae7fd55446b009889/py_bip39_bindings-0.1.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4ee776f3b33b2d71fee48679951f117e3d1f052449ec2fcb184f3c64a4c77e4f", size = 1252039 }, - { url = "https://files.pythonhosted.org/packages/e9/a0/68bbb9e9326266a9acca2558d6556e22df31bcf4d2235ee1cdaf362add82/py_bip39_bindings-0.1.11-cp311-none-win32.whl", hash = "sha256:d8b722e49562810f94eb61c9efa172f327537c74c37da3e86b161f7f444c51bf", size = 296767 }, - { url = "https://files.pythonhosted.org/packages/0a/47/4c5d0ff9949b725696b1b10b5b87f6c6d3c333d8458b354b7c8536272eef/py_bip39_bindings-0.1.11-cp311-none-win_amd64.whl", hash = "sha256:be934052497f07605768e2c7184e4f4269b3e2e77930131dfc9bdbb791e6fdf4", size = 283550 }, - { url = "https://files.pythonhosted.org/packages/cb/a5/0d29c79ee79475ceca80ca19b5975917827af6ce4dd2711ed197822a12ea/py_bip39_bindings-0.1.11-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:afa9c5762cfaec01141f478a9c3132de01ec3890ff2e5a4013c79d3ba3aff8bb", size = 798236 }, - { url = "https://files.pythonhosted.org/packages/47/fd/a4baff5368ef8be569064e5aef1319c4e75b24a80c70c0f3a871727c6a38/py_bip39_bindings-0.1.11-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a3af7c1f955c6bbd613c6b38d022f7c73896acaf0ecc972ac0dee4b952e14568", size = 406227 }, - { url = "https://files.pythonhosted.org/packages/78/44/fe4a107204690d18691a2db7cacfd6043331f6982dc59962d9e220d46711/py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6aed3e86f105a36676e8dd0c8bc3f611a81b7ba4309b22a77fdc0f63b260e094", size = 1215916 }, - { url = "https://files.pythonhosted.org/packages/0d/53/0cbfe92fde6925244280eaed3ede0f16cb498c8764023acc155225d5f9e4/py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d202f051cf063abae3acd0b74454d9d7b1dbeaf466ef7cb47a34ccedac845b62", size = 451663 }, - { url = "https://files.pythonhosted.org/packages/44/9b/4c3c8c6decdc7472323a66e98e1d37c43dcbf798c944791eafeb63ff8411/py_bip39_bindings-0.1.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae120b5542fecf97aa3fdb6a526bac1004cb641bc9cc0d0030c6735dc2156072", size = 1206493 }, - { url = "https://files.pythonhosted.org/packages/94/47/71ed526077a4e58ac4ec5dbb43637faa33cc02a0ada912a3fd8f20c193b9/py_bip39_bindings-0.1.11-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:baf896aabb3bec42803015e010c121c8a3210b20184f37aaa6e400ae8e877e60", size = 483935 }, - { url = "https://files.pythonhosted.org/packages/be/e3/7da98b60d113334e2eb95028289410f8a1771e755fa7ad3de1ae2fa9d951/py_bip39_bindings-0.1.11-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e4d45324c598197dbddac10a0298197ca2587fa7b09d1450697517988a29d515", size = 481093 }, - { url = "https://files.pythonhosted.org/packages/c1/38/d54060bda276a062e2327e169b6660b27beb4f75ab7a9e216dd11b9ae703/py_bip39_bindings-0.1.11-cp312-none-win32.whl", hash = "sha256:92abce265b0f2d8c5830441aff06b7b4f9426088a3de39624b12f3f9ff9fc2eb", size = 296429 }, - { url = "https://files.pythonhosted.org/packages/86/12/256aa92f70a8bdf2a00dc84f6c75c86abadeca1c990e02c8345933889952/py_bip39_bindings-0.1.11-cp312-none-win_amd64.whl", hash = "sha256:6794187229eb0b04d0770f0fba936f0c5c598f552848a398ed5af9a61638cacb", size = 284888 }, +version = "0.1.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/a1/65aeab0f95b64d4f95034b3a6e32a44d156e300c1b00c3c6087235cb4658/py_bip39_bindings-0.1.12.tar.gz", hash = "sha256:56f446e665a4511e9e7dab807a908ca692247a257e141f76633110e3d30e53af", size = 15882 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/c1/e1161b3251975009fabf0e4d67895554ed4612d8416b9d5b060532754d6f/py_bip39_bindings-0.1.12-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:830a1cd07b46f84d07b9807ea1e378e947d95f9f69a1b4acc5012cf2e9336e47", size = 393630 }, + { url = "https://files.pythonhosted.org/packages/98/ae/ed9c88c076944f43f5632f9b748413a6bc25232042732b7a1d186b80f82d/py_bip39_bindings-0.1.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ad84b1ca46329f23c808889d97bd79cc8a2c48e0b9fbf0ecefd16ba8c4e54761", size = 383959 }, + { url = "https://files.pythonhosted.org/packages/d1/47/57b56e586f9c4c6215c13857eb91d7518b7ec2c31b11b6cb0fa0cebf8638/py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3772e233a03a322cd7d6587c393f24a6f98059fbeb723b05c536489671a9ae8a", size = 449117 }, + { url = "https://files.pythonhosted.org/packages/05/88/ed9df4cd6329dd19e87d27f403c0ad6fc7ec20f514aeba168a143aebdf1e/py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f28937f25cc9fcae37992460be1281e8d55973f8998c7d72e7b5047d3ead375a", size = 456616 }, + { url = "https://files.pythonhosted.org/packages/c7/63/5baa949d175fcddaf1722c163f2b450ea3ea8906f3931b03e73efb403db8/py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:332d6340201341dd87b1d5764ba40fd3b011b1f152145104d733c378a2af2970", size = 494949 }, + { url = "https://files.pythonhosted.org/packages/76/d0/11705b72d6b0c50f206d42b8af0bd9f07c3ac373ed36ab3c0779170f8308/py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79daf697315084d1f91e865fae042e067c818c790dfdc6d2e65b8f9d119fc703", size = 457494 }, + { url = "https://files.pythonhosted.org/packages/ca/6a/f7858f0d707a821671d3d59ed79012dafad3a22ec04a6f1044094000ad83/py_bip39_bindings-0.1.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7764520c8b347ff4f3ead955f2044644ab89dc82e61f3bf5b9baa45ff03b389b", size = 472489 }, + { url = "https://files.pythonhosted.org/packages/ec/cf/d51cf3312bbc2ac77ef5928441df0b86a714148956492d88d51192adc8fe/py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:09ca55cde30aea939c86cdadca13d7b500da414070b95fc5bf93ebdb0ec14cd7", size = 631968 }, + { url = "https://files.pythonhosted.org/packages/ed/13/55648daa439408969e3258c4e6fd0bb20998b1ac5ed69f56621926bb23cb/py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6e4e36c2474b946dab0c1019ac38be797073d9336e4735d574cd38cc506e5857", size = 711894 }, + { url = "https://files.pythonhosted.org/packages/5c/62/70f1836c31ad0a0548142e5177f3f20fd6ef5f03481fb0b1a461789f2ea3/py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:534609eef941e401aaba7fc54903e219bbe9bd652d02df1d275f242e28833aa0", size = 637331 }, + { url = "https://files.pythonhosted.org/packages/65/d4/c0873ba047b345ad793834eb96d003c186490a652ab8b52b0e492ef1958a/py_bip39_bindings-0.1.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:260b61bbbed75afe4f5e2caeaefa0d844650c5bcde02dadbd963d73253554475", size = 619105 }, + { url = "https://files.pythonhosted.org/packages/d0/e1/09fe0a4f7e4ded8e373857429758dd8773d5c5f456a46faf6843699cee1a/py_bip39_bindings-0.1.12-cp310-none-win32.whl", hash = "sha256:b13e44670e34e2d28d1856bba82a362ed4b84822c73bdd23f57e941da0f7d489", size = 297595 }, + { url = "https://files.pythonhosted.org/packages/f0/57/616985f9adb6008b174682f1f3c26a8736a689124351677e103c25b97c06/py_bip39_bindings-0.1.12-cp310-none-win_amd64.whl", hash = "sha256:09a1ed423242dccd5016eec18e74c80236d468ef2e85d3297615ddb4e792cd77", size = 287992 }, + { url = "https://files.pythonhosted.org/packages/22/c1/b25c23e06132731f4475e94d1313464af1fd3ade5779a96b8491b187cced/py_bip39_bindings-0.1.12-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:200ce6173c330af830177944d18402b4861f1dd1b52a410a6c02d95f69f04b92", size = 393687 }, + { url = "https://files.pythonhosted.org/packages/59/5e/61c0cad53f737293563d8c1724b79ad949e5eaedcbcbea6918ce893e5682/py_bip39_bindings-0.1.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:808f1042c31e8373bcd56be45fbebbeae2ab2e90b91178bc4d5cfad13f235f34", size = 383994 }, + { url = "https://files.pythonhosted.org/packages/8a/d6/64e8a2d7287499668531034e93459b04bb891c3063e821850b6d901f316d/py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da4c11662304beb093dfaa24f5a3b036d4e76c21de7dafd2bd43d0e78325b377", size = 449261 }, + { url = "https://files.pythonhosted.org/packages/0b/7a/80238608da59e1ec23df49b7cd7891a7a0ef22c3693ff5263783340440bb/py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4af354d2e138304c20fffa0820aa79f9b4ee4de3f1db4e4b77cd0fdf72c39fc2", size = 456701 }, + { url = "https://files.pythonhosted.org/packages/17/82/ee1b319fafa3abd5c9e7c4b9093193bfe645bc4eb9effd97147fe0e5de77/py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a337fd6eaf16bf8c42752d9a25fd58bb303499da5d6428b466eff7ddb642237", size = 494967 }, + { url = "https://files.pythonhosted.org/packages/99/1e/e7c8940e097d99266cb9b5c4c40ca2e52afd27f768b3d1ec0f125b0b2ce1/py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d72041b34d6a7ba5e83009cb96c59c48b356eb3831a0ab627421e1fcdec83c9a", size = 457601 }, + { url = "https://files.pythonhosted.org/packages/ff/28/ec02fc1bf84acbd1595d603cd7c6a2926159175cea3be1166988322190cd/py_bip39_bindings-0.1.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8e48ab058ac4cfdcb6bdaefc8bb555a6d36b11673589332d6336495d388a4902", size = 472536 }, + { url = "https://files.pythonhosted.org/packages/a2/0a/22916b1f8ae4187781ee38acf3470808a1a7b5adc3f435cdd112dbb21189/py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cbd4865d3ef310fbad03197511423376ff8fea162d8d14c4259ee086be249b74", size = 631996 }, + { url = "https://files.pythonhosted.org/packages/67/96/2a3dd14b9b7e07a5624c6cf02c66583e20734e5c5d789fcf9400c9c87bf4/py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:b7eafc0ab28d5835789abc82d2443aec7154c0bca8b627597ab7b4761bb3d8ac", size = 711992 }, + { url = "https://files.pythonhosted.org/packages/ca/df/8d534cc41a699bf0b766aa298704fa44bd981013f9882e0330c2fb70af9e/py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:97e739430d3b7801a4afd0e767c82554b92ba727b52c8c3a1ed9f9b676c176e3", size = 637395 }, + { url = "https://files.pythonhosted.org/packages/dd/d0/ae98b03e8f10ad0793b713b2afa723b74995f5c09dfee9d760dbb41399ed/py_bip39_bindings-0.1.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f6c3a446e7cb339f8d58659bf0bbf8b549482c2eefc37c7573b84150de4423d7", size = 619253 }, + { url = "https://files.pythonhosted.org/packages/9c/f3/d6f5e73456f6bf4001bf67c0e568ab2697d1fc176cf1b0e2fc4fdea0de24/py_bip39_bindings-0.1.12-cp311-none-win32.whl", hash = "sha256:6e9c09a916ac890ea629ad8334b02e43ce7d1887426d74c7c69f82d0820f66db", size = 297592 }, + { url = "https://files.pythonhosted.org/packages/d7/81/3119950191dcc80db45cb7ddce0d1b5fd19bad49ec1e40218e72aaf71c61/py_bip39_bindings-0.1.12-cp311-none-win_amd64.whl", hash = "sha256:f3480cb2e99b7d0ffae676d2d59a844623cee4c73fbed5c9bb3069b9a9845859", size = 287993 }, + { url = "https://files.pythonhosted.org/packages/8d/bb/fc724925bdd20fd70e43a5fc05f39d1ff4b6e63e63b2c992b000d69a4c4e/py_bip39_bindings-0.1.12-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a65facd53ff11314a1e2411fced145daa3a07448c40d8aff87b22dec703d631c", size = 393595 }, + { url = "https://files.pythonhosted.org/packages/53/24/bbd57790c3780dac0d48bff43d78aaefb17aa6793b5d44ec6825e6d700b5/py_bip39_bindings-0.1.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd1490d168409763b846df691e14756c1461b1edf62343ad72c4b1e00918798d", size = 384102 }, + { url = "https://files.pythonhosted.org/packages/a3/c4/1bad1232180de5368ddc08845e72d9bd6eb90ef135708aad08ed5692bb3e/py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21bc7bfb907ebb4805b83f4e674dbe2745dd505d22472eefb65dec09c679a718", size = 449147 }, + { url = "https://files.pythonhosted.org/packages/8f/b8/a4eb574670d0a3840c3a20f5cc2889cec572ad83810067d7fad67e3a98ea/py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1aa1cf5a76ea8280f2f684593f1456d8f459f200f13e7e1c351e27001310ae1", size = 456974 }, + { url = "https://files.pythonhosted.org/packages/d5/4f/b02c27f405f63c729b2bfa392044d5c182126907c360012da47118982aee/py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:950a127bf0a71be0a163bcce16d9cbb227e80da4f12ffcc0effecd9743c806d7", size = 495143 }, + { url = "https://files.pythonhosted.org/packages/7c/6f/d91908e5967198d83993c924660b18c03eb1ea560f6539d9f376ab4b42a3/py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7ad2ed21601f40037e912e87725bb3e3aef1635fdd84eae21d5bbb0034d5727", size = 457718 }, + { url = "https://files.pythonhosted.org/packages/10/1b/ad82b7592294ab909d514838173124b8f302d347ce4c630b7cc37bc652bc/py_bip39_bindings-0.1.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aed015ca58ae7e9912e7cead85feba9ce7ccabd6605d76c436615fbc035278a5", size = 472972 }, + { url = "https://files.pythonhosted.org/packages/6b/7c/430613e33c23b4fd883f582682afdd48eeeeb4f474c8d1e005f858ad8326/py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5f6aab32cd3cc0fd7fb72247bada0cb269c3fc120dbdf12cfa06af1e5d3243", size = 632513 }, + { url = "https://files.pythonhosted.org/packages/4a/20/cd62358b12c07952ffe64688edf2c37558f90785e6f3f050a23ba3798080/py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d4f62d125f9cd9a3bf183d1cc3d0ff794e78185098c61c6392221a00e15dc4c7", size = 712629 }, + { url = "https://files.pythonhosted.org/packages/13/ee/e1752b352c79a42b1af500bb6fe251e41782ce55d7d76be8d40f9f5b7f38/py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:25f3f6ab788d14a56691cbef8ad3345040c358fced832338b81fb87e9951ea5e", size = 638350 }, + { url = "https://files.pythonhosted.org/packages/9f/fa/02c2d18bebe763057b9dffb2d6a5be03f633bc6e3316e9ebeb0ebd40ed22/py_bip39_bindings-0.1.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2fdf3c4d3acbb772c5e90da1f24db39b889d9e69b442925ebe56244a89fc24f9", size = 619254 }, + { url = "https://files.pythonhosted.org/packages/b1/9c/065d10300d3ac983300e398c33261d39935d77908c9a7c6bb4a110c75095/py_bip39_bindings-0.1.12-cp312-none-win32.whl", hash = "sha256:c7af72b8afcac625d69acd40f714963725d8078bee57c36844ae1b924d6490d2", size = 297450 }, + { url = "https://files.pythonhosted.org/packages/52/22/fd753b852d46ef18919df826771a5a7e4c5660e2afb6424510634ce3e454/py_bip39_bindings-0.1.12-cp312-none-win_amd64.whl", hash = "sha256:1dedf9899cb9cc6000373858ea9d7069ff4d961d4c53f6624496ff31fb4398f8", size = 288392 }, + { url = "https://files.pythonhosted.org/packages/71/24/ab48e19a9769d01996a225570f2b1f0600fe0a62adbe77713356ea2de923/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b60e46ecd3bee23f4e458303ace7c86c592cff2d28860808a5e46398f915035a", size = 449305 }, + { url = "https://files.pythonhosted.org/packages/15/14/597ba2bb300c588da62cdcdceba5a5a1d31c35157699c11e8e6dbd7f4c28/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:71afa142cf045b4d7743a96aef66f030342a8f287a83733c6841d3b005954c52", size = 457324 }, + { url = "https://files.pythonhosted.org/packages/e7/8a/115dbfd71a72739b6d6b68a3d2fc2c2e6a5c8ad8ebf20c73f18f1feb1f9d/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c65ba92ec43ef78c5926506437b62d959ac4e343f8bf2cfc8ed799c3a6495f23", size = 494969 }, + { url = "https://files.pythonhosted.org/packages/62/6c/7d50300b72c03ec63af8e1ea997b448ef8cf2f1a9393cb243b3a7dda5289/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf3a5ec5095f56dbf0ab8258d722d860746e807c5ace99ea5ab92000268a750b", size = 457309 }, + { url = "https://files.pythonhosted.org/packages/ae/dc/42ff2c5228a5fa5897a26fa58f2e9973625b91931fb34730057d26fa2ae2/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6232b0b8dfecd73bbc4dc4865f1c0b10d00df63dc19ad7448b5e5e45fdd279e7", size = 472550 }, + { url = "https://files.pythonhosted.org/packages/c4/18/af32c6fda144e053c106b52ef7775035f9ec981bd4987f66bf13c78e14cf/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:fd13f3ba45ea56f2db85a66c1d8b03337ec8977b0a00a02448f4f65112638177", size = 633101 }, + { url = "https://files.pythonhosted.org/packages/81/a9/15fdabfe8d0a9e14d0570e6c2b3d9e6144166dd82d76206f68bae4968c2a/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:bc00a31943d3d6d6a1ab61321d0c14675f4f1452165ab712c90c8368f754648a", size = 712410 }, + { url = "https://files.pythonhosted.org/packages/38/e6/03c897d0c87c48f1d78a1fe15276891f0f603d94665d55aa8d250a250af5/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d9f96bb10320a1ddd354ea639c434cfb1e594d4a1cb9425a476f06fc04aa18d2", size = 638118 }, + { url = "https://files.pythonhosted.org/packages/97/89/d65013ba2cad7eb43e439a4b274b10b208a933e723e71ee390b817966e34/py_bip39_bindings-0.1.12-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e106a1d6d1106cf40a49b3e17748c89fd9561a3aeeb98725dca9ce751c780e16", size = 620020 }, ] [[package]] @@ -2065,38 +1698,58 @@ wheels = [ [[package]] name = "py-sr25519-bindings" -version = "0.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f7/81/3c6f3c6e37f51ec49a3dbf98162a5008c321d8a137b07b3b8521b71bf1b8/py_sr25519_bindings-0.2.0.tar.gz", hash = "sha256:0c2fe92b7cdcebf6c5611a90054f8ba6ea90b68b8832896d2dc565537bc40b0c", size = 19597 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/b9/78cbf176b9da94eaf440443d7f788fa8a524954dd6c08ed52c6709b4a780/py_sr25519_bindings-0.2.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:86cc1a571852a4f2ade827ebf211e066b23ab805d3e864cbe213a3d8cd53f7d5", size = 307576 }, - { url = "https://files.pythonhosted.org/packages/1a/77/5f4902441bce6cfd3f609ccdefa0d6fe1be996ef4937a3bca9f8fc4a0594/py_sr25519_bindings-0.2.0-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:453c9088e39dd04b07bf3ada6c473a5349c4dfd965009a35124b2c807117eda8", size = 610775 }, - { url = "https://files.pythonhosted.org/packages/89/3d/d641c5165b98c861842196380a18049fd67bbdc58146193aa5c6f536c3ec/py_sr25519_bindings-0.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f12122a18b688e4a4bf0e74d3969d9e3f6f83d2b01fe88ab5f19c969e95192a2", size = 581871 }, - { url = "https://files.pythonhosted.org/packages/18/6e/6328c4ec57b94acb6fc72f9aa373776132fa13960b8d5febddd03c15d39f/py_sr25519_bindings-0.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2815ecc958f6edbad79fee76899bd33b8950caa7106c1db08c828ec90e16fa7", size = 1101905 }, - { url = "https://files.pythonhosted.org/packages/cd/e9/ee49788c1aa6736517782b094e5aef27435d43ef7d410ae0fc7c7bd7709a/py_sr25519_bindings-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfe52e73d7f0237820f7a935397d5004733a1d890464701f2c3c71be6033c442", size = 1123248 }, - { url = "https://files.pythonhosted.org/packages/b6/31/b19576a2d3e914d236b1bd542ad3ee20e5c603acb3c1af7dc7f8a76044f8/py_sr25519_bindings-0.2.0-cp310-cp310-manylinux_2_28_armv7l.whl", hash = "sha256:df7e2fad636831919bfa479cd4b6fffdd429cde778da72b1834c1434dadaf982", size = 1115581 }, - { url = "https://files.pythonhosted.org/packages/ec/20/d673c954a7cbb50112e8255ce77ea7721bc81ad24ef66e46300a532e5341/py_sr25519_bindings-0.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f4ebeb2aac26a39160f2fad8ffc40ff98da835af57618c0446637bf182b9c927", size = 1171562 }, - { url = "https://files.pythonhosted.org/packages/69/18/6d2f5476e68f594c8ad0f5d6e0405de01cb0309148456b6481f2432d9b2d/py_sr25519_bindings-0.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:942a6b52e871d6e152dda80a60ed338dccedc69b6375e080e496bf886f2556c0", size = 1130581 }, - { url = "https://files.pythonhosted.org/packages/09/5e/494f4dae3a01612c291710d93e6c7225a19f40f3fca3626be34722507fee/py_sr25519_bindings-0.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b24307c34a06209d0e34ca15ab4c0275617538dfdac1eac8aa25e792fa9f4108", size = 1144892 }, - { url = "https://files.pythonhosted.org/packages/e5/09/827ea815f5759b7c02bfa8b20b5633e7b345986af0aafb89720e9f19630c/py_sr25519_bindings-0.2.0-cp310-none-win32.whl", hash = "sha256:2e06a2d1119a2ad063f11448bb27ec4f4ba77416043d98ae28ef30624cf0e12d", size = 217214 }, - { url = "https://files.pythonhosted.org/packages/61/e7/7291c24825b6e43ba96dc77a3f3ede218bf306f01bcfa5a785b9c92feaee/py_sr25519_bindings-0.2.0-cp310-none-win_amd64.whl", hash = "sha256:16b36d9fe8bda873ab8376f3a4d0894b8d4ab2d702665afc3ab3ca69f0dc9495", size = 198163 }, - { url = "https://files.pythonhosted.org/packages/a5/8f/98250f99cc70184fbed486dae8a3c5622bca643603515cfebd1ff41e7c05/py_sr25519_bindings-0.2.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:54e8c41081a4c23eca4b19f52de2514c48ddec6f49844dff7ad4cfac0bc11712", size = 307576 }, - { url = "https://files.pythonhosted.org/packages/9c/92/717787c821b27867d653026ad56689218e031de29d47e9534acc0f994b07/py_sr25519_bindings-0.2.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:6c73bd1a87849db9cd0e664b2d2e14208183dd8d11ac083d70e688fc28283a71", size = 610780 }, - { url = "https://files.pythonhosted.org/packages/61/ba/c1b80ffdc7c16295f8d1ecf03af2f0ad394dd652f5633dd517d266d0332b/py_sr25519_bindings-0.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47d21382ea24f7f25e72cdddaca2f013ce46cc7983bcfebc611c795cea177eff", size = 1101905 }, - { url = "https://files.pythonhosted.org/packages/59/e6/9691bffadfeb6db2ed86d498b6aa8e6bc139672db526adf0d0c5d94cedaf/py_sr25519_bindings-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c1448cf55bbf6f52d2e24766a8a84ba6d77100a991897e8519711ccd7409830", size = 1123248 }, - { url = "https://files.pythonhosted.org/packages/c4/d6/239bb46109fd88588d8081bd83a1711a18d450cd2da0ad708a86d790687f/py_sr25519_bindings-0.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:392b8b9875c89c9302930ad3d59567b62176f33adeee96a55ff61ba17fb7aac2", size = 1171562 }, - { url = "https://files.pythonhosted.org/packages/1d/ff/6570292df23edf108a8415556a81c374bd609ae82025d5a768d311b05abb/py_sr25519_bindings-0.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7b56b5cbbfb36b41ddfa462989a03386590ac036f3a755ef64fffeb2fed88654", size = 1130583 }, - { url = "https://files.pythonhosted.org/packages/9a/47/88087d43f66de9d421a42830df90de7723b7049206fdec50c6bf4d3e71a3/py_sr25519_bindings-0.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8f06ea3237e06666e3a4ff4719b4fba415472943831b229428753c37d5ecd1b4", size = 1144894 }, - { url = "https://files.pythonhosted.org/packages/57/01/ed81620a93c7339f62fdacba6d6a86c4e11a9f912d4c3b4a036f27167dec/py_sr25519_bindings-0.2.0-cp311-none-win_amd64.whl", hash = "sha256:d62af30b2022f5fa787e46c06823c35a21abe791bf55012f498f9ba8e4baabc8", size = 200379 }, - { url = "https://files.pythonhosted.org/packages/c4/57/4aaeb2dea9e6b0de21f380bded496d95e1851a0d3feb1aa9e8f09610597e/py_sr25519_bindings-0.2.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:ceafa0c31b49f2128461eb2c6ea18dc5d0bfae7218a100be7153f271e46bac49", size = 695813 }, - { url = "https://files.pythonhosted.org/packages/5e/ab/9e894bab69aaeaa7cc52c3e2a77e5ee98e25f89bb00dba8fce79dc103478/py_sr25519_bindings-0.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c8dedb8525556591738a64310875df70ea67886e5a40f2799bd96ef8848936cf", size = 350785 }, - { url = "https://files.pythonhosted.org/packages/1b/2d/bdc61a8271fc871bf22ef215caca5e54e19a8a565b9c403b316860ce549e/py_sr25519_bindings-0.2.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ce149796923696f5cfc6263f135674a14fe2d513fd35b2bfa73226b940aff648", size = 1163591 }, - { url = "https://files.pythonhosted.org/packages/b1/20/8cef884f1d6791cbb0bc5101b949f03ed7b0bc93b0ca30f5352e0a50a82a/py_sr25519_bindings-0.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20d71ca3ba22f98f4c208d509f735fe4eb5aa9e3547a507733a95828adde6cab", size = 371547 }, - { url = "https://files.pythonhosted.org/packages/ca/ab/875e55a22f30e2b58e978355cd6dcd90ec86394f6d30887b58107437e4e7/py_sr25519_bindings-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8e20ee0856e8a60682566df955b81e7631670136607da627ab6892df34790d", size = 1122414 }, - { url = "https://files.pythonhosted.org/packages/73/3d/ebbfe44cd0106c360296a29f0cd9e59831a33dda18d0424c4c0c16465a12/py_sr25519_bindings-0.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0efd5487e3f6d6053cfc4a891b10f729d69263897270d0354f409ee2106fc9b7", size = 404291 }, - { url = "https://files.pythonhosted.org/packages/b4/82/f32f2d5162cf932063b3bb3a499416ae4d6665cdf73d39db90756dc595e8/py_sr25519_bindings-0.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ae7f2164d510458740145d20912d5d7a5c45e8fcde7cebd4057f60811ecc276f", size = 399144 }, - { url = "https://files.pythonhosted.org/packages/ac/32/124d3b0073b3c18be2cb2f15a75bcbb39ced862b8402916bcfc93cc38349/py_sr25519_bindings-0.2.0-cp312-none-win32.whl", hash = "sha256:92382456c6f176c07e0d554c71d483853387885ce17714f8a4b50fdcf7552297", size = 251644 }, - { url = "https://files.pythonhosted.org/packages/7f/ee/7bc554af65df98da93b7357da885299ce77ca65f4731c8c833f70275e418/py_sr25519_bindings-0.2.0-cp312-none-win_amd64.whl", hash = "sha256:48ee4e14a77f815f3996beecb7d7abf422b756e9163ee4df739c1aded8a3e8ba", size = 234175 }, +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/55/e5c27d1387f6cb3a6bf7714e1e0c4a62edc3b006710e2d081e8bdfa4123f/py_sr25519_bindings-0.2.1.tar.gz", hash = "sha256:1b96d3dde43adcf86ab427a9fd72b2c6291dca36eb40747df631588c16f01c1a", size = 18439 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/bc/d9c0e997def0884b81ef2fdea5f3f65fae0974dd60ca0639ff0eb04d5ae2/py_sr25519_bindings-0.2.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:b10489c399768dc4ac91c90a6c8da60aeb77a48b21a81944244d41b0d4c4be2f", size = 331167 }, + { url = "https://files.pythonhosted.org/packages/cd/33/1d9d0345a7c71b6296927f29fb6500e460187c381d7d4fffa57e6ab1f77b/py_sr25519_bindings-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8358a7b3048765008a79733447dfdcafdce3f66859c98634055fee6868252e12", size = 306032 }, + { url = "https://files.pythonhosted.org/packages/68/61/66811bb11031a48c54b7cdfaf75731e86cf136449a10ca3287e9963092bd/py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:202af5a516614907ddaef073104ae6d0a98ec96743d11cb87faa09d2b235a6b4", size = 340111 }, + { url = "https://files.pythonhosted.org/packages/4c/f0/a0cf86f6b424303c1ab51e55470006da83950b39c35716e9206f2260882e/py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f0b0d977c9ba6063d7807dda84264f10b1951736ba528b4d4078e5c9989051b1", size = 367989 }, + { url = "https://files.pythonhosted.org/packages/f5/8d/0053fb7afef406ba3aca08ff51d0c0afc31b3c7a3874c824a92c0a5366e8/py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e6c46cbbb87eb9db3c7deebd71c296d67c0725d9379ee737255e22c15c64bae", size = 384040 }, + { url = "https://files.pythonhosted.org/packages/a6/c6/59ba7e7edb8e496ad8ae2777d102cacb41aae7d5fb05c2ed6972fdd0d55f/py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9368e9ca0bc1c967db0dd5cfc401f23d364064e99a48d21ea12a068612ccce7e", size = 365611 }, + { url = "https://files.pythonhosted.org/packages/8f/ca/30ab71b4357e9380b4bd8ed65338cf9ec36970798fe8b8e0f3273c3aed71/py_sr25519_bindings-0.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9f1ade92569b0281ff24476bd93333865370d86746b2d7949545f1ca70ac4e14", size = 385332 }, + { url = "https://files.pythonhosted.org/packages/15/bc/1846c1600eb2004e49bf7bd07fbfcb73c61b8f17d5ab6478874b1abd0d94/py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7286da1662afc300038441620092a0ae527430f7c50b0768e826d46893dd5095", size = 523820 }, + { url = "https://files.pythonhosted.org/packages/b7/8b/bfd727048597181a83cc43282a61f9d7eebc1aed317e4999c58763cdf1dd/py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1afbf451ecb78d5a1fa3be0f1cafb914aa2d4464ce15374bbff495cc384b1947", size = 627704 }, + { url = "https://files.pythonhosted.org/packages/23/87/fd02d1a53d9287d31ecef4842cfe7df84377a797c297d8497052fa9f5068/py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:873c0ec12fed805f4086e36ebbb673c95af09e4007ea66d5a9bbd2cc29dfa076", size = 551535 }, + { url = "https://files.pythonhosted.org/packages/14/86/7054e137d105de5408c2510c0d457b69756cdd4d4fbdb77aa2ba71b164b8/py_sr25519_bindings-0.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5917f8584cf6a81e32f03547d9fbd8c783db2372d49bd9ff8c5c57d969ea1039", size = 529596 }, + { url = "https://files.pythonhosted.org/packages/b0/ef/6701c33c8f243dfc143e55ead788727b1d99865915fe82e72019dfd16109/py_sr25519_bindings-0.2.1-cp310-none-win32.whl", hash = "sha256:09f184393e01d0d2b62d3782a6d18dd0824a225444e0171c08e03f8cf3920e7b", size = 217893 }, + { url = "https://files.pythonhosted.org/packages/70/9c/bca6f55663f573eee619a2100af35797449362e906316e01b8e5ddb612f2/py_sr25519_bindings-0.2.1-cp310-none-win_amd64.whl", hash = "sha256:2d548a8ea057c6f150572059475761101ba8ef15e3b349d2d0cb108652f6aaf8", size = 224183 }, + { url = "https://files.pythonhosted.org/packages/b7/e5/62067ff055a940bcbb02467f7fb63fd85a89cc12153f8c78199ce5c71fb9/py_sr25519_bindings-0.2.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4941e6e0e180f7e72565043ed3ba7190455c9feaa2ab9ee6038904f2b4bb6c5b", size = 331203 }, + { url = "https://files.pythonhosted.org/packages/0a/6c/48a6e1289012b4ab704ccec5315a7c1f1694909b5cc332a36ec87ab03608/py_sr25519_bindings-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b63d7cf5bb4d9b986d7f7012c80b92be70311dc9b75862f7880e03b71a29543d", size = 306083 }, + { url = "https://files.pythonhosted.org/packages/e6/da/b7ab72a15e950779edf376b344b6de43aacc7250e319ff23996ef96cda5b/py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6752bf3b109446d99f3a368e3ba805812fc5bc09e52ef1c82f5a47e43b19973", size = 340172 }, + { url = "https://files.pythonhosted.org/packages/15/7f/4defee54893a3947936f3b5b8b1fe8cb10bb6d01cf87240345f511636e8d/py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0368dcdf5ec8d2bb9c13273c78c3c5b033211d37a70a2f1d2080f29a7d118340", size = 368044 }, + { url = "https://files.pythonhosted.org/packages/44/a9/b6ddb161bb28f7da1b261d8e6d59d9669a15bdbfe8bfff0ff15f9a28f0a6/py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2618b02b4a3babac07b8bb61fe9550f911f038bb079665682ca76b2e664e5258", size = 384053 }, + { url = "https://files.pythonhosted.org/packages/7a/66/5d4c78ad9766cd46e5439e9fb84cb10bc47b9c4929c8ea99ee880f405f50/py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab1bc4dc524efefaecf3a85f4a0ff05c1ca9509d4d64056199984550f3c98b3", size = 365700 }, + { url = "https://files.pythonhosted.org/packages/07/ef/f96d4e2472af62768ffd81df2170f643de87b0ab831e405a4572b9959379/py_sr25519_bindings-0.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ccdc89d5e3ae0dd163c8150ec76b6bb3291c1cec9746eb79e9544b3423f35f9", size = 385360 }, + { url = "https://files.pythonhosted.org/packages/9e/91/ea5e750e5f2896412fcbbe32da3be8ffab50f4221df7fe3ab367c51a99ac/py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ae6545c414cfa5d7207c9c77aaa576bb374982fb2105a7a9c2764afa5621f6d4", size = 523867 }, + { url = "https://files.pythonhosted.org/packages/7c/d0/e56f6753b264dd4c3f40364879429af7127c8b235c7a2f6d5fbb69137004/py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:7046774e39e0166d3c12632969c9d1713e6ad9ca8206bbe82923ba6935b0a01f", size = 627828 }, + { url = "https://files.pythonhosted.org/packages/63/19/7a8d5cca0a498da55b0457be98f03e428e4981b563e5d1c8c92dfc7d136e/py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cba9a8821176895b080ea761e5ab9cd8727660bf401478a6532a30ae3429573d", size = 551658 }, + { url = "https://files.pythonhosted.org/packages/58/4e/083694bded9ce2d8d598f086aa4ca67f2b9c5d9bfd79ca46f04c95e9322b/py_sr25519_bindings-0.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c31aba05819e5b6b26746dc1b078cf680bd471f135c55e376e95c7774e22e936", size = 529627 }, + { url = "https://files.pythonhosted.org/packages/3d/cc/837b57c938d2b1d0e6f296dc09a3e65b0d762b2387301f8a51452d679391/py_sr25519_bindings-0.2.1-cp311-none-win32.whl", hash = "sha256:d4bfb9c9a5c46563ccf12e74862ee95d2961556ba7aca62c9e4d6e4f7c37b4e0", size = 217894 }, + { url = "https://files.pythonhosted.org/packages/5e/43/3f91ccad4b8d96ddf9a26b00be11de6ad0d260ab26e17ad8f98088512c3a/py_sr25519_bindings-0.2.1-cp311-none-win_amd64.whl", hash = "sha256:4f0d5c065d5e6122e53e771035aa335534363b451358b408d211df1c46773617", size = 224191 }, + { url = "https://files.pythonhosted.org/packages/fa/6f/5dca831fe2617075237d49868d1bd4f025d0dbd23676d7dec3aaf39642cd/py_sr25519_bindings-0.2.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:01ef73c0b3d3f703b54ee69c0f5ff4aa54b4233212c466fd497c7a84d170963a", size = 330633 }, + { url = "https://files.pythonhosted.org/packages/3e/86/569b69e01a962e0c3cd63465e5faad589e54f0c27bfaed5436fef283d56c/py_sr25519_bindings-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7ce8ac85e5ea82825a863f3f6f071e5ead610d7675820eb8ffe772267445ec0b", size = 306030 }, + { url = "https://files.pythonhosted.org/packages/a1/ae/ad0d1fff92966b4ca020abc3ea12e3e1f34c3a937bab28fa0e6bf893d587/py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f59ac8c03c8ef819db063627f4a8247aab0db11d88b21562abbe371612cf66ab", size = 340266 }, + { url = "https://files.pythonhosted.org/packages/b0/7e/93903b1a0789fe1e7f2bb17f4992b55549dfbc8dd8dc3fa4d57c08b72250/py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d2c11fc77b57308e3ada9a40e7c343027129b582d3091ebd992c99b1832ac8c1", size = 367790 }, + { url = "https://files.pythonhosted.org/packages/f4/79/842a46cc48c33ff0d08f95db6b327fdd5972fd68d733634322762dd74702/py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92af2831d6896f0b3fef792d1f2da780fabf6c78dac12535b394cbdb51c0d257", size = 383790 }, + { url = "https://files.pythonhosted.org/packages/0d/33/aeeacf174483ae6163bfb8993c0dabdb15875272e59658123d2dcf55f39a/py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc99f7f310b7641e510810c1d6a6b51792ab2ccefac3ab288445a9fcbc9a8265", size = 365962 }, + { url = "https://files.pythonhosted.org/packages/85/bb/c41e0115115336acad5b05d577bf463fa69975ed84dcf50011ac4e07eb89/py_sr25519_bindings-0.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1dc4995a352a6e5851a41cb0ea37d8c9083d173515b7fd2f381b014f57dc1cda", size = 386028 }, + { url = "https://files.pythonhosted.org/packages/cd/d0/48744d7ec55853dc7ec6889f7b85b4f9d21349f09a9ccc8fd988a67f0a46/py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f103dc5c420057c4447bd6ebf28b2b68ff3ab8da85a5f7ff39c405293de80c78", size = 524320 }, + { url = "https://files.pythonhosted.org/packages/50/4f/9462c0525bd64417c56e788b9543a34c08583bf7eabf81797bf5545b924d/py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:902ee675497b8d356a2abe2abc4278cd76c503f76d06ef2bcd797c1df59e84b7", size = 628052 }, + { url = "https://files.pythonhosted.org/packages/a7/2a/873f8e7425fd424f9d4aa6eddbbe767889d2aee639372fd9516d6b352c93/py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5dd9748f4bd9a3bc4d5c1245f6edcc723075b1470b4c36add4474df4c53604e8", size = 552273 }, + { url = "https://files.pythonhosted.org/packages/0e/e2/bb29457851816c1637bdd7176ac419073faeecf452dcfae54b50ddb81bc1/py_sr25519_bindings-0.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c24bc55699d12948571969c26e65138a942bdaca062171288c40c44b9a4f266", size = 530013 }, + { url = "https://files.pythonhosted.org/packages/4b/70/21d32090ca207738a3979620865e2a48ccbed64871cffafb24c6febe234d/py_sr25519_bindings-0.2.1-cp312-none-win32.whl", hash = "sha256:d4799c9a8f280abdfe564d397bad45da380275c8d22604e059bd7b3d5af404b5", size = 218181 }, + { url = "https://files.pythonhosted.org/packages/bb/df/06a61ef52a6889d6879bfa8a5877688f62854c8eab491ad7af60e797a3ef/py_sr25519_bindings-0.2.1-cp312-none-win_amd64.whl", hash = "sha256:0746befd71d1766d8747910cfeb2cec2be2c859c3b3618eda1dc3cb4a1b85175", size = 224095 }, + { url = "https://files.pythonhosted.org/packages/bf/21/d5a2b0d2b518fa530cd7b08d8906390c9b3eb2476b8d04f3b9eeae848207/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50f8b34fed2c98814dcd414379ef43bf63cd4c05d7d90b83c590cca60fe804d6", size = 340467 }, + { url = "https://files.pythonhosted.org/packages/1e/92/38b9b6ae88eee7ffbe99fd0a577b82ff0ea2b030c92e85696355f1e1f0f4/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:141b0f8fb99cb249984f7c9ec67dd1768aae4d137d47ea0eca027d669503e132", size = 368253 }, + { url = "https://files.pythonhosted.org/packages/d5/c5/90eb85986e929e4e004a5c1f4f1f158bf792426d7ace5a2d59ed3557dc8e/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45cfef18bdfde67d445650a388bfafecbd1844a64c19087e9e4267548998c100", size = 384131 }, + { url = "https://files.pythonhosted.org/packages/31/04/a4575abaaf793836bd43f976288ab637edce45a0e523472d44681a3fe98c/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:639410c0258a543bb84b0518616af724716737054ac5c78daa4d956d17841b17", size = 365591 }, + { url = "https://files.pythonhosted.org/packages/b8/fb/1d32c088d5c297c4c9f6d6887cec43a5f4bb677b058291555cd1ede6d870/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a98e5a395445046f37fc4e365556ce06fa344e3b711de0564ac3fd2b351a1b3e", size = 385688 }, + { url = "https://files.pythonhosted.org/packages/9e/84/f2aa8a575d4dfc9d066dda65f571b814ac662cb81fbacaefd5244bb3df7b/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:7935b79a91aa72db42b5015117018554980c320256e63bc930b8bd148a0765a4", size = 524790 }, + { url = "https://files.pythonhosted.org/packages/33/eb/5f2cba82b804cda52625570875aaea108b9a1c7c01b3ea8a33f34b656420/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:cedf5d0669c23ddab8804982f665c7e99b13e8452db78128f231217b8528c31a", size = 628076 }, + { url = "https://files.pythonhosted.org/packages/c8/87/32b480bc5dfabf8e4ba43ced626d5ce40c0132fbb512ea22fbea63cf6447/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:9ea24db07992f756409729adad1e3ec9aa0a9d4fece5da90768a56ac1563f0f4", size = 552147 }, + { url = "https://files.pythonhosted.org/packages/0b/7f/88d3a788c85727076f512fae958d464f49046cdd9a88958cf39b2b47ceb4/py_sr25519_bindings-0.2.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e8b7e42cd4a5177dd83bbcdef77591fd72d3da02616545011ebcdd872f8cc39d", size = 530561 }, ] [[package]] @@ -2301,41 +1954,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/10/52422fdb5a6b4a04938f47a76c655325775b7dd8cc71bd3557aae87b40e1/pytype-2024.10.11-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb98711679e631b01b09b09185504fbf38d60f119280918e244a602cf843b0fe", size = 4695132 }, ] -[[package]] -name = "pywavelets" -version = "1.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/94/0a/c235e7dd60d136b14cd8793c440e8d22e7880df5588162feb02d6d6118a3/pywavelets-1.7.0.tar.gz", hash = "sha256:b47250e5bb853e37db5db423bafc82847f4cde0ffdf7aebb06336a993bc174f6", size = 3934767 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d4/ef/ab21d4963ff9810e38194a934a45d92145a07b4e491e9e5d91cc5bf87401/pywavelets-1.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d99156b461f914cafbe6ee3b511612a83e90061addbe1f2660f522e9841fbdc4", size = 4320477 }, - { url = "https://files.pythonhosted.org/packages/19/3f/931e03737d6a216b1b390ef9a47191f8dd977484efdde2bca5b87ca5c3b3/pywavelets-1.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:953b877c43f1fa53204b1b0eedd04efa6739378a873e79fa34ee5296d47a9ca1", size = 4289715 }, - { url = "https://files.pythonhosted.org/packages/1d/47/32324220b427b07bfcdfbd88a37ffdacdba8423b219ca4ebd85043c11b91/pywavelets-1.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fc5e0e592678e43c18dd169b0d8471e9a5ffb5eb7ff4bdc8f447c882f78aa8b", size = 4446534 }, - { url = "https://files.pythonhosted.org/packages/d6/60/056374044b41f6e2ccca8239d1c9e422e3906f54c7cd08d55a19d98e2a28/pywavelets-1.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a469a7e73f5ab1d59b52a525a89a4a280426d1ba08eb081261f8bc6775f101d6", size = 4481597 }, - { url = "https://files.pythonhosted.org/packages/0b/16/137ff09a8295ca9beefdd89f7afc97647963f08a62016696d500781cdf98/pywavelets-1.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3740c84de06fab5081c8f08994f12f9ee94dc2eb4d818eaeace3bdb0b838e2fc", size = 4473799 }, - { url = "https://files.pythonhosted.org/packages/28/49/a16de31134a4161eb017b9b330a5f334bd62edabb70def6b8e17d4247a5e/pywavelets-1.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1a550fdbe134040c04f1bb46cfe13a1a903c5dce13090b681106e4db99feba81", size = 4516569 }, - { url = "https://files.pythonhosted.org/packages/45/54/85649111f4ccadf45edbec3bee4ab0380b38cb2bf0067214b14800e3b873/pywavelets-1.7.0-cp310-cp310-win32.whl", hash = "sha256:d5fc7fbad53379c30b2c9d46c235130a4b96e0597653e32e7680a310da06bd07", size = 4178657 }, - { url = "https://files.pythonhosted.org/packages/ce/d1/91298a86da6680aad9064b0b18475fd224ca47ff6646823a920addcabfff/pywavelets-1.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:0b37212b7524438f694cb619cc4a0a3dc54ad77b63a18d0e8e6364f525fffd91", size = 4250753 }, - { url = "https://files.pythonhosted.org/packages/df/30/4ab2547017bd6af02d916ce87e7fc55d08dbfe466b0440bea79a71b16ae4/pywavelets-1.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:392553248aed33eac6f38647acacdba94dd6a8f283319c2d9852de7a871d6d0f", size = 4315611 }, - { url = "https://files.pythonhosted.org/packages/1e/77/b2c9976cbc7c378c72a8e7cff08a2ed49e26ef58e1a8fcaa523aadae5419/pywavelets-1.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae3ae86ba69d75327b1c5cd368138fb9329bc7eb7418d6b0ce9504c5070974ef", size = 4286338 }, - { url = "https://files.pythonhosted.org/packages/7c/bd/e65c7d3a8e7e7b79ee77499fc1637c65c738c458a7f6469433b6050935c4/pywavelets-1.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d81d2486e4f9b65f7c6cab252f3e706c8e8e72bbd0311f72c1a5ec56c947d257", size = 4446349 }, - { url = "https://files.pythonhosted.org/packages/45/e9/3a047a49a6fd0917ba3e436ff93825f8cecc3cb55720d798bc71433a5433/pywavelets-1.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05dc2930cf9b7f61a24b2fe52b18e9d6046012fc46fc360355222781a95a1378", size = 4482899 }, - { url = "https://files.pythonhosted.org/packages/05/e8/63037524d8cc82f0fee1b744f41eaee9a8bd93c80de9b437a179fb258f0a/pywavelets-1.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8565de589f42283bca17ddca298f1188a26ef8ee75cadc4a4744cadf5a79cfdf", size = 4486261 }, - { url = "https://files.pythonhosted.org/packages/9f/70/1e83a42a4084de2f3440a7af79adec69e52e679b13eb0ff8d787af330037/pywavelets-1.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8bdab6b1781f01c087c54782d656a4fc1df77796c241f122445adcbb24892839", size = 4516539 }, - { url = "https://files.pythonhosted.org/packages/e7/14/1c197e0f2f657fd18c6db0281377ac8928abf232ab954a44efce82048670/pywavelets-1.7.0-cp311-cp311-win32.whl", hash = "sha256:c7b47d94aefe6e03085f4d9ce74f6133741164d470ac2839af9906686c6c2ed1", size = 4176201 }, - { url = "https://files.pythonhosted.org/packages/81/49/ba85ea2acf08a113a17da37e6b8cdaa432ad3946fe6cc480fe98f20b5231/pywavelets-1.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e3c8c0fa44f4de7bf05c5d12883b227aaf6dcf46deb3f6f5a9fa5bb79c33283", size = 4251738 }, - { url = "https://files.pythonhosted.org/packages/72/48/b6dbb1124bfa15e2d16dc2c199562d0a9c3d7e7333348b29d05f68cdf146/pywavelets-1.7.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:badb7dc70ecd8042ddd98fdd41803d5e5b28bf7c90910bb1751906812326ab54", size = 4317328 }, - { url = "https://files.pythonhosted.org/packages/9c/cf/b5b1706d7054d792bdf678c894f4ad8f8cdaa789f82b7eaa48b80aa45ba0/pywavelets-1.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:74e838e0225783f37ae346e60a9f783b4a31adc5731b9cb6d687ee5c93bd87b7", size = 4287220 }, - { url = "https://files.pythonhosted.org/packages/05/a3/90cad7bfbd765f39bcd96af3efdefcf6fd05a49b7e81fc281f1be7a8e637/pywavelets-1.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ad14d8b5a412a621406276b8ae8ee1e369ba7a7f8e517fb87355bcb8106820f", size = 4420514 }, - { url = "https://files.pythonhosted.org/packages/53/b6/08d5ea524a5ed25e1f94fba428ac605f0f774bea4a8cf14dbdc7947a2bc5/pywavelets-1.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0bd2611076f5d2c4ad940421bbb3c450b6a53d8ca24bde02662455dc67c70dac", size = 4453780 }, - { url = "https://files.pythonhosted.org/packages/f3/34/ad1502dc37295249000d3644c5bd183f5c063e9cebb3a37a9422121d77c1/pywavelets-1.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:40ebb994b332d48db3b0564e3c335c4f8ba236283939f5167de099766cf16517", size = 4448531 }, - { url = "https://files.pythonhosted.org/packages/f5/52/8e756c9783e7e7c43058cc3e9e9633935206ac77ff13580d489669d84b98/pywavelets-1.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a2a8cc39901f09d82fc94007026f9aed63876e334ae043eb26caa601aee2551", size = 4477268 }, - { url = "https://files.pythonhosted.org/packages/ce/74/15942502ec146c0e06d3f62ebeeeb2cfa873b57413a44238171cc3658387/pywavelets-1.7.0-cp312-cp312-win32.whl", hash = "sha256:0cd599c78fc240cbadb63344d73912fc79e8dccbb0db8a8bd5143df400c3a519", size = 4171601 }, - { url = "https://files.pythonhosted.org/packages/d6/bf/dc8836f983876a43cb15791f0ff15dab6631f423ca6ba55c068d8764ddf8/pywavelets-1.7.0-cp312-cp312-win_amd64.whl", hash = "sha256:29a912c074977db6adf3782dfbd414945805039b755d0c23979bc823f1b4e9c3", size = 4247115 }, -] - [[package]] name = "pyyaml" version = "6.0.2" @@ -2373,56 +1991,56 @@ wheels = [ [[package]] name = "regex" -version = "2024.9.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f9/38/148df33b4dbca3bd069b963acab5e0fa1a9dbd6820f8c322d0dd6faeff96/regex-2024.9.11.tar.gz", hash = "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd", size = 399403 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/63/12/497bd6599ce8a239ade68678132296aec5ee25ebea45fc8ba91aa60fceec/regex-2024.9.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408", size = 482488 }, - { url = "https://files.pythonhosted.org/packages/c1/24/595ddb9bec2a9b151cdaf9565b0c9f3da9f0cb1dca6c158bc5175332ddf8/regex-2024.9.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d", size = 287443 }, - { url = "https://files.pythonhosted.org/packages/69/a8/b2fb45d9715b1469383a0da7968f8cacc2f83e9fbbcd6b8713752dd980a6/regex-2024.9.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5", size = 284561 }, - { url = "https://files.pythonhosted.org/packages/88/87/1ce4a5357216b19b7055e7d3b0efc75a6e426133bf1e7d094321df514257/regex-2024.9.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c", size = 783177 }, - { url = "https://files.pythonhosted.org/packages/3c/65/b9f002ab32f7b68e7d1dcabb67926f3f47325b8dbc22cc50b6a043e1d07c/regex-2024.9.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8", size = 823193 }, - { url = "https://files.pythonhosted.org/packages/22/91/8339dd3abce101204d246e31bc26cdd7ec07c9f91598472459a3a902aa41/regex-2024.9.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35", size = 809950 }, - { url = "https://files.pythonhosted.org/packages/cb/19/556638aa11c2ec9968a1da998f07f27ec0abb9bf3c647d7c7985ca0b8eea/regex-2024.9.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71", size = 782661 }, - { url = "https://files.pythonhosted.org/packages/d1/e9/7a5bc4c6ef8d9cd2bdd83a667888fc35320da96a4cc4da5fa084330f53db/regex-2024.9.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8", size = 772348 }, - { url = "https://files.pythonhosted.org/packages/f1/0b/29f2105bfac3ed08e704914c38e93b07c784a6655f8a015297ee7173e95b/regex-2024.9.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a", size = 697460 }, - { url = "https://files.pythonhosted.org/packages/71/3a/52ff61054d15a4722605f5872ad03962b319a04c1ebaebe570b8b9b7dde1/regex-2024.9.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d", size = 769151 }, - { url = "https://files.pythonhosted.org/packages/97/07/37e460ab5ca84be8e1e197c3b526c5c86993dcc9e13cbc805c35fc2463c1/regex-2024.9.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137", size = 777478 }, - { url = "https://files.pythonhosted.org/packages/65/7b/953075723dd5ab00780043ac2f9de667306ff9e2a85332975e9f19279174/regex-2024.9.11-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6", size = 845373 }, - { url = "https://files.pythonhosted.org/packages/40/b8/3e9484c6230b8b6e8f816ab7c9a080e631124991a4ae2c27a81631777db0/regex-2024.9.11-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca", size = 845369 }, - { url = "https://files.pythonhosted.org/packages/b7/99/38434984d912edbd2e1969d116257e869578f67461bd7462b894c45ed874/regex-2024.9.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a", size = 773935 }, - { url = "https://files.pythonhosted.org/packages/ab/67/43174d2b46fa947b7b9dfe56b6c8a8a76d44223f35b1d64645a732fd1d6f/regex-2024.9.11-cp310-cp310-win32.whl", hash = "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0", size = 261624 }, - { url = "https://files.pythonhosted.org/packages/c4/2a/4f9c47d9395b6aff24874c761d8d620c0232f97c43ef3cf668c8b355e7a7/regex-2024.9.11-cp310-cp310-win_amd64.whl", hash = "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623", size = 274020 }, - { url = "https://files.pythonhosted.org/packages/86/a1/d526b7b6095a0019aa360948c143aacfeb029919c898701ce7763bbe4c15/regex-2024.9.11-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df", size = 482483 }, - { url = "https://files.pythonhosted.org/packages/32/d9/bfdd153179867c275719e381e1e8e84a97bd186740456a0dcb3e7125c205/regex-2024.9.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268", size = 287442 }, - { url = "https://files.pythonhosted.org/packages/33/c4/60f3370735135e3a8d673ddcdb2507a8560d0e759e1398d366e43d000253/regex-2024.9.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad", size = 284561 }, - { url = "https://files.pythonhosted.org/packages/b1/51/91a5ebdff17f9ec4973cb0aa9d37635efec1c6868654bbc25d1543aca4ec/regex-2024.9.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679", size = 791779 }, - { url = "https://files.pythonhosted.org/packages/07/4a/022c5e6f0891a90cd7eb3d664d6c58ce2aba48bff107b00013f3d6167069/regex-2024.9.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4", size = 832605 }, - { url = "https://files.pythonhosted.org/packages/ac/1c/3793990c8c83ca04e018151ddda83b83ecc41d89964f0f17749f027fc44d/regex-2024.9.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664", size = 818556 }, - { url = "https://files.pythonhosted.org/packages/e9/5c/8b385afbfacb853730682c57be56225f9fe275c5bf02ac1fc88edbff316d/regex-2024.9.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50", size = 792808 }, - { url = "https://files.pythonhosted.org/packages/9b/8b/a4723a838b53c771e9240951adde6af58c829fb6a6a28f554e8131f53839/regex-2024.9.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199", size = 781115 }, - { url = "https://files.pythonhosted.org/packages/83/5f/031a04b6017033d65b261259c09043c06f4ef2d4eac841d0649d76d69541/regex-2024.9.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4", size = 778155 }, - { url = "https://files.pythonhosted.org/packages/fd/cd/4660756070b03ce4a66663a43f6c6e7ebc2266cc6b4c586c167917185eb4/regex-2024.9.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd", size = 784614 }, - { url = "https://files.pythonhosted.org/packages/93/8d/65b9bea7df120a7be8337c415b6d256ba786cbc9107cebba3bf8ff09da99/regex-2024.9.11-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f", size = 853744 }, - { url = "https://files.pythonhosted.org/packages/96/a7/fba1eae75eb53a704475baf11bd44b3e6ccb95b316955027eb7748f24ef8/regex-2024.9.11-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96", size = 855890 }, - { url = "https://files.pythonhosted.org/packages/45/14/d864b2db80a1a3358534392373e8a281d95b28c29c87d8548aed58813910/regex-2024.9.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1", size = 781887 }, - { url = "https://files.pythonhosted.org/packages/4d/a9/bfb29b3de3eb11dc9b412603437023b8e6c02fb4e11311863d9bf62c403a/regex-2024.9.11-cp311-cp311-win32.whl", hash = "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9", size = 261644 }, - { url = "https://files.pythonhosted.org/packages/c7/ab/1ad2511cf6a208fde57fafe49829cab8ca018128ab0d0b48973d8218634a/regex-2024.9.11-cp311-cp311-win_amd64.whl", hash = "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf", size = 274033 }, - { url = "https://files.pythonhosted.org/packages/6e/92/407531450762bed778eedbde04407f68cbd75d13cee96c6f8d6903d9c6c1/regex-2024.9.11-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7", size = 483590 }, - { url = "https://files.pythonhosted.org/packages/8e/a2/048acbc5ae1f615adc6cba36cc45734e679b5f1e4e58c3c77f0ed611d4e2/regex-2024.9.11-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231", size = 288175 }, - { url = "https://files.pythonhosted.org/packages/8a/ea/909d8620329ab710dfaf7b4adee41242ab7c9b95ea8d838e9bfe76244259/regex-2024.9.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d", size = 284749 }, - { url = "https://files.pythonhosted.org/packages/ca/fa/521eb683b916389b4975337873e66954e0f6d8f91bd5774164a57b503185/regex-2024.9.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64", size = 795181 }, - { url = "https://files.pythonhosted.org/packages/28/db/63047feddc3280cc242f9c74f7aeddc6ee662b1835f00046f57d5630c827/regex-2024.9.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42", size = 835842 }, - { url = "https://files.pythonhosted.org/packages/e3/94/86adc259ff8ec26edf35fcca7e334566c1805c7493b192cb09679f9c3dee/regex-2024.9.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766", size = 823533 }, - { url = "https://files.pythonhosted.org/packages/29/52/84662b6636061277cb857f658518aa7db6672bc6d1a3f503ccd5aefc581e/regex-2024.9.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a", size = 797037 }, - { url = "https://files.pythonhosted.org/packages/c3/2a/cd4675dd987e4a7505f0364a958bc41f3b84942de9efaad0ef9a2646681c/regex-2024.9.11-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9", size = 784106 }, - { url = "https://files.pythonhosted.org/packages/6f/75/3ea7ec29de0bbf42f21f812f48781d41e627d57a634f3f23947c9a46e303/regex-2024.9.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d", size = 782468 }, - { url = "https://files.pythonhosted.org/packages/d3/67/15519d69b52c252b270e679cb578e22e0c02b8dd4e361f2b04efcc7f2335/regex-2024.9.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822", size = 790324 }, - { url = "https://files.pythonhosted.org/packages/9c/71/eff77d3fe7ba08ab0672920059ec30d63fa7e41aa0fb61c562726e9bd721/regex-2024.9.11-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0", size = 860214 }, - { url = "https://files.pythonhosted.org/packages/81/11/e1bdf84a72372e56f1ea4b833dd583b822a23138a616ace7ab57a0e11556/regex-2024.9.11-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a", size = 859420 }, - { url = "https://files.pythonhosted.org/packages/ea/75/9753e9dcebfa7c3645563ef5c8a58f3a47e799c872165f37c55737dadd3e/regex-2024.9.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a", size = 787333 }, - { url = "https://files.pythonhosted.org/packages/bc/4e/ba1cbca93141f7416624b3ae63573e785d4bc1834c8be44a8f0747919eca/regex-2024.9.11-cp312-cp312-win32.whl", hash = "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776", size = 262058 }, - { url = "https://files.pythonhosted.org/packages/6e/16/efc5f194778bf43e5888209e5cec4b258005d37c613b67ae137df3b89c53/regex-2024.9.11-cp312-cp312-win_amd64.whl", hash = "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009", size = 273526 }, +version = "2024.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/3c/4651f6b130c6842a8f3df82461a8950f923925db8b6961063e82744bddcc/regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91", size = 482674 }, + { url = "https://files.pythonhosted.org/packages/15/51/9f35d12da8434b489c7b7bffc205c474a0a9432a889457026e9bc06a297a/regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0", size = 287684 }, + { url = "https://files.pythonhosted.org/packages/bd/18/b731f5510d1b8fb63c6b6d3484bfa9a59b84cc578ac8b5172970e05ae07c/regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e", size = 284589 }, + { url = "https://files.pythonhosted.org/packages/78/a2/6dd36e16341ab95e4c6073426561b9bfdeb1a9c9b63ab1b579c2e96cb105/regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde", size = 782511 }, + { url = "https://files.pythonhosted.org/packages/1b/2b/323e72d5d2fd8de0d9baa443e1ed70363ed7e7b2fb526f5950c5cb99c364/regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e", size = 821149 }, + { url = "https://files.pythonhosted.org/packages/90/30/63373b9ea468fbef8a907fd273e5c329b8c9535fee36fc8dba5fecac475d/regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2", size = 809707 }, + { url = "https://files.pythonhosted.org/packages/f2/98/26d3830875b53071f1f0ae6d547f1d98e964dd29ad35cbf94439120bb67a/regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf", size = 781702 }, + { url = "https://files.pythonhosted.org/packages/87/55/eb2a068334274db86208ab9d5599ffa63631b9f0f67ed70ea7c82a69bbc8/regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c", size = 771976 }, + { url = "https://files.pythonhosted.org/packages/74/c0/be707bcfe98254d8f9d2cff55d216e946f4ea48ad2fd8cf1428f8c5332ba/regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86", size = 697397 }, + { url = "https://files.pythonhosted.org/packages/49/dc/bb45572ceb49e0f6509f7596e4ba7031f6819ecb26bc7610979af5a77f45/regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67", size = 768726 }, + { url = "https://files.pythonhosted.org/packages/5a/db/f43fd75dc4c0c2d96d0881967897926942e935d700863666f3c844a72ce6/regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d", size = 775098 }, + { url = "https://files.pythonhosted.org/packages/99/d7/f94154db29ab5a89d69ff893159b19ada89e76b915c1293e98603d39838c/regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2", size = 839325 }, + { url = "https://files.pythonhosted.org/packages/f7/17/3cbfab1f23356fbbf07708220ab438a7efa1e0f34195bf857433f79f1788/regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008", size = 843277 }, + { url = "https://files.pythonhosted.org/packages/7e/f2/48b393b51900456155de3ad001900f94298965e1cad1c772b87f9cfea011/regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62", size = 773197 }, + { url = "https://files.pythonhosted.org/packages/45/3f/ef9589aba93e084cd3f8471fded352826dcae8489b650d0b9b27bc5bba8a/regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e", size = 261714 }, + { url = "https://files.pythonhosted.org/packages/42/7e/5f1b92c8468290c465fd50c5318da64319133231415a8aa6ea5ab995a815/regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519", size = 274042 }, + { url = "https://files.pythonhosted.org/packages/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669 }, + { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684 }, + { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589 }, + { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121 }, + { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275 }, + { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257 }, + { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727 }, + { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667 }, + { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963 }, + { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700 }, + { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592 }, + { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929 }, + { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213 }, + { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734 }, + { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052 }, + { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781 }, + { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455 }, + { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759 }, + { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976 }, + { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077 }, + { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160 }, + { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896 }, + { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997 }, + { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725 }, + { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481 }, + { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896 }, + { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138 }, + { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692 }, + { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135 }, + { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567 }, ] [[package]] @@ -2575,72 +2193,72 @@ wheels = [ [[package]] name = "sentry-sdk" -version = "2.18.0" +version = "2.19.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/24/cc/0d87cc8246f52d92228aa6718a24e1988a2893f4abe2f64ec5a8bcba4185/sentry_sdk-2.18.0.tar.gz", hash = "sha256:0dc21febd1ab35c648391c664df96f5f79fb0d92d7d4225cd9832e53a617cafd", size = 293615 } +sdist = { url = "https://files.pythonhosted.org/packages/a2/0e/cc0e60f0e0cfd5a9e42622ff5a227301c6475a56bcfa82e8e893bc209f20/sentry_sdk-2.19.0.tar.gz", hash = "sha256:ee4a4d2ae8bfe3cac012dcf3e4607975904c137e1738116549fc3dbbb6ff0e36", size = 298045 } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/9b/2d512efdb0de203d1f0312fae53433c3009ba70b0078421d25baaedc960a/sentry_sdk-2.18.0-py2.py3-none-any.whl", hash = "sha256:ee70e27d1bbe4cd52a38e1bd28a5fadb9b17bc29d91b5f2b97ae29c0a7610442", size = 317514 }, + { url = "https://files.pythonhosted.org/packages/c6/6b/191ca63f05d3ecc7600b5b3abd493a4c1b8468289c9737a7735ade1fedca/sentry_sdk-2.19.0-py2.py3-none-any.whl", hash = "sha256:7b0b3b709dee051337244a09a30dbf6e95afe0d34a1f8b430d45e0982a7c125b", size = 322158 }, ] [[package]] name = "setproctitle" -version = "1.3.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ff/e1/b16b16a1aa12174349d15b73fd4b87e641a8ae3fb1163e80938dbbf6ae98/setproctitle-1.3.3.tar.gz", hash = "sha256:c913e151e7ea01567837ff037a23ca8740192880198b7fbb90b16d181607caae", size = 27253 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4f/cc/c51e6371f640a9adbe693ddb89d68596e5a8e4b5e05b4d3c65ec504e2f6d/setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754", size = 16954 }, - { url = "https://files.pythonhosted.org/packages/c3/7d/d03f319e0f3b3a6e98731a56cd4d81478ed0c12531b822fd2c728b948edb/setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452", size = 11304 }, - { url = "https://files.pythonhosted.org/packages/9c/56/6f4a4e80b2810eb7ea9ab355022c780ef80457de368ab5b6b21b795e4f05/setproctitle-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbbd6c7de0771c84b4aa30e70b409565eb1fc13627a723ca6be774ed6b9d9fa3", size = 31249 }, - { url = "https://files.pythonhosted.org/packages/d0/ae/010811bece9a59a8bba131d9e7acea9c2e3c3cbf544bf06d8b10b8c28ff5/setproctitle-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c05ac48ef16ee013b8a326c63e4610e2430dbec037ec5c5b58fcced550382b74", size = 32594 }, - { url = "https://files.pythonhosted.org/packages/87/7b/69bdc791001250dff279a1a81904f3f563caece4fa1607a95b9fd5197d6e/setproctitle-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1342f4fdb37f89d3e3c1c0a59d6ddbedbde838fff5c51178a7982993d238fe4f", size = 29713 }, - { url = "https://files.pythonhosted.org/packages/79/e7/54b36be02aee8ad573be68f6f46fd62838735c2f007b22df50eb5e13a20d/setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc74e84fdfa96821580fb5e9c0b0777c1c4779434ce16d3d62a9c4d8c710df39", size = 30755 }, - { url = "https://files.pythonhosted.org/packages/69/a7/2a77b68c11db87c22350381d6ce022011eb420076790e0e3697153e89458/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9617b676b95adb412bb69645d5b077d664b6882bb0d37bfdafbbb1b999568d85", size = 38562 }, - { url = "https://files.pythonhosted.org/packages/9d/09/bc108723bbfb7c50c22fdf22191f3e32abcb5d6f46610018030b25f601c5/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6a249415f5bb88b5e9e8c4db47f609e0bf0e20a75e8d744ea787f3092ba1f2d0", size = 36991 }, - { url = "https://files.pythonhosted.org/packages/94/ad/4166381d79f6ae8138be9b49f05d193a8deb748debace9896dffad45a753/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:38da436a0aaace9add67b999eb6abe4b84397edf4a78ec28f264e5b4c9d53cd5", size = 39866 }, - { url = "https://files.pythonhosted.org/packages/3d/92/17168f4bb1a695094e93e73a1ef1f7b89953a6d91e8a7699a2c840ba712f/setproctitle-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:da0d57edd4c95bf221b2ebbaa061e65b1788f1544977288bdf95831b6e44e44d", size = 38221 }, - { url = "https://files.pythonhosted.org/packages/0c/1b/753432a877bcdfb099e280795c86ac7dc245d9651b98308f606bb3db610d/setproctitle-1.3.3-cp310-cp310-win32.whl", hash = "sha256:a1fcac43918b836ace25f69b1dca8c9395253ad8152b625064415b1d2f9be4fb", size = 11064 }, - { url = "https://files.pythonhosted.org/packages/29/ff/80a02c5b414c2d3ff49c36c0a571a94aa3b4236f07eee39f72ebdb7314a0/setproctitle-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:200620c3b15388d7f3f97e0ae26599c0c378fdf07ae9ac5a13616e933cbd2086", size = 11815 }, - { url = "https://files.pythonhosted.org/packages/c9/17/7f9d5ddf4cfc4386e74565ccf63b8381396336e4629bb165b52b803ceddb/setproctitle-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:334f7ed39895d692f753a443102dd5fed180c571eb6a48b2a5b7f5b3564908c8", size = 16948 }, - { url = "https://files.pythonhosted.org/packages/ff/5d/77edf4c29c8d6728b49d3f0abb22159bb9c0c4ddebd721c09486b34985c8/setproctitle-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:950f6476d56ff7817a8fed4ab207727fc5260af83481b2a4b125f32844df513a", size = 11305 }, - { url = "https://files.pythonhosted.org/packages/13/f0/263954ca925a278036f100405e7ba82d4341e1e6bdc09f35362a7b40f684/setproctitle-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:195c961f54a09eb2acabbfc90c413955cf16c6e2f8caa2adbf2237d1019c7dd8", size = 31578 }, - { url = "https://files.pythonhosted.org/packages/79/52/503b546da451deb78fde27fec96c39d3f63a7958be60c9a837de89f47a0d/setproctitle-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f05e66746bf9fe6a3397ec246fe481096664a9c97eb3fea6004735a4daf867fd", size = 32910 }, - { url = "https://files.pythonhosted.org/packages/48/72/aeb734419a58a85ca7845c3d0011c322597da4ff601ebbc28f6c1dfd1ae8/setproctitle-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5901a31012a40ec913265b64e48c2a4059278d9f4e6be628441482dd13fb8b5", size = 30086 }, - { url = "https://files.pythonhosted.org/packages/fd/df/44b267cb8f073a4ae77e120f0705ab3a07165ad90cecd4881b34c7e1e37b/setproctitle-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64286f8a995f2cd934082b398fc63fca7d5ffe31f0e27e75b3ca6b4efda4e353", size = 31076 }, - { url = "https://files.pythonhosted.org/packages/82/c2/79ad43c914418cb1920e0198ac7326061c05cd4ec75c86ed0ca456b7e957/setproctitle-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:184239903bbc6b813b1a8fc86394dc6ca7d20e2ebe6f69f716bec301e4b0199d", size = 41226 }, - { url = "https://files.pythonhosted.org/packages/81/1b/0498c36a07a73d39a7070f45d96a299006e624efc07fc2e2296286237316/setproctitle-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:664698ae0013f986118064b6676d7dcd28fefd0d7d5a5ae9497cbc10cba48fa5", size = 39723 }, - { url = "https://files.pythonhosted.org/packages/3a/fe/ebbcffd6012b9cf5edb017a9c30cfc2beccf707f5bf495da8cf69b4abe69/setproctitle-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e5119a211c2e98ff18b9908ba62a3bd0e3fabb02a29277a7232a6fb4b2560aa0", size = 42773 }, - { url = "https://files.pythonhosted.org/packages/64/b1/5786c0442435eb18d04299c8ce7d1f86feb5154444ac684963527a76e169/setproctitle-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:417de6b2e214e837827067048f61841f5d7fc27926f2e43954567094051aff18", size = 41089 }, - { url = "https://files.pythonhosted.org/packages/33/fb/14b41e920406a12de0a164ef3b86d62edb4fac63d91d9f86f3b80dae5b38/setproctitle-1.3.3-cp311-cp311-win32.whl", hash = "sha256:6a143b31d758296dc2f440175f6c8e0b5301ced3b0f477b84ca43cdcf7f2f476", size = 11066 }, - { url = "https://files.pythonhosted.org/packages/7e/ba/f6da9ba74e8c2c662e932b27a01025c1bee2846222f6a2e87a69c259772f/setproctitle-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a680d62c399fa4b44899094027ec9a1bdaf6f31c650e44183b50d4c4d0ccc085", size = 11817 }, - { url = "https://files.pythonhosted.org/packages/32/22/9672612b194e4ac5d9fb67922ad9d30232b4b66129b0381ab5efeb6ae88f/setproctitle-1.3.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d4460795a8a7a391e3567b902ec5bdf6c60a47d791c3b1d27080fc203d11c9dc", size = 16917 }, - { url = "https://files.pythonhosted.org/packages/49/e5/562ff00f2f3f4253ff8fa6886e0432b8eae8cde82530ac19843d8ed2c485/setproctitle-1.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bdfd7254745bb737ca1384dee57e6523651892f0ea2a7344490e9caefcc35e64", size = 11264 }, - { url = "https://files.pythonhosted.org/packages/8f/1f/f97ea7bf71c873590a63d62ba20bf7294439d1c28603e5c63e3616c2131a/setproctitle-1.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477d3da48e216d7fc04bddab67b0dcde633e19f484a146fd2a34bb0e9dbb4a1e", size = 31907 }, - { url = "https://files.pythonhosted.org/packages/66/fb/2d90806b9a2ed97c140baade3d1d2d41d3b51458300a2d999268be24d21d/setproctitle-1.3.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ab2900d111e93aff5df9fddc64cf51ca4ef2c9f98702ce26524f1acc5a786ae7", size = 33333 }, - { url = "https://files.pythonhosted.org/packages/38/39/e7ce791f5635f3a16bd21d6b79bd9280c4c4aed8ab936b4b21334acf05a7/setproctitle-1.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:088b9efc62d5aa5d6edf6cba1cf0c81f4488b5ce1c0342a8b67ae39d64001120", size = 30573 }, - { url = "https://files.pythonhosted.org/packages/20/22/fd76bbde4194d4e31d5b31a02f80c8e7e54a99d3d8ff34f3d656c6655689/setproctitle-1.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6d50252377db62d6a0bb82cc898089916457f2db2041e1d03ce7fadd4a07381", size = 31601 }, - { url = "https://files.pythonhosted.org/packages/51/5c/a6257cc68e17abcc4d4a78cc6666aa0d3805af6d942576625c4a468a72f0/setproctitle-1.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:87e668f9561fd3a457ba189edfc9e37709261287b52293c115ae3487a24b92f6", size = 40717 }, - { url = "https://files.pythonhosted.org/packages/db/31/4f0faad7ef641be4e8dfcbc40829775f2d6a4ca1ff435a4074047fa3dad1/setproctitle-1.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:287490eb90e7a0ddd22e74c89a92cc922389daa95babc833c08cf80c84c4df0a", size = 39384 }, - { url = "https://files.pythonhosted.org/packages/22/17/8763dc4f9ddf36af5f043ceec213b0f9f45f09fd2d5061a89c699aabe8b0/setproctitle-1.3.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe1c49486109f72d502f8be569972e27f385fe632bd8895f4730df3c87d5ac8", size = 42350 }, - { url = "https://files.pythonhosted.org/packages/7b/b2/2403cecf2e5c5b4da22f7d9df4b2149bf92d03a3422185e682e81055549c/setproctitle-1.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4a6ba2494a6449b1f477bd3e67935c2b7b0274f2f6dcd0f7c6aceae10c6c6ba3", size = 40704 }, - { url = "https://files.pythonhosted.org/packages/5e/c1/11e80061ac06aece2a0ffcaf018cdc088aebb2fc586f68201755518532ad/setproctitle-1.3.3-cp312-cp312-win32.whl", hash = "sha256:2df2b67e4b1d7498632e18c56722851ba4db5d6a0c91aaf0fd395111e51cdcf4", size = 11057 }, - { url = "https://files.pythonhosted.org/packages/90/e8/ece468e93e99d3b2826e9649f6d03e80f071d451e20c742f201f77d1bea1/setproctitle-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:f38d48abc121263f3b62943f84cbaede05749047e428409c2c199664feb6abc7", size = 11809 }, - { url = "https://files.pythonhosted.org/packages/24/55/8b369b56007a5a2c7594cdb58cd4a09d7cca65b28483bb5582c6975663f1/setproctitle-1.3.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6b9e62ddb3db4b5205c0321dd69a406d8af9ee1693529d144e86bd43bcb4b6c0", size = 10726 }, - { url = "https://files.pythonhosted.org/packages/35/30/ac99ecae8458ba995f85aa3aa911004679b405922e1487b0fba6fe8f4d37/setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e3b99b338598de0bd6b2643bf8c343cf5ff70db3627af3ca427a5e1a1a90dd9", size = 13368 }, - { url = "https://files.pythonhosted.org/packages/70/1d/3b2249c833c7d52b59ff0602d760df0543dc1e6c272f145b949750edeb01/setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ae9a02766dad331deb06855fb7a6ca15daea333b3967e214de12cfae8f0ef5", size = 12969 }, - { url = "https://files.pythonhosted.org/packages/76/78/97f36752438cb5c6409b53eb3b1a334827cede43acab65e4fc4a0014cf9f/setproctitle-1.3.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:200ede6fd11233085ba9b764eb055a2a191fb4ffb950c68675ac53c874c22e20", size = 11848 }, +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ae/4e/b09341b19b9ceb8b4c67298ab4a08ef7a4abdd3016c7bb152e9b6379031d/setproctitle-1.3.4.tar.gz", hash = "sha256:3b40d32a3e1f04e94231ed6dfee0da9e43b4f9c6b5450d53e6dd7754c34e0c50", size = 26456 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/f4/95937eb5c5370324a942ba90174c6d0fc7c5ad2f7f8ea989ccdbd6e1be5e/setproctitle-1.3.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0f6661a69c68349172ba7b4d5dd65fec2b0917abc99002425ad78c3e58cf7595", size = 16855 }, + { url = "https://files.pythonhosted.org/packages/32/a6/d49dbb0d75d02d11db49151469e1fee740efa45de7288bffcc4d88d0c290/setproctitle-1.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:754bac5e470adac7f7ec2239c485cd0b75f8197ca8a5b86ffb20eb3a3676cc42", size = 11627 }, + { url = "https://files.pythonhosted.org/packages/2e/cd/73a0fc913db50c3b736750ce67824f1108c2173e5d043a16ef9874b4f988/setproctitle-1.3.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7bc7088c15150745baf66db62a4ced4507d44419eb66207b609f91b64a682af", size = 31187 }, + { url = "https://files.pythonhosted.org/packages/63/0f/74f9112f7f506acc01f085811c6d135751b6fa42d30207f53b25579d043a/setproctitle-1.3.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a46ef3ecf61e4840fbc1145fdd38acf158d0da7543eda7b773ed2b30f75c2830", size = 32534 }, + { url = "https://files.pythonhosted.org/packages/3b/88/53eec2373745069d4c8a59d41ee2ef4a48949b77cccd0077c270261b238a/setproctitle-1.3.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffcb09d5c0ffa043254ec9a734a73f3791fec8bf6333592f906bb2e91ed2af1a", size = 29657 }, + { url = "https://files.pythonhosted.org/packages/50/1c/a4d3d8c20bf3bbafd8c5038e7da09043a9d21450b6a73694ada11c01b58a/setproctitle-1.3.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06c16b7a91cdc5d700271899e4383384a61aae83a3d53d0e2e5a266376083342", size = 30695 }, + { url = "https://files.pythonhosted.org/packages/a2/2a/9f290f0d10ea87a266d63025078eabfa040ad29ea10d815e167a5104de00/setproctitle-1.3.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9f9732e59863eaeedd3feef94b2b216cb86d40dda4fad2d0f0aaec3b31592716", size = 30340 }, + { url = "https://files.pythonhosted.org/packages/38/c4/5bfe02d4cdd16338973d452c7c6042abdd2827d90f7ce4e21bc003f2edb1/setproctitle-1.3.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e152f4ab9ea1632b5fecdd87cee354f2b2eb6e2dfc3aceb0eb36a01c1e12f94c", size = 29352 }, + { url = "https://files.pythonhosted.org/packages/b3/41/0dd85cef0e5a5a332bdda7b55738e950c2edecea3ae45c658990553d50f8/setproctitle-1.3.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:020ea47a79b2bbd7bd7b94b85ca956ba7cb026e82f41b20d2e1dac4008cead25", size = 31819 }, + { url = "https://files.pythonhosted.org/packages/d7/23/fbfacfed8805983a83324099484e47b9028d0d3c07a0fe017123eee3f580/setproctitle-1.3.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8c52b12b10e4057fc302bd09cb3e3f28bb382c30c044eb3396e805179a8260e4", size = 29745 }, + { url = "https://files.pythonhosted.org/packages/68/37/e18c5a00bfd1c4c2c815536d5c63a470e4364b571bd5096d38d0fe277bf5/setproctitle-1.3.4-cp310-cp310-win32.whl", hash = "sha256:a65a147f545f3fac86f11acb2d0b316d3e78139a9372317b7eb50561b2817ba0", size = 11358 }, + { url = "https://files.pythonhosted.org/packages/52/fd/1fae8c4c13af22d8d17816c44421085509a08dfa77f573d31447d6cd540c/setproctitle-1.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:66821fada6426998762a3650a37fba77e814a249a95b1183011070744aff47f6", size = 12072 }, + { url = "https://files.pythonhosted.org/packages/5d/1a/1fb7d622195bcb3ce7b04366a833e51cfa5ad632c5dafe32e0763cd3fdc9/setproctitle-1.3.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0f749f07002c2d6fecf37cedc43207a88e6c651926a470a5f229070cf791879", size = 16851 }, + { url = "https://files.pythonhosted.org/packages/46/54/e3aa4f46eddf795f10452ea878ff85c3496d36409636530f9a37e2de3cbe/setproctitle-1.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:90ea8d302a5d30b948451d146e94674a3c5b020cc0ced9a1c28f8ddb0f203a5d", size = 11620 }, + { url = "https://files.pythonhosted.org/packages/61/47/80988221679dfd93c464248abb71c2a96338f2ca3f8e3288d0ecb7422f4d/setproctitle-1.3.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f859c88193ed466bee4eb9d45fbc29d2253e6aa3ccd9119c9a1d8d95f409a60d", size = 31519 }, + { url = "https://files.pythonhosted.org/packages/2c/72/14984c127f708597e412f1a8cf7cac809b9bca50a267a6b01b221b094330/setproctitle-1.3.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b3afa5a0ed08a477ded239c05db14c19af585975194a00adf594d48533b23701", size = 32860 }, + { url = "https://files.pythonhosted.org/packages/16/9d/34ea09295620fddae65cf7caeac81bbfc386a3ae6ce26a4dcadbb54c134d/setproctitle-1.3.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10a78fce9018cc3e9a772b6537bbe3fe92380acf656c9f86db2f45e685af376e", size = 30029 }, + { url = "https://files.pythonhosted.org/packages/44/bf/a447a51054ceed23f69d4f7370289044b4508569f11da6db2eec087bc174/setproctitle-1.3.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d758e2eed2643afac5f2881542fbb5aa97640b54be20d0a5ed0691d02f0867d", size = 31017 }, + { url = "https://files.pythonhosted.org/packages/ec/46/adcffde6fb8d95458da0a568afdf0dabbbff6470299d94014676e1ab43c0/setproctitle-1.3.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ef133a1a2ee378d549048a12d56f4ef0e2b9113b0b25b6b77821e9af94d50634", size = 30762 }, + { url = "https://files.pythonhosted.org/packages/a3/cd/747a67ce1f6ef8fd1fa46b0b13ba0e007b80914bd549318830b8691ab9f6/setproctitle-1.3.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1d2a154b79d5fb42d1eff06e05e22f0e8091261d877dd47b37d31352b74ecc37", size = 29753 }, + { url = "https://files.pythonhosted.org/packages/3d/86/5939546e57238462a7839ae78399a635d1cfc5d125c7a12a28face111730/setproctitle-1.3.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:202eae632815571297833876a0f407d0d9c7ad9d843b38adbe687fe68c5192ee", size = 32161 }, + { url = "https://files.pythonhosted.org/packages/62/83/9194a4baed06e0e90a69e2e4a77a75e5a3ff008046870c79bc36a5c45e1c/setproctitle-1.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2b0080819859e80a7776ac47cf6accb4b7ad313baf55fabac89c000480dcd103", size = 30104 }, + { url = "https://files.pythonhosted.org/packages/ac/cd/08928fec23cbf4dae2a7b245b72d86e6458d64f4e7e6956cd80a9fda8c80/setproctitle-1.3.4-cp311-cp311-win32.whl", hash = "sha256:9c9d7d1267dee8c6627963d9376efa068858cfc8f573c083b1b6a2d297a8710f", size = 11349 }, + { url = "https://files.pythonhosted.org/packages/aa/19/240c4b99d57e045d3b2e2effa5924e810eabb18c56ef9c2336a7746dffe4/setproctitle-1.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:475986ddf6df65d619acd52188336a20f616589403f5a5ceb3fc70cdc137037a", size = 12071 }, + { url = "https://files.pythonhosted.org/packages/94/1f/02fb3c6038c819d86765316d2a911281fc56c7dd3a9355dceb3f26a5bf7b/setproctitle-1.3.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d06990dcfcd41bb3543c18dd25c8476fbfe1f236757f42fef560f6aa03ac8dfc", size = 16842 }, + { url = "https://files.pythonhosted.org/packages/b8/0c/d69e1f91c8f3d3aa74394e9e6ebb818f7d323e2d138ce1127e9462d09ebc/setproctitle-1.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:317218c9d8b17a010ab2d2f0851e8ef584077a38b1ba2b7c55c9e44e79a61e73", size = 11614 }, + { url = "https://files.pythonhosted.org/packages/86/ed/8031871d275302054b2f1b94b7cf5e850212cc412fe968f0979e64c1b838/setproctitle-1.3.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb5fefb53b9d9f334a5d9ec518a36b92a10b936011ac8a6b6dffd60135f16459", size = 31840 }, + { url = "https://files.pythonhosted.org/packages/45/b7/04f5d221cbdcff35d6cdf74e2a852e69dc8d8e746eb1b314be6b57b79c41/setproctitle-1.3.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0855006261635e8669646c7c304b494b6df0a194d2626683520103153ad63cc9", size = 33271 }, + { url = "https://files.pythonhosted.org/packages/25/b2/8dff0d2a72076e5535f117f33458d520538b5a0900b90a9f59a278f0d3f6/setproctitle-1.3.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a88e466fcaee659679c1d64dcb2eddbcb4bfadffeb68ba834d9c173a25b6184", size = 30509 }, + { url = "https://files.pythonhosted.org/packages/4b/cf/4f19cdc7fdff3eaeb3064ce6eeb27c63081dba3123fbf904ac6bf0de440c/setproctitle-1.3.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f963b6ed8ba33eda374a98d979e8a0eaf21f891b6e334701693a2c9510613c4c", size = 31543 }, + { url = "https://files.pythonhosted.org/packages/9b/a7/5f9c3c70dc5573f660f978fb3bb4847cd26ede95a5fc294d3f1cf6779800/setproctitle-1.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:122c2e05697fa91f5d23f00bbe98a9da1bd457b32529192e934095fadb0853f1", size = 31268 }, + { url = "https://files.pythonhosted.org/packages/26/ab/bbde90ea0ed6a062ef94fe1c609b68077f7eb586133a62fa62d0c8dd9f8c/setproctitle-1.3.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:1bba0a866f5895d5b769d8c36b161271c7fd407e5065862ab80ff91c29fbe554", size = 30232 }, + { url = "https://files.pythonhosted.org/packages/36/0e/817be9934eda4cf63c96c694c3383cb0d2e5d019a2871af7dbd2202f7a58/setproctitle-1.3.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:97f1f861998e326e640708488c442519ad69046374b2c3fe9bcc9869b387f23c", size = 32739 }, + { url = "https://files.pythonhosted.org/packages/b0/76/9b4877850c9c5f41c4bacae441285dead7c192bebf4fcbf3b3eb0e8033cc/setproctitle-1.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:726aee40357d4bdb70115442cb85ccc8e8bc554fc0bbbaa3a57cbe81df42287d", size = 30778 }, + { url = "https://files.pythonhosted.org/packages/b2/fa/bbc7ab32f253b9700ac20d78ba0d5fbdc4ea5789d33e1adb236cdf20b23a/setproctitle-1.3.4-cp312-cp312-win32.whl", hash = "sha256:04d6ba8b816dbb0bfd62000b0c3e583160893e6e8c4233e1dca1a9ae4d95d924", size = 11355 }, + { url = "https://files.pythonhosted.org/packages/44/5c/6e6665b5fd800206a9e537ab0d2630d7b9b31b4697d931ed468837cc9cf5/setproctitle-1.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:9c76e43cb351ba8887371240b599925cdf3ecececc5dfb7125c71678e7722c55", size = 12069 }, + { url = "https://files.pythonhosted.org/packages/2f/d0/775418662081d44b91da236ed4503e10e7008c9c5fd30193e13db388fbef/setproctitle-1.3.4-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:939d364a187b2adfbf6ae488664277e717d56c7951a4ddeb4f23b281bc50bfe5", size = 11153 }, + { url = "https://files.pythonhosted.org/packages/fd/1f/b3b82633336cd9908bf74cbc06dd533025b3d3c202437c4e3d0bc871ca13/setproctitle-1.3.4-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb8a6a19be0cbf6da6fcbf3698b76c8af03fe83e4bd77c96c3922be3b88bf7da", size = 13310 }, + { url = "https://files.pythonhosted.org/packages/f5/89/887c6872ceed5ca344d25c8cc8a3f9b99bbcb25613c4b680476b29aabe23/setproctitle-1.3.4-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:779006f9e1aade9522a40e8d9635115ab15dd82b7af8e655967162e9c01e2573", size = 12911 }, + { url = "https://files.pythonhosted.org/packages/b0/8d/9e4a4651b1c5845a9aec0d2c08c65768ba5ca2ec76598124b45d384a5f46/setproctitle-1.3.4-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5519f2a7b8c535b0f1f77b30441476571373add72008230c81211ee17b423b57", size = 12105 }, ] [[package]] name = "setuptools" -version = "75.3.0" +version = "75.6.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ed/22/a438e0caa4576f8c383fa4d35f1cc01655a46c75be358960d815bfbb12bd/setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686", size = 1351577 } +sdist = { url = "https://files.pythonhosted.org/packages/43/54/292f26c208734e9a7f067aea4a7e282c080750c4546559b58e2e45413ca0/setuptools-75.6.0.tar.gz", hash = "sha256:8199222558df7c86216af4f84c30e9b34a61d8ba19366cc914424cdbd28252f6", size = 1337429 } wheels = [ - { url = "https://files.pythonhosted.org/packages/90/12/282ee9bce8b58130cb762fbc9beabd531549952cac11fc56add11dcb7ea0/setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd", size = 1251070 }, + { url = "https://files.pythonhosted.org/packages/55/21/47d163f615df1d30c094f6c8bbb353619274edccf0327b185cc2493c2c33/setuptools-75.6.0-py3-none-any.whl", hash = "sha256:ce74b49e8f7110f9bf04883b730f4765b774ef3ef28f722cce7c273d253aaf7d", size = 1224032 }, ] [[package]] @@ -2672,14 +2290,14 @@ wheels = [ [[package]] name = "starlette" -version = "0.37.2" +version = "0.41.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/61/b5/6bceb93ff20bd7ca36e6f7c540581abb18f53130fabb30ba526e26fd819b/starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823", size = 2843736 } +sdist = { url = "https://files.pythonhosted.org/packages/1a/4c/9b5764bd22eec91c4039ef4c55334e9187085da2d8a2df7bd570869aae18/starlette-0.41.3.tar.gz", hash = "sha256:0e4ab3d16522a255be6b28260b938eae2482f98ce5cc934cb08dce8dc3ba5835", size = 2574159 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/18/31fa32ed6c68ba66220204ef0be798c349d0a20c1901f9d4a794e08c76d8/starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee", size = 71908 }, + { url = "https://files.pythonhosted.org/packages/96/00/2b325970b3060c7cecebab6d295afe763365822b1306a12eeab198f74323/starlette-0.41.3-py3-none-any.whl", hash = "sha256:44cedb2b7c77a9de33a8b74b2b90e9f50d11fcf25d8270ea525ad71a25374ff7", size = 73225 }, ] [[package]] @@ -2863,45 +2481,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/57/6c/bf52ff061da33deb9f94f4121fde7ff3058812cb7d2036c97bc167793bd1/torch-2.5.1-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:8c712df61101964eb11910a846514011f0b6f5920c55dbf567bff8a34163d5b1", size = 63858109 }, ] -[[package]] -name = "torchvision" -version = "0.20.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "numpy" }, - { name = "pillow" }, - { name = "torch" }, -] -wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/59/aea68d755da1451e1a0d894528a7edc9b58eb30d33e274bf21bef28dad1a/torchvision-0.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4878fefb96ef293d06c27210918adc83c399d9faaf34cda5a63e129f772328f1", size = 1787552 }, - { url = "https://files.pythonhosted.org/packages/a2/f6/7ff89a9f8703f623f5664afd66c8600e3f09fe188e1e0b7e6f9a8617f865/torchvision-0.20.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:8ffbdf8bf5b30eade22d459f5a313329eeadb20dc75efa142987b53c007098c3", size = 7238975 }, - { url = "https://files.pythonhosted.org/packages/f7/ce/4c31e9b96cc4f9fec746b258d2aa35f8d1247f4f58d63f9c505ea5eb254d/torchvision-0.20.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:75f8a4d51a593c4bab6c9bf7d75bdd88691b00a53b07656678bc55a3a753dd73", size = 14265343 }, - { url = "https://files.pythonhosted.org/packages/17/11/b5ce67715bbbec8798fb48c4a20ac28828aec1710ac01091a3eddcb8e075/torchvision-0.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:22c2fa44e20eb404b85e42b22b453863a14b0927d25e550fd4f84eea97fa5b39", size = 1562413 }, - { url = "https://files.pythonhosted.org/packages/28/57/4d7ad90be612f5ac6c4bdafcb0ff13e818e14a340a88c8ca00d9ed8c2dad/torchvision-0.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:344b339e15e6bbb59ee0700772616d0afefd209920c762b1604368d8c3458322", size = 1787548 }, - { url = "https://files.pythonhosted.org/packages/de/e9/e190ecec448d5a2abad8348cf085fcb39962a491e3f40dcb023721e04feb/torchvision-0.20.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:86f6523dee420000fe14c3527f6c8e0175139fda7d995b187f54a0b0ebec7eb6", size = 7241222 }, - { url = "https://files.pythonhosted.org/packages/b1/a3/cbb8177e5e379f0c040b00c6f80f14d323a97e30495d7115d169b101b2f7/torchvision-0.20.1-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:a40d766345927639da322c693934e5f91b1ba2218846c7104b868dea2314ce8e", size = 14267510 }, - { url = "https://files.pythonhosted.org/packages/69/55/ce836703ff77bb21582c3098d5311f8ddde7eadc7eab04be9561961f4725/torchvision-0.20.1-cp311-cp311-win_amd64.whl", hash = "sha256:5b501d5c04b034d2ecda96a31ed050e383cf8201352e4c9276ca249cbecfded0", size = 1562402 }, - { url = "https://files.pythonhosted.org/packages/c5/eb/4ba19616378f2bc085999432fded2b7dfdbdccc6dd0fc293203452508100/torchvision-0.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1a31256ff945d64f006bb306813a7c95a531fe16bfb2535c837dd4c104533d7a", size = 1787553 }, - { url = "https://files.pythonhosted.org/packages/d4/75/00a852275ade58d3dc474530f7a7b6bc999a817148f0eb59d4fde12eb955/torchvision-0.20.1-cp312-cp312-manylinux1_x86_64.whl", hash = "sha256:17cd78adddf81dac57d7dccc9277a4d686425b1c55715f308769770cb26cad5c", size = 7240323 }, - { url = "https://files.pythonhosted.org/packages/af/f0/ca1445406eb12cbeb7a41fc833a1941ede78e7c55621198b83ecd7bcfd0f/torchvision-0.20.1-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:9f853ba4497ac4691815ad41b523ee23cf5ba4f87b1ce869d704052e233ca8b7", size = 14266936 }, - { url = "https://files.pythonhosted.org/packages/c3/18/00993d420b1d6e88582e51d4bc82c824c99a2e9c045d50eaf9b34fff729a/torchvision-0.20.1-cp312-cp312-win_amd64.whl", hash = "sha256:4a330422c36dbfc946d3a6c1caec3489db07ecdf3675d83369adb2e5a0ca17c4", size = 1562392 }, -] - [[package]] name = "tqdm" -version = "4.66.6" +version = "4.67.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "platform_system == 'Windows'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/34/bef135b27fe1864993a5284ad001157ee9b5538e859ac90f5b0e8cc8c9ec/tqdm-4.66.6.tar.gz", hash = "sha256:4bdd694238bef1485ce839d67967ab50af8f9272aab687c0d7702a01da0be090", size = 169533 } +sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737 } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/73/02342de9c2d20922115f787e101527b831c0cffd2105c946c4a4826bcfd4/tqdm-4.66.6-py3-none-any.whl", hash = "sha256:223e8b5359c2efc4b30555531f09e9f2f3589bcd7fdd389271191031b49b7a63", size = 78326 }, + { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, ] [[package]] name = "transformers" -version = "4.46.2" +version = "4.46.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, @@ -2915,9 +2509,9 @@ dependencies = [ { name = "tokenizers" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/05/6f/8f964f61983e3989c8ff23b5c21464807c6bc6236f36cdd41108222556d9/transformers-4.46.2.tar.gz", hash = "sha256:3d85410881e1c074be767877bf33c83231ec11529f274a6044ecb20c157ba14e", size = 8611717 } +sdist = { url = "https://files.pythonhosted.org/packages/37/5a/58f96c83e566f907ae39f16d4401bbefd8bb85c60bd1e6a95c419752ab90/transformers-4.46.3.tar.gz", hash = "sha256:8ee4b3ae943fe33e82afff8e837f4b052058b07ca9be3cb5b729ed31295f72cc", size = 8627944 } wheels = [ - { url = "https://files.pythonhosted.org/packages/ed/ad/c9b96572ab7994e73c64588f8875741823f2daba70e746547fff9a2d9a54/transformers-4.46.2-py3-none-any.whl", hash = "sha256:c921f4406b78e6518c97b618c5acd1cf8a4f2315b6b727f4bf9e01496eef849c", size = 10034514 }, + { url = "https://files.pythonhosted.org/packages/51/51/b87caa939fedf307496e4dbf412f4b909af3d9ca8b189fc3b65c1faa456f/transformers-4.46.3-py3-none-any.whl", hash = "sha256:a12ef6f52841fd190a3e5602145b542d03507222f2c64ebb7ee92e8788093aef", size = 10034536 }, ] [[package]] @@ -2951,23 +2545,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 }, ] -[[package]] -name = "uvicorn" -version = "0.30.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "h11" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c3/ad/02b1b412e43605aa6aac8d0392c383ff3f6ae8267b7864e48e3b5f3f601e/uvicorn-0.30.5.tar.gz", hash = "sha256:ac6fdbd4425c5fd17a9fe39daf4d4d075da6fdc80f653e5894cdc2fd98752bee", size = 42835 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/67/d8/1bcb5e6508d14c6c9912cd964b286f04392298ffb3e4218f4a1292d64e76/uvicorn-0.30.5-py3-none-any.whl", hash = "sha256:b2d86de274726e9878188fa07576c9ceeff90a839e2b6e25c917fe05f5a6c835", size = 62805 }, -] - [[package]] name = "wandb" -version = "0.18.5" +version = "0.18.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -2983,17 +2563,17 @@ dependencies = [ { name = "setuptools" }, { name = "typing-extensions", marker = "python_full_version < '3.12'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d2/de/99efb1b850f40cae30a7f036cbd2e003674bfcb9c7157a1483c14721861c/wandb-0.18.5.tar.gz", hash = "sha256:75ef47ba7fc709b787be05e558f1635d99246afeacc9369031c1be6e5b620ce6", size = 9479875 } +sdist = { url = "https://files.pythonhosted.org/packages/d5/10/81cd2519a92c5dc76f0a3553daa32bc58875e05abae6eca4509e65c87d63/wandb-0.18.7.tar.gz", hash = "sha256:00f9891558d4833ee47f21ce6c603499f0bd1a7ce117ff55ee1a041e9094f9a2", size = 9505273 } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/28/b3ac8927c1d1a7a1f98f6885b847ac95f49ceee64829f4991f4ca281ea71/wandb-0.18.5-py3-none-any.whl", hash = "sha256:49ba7bafff0cecff2159bc6fb68176d6e5561d744a9bd6a63753e7077a74e26d", size = 6254313 }, - { url = "https://files.pythonhosted.org/packages/d6/13/ac33ccf8a8ffb50389ed0c82f6c72d0d56b62a2c592b6633ab44326c2cab/wandb-0.18.5-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:c9d903dbff9517843881d9a0d561d82bcf0e949d8b8c03aafa35aceef31ea7e0", size = 15726566 }, - { url = "https://files.pythonhosted.org/packages/40/3c/a88b2341709adec5bec6d70dcc9465aa280cadbda6220efd145f8da415e3/wandb-0.18.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:33d3e5765a9bb305558af4f291338cf8723856d2b3a3c377414cd8f8b711baa4", size = 15158959 }, - { url = "https://files.pythonhosted.org/packages/7a/2c/a27020ce784ed693f56f6912511252fb99e9dd63234485ea7a8e5bd82cbe/wandb-0.18.5-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:9ff72e7a45e998e2a7ff42645ec76bedabf17ea51fd112ae2837dce5023ac0cc", size = 15859722 }, - { url = "https://files.pythonhosted.org/packages/83/1e/6bfe1701439343ee4fe3346208f98208f4db15ca888cf5cf21d1ced91d9a/wandb-0.18.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:136a79c06c114c225add8f977acec23d53df5e2a4d2803700a5eb5501ae40160", size = 15122275 }, - { url = "https://files.pythonhosted.org/packages/e2/ae/943335dd9b8783db59133047a1fdf53f5070cadab7ce2464632e36ba6b7f/wandb-0.18.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:350fc0f6f5bc23f4baeef12ccfea6daa89d1a5b84948d72d48249cbb652ab22a", size = 16038739 }, - { url = "https://files.pythonhosted.org/packages/20/cd/e8190fc072d51a82ea23d5789e54ab089872341f7fdaeb105b710cd626e4/wandb-0.18.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:4e31741eefa2b2a83aa9f69ef27ce6112fee6f4c792a9e2996cf374a74465276", size = 16115291 }, - { url = "https://files.pythonhosted.org/packages/21/0e/879af06b9ec0cae20fe6657a57916105ae50e0a8301cb713830535d66bb3/wandb-0.18.5-py3-none-win32.whl", hash = "sha256:b2a25e9caf63c12e5de1cbdb30b13f76553c04754f9ff404080f70386adb8384", size = 15417791 }, - { url = "https://files.pythonhosted.org/packages/92/52/a8563300b7a0474f68081acf5427331c8c2d8233137e49a29c1bcdf41817/wandb-0.18.5-py3-none-win_amd64.whl", hash = "sha256:83b619167eb2ffdd1188cba3805ccad158f6fd7fc06bef43daf6d2729a787fa0", size = 15417794 }, + { url = "https://files.pythonhosted.org/packages/d1/78/ca2444c41bcacd6b49846cfa853698935c656f4419f38d0860177b31763c/wandb-0.18.7-py3-none-any.whl", hash = "sha256:c2b9f9fea6daf8b62a505ea5d77d7e5e375c6014947a8882c0497399a9a1e4af", size = 6266739 }, + { url = "https://files.pythonhosted.org/packages/0c/6d/cf600f649090d3c3f8ac86becf10a1d3d5c1ce305389c4d02cc9488fb8d0/wandb-0.18.7-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:9fb2d381b20a079d7bb519b1b5cbbd94a10e941a2a0c5ccc044748b00344a294", size = 15789924 }, + { url = "https://files.pythonhosted.org/packages/de/7f/23f776942928bc9aea4d167030c39f4aee23fe07159ab5341bba8bb05a7f/wandb-0.18.7-py3-none-macosx_11_0_arm64.whl", hash = "sha256:87209f5aed8dbcf4b699ce745d096bc13b3cb66217efa5c44dd772d4f7fe7836", size = 15223289 }, + { url = "https://files.pythonhosted.org/packages/0b/e7/1cfc141d8ea5138cfa8bc6383b9047c7e0c26873ce15e43bc5db8fa5f249/wandb-0.18.7-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:e31d2115c558257406bf9beffe13d42313d958f2809cb15123a8e6a6d18d66c6", size = 15921278 }, + { url = "https://files.pythonhosted.org/packages/8f/bc/1688dd13505479f2a1901728e7d0e7b572ea7d9233af9beff62edf9a42fa/wandb-0.18.7-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e261e9f87005a4487548137d04bfa10fa14e3306b9901bc6ac2f3335c73df7c6", size = 15179910 }, + { url = "https://files.pythonhosted.org/packages/a3/65/8af6447adb236c0b487ae44f370cb24c8afda678b5acf7f1cb4469739048/wandb-0.18.7-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3133683a5b3bd3a50cf498e6b5ecc7406738619ae9f245326a9fa2e80ad313f", size = 16104608 }, + { url = "https://files.pythonhosted.org/packages/a6/34/fccdb0a3001200eadcf660558e549be895f18e0a10658fa957712fe02333/wandb-0.18.7-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7ca272660d880ba007aa7b4be2f88160692b2f12dccd431bd2f6471c85e68986", size = 16181168 }, + { url = "https://files.pythonhosted.org/packages/62/29/465482fa31ee52e310df09b365ea1f498799b1aba9b7520f9f27f83eb371/wandb-0.18.7-py3-none-win32.whl", hash = "sha256:a42b63c9b9e552b51e51b35caf26d81675dbc012317bc2701e39b3d84d479354", size = 15472552 }, + { url = "https://files.pythonhosted.org/packages/1f/d3/1996ef42e58a049d6b2d6c3e3f0c8d7d38a286f707c515672a928fd9eb6c/wandb-0.18.7-py3-none-win_amd64.whl", hash = "sha256:4ba9fda6dd7db02a23c6b302411fe26c3fcfea4947cc130a65e1de19812d324e", size = 15472555 }, ] [[package]] @@ -3005,91 +2585,40 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5a/84/44687a29792a70e111c5c477230a72c4b957d88d16141199bf9acb7537a3/websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526", size = 58826 }, ] -[[package]] -name = "websockets" -version = "13.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e2/73/9223dbc7be3dcaf2a7bbf756c351ec8da04b1fa573edaf545b95f6b0c7fd/websockets-13.1.tar.gz", hash = "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878", size = 158549 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/0a/94/d15dbfc6a5eb636dbc754303fba18208f2e88cf97e733e1d64fb9cb5c89e/websockets-13.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f48c749857f8fb598fb890a75f540e3221d0976ed0bf879cf3c7eef34151acee", size = 157815 }, - { url = "https://files.pythonhosted.org/packages/30/02/c04af33f4663945a26f5e8cf561eb140c35452b50af47a83c3fbcfe62ae1/websockets-13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7e72ce6bda6fb9409cc1e8164dd41d7c91466fb599eb047cfda72fe758a34a7", size = 155466 }, - { url = "https://files.pythonhosted.org/packages/35/e8/719f08d12303ea643655e52d9e9851b2dadbb1991d4926d9ce8862efa2f5/websockets-13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f779498eeec470295a2b1a5d97aa1bc9814ecd25e1eb637bd9d1c73a327387f6", size = 155716 }, - { url = "https://files.pythonhosted.org/packages/91/e1/14963ae0252a8925f7434065d25dcd4701d5e281a0b4b460a3b5963d2594/websockets-13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4676df3fe46956fbb0437d8800cd5f2b6d41143b6e7e842e60554398432cf29b", size = 164806 }, - { url = "https://files.pythonhosted.org/packages/ec/fa/ab28441bae5e682a0f7ddf3d03440c0c352f930da419301f4a717f675ef3/websockets-13.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7affedeb43a70351bb811dadf49493c9cfd1ed94c9c70095fd177e9cc1541fa", size = 163810 }, - { url = "https://files.pythonhosted.org/packages/44/77/dea187bd9d16d4b91566a2832be31f99a40d0f5bfa55eeb638eb2c3bc33d/websockets-13.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1971e62d2caa443e57588e1d82d15f663b29ff9dfe7446d9964a4b6f12c1e700", size = 164125 }, - { url = "https://files.pythonhosted.org/packages/cf/d9/3af14544e83f1437eb684b399e6ba0fa769438e869bf5d83d74bc197fae8/websockets-13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5f2e75431f8dc4a47f31565a6e1355fb4f2ecaa99d6b89737527ea917066e26c", size = 164532 }, - { url = "https://files.pythonhosted.org/packages/1c/8a/6d332eabe7d59dfefe4b8ba6f46c8c5fabb15b71c8a8bc3d2b65de19a7b6/websockets-13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:58cf7e75dbf7e566088b07e36ea2e3e2bd5676e22216e4cad108d4df4a7402a0", size = 163948 }, - { url = "https://files.pythonhosted.org/packages/1a/91/a0aeadbaf3017467a1ee03f8fb67accdae233fe2d5ad4b038c0a84e357b0/websockets-13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c90d6dec6be2c7d03378a574de87af9b1efea77d0c52a8301dd831ece938452f", size = 163898 }, - { url = "https://files.pythonhosted.org/packages/71/31/a90fb47c63e0ae605be914b0b969d7c6e6ffe2038cd744798e4b3fbce53b/websockets-13.1-cp310-cp310-win32.whl", hash = "sha256:730f42125ccb14602f455155084f978bd9e8e57e89b569b4d7f0f0c17a448ffe", size = 158706 }, - { url = "https://files.pythonhosted.org/packages/93/ca/9540a9ba80da04dc7f36d790c30cae4252589dbd52ccdc92e75b0be22437/websockets-13.1-cp310-cp310-win_amd64.whl", hash = "sha256:5993260f483d05a9737073be197371940c01b257cc45ae3f1d5d7adb371b266a", size = 159141 }, - { url = "https://files.pythonhosted.org/packages/b2/f0/cf0b8a30d86b49e267ac84addbebbc7a48a6e7bb7c19db80f62411452311/websockets-13.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:61fc0dfcda609cda0fc9fe7977694c0c59cf9d749fbb17f4e9483929e3c48a19", size = 157813 }, - { url = "https://files.pythonhosted.org/packages/bf/e7/22285852502e33071a8cf0ac814f8988480ec6db4754e067b8b9d0e92498/websockets-13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ceec59f59d092c5007e815def4ebb80c2de330e9588e101cf8bd94c143ec78a5", size = 155469 }, - { url = "https://files.pythonhosted.org/packages/68/d4/c8c7c1e5b40ee03c5cc235955b0fb1ec90e7e37685a5f69229ad4708dcde/websockets-13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1dca61c6db1166c48b95198c0b7d9c990b30c756fc2923cc66f68d17dc558fd", size = 155717 }, - { url = "https://files.pythonhosted.org/packages/c9/e4/c50999b9b848b1332b07c7fd8886179ac395cb766fda62725d1539e7bc6c/websockets-13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:308e20f22c2c77f3f39caca508e765f8725020b84aa963474e18c59accbf4c02", size = 165379 }, - { url = "https://files.pythonhosted.org/packages/bc/49/4a4ad8c072f18fd79ab127650e47b160571aacfc30b110ee305ba25fffc9/websockets-13.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62d516c325e6540e8a57b94abefc3459d7dab8ce52ac75c96cad5549e187e3a7", size = 164376 }, - { url = "https://files.pythonhosted.org/packages/af/9b/8c06d425a1d5a74fd764dd793edd02be18cf6fc3b1ccd1f29244ba132dc0/websockets-13.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87c6e35319b46b99e168eb98472d6c7d8634ee37750d7693656dc766395df096", size = 164753 }, - { url = "https://files.pythonhosted.org/packages/d5/5b/0acb5815095ff800b579ffc38b13ab1b915b317915023748812d24e0c1ac/websockets-13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5f9fee94ebafbc3117c30be1844ed01a3b177bb6e39088bc6b2fa1dc15572084", size = 165051 }, - { url = "https://files.pythonhosted.org/packages/30/93/c3891c20114eacb1af09dedfcc620c65c397f4fd80a7009cd12d9457f7f5/websockets-13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7c1e90228c2f5cdde263253fa5db63e6653f1c00e7ec64108065a0b9713fa1b3", size = 164489 }, - { url = "https://files.pythonhosted.org/packages/28/09/af9e19885539759efa2e2cd29b8b3f9eecef7ecefea40d46612f12138b36/websockets-13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6548f29b0e401eea2b967b2fdc1c7c7b5ebb3eeb470ed23a54cd45ef078a0db9", size = 164438 }, - { url = "https://files.pythonhosted.org/packages/b6/08/6f38b8e625b3d93de731f1d248cc1493327f16cb45b9645b3e791782cff0/websockets-13.1-cp311-cp311-win32.whl", hash = "sha256:c11d4d16e133f6df8916cc5b7e3e96ee4c44c936717d684a94f48f82edb7c92f", size = 158710 }, - { url = "https://files.pythonhosted.org/packages/fb/39/ec8832ecb9bb04a8d318149005ed8cee0ba4e0205835da99e0aa497a091f/websockets-13.1-cp311-cp311-win_amd64.whl", hash = "sha256:d04f13a1d75cb2b8382bdc16ae6fa58c97337253826dfe136195b7f89f661557", size = 159137 }, - { url = "https://files.pythonhosted.org/packages/df/46/c426282f543b3c0296cf964aa5a7bb17e984f58dde23460c3d39b3148fcf/websockets-13.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9d75baf00138f80b48f1eac72ad1535aac0b6461265a0bcad391fc5aba875cfc", size = 157821 }, - { url = "https://files.pythonhosted.org/packages/aa/85/22529867010baac258da7c45848f9415e6cf37fef00a43856627806ffd04/websockets-13.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:9b6f347deb3dcfbfde1c20baa21c2ac0751afaa73e64e5b693bb2b848efeaa49", size = 155480 }, - { url = "https://files.pythonhosted.org/packages/29/2c/bdb339bfbde0119a6e84af43ebf6275278698a2241c2719afc0d8b0bdbf2/websockets-13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de58647e3f9c42f13f90ac7e5f58900c80a39019848c5547bc691693098ae1bd", size = 155715 }, - { url = "https://files.pythonhosted.org/packages/9f/d0/8612029ea04c5c22bf7af2fd3d63876c4eaeef9b97e86c11972a43aa0e6c/websockets-13.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1b54689e38d1279a51d11e3467dd2f3a50f5f2e879012ce8f2d6943f00e83f0", size = 165647 }, - { url = "https://files.pythonhosted.org/packages/56/04/1681ed516fa19ca9083f26d3f3a302257e0911ba75009533ed60fbb7b8d1/websockets-13.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf1781ef73c073e6b0f90af841aaf98501f975d306bbf6221683dd594ccc52b6", size = 164592 }, - { url = "https://files.pythonhosted.org/packages/38/6f/a96417a49c0ed132bb6087e8e39a37db851c70974f5c724a4b2a70066996/websockets-13.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d23b88b9388ed85c6faf0e74d8dec4f4d3baf3ecf20a65a47b836d56260d4b9", size = 165012 }, - { url = "https://files.pythonhosted.org/packages/40/8b/fccf294919a1b37d190e86042e1a907b8f66cff2b61e9befdbce03783e25/websockets-13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3c78383585f47ccb0fcf186dcb8a43f5438bd7d8f47d69e0b56f71bf431a0a68", size = 165311 }, - { url = "https://files.pythonhosted.org/packages/c1/61/f8615cf7ce5fe538476ab6b4defff52beb7262ff8a73d5ef386322d9761d/websockets-13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d6d300f8ec35c24025ceb9b9019ae9040c1ab2f01cddc2bcc0b518af31c75c14", size = 164692 }, - { url = "https://files.pythonhosted.org/packages/5c/f1/a29dd6046d3a722d26f182b783a7997d25298873a14028c4760347974ea3/websockets-13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a9dcaf8b0cc72a392760bb8755922c03e17a5a54e08cca58e8b74f6902b433cf", size = 164686 }, - { url = "https://files.pythonhosted.org/packages/0f/99/ab1cdb282f7e595391226f03f9b498f52109d25a2ba03832e21614967dfa/websockets-13.1-cp312-cp312-win32.whl", hash = "sha256:2f85cf4f2a1ba8f602298a853cec8526c2ca42a9a4b947ec236eaedb8f2dc80c", size = 158712 }, - { url = "https://files.pythonhosted.org/packages/46/93/e19160db48b5581feac8468330aa11b7292880a94a37d7030478596cc14e/websockets-13.1-cp312-cp312-win_amd64.whl", hash = "sha256:38377f8b0cdeee97c552d20cf1865695fcd56aba155ad1b4ca8779a5b6ef4ac3", size = 159145 }, - { url = "https://files.pythonhosted.org/packages/2d/75/6da22cb3ad5b8c606963f9a5f9f88656256fecc29d420b4b2bf9e0c7d56f/websockets-13.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5dd6da9bec02735931fccec99d97c29f47cc61f644264eb995ad6c0c27667238", size = 155499 }, - { url = "https://files.pythonhosted.org/packages/c0/ba/22833d58629088fcb2ccccedfae725ac0bbcd713319629e97125b52ac681/websockets-13.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:2510c09d8e8df777177ee3d40cd35450dc169a81e747455cc4197e63f7e7bfe5", size = 155737 }, - { url = "https://files.pythonhosted.org/packages/95/54/61684fe22bdb831e9e1843d972adadf359cf04ab8613285282baea6a24bb/websockets-13.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1c3cf67185543730888b20682fb186fc8d0fa6f07ccc3ef4390831ab4b388d9", size = 157095 }, - { url = "https://files.pythonhosted.org/packages/fc/f5/6652fb82440813822022a9301a30afde85e5ff3fb2aebb77f34aabe2b4e8/websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcc03c8b72267e97b49149e4863d57c2d77f13fae12066622dc78fe322490fe6", size = 156701 }, - { url = "https://files.pythonhosted.org/packages/67/33/ae82a7b860fa8a08aba68818bdf7ff61f04598aa5ab96df4cd5a3e418ca4/websockets-13.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:004280a140f220c812e65f36944a9ca92d766b6cc4560be652a0a3883a79ed8a", size = 156654 }, - { url = "https://files.pythonhosted.org/packages/63/0b/a1b528d36934f833e20f6da1032b995bf093d55cb416b9f2266f229fb237/websockets-13.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:e2620453c075abeb0daa949a292e19f56de518988e079c36478bacf9546ced23", size = 159192 }, - { url = "https://files.pythonhosted.org/packages/56/27/96a5cd2626d11c8280656c6c71d8ab50fe006490ef9971ccd154e0c42cd2/websockets-13.1-py3-none-any.whl", hash = "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f", size = 152134 }, -] - [[package]] name = "wrapt" -version = "1.16.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/95/4c/063a912e20bcef7124e0df97282a8af3ff3e4b603ce84c481d6d7346be0a/wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d", size = 53972 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a8/c6/5375258add3777494671d8cec27cdf5402abd91016dee24aa2972c61fedf/wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4", size = 37315 }, - { url = "https://files.pythonhosted.org/packages/32/12/e11adfde33444986135d8881b401e4de6cbb4cced046edc6b464e6ad7547/wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020", size = 38160 }, - { url = "https://files.pythonhosted.org/packages/70/7d/3dcc4a7e96f8d3e398450ec7703db384413f79bd6c0196e0e139055ce00f/wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440", size = 80419 }, - { url = "https://files.pythonhosted.org/packages/d1/c4/8dfdc3c2f0b38be85c8d9fdf0011ebad2f54e40897f9549a356bebb63a97/wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487", size = 72669 }, - { url = "https://files.pythonhosted.org/packages/49/83/b40bc1ad04a868b5b5bcec86349f06c1ee1ea7afe51dc3e46131e4f39308/wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf", size = 80271 }, - { url = "https://files.pythonhosted.org/packages/19/d4/cd33d3a82df73a064c9b6401d14f346e1d2fb372885f0295516ec08ed2ee/wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72", size = 84748 }, - { url = "https://files.pythonhosted.org/packages/ef/58/2fde309415b5fa98fd8f5f4a11886cbf276824c4c64d45a39da342fff6fe/wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0", size = 77522 }, - { url = "https://files.pythonhosted.org/packages/07/44/359e4724a92369b88dbf09878a7cde7393cf3da885567ea898e5904049a3/wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136", size = 84780 }, - { url = "https://files.pythonhosted.org/packages/88/8f/706f2fee019360cc1da652353330350c76aa5746b4e191082e45d6838faf/wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d", size = 35335 }, - { url = "https://files.pythonhosted.org/packages/19/2b/548d23362e3002ebbfaefe649b833fa43f6ca37ac3e95472130c4b69e0b4/wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2", size = 37528 }, - { url = "https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09", size = 37313 }, - { url = "https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d", size = 38164 }, - { url = "https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389", size = 80890 }, - { url = "https://files.pythonhosted.org/packages/b7/96/bb5e08b3d6db003c9ab219c487714c13a237ee7dcc572a555eaf1ce7dc82/wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060", size = 73118 }, - { url = "https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1", size = 80746 }, - { url = "https://files.pythonhosted.org/packages/11/fb/18ec40265ab81c0e82a934de04596b6ce972c27ba2592c8b53d5585e6bcd/wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3", size = 85668 }, - { url = "https://files.pythonhosted.org/packages/0f/ef/0ecb1fa23145560431b970418dce575cfaec555ab08617d82eb92afc7ccf/wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956", size = 78556 }, - { url = "https://files.pythonhosted.org/packages/25/62/cd284b2b747f175b5a96cbd8092b32e7369edab0644c45784871528eb852/wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d", size = 85712 }, - { url = "https://files.pythonhosted.org/packages/e5/a7/47b7ff74fbadf81b696872d5ba504966591a3468f1bc86bca2f407baef68/wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362", size = 35327 }, - { url = "https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89", size = 37523 }, - { url = "https://files.pythonhosted.org/packages/92/17/224132494c1e23521868cdd57cd1e903f3b6a7ba6996b7b8f077ff8ac7fe/wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b", size = 37614 }, - { url = "https://files.pythonhosted.org/packages/6a/d7/cfcd73e8f4858079ac59d9db1ec5a1349bc486ae8e9ba55698cc1f4a1dff/wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36", size = 38316 }, - { url = "https://files.pythonhosted.org/packages/7e/79/5ff0a5c54bda5aec75b36453d06be4f83d5cd4932cc84b7cb2b52cee23e2/wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73", size = 86322 }, - { url = "https://files.pythonhosted.org/packages/c4/81/e799bf5d419f422d8712108837c1d9bf6ebe3cb2a81ad94413449543a923/wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809", size = 79055 }, - { url = "https://files.pythonhosted.org/packages/62/62/30ca2405de6a20448ee557ab2cd61ab9c5900be7cbd18a2639db595f0b98/wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b", size = 87291 }, - { url = "https://files.pythonhosted.org/packages/49/4e/5d2f6d7b57fc9956bf06e944eb00463551f7d52fc73ca35cfc4c2cdb7aed/wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81", size = 90374 }, - { url = "https://files.pythonhosted.org/packages/a6/9b/c2c21b44ff5b9bf14a83252a8b973fb84923764ff63db3e6dfc3895cf2e0/wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9", size = 83896 }, - { url = "https://files.pythonhosted.org/packages/14/26/93a9fa02c6f257df54d7570dfe8011995138118d11939a4ecd82cb849613/wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c", size = 91738 }, - { url = "https://files.pythonhosted.org/packages/a2/5b/4660897233eb2c8c4de3dc7cefed114c61bacb3c28327e64150dc44ee2f6/wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc", size = 35568 }, - { url = "https://files.pythonhosted.org/packages/5c/cc/8297f9658506b224aa4bd71906447dea6bb0ba629861a758c28f67428b91/wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8", size = 37653 }, - { url = "https://files.pythonhosted.org/packages/ff/21/abdedb4cdf6ff41ebf01a74087740a709e2edb146490e4d9beea054b0b7a/wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1", size = 23362 }, +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/a1/fc03dca9b0432725c2e8cdbf91a349d2194cf03d8523c124faebe581de09/wrapt-1.17.0.tar.gz", hash = "sha256:16187aa2317c731170a88ef35e8937ae0f533c402872c1ee5e6d079fcf320801", size = 55542 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/f9/85220321e9bb1a5f72ccce6604395ae75fcb463d87dad0014dc1010bd1f1/wrapt-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a0c23b8319848426f305f9cb0c98a6e32ee68a36264f45948ccf8e7d2b941f8", size = 38766 }, + { url = "https://files.pythonhosted.org/packages/ff/71/ff624ff3bde91ceb65db6952cdf8947bc0111d91bd2359343bc2fa7c57fd/wrapt-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1ca5f060e205f72bec57faae5bd817a1560fcfc4af03f414b08fa29106b7e2d", size = 83262 }, + { url = "https://files.pythonhosted.org/packages/9f/0a/814d4a121a643af99cfe55a43e9e6dd08f4a47cdac8e8f0912c018794715/wrapt-1.17.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e185ec6060e301a7e5f8461c86fb3640a7beb1a0f0208ffde7a65ec4074931df", size = 74990 }, + { url = "https://files.pythonhosted.org/packages/cd/c7/b8c89bf5ca5c4e6a2d0565d149d549cdb4cffb8916d1d1b546b62fb79281/wrapt-1.17.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb90765dd91aed05b53cd7a87bd7f5c188fcd95960914bae0d32c5e7f899719d", size = 82712 }, + { url = "https://files.pythonhosted.org/packages/19/7c/5977aefa8460906c1ff914fd42b11cf6c09ded5388e46e1cc6cea4ab15e9/wrapt-1.17.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:879591c2b5ab0a7184258274c42a126b74a2c3d5a329df16d69f9cee07bba6ea", size = 81705 }, + { url = "https://files.pythonhosted.org/packages/ae/e7/233402d7bd805096bb4a8ec471f5a141421a01de3c8c957cce569772c056/wrapt-1.17.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fce6fee67c318fdfb7f285c29a82d84782ae2579c0e1b385b7f36c6e8074fffb", size = 74636 }, + { url = "https://files.pythonhosted.org/packages/93/81/b6c32d8387d9cfbc0134f01585dee7583315c3b46dfd3ae64d47693cd078/wrapt-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0698d3a86f68abc894d537887b9bbf84d29bcfbc759e23f4644be27acf6da301", size = 81299 }, + { url = "https://files.pythonhosted.org/packages/d1/c3/1fae15d453468c98f09519076f8d401b476d18d8d94379e839eed14c4c8b/wrapt-1.17.0-cp310-cp310-win32.whl", hash = "sha256:69d093792dc34a9c4c8a70e4973a3361c7a7578e9cd86961b2bbf38ca71e4e22", size = 36425 }, + { url = "https://files.pythonhosted.org/packages/c6/f4/77e0886c95556f2b4caa8908ea8eb85f713fc68296a2113f8c63d50fe0fb/wrapt-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:f28b29dc158ca5d6ac396c8e0a2ef45c4e97bb7e65522bfc04c989e6fe814575", size = 38748 }, + { url = "https://files.pythonhosted.org/packages/0e/40/def56538acddc2f764c157d565b9f989072a1d2f2a8e384324e2e104fc7d/wrapt-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:74bf625b1b4caaa7bad51d9003f8b07a468a704e0644a700e936c357c17dd45a", size = 38766 }, + { url = "https://files.pythonhosted.org/packages/89/e2/8c299f384ae4364193724e2adad99f9504599d02a73ec9199bf3f406549d/wrapt-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f2a28eb35cf99d5f5bd12f5dd44a0f41d206db226535b37b0c60e9da162c3ed", size = 83730 }, + { url = "https://files.pythonhosted.org/packages/29/ef/fcdb776b12df5ea7180d065b28fa6bb27ac785dddcd7202a0b6962bbdb47/wrapt-1.17.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81b1289e99cf4bad07c23393ab447e5e96db0ab50974a280f7954b071d41b489", size = 75470 }, + { url = "https://files.pythonhosted.org/packages/55/b5/698bd0bf9fbb3ddb3a2feefbb7ad0dea1205f5d7d05b9cbab54f5db731aa/wrapt-1.17.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2939cd4a2a52ca32bc0b359015718472d7f6de870760342e7ba295be9ebaf9", size = 83168 }, + { url = "https://files.pythonhosted.org/packages/ce/07/701a5cee28cb4d5df030d4b2649319e36f3d9fdd8000ef1d84eb06b9860d/wrapt-1.17.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6a9653131bda68a1f029c52157fd81e11f07d485df55410401f745007bd6d339", size = 82307 }, + { url = "https://files.pythonhosted.org/packages/42/92/c48ba92cda6f74cb914dc3c5bba9650dc80b790e121c4b987f3a46b028f5/wrapt-1.17.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4e4b4385363de9052dac1a67bfb535c376f3d19c238b5f36bddc95efae15e12d", size = 75101 }, + { url = "https://files.pythonhosted.org/packages/8a/0a/9276d3269334138b88a2947efaaf6335f61d547698e50dff672ade24f2c6/wrapt-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bdf62d25234290db1837875d4dceb2151e4ea7f9fff2ed41c0fde23ed542eb5b", size = 81835 }, + { url = "https://files.pythonhosted.org/packages/b9/4c/39595e692753ef656ea94b51382cc9aea662fef59d7910128f5906486f0e/wrapt-1.17.0-cp311-cp311-win32.whl", hash = "sha256:5d8fd17635b262448ab8f99230fe4dac991af1dabdbb92f7a70a6afac8a7e346", size = 36412 }, + { url = "https://files.pythonhosted.org/packages/63/bb/c293a67fb765a2ada48f48cd0f2bb957da8161439da4c03ea123b9894c02/wrapt-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:92a3d214d5e53cb1db8b015f30d544bc9d3f7179a05feb8f16df713cecc2620a", size = 38744 }, + { url = "https://files.pythonhosted.org/packages/85/82/518605474beafff11f1a34759f6410ab429abff9f7881858a447e0d20712/wrapt-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:89fc28495896097622c3fc238915c79365dd0ede02f9a82ce436b13bd0ab7569", size = 38904 }, + { url = "https://files.pythonhosted.org/packages/80/6c/17c3b2fed28edfd96d8417c865ef0b4c955dc52c4e375d86f459f14340f1/wrapt-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875d240fdbdbe9e11f9831901fb8719da0bd4e6131f83aa9f69b96d18fae7504", size = 88622 }, + { url = "https://files.pythonhosted.org/packages/4a/11/60ecdf3b0fd3dca18978d89acb5d095a05f23299216e925fcd2717c81d93/wrapt-1.17.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5ed16d95fd142e9c72b6c10b06514ad30e846a0d0917ab406186541fe68b451", size = 80920 }, + { url = "https://files.pythonhosted.org/packages/d2/50/dbef1a651578a3520d4534c1e434989e3620380c1ad97e309576b47f0ada/wrapt-1.17.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18b956061b8db634120b58f668592a772e87e2e78bc1f6a906cfcaa0cc7991c1", size = 89170 }, + { url = "https://files.pythonhosted.org/packages/44/a2/78c5956bf39955288c9e0dd62e807b308c3aa15a0f611fbff52aa8d6b5ea/wrapt-1.17.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:daba396199399ccabafbfc509037ac635a6bc18510ad1add8fd16d4739cdd106", size = 86748 }, + { url = "https://files.pythonhosted.org/packages/99/49/2ee413c78fc0bdfebe5bee590bf3becdc1fab0096a7a9c3b5c9666b2415f/wrapt-1.17.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4d63f4d446e10ad19ed01188d6c1e1bb134cde8c18b0aa2acfd973d41fcc5ada", size = 79734 }, + { url = "https://files.pythonhosted.org/packages/c0/8c/4221b7b270e36be90f0930fe15a4755a6ea24093f90b510166e9ed7861ea/wrapt-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8a5e7cc39a45fc430af1aefc4d77ee6bad72c5bcdb1322cfde852c15192b8bd4", size = 87552 }, + { url = "https://files.pythonhosted.org/packages/4c/6b/1aaccf3efe58eb95e10ce8e77c8909b7a6b0da93449a92c4e6d6d10b3a3d/wrapt-1.17.0-cp312-cp312-win32.whl", hash = "sha256:0a0a1a1ec28b641f2a3a2c35cbe86c00051c04fffcfcc577ffcdd707df3f8635", size = 36647 }, + { url = "https://files.pythonhosted.org/packages/b3/4f/243f88ac49df005b9129194c6511b3642818b3e6271ddea47a15e2ee4934/wrapt-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:3c34f6896a01b84bab196f7119770fd8466c8ae3dfa73c59c0bb281e7b588ce7", size = 38830 }, + { url = "https://files.pythonhosted.org/packages/4b/d9/a8ba5e9507a9af1917285d118388c5eb7a81834873f45df213a6fe923774/wrapt-1.17.0-py3-none-any.whl", hash = "sha256:d2c63b93548eda58abf5188e505ffed0229bf675f7c3090f8e36ad55b8cbc371", size = 23592 }, ] [[package]] @@ -3150,73 +2679,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/62/e3/bef7b82c1997579c94de9ac5ea7626d01ae5858aa22bf4fcb38bf220cb3e/xxhash-3.5.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a74f23335b9689b66eb6dbe2a931a88fcd7a4c2cc4b1cb0edba8ce381c7a1da", size = 30064 }, ] -[[package]] -name = "yarl" -version = "1.17.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "idna" }, - { name = "multidict" }, - { name = "propcache" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/54/9c/9c0a9bfa683fc1be7fdcd9687635151544d992cccd48892dc5e0a5885a29/yarl-1.17.1.tar.gz", hash = "sha256:067a63fcfda82da6b198fa73079b1ca40b7c9b7994995b6ee38acda728b64d47", size = 178163 } -wheels = [ - { url = "https://files.pythonhosted.org/packages/97/63/0e1e3626a323f366a8ff8eeb4d2835d403cb505393c2fce00c68c2be9d1a/yarl-1.17.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1794853124e2f663f0ea54efb0340b457f08d40a1cef78edfa086576179c91", size = 140627 }, - { url = "https://files.pythonhosted.org/packages/ff/ef/80c92e43f5ca5dfe964f42080252b669097fdd37d40e8c174e5a10d67d2c/yarl-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fbea1751729afe607d84acfd01efd95e3b31db148a181a441984ce9b3d3469da", size = 93563 }, - { url = "https://files.pythonhosted.org/packages/05/43/add866f8c7e99af126a3ff4a673165537617995a5ae90e86cb95f9a1d4ad/yarl-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ee427208c675f1b6e344a1f89376a9613fc30b52646a04ac0c1f6587c7e46ec", size = 91400 }, - { url = "https://files.pythonhosted.org/packages/b9/44/464aba5761fb7ab448d8854520d98355217481746d2421231b8d07d2de8c/yarl-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b74ff4767d3ef47ffe0cd1d89379dc4d828d4873e5528976ced3b44fe5b0a21", size = 313746 }, - { url = "https://files.pythonhosted.org/packages/c1/0f/3a08d81f1e4ff88b07d62f3bb271603c0e2d063cea12239e500defa800d3/yarl-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62a91aefff3d11bf60e5956d340eb507a983a7ec802b19072bb989ce120cd948", size = 329234 }, - { url = "https://files.pythonhosted.org/packages/7d/0f/98f29b8637cf13d7589bb7a1fdc4357bcfc0cfc3f20bc65a6970b71a22ec/yarl-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:846dd2e1243407133d3195d2d7e4ceefcaa5f5bf7278f0a9bda00967e6326b04", size = 325776 }, - { url = "https://files.pythonhosted.org/packages/3c/8c/f383fc542a3d2a1837fb0543ce698653f1760cc18954c29e6d6d49713376/yarl-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e844be8d536afa129366d9af76ed7cb8dfefec99f5f1c9e4f8ae542279a6dc3", size = 318659 }, - { url = "https://files.pythonhosted.org/packages/2b/35/742b4a03ca90e116f70a44b24a36d2138f1b1d776a532ddfece4d60cd93d/yarl-1.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc7c92c1baa629cb03ecb0c3d12564f172218fb1739f54bf5f3881844daadc6d", size = 310172 }, - { url = "https://files.pythonhosted.org/packages/9b/fc/f1aba4194861f44673d9b432310cbee2e7c3ffa8ff9bdf165c7eaa9c6e38/yarl-1.17.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ae3476e934b9d714aa8000d2e4c01eb2590eee10b9d8cd03e7983ad65dfbfcba", size = 318283 }, - { url = "https://files.pythonhosted.org/packages/27/0f/2b20100839064d1c75fb85fa6b5cbd68249d96a4b06a5cf25f9eaaf9b32a/yarl-1.17.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c7e177c619342e407415d4f35dec63d2d134d951e24b5166afcdfd1362828e17", size = 317599 }, - { url = "https://files.pythonhosted.org/packages/7b/da/3f2d6643d8cf3003c72587f28a9d9c76829a5b45186cae8f978bac113fc5/yarl-1.17.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:64cc6e97f14cf8a275d79c5002281f3040c12e2e4220623b5759ea7f9868d6a5", size = 323398 }, - { url = "https://files.pythonhosted.org/packages/9e/f8/881c97cc35603ec63b48875d47e36e1b984648826b36ce7affac16e08261/yarl-1.17.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:84c063af19ef5130084db70ada40ce63a84f6c1ef4d3dbc34e5e8c4febb20822", size = 337601 }, - { url = "https://files.pythonhosted.org/packages/81/da/049b354e00b33019c32126f2a40ecbcc320859f619c4304c556cf23a5dc3/yarl-1.17.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:482c122b72e3c5ec98f11457aeb436ae4aecca75de19b3d1de7cf88bc40db82f", size = 338975 }, - { url = "https://files.pythonhosted.org/packages/26/64/e36e808b249d64cfc33caca7e9ef2d7e636e4f9e8529e4fe5ed4813ac5b0/yarl-1.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:380e6c38ef692b8fd5a0f6d1fa8774d81ebc08cfbd624b1bca62a4d4af2f9931", size = 331078 }, - { url = "https://files.pythonhosted.org/packages/82/cb/6fe205b528cc889f8e13d6d180adbc8721a21a6aac67fc3158294575add3/yarl-1.17.1-cp310-cp310-win32.whl", hash = "sha256:16bca6678a83657dd48df84b51bd56a6c6bd401853aef6d09dc2506a78484c7b", size = 83573 }, - { url = "https://files.pythonhosted.org/packages/55/96/4dcb7110ae4cd53768254fb50ace7bca00e110459e6eff1d16983c513219/yarl-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:561c87fea99545ef7d692403c110b2f99dced6dff93056d6e04384ad3bc46243", size = 89761 }, - { url = "https://files.pythonhosted.org/packages/ec/0f/ce6a2c8aab9946446fb27f1e28f0fd89ce84ae913ab18a92d18078a1c7ed/yarl-1.17.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cbad927ea8ed814622305d842c93412cb47bd39a496ed0f96bfd42b922b4a217", size = 140727 }, - { url = "https://files.pythonhosted.org/packages/9d/df/204f7a502bdc3973cd9fc29e7dfad18ae48b3acafdaaf1ae07c0f41025aa/yarl-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fca4b4307ebe9c3ec77a084da3a9d1999d164693d16492ca2b64594340999988", size = 93560 }, - { url = "https://files.pythonhosted.org/packages/a2/e1/f4d522ae0560c91a4ea31113a50f00f85083be885e1092fc6e74eb43cb1d/yarl-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff5c6771c7e3511a06555afa317879b7db8d640137ba55d6ab0d0c50425cab75", size = 91497 }, - { url = "https://files.pythonhosted.org/packages/f1/82/783d97bf4a226f1a2e59b1966f2752244c2bf4dc89bc36f61d597b8e34e5/yarl-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b29beab10211a746f9846baa39275e80034e065460d99eb51e45c9a9495bcca", size = 339446 }, - { url = "https://files.pythonhosted.org/packages/e5/ff/615600647048d81289c80907165de713fbc566d1e024789863a2f6563ba3/yarl-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a52a1ffdd824fb1835272e125385c32fd8b17fbdefeedcb4d543cc23b332d74", size = 354616 }, - { url = "https://files.pythonhosted.org/packages/a5/04/bfb7adb452bd19dfe0c35354ffce8ebc3086e028e5f8270e409d17da5466/yarl-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58c8e9620eb82a189c6c40cb6b59b4e35b2ee68b1f2afa6597732a2b467d7e8f", size = 351801 }, - { url = "https://files.pythonhosted.org/packages/10/e0/efe21edacdc4a638ce911f8cabf1c77cac3f60e9819ba7d891b9ceb6e1d4/yarl-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d216e5d9b8749563c7f2c6f7a0831057ec844c68b4c11cb10fc62d4fd373c26d", size = 343381 }, - { url = "https://files.pythonhosted.org/packages/63/f9/7bc7e69857d6fc3920ecd173592f921d5701f4a0dd3f2ae293b386cfa3bf/yarl-1.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:881764d610e3269964fc4bb3c19bb6fce55422828e152b885609ec176b41cf11", size = 337093 }, - { url = "https://files.pythonhosted.org/packages/93/52/99da61947466275ff17d7bc04b0ac31dfb7ec699bd8d8985dffc34c3a913/yarl-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8c79e9d7e3d8a32d4824250a9c6401194fb4c2ad9a0cec8f6a96e09a582c2cc0", size = 346619 }, - { url = "https://files.pythonhosted.org/packages/91/8a/8aaad86a35a16e485ba0e5de0d2ae55bf8dd0c9f1cccac12be4c91366b1d/yarl-1.17.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:299f11b44d8d3a588234adbe01112126010bd96d9139c3ba7b3badd9829261c3", size = 344347 }, - { url = "https://files.pythonhosted.org/packages/af/b6/97f29f626b4a1768ffc4b9b489533612cfcb8905c90f745aade7b2eaf75e/yarl-1.17.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cc7d768260f4ba4ea01741c1b5fe3d3a6c70eb91c87f4c8761bbcce5181beafe", size = 350316 }, - { url = "https://files.pythonhosted.org/packages/d7/98/8e0e8b812479569bdc34d66dd3e2471176ca33be4ff5c272a01333c4b269/yarl-1.17.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:de599af166970d6a61accde358ec9ded821234cbbc8c6413acfec06056b8e860", size = 361336 }, - { url = "https://files.pythonhosted.org/packages/9e/d3/d1507efa0a85c25285f8eb51df9afa1ba1b6e446dda781d074d775b6a9af/yarl-1.17.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2b24ec55fad43e476905eceaf14f41f6478780b870eda5d08b4d6de9a60b65b4", size = 365350 }, - { url = "https://files.pythonhosted.org/packages/22/ba/ee7f1830449c96bae6f33210b7d89e8aaf3079fbdaf78ac398e50a9da404/yarl-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9fb815155aac6bfa8d86184079652c9715c812d506b22cfa369196ef4e99d1b4", size = 357689 }, - { url = "https://files.pythonhosted.org/packages/a0/85/321c563dc5afe1661108831b965c512d185c61785400f5606006507d2e18/yarl-1.17.1-cp311-cp311-win32.whl", hash = "sha256:7615058aabad54416ddac99ade09a5510cf77039a3b903e94e8922f25ed203d7", size = 83635 }, - { url = "https://files.pythonhosted.org/packages/bc/da/543a32c00860588ff1235315b68f858cea30769099c32cd22b7bb266411b/yarl-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:14bc88baa44e1f84164a392827b5defb4fa8e56b93fecac3d15315e7c8e5d8b3", size = 90218 }, - { url = "https://files.pythonhosted.org/packages/5d/af/e25615c7920396219b943b9ff8b34636ae3e1ad30777649371317d7f05f8/yarl-1.17.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:327828786da2006085a4d1feb2594de6f6d26f8af48b81eb1ae950c788d97f61", size = 141839 }, - { url = "https://files.pythonhosted.org/packages/83/5e/363d9de3495c7c66592523f05d21576a811015579e0c87dd38c7b5788afd/yarl-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cc353841428d56b683a123a813e6a686e07026d6b1c5757970a877195f880c2d", size = 94125 }, - { url = "https://files.pythonhosted.org/packages/e3/a2/b65447626227ebe36f18f63ac551790068bf42c69bb22dfa3ae986170728/yarl-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c73df5b6e8fabe2ddb74876fb82d9dd44cbace0ca12e8861ce9155ad3c886139", size = 92048 }, - { url = "https://files.pythonhosted.org/packages/a1/f5/2ef86458446f85cde10582054fd5113495ef8ce8477da35aaaf26d2970ef/yarl-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bdff5e0995522706c53078f531fb586f56de9c4c81c243865dd5c66c132c3b5", size = 331472 }, - { url = "https://files.pythonhosted.org/packages/f3/6b/1ba79758ba352cdf2ad4c20cab1b982dd369aa595bb0d7601fc89bf82bee/yarl-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06157fb3c58f2736a5e47c8fcbe1afc8b5de6fb28b14d25574af9e62150fcaac", size = 341260 }, - { url = "https://files.pythonhosted.org/packages/2d/41/4e07c2afca3f9ed3da5b0e38d43d0280d9b624a3d5c478c425e5ce17775c/yarl-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1654ec814b18be1af2c857aa9000de7a601400bd4c9ca24629b18486c2e35463", size = 340882 }, - { url = "https://files.pythonhosted.org/packages/c3/c0/cd8e94618983c1b811af082e1a7ad7764edb3a6af2bc6b468e0e686238ba/yarl-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f6595c852ca544aaeeb32d357e62c9c780eac69dcd34e40cae7b55bc4fb1147", size = 336648 }, - { url = "https://files.pythonhosted.org/packages/ac/fc/73ec4340d391ffbb8f34eb4c55429784ec9f5bd37973ce86d52d67135418/yarl-1.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:459e81c2fb920b5f5df744262d1498ec2c8081acdcfe18181da44c50f51312f7", size = 325019 }, - { url = "https://files.pythonhosted.org/packages/57/48/da3ebf418fc239d0a156b3bdec6b17a5446f8d2dea752299c6e47b143a85/yarl-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e48cdb8226644e2fbd0bdb0a0f87906a3db07087f4de77a1b1b1ccfd9e93685", size = 342841 }, - { url = "https://files.pythonhosted.org/packages/5d/79/107272745a470a8167924e353a5312eb52b5a9bb58e22686adc46c94f7ec/yarl-1.17.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:d9b6b28a57feb51605d6ae5e61a9044a31742db557a3b851a74c13bc61de5172", size = 341433 }, - { url = "https://files.pythonhosted.org/packages/30/9c/6459668b3b8dcc11cd061fc53e12737e740fb6b1575b49c84cbffb387b3a/yarl-1.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e594b22688d5747b06e957f1ef822060cb5cb35b493066e33ceac0cf882188b7", size = 344927 }, - { url = "https://files.pythonhosted.org/packages/c5/0b/93a17ed733aca8164fc3a01cb7d47b3f08854ce4f957cce67a6afdb388a0/yarl-1.17.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5f236cb5999ccd23a0ab1bd219cfe0ee3e1c1b65aaf6dd3320e972f7ec3a39da", size = 355732 }, - { url = "https://files.pythonhosted.org/packages/9a/63/ead2ed6aec3c59397e135cadc66572330325a0c24cd353cd5c94f5e63463/yarl-1.17.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a2a64e62c7a0edd07c1c917b0586655f3362d2c2d37d474db1a509efb96fea1c", size = 362123 }, - { url = "https://files.pythonhosted.org/packages/89/bf/f6b75b4c2fcf0e7bb56edc0ed74e33f37fac45dc40e5a52a3be66b02587a/yarl-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d0eea830b591dbc68e030c86a9569826145df485b2b4554874b07fea1275a199", size = 356355 }, - { url = "https://files.pythonhosted.org/packages/45/1f/50a0257cd07eef65c8c65ad6a21f5fb230012d659e021aeb6ac8a7897bf6/yarl-1.17.1-cp312-cp312-win32.whl", hash = "sha256:46ddf6e0b975cd680eb83318aa1d321cb2bf8d288d50f1754526230fcf59ba96", size = 83279 }, - { url = "https://files.pythonhosted.org/packages/bc/82/fafb2c1268d63d54ec08b3a254fbe51f4ef098211501df646026717abee3/yarl-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:117ed8b3732528a1e41af3aa6d4e08483c2f0f2e3d3d7dca7cf538b3516d93df", size = 89590 }, - { url = "https://files.pythonhosted.org/packages/52/ad/1fe7ff5f3e8869d4c5070f47b96bac2b4d15e67c100a8278d8e7876329fc/yarl-1.17.1-py3-none-any.whl", hash = "sha256:f1790a4b1e8e8e028c391175433b9c8122c39b46e1663228158e61e6f915bf06", size = 44352 }, -] - [[package]] name = "zipp" -version = "3.20.2" +version = "3.21.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/54/bf/5c0000c44ebc80123ecbdddba1f5dcd94a5ada602a9c225d84b5aaa55e86/zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29", size = 24199 } +sdist = { url = "https://files.pythonhosted.org/packages/3f/50/bad581df71744867e9468ebd0bcd6505de3b275e06f202c2cb016e3ff56f/zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", size = 24545 } wheels = [ - { url = "https://files.pythonhosted.org/packages/62/8b/5ba542fa83c90e09eac972fc9baca7a88e7e7ca4b221a89251954019308b/zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", size = 9200 }, + { url = "https://files.pythonhosted.org/packages/b7/1a/7e4798e9339adc931158c9d69ecc34f5e6791489d469f5e50ec15e35f458/zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931", size = 9630 }, ] diff --git a/validator/weight_setting/Dockerfile b/validator/weight_setting/Dockerfile index 9a2ca363..f8617ff5 100644 --- a/validator/weight_setting/Dockerfile +++ b/validator/weight_setting/Dockerfile @@ -1,43 +1,24 @@ FROM python:3.10 -RUN apt-get update && apt-get install -y sudo pipx +RUN apt-get update && apt-get install -y pipx RUN useradd --create-home --home-dir /home/validator validator - -WORKDIR /app - USER validator RUN pipx install uv -COPY neuron/pyproject.toml neuron/ -COPY neuron/neuron/__init__.py neuron/neuron/ -COPY pipelines/pyproject.toml pipelines/ -COPY pipelines/pipelines/__init__.py pipelines/pipelines/ +WORKDIR /app/validator +COPY base/pyproject.toml base/ COPY validator/pyproject.toml validator/ -COPY validator/uv.lock validator/ - -COPY README.md . - -COPY validator/base_validator/__init__.py validator/base_validator/ -COPY validator/submission_tester/__init__.py validator/submission_tester/ -COPY validator/weight_setting/__init__.py validator/weight_setting/ -COPY --chown=api:api .git .git - -USER root -RUN chown -R validator:validator /app -USER validator - -WORKDIR /app/validator -ENV PATH="/home/validator/.local/bin:$PATH" +RUN uv sync --compile-bytecode -RUN uv sync +COPY pipelines . +COPY base . +COPY validator . +COPY .git .git -COPY validator/base_validator base_validator -COPY validator/weight_setting weight_setting -COPY neuron/neuron ../neuron/neuron -COPY pipelines/pipelines ../pipelines/pipelines +WORKDIR /api/validator/weight_setting USER root -ENTRYPOINT ["weight_setting/entrypoint.sh"] \ No newline at end of file +ENTRYPOINT ["entrypoint.sh"] diff --git a/validator/weight_setting/benchmarking_api.py b/validator/weight_setting/benchmarking_api.py index 3bb6dd5b..d43ea12c 100644 --- a/validator/weight_setting/benchmarking_api.py +++ b/validator/weight_setting/benchmarking_api.py @@ -1,40 +1,44 @@ -import time +from collections import defaultdict from itertools import islice from math import ceil +from operator import itemgetter +from time import time_ns import requests from fiber.logging_utils import get_logger from substrateinterface import Keypair -from base_validator import BenchmarkResults, BenchmarkingStartRequest, ApiMetadata, API_VERSION -from neuron import ModelRepositoryInfo, Key, ContestId, MinerModelInfo, CURRENT_CONTEST +from base.checkpoint import Key, Uid, Submissions +from base.contest import ContestId, RepositoryInfo +from base_validator.api_data import BenchmarkingStartRequest, ApiMetadata, BenchmarkingResults, BenchmarkingInitializeRequest logger = get_logger(__name__) - -def _authentication_headers(keypair: Keypair): - nonce = str(time.time_ns()) - - signature = f"0x{keypair.sign(nonce).hex()}" - - return { - "X-Nonce": nonce, - "Signature": signature, - } - - class BenchmarkingApi: - _keypair: Keypair _api: str + _keypair: Keypair - def __init__(self, keypair: Keypair, api: str): - self._keypair = keypair + def __init__(self, api: str, keypair: Keypair): self._api = api + self._keypair = keypair - def start_benchmarking(self, contest_id: ContestId, submissions: dict[Key, ModelRepositoryInfo]): - logger.info(f"Sending {len(submissions)} submissions for testing") + def initialize(self, uid: Uid, signature: str, substrate_url: str): + requests.post( + f"{self._api}/initialize", + headers={ + "Content-Type": "application/json", + **_authentication_headers(self._keypair), + }, + data=BenchmarkingInitializeRequest( + uid=uid, + signature=signature, + substrate_url=substrate_url, + ).model_dump_json(), + + ).raise_for_status() - data = BenchmarkingStartRequest(contest_id=contest_id, submissions=submissions) + def start(self, contest_id: ContestId, submissions: dict[Key, RepositoryInfo]): + logger.info(f"Sending {len(submissions)} submissions for {contest_id.name}") requests.post( f"{self._api}/start", @@ -42,34 +46,75 @@ def start_benchmarking(self, contest_id: ContestId, submissions: dict[Key, Model "Content-Type": "application/json", **_authentication_headers(self._keypair), }, - data=data.model_dump_json(), + data=BenchmarkingStartRequest( + contest_id=contest_id, + submissions=submissions, + ).model_dump_json(), ).raise_for_status() - def state(self): - response = requests.get(f"{self._api}/state") - response.raise_for_status() - return BenchmarkResults.model_validate(response.json()) - def metadata(self) -> ApiMetadata: response = requests.get(f"{self._api}/metadata") response.raise_for_status() return ApiMetadata.model_validate(response.json()) + def results(self) -> BenchmarkingResults: + response = requests.get(f"{self._api}/state") + response.raise_for_status() + return BenchmarkingResults.model_validate(response.json()) -def send_submissions_to_api(apis: list[BenchmarkingApi], submissions: dict[Key, MinerModelInfo]): - submissions_info = { - key: info.repository - for key, info in submissions.items() +def _authentication_headers(keypair: Keypair): + nonce = str(time_ns()) + + signature = f"0x{keypair.sign(nonce).hex()}" + + return { + "X-Nonce": nonce, + "Signature": signature, } - iterator = iter(submissions_info.items()) +def send_submissions_to_api(version: str, all_apis: list[BenchmarkingApi], submissions: Submissions): + submissions_by_contest: dict[ContestId, dict[Key, RepositoryInfo]] = defaultdict(lambda: {}) + + for key, info in submissions.items(): + submissions_by_contest[info.contest_id][key] = info.repository + + contest_api_assignment: dict[ContestId, list[BenchmarkingApi]] = defaultdict(lambda: []) + + for api in all_apis: + metadata = api.metadata() + if metadata.version != version: + raise ValueError(f"API version mismatch, expected {version}, got {metadata.version}") + + if sum(len(contest_api_assignment[contest_id]) for contest_id in metadata.compatible_contests) == 0: + compatible_contests = list(filter(submissions_by_contest.__contains__, metadata.compatible_contests)) + + if compatible_contests: + contest_api_assignment[compatible_contests[0]].append(api) + else: + assignment_counts = [ + (contest_id, len(contest_api_assignment[contest_id])) + for contest_id in metadata.compatible_contests + if contest_id in submissions_by_contest + ] + + lowest_contest_id = min(assignment_counts, key=itemgetter(1))[0] + + contest_api_assignment[lowest_contest_id].append(api) + + for contest_id, apis in contest_api_assignment.items(): + if contest_id not in submissions_by_contest: + raise RuntimeError(f"No API compatible with contest type {contest_id}") + + contest_submissions = submissions_by_contest[contest_id] + + iterator = iter(contest_submissions.items()) - chunk_size = ceil(len(submissions_info) / len(apis)) + chunk_size = ceil(len(contest_submissions) / len(apis)) - chunks = [ - (api, list(islice(iterator, chunk_size))) - for api in apis - ] + chunks = [ + (api, list(islice(iterator, chunk_size))) + for api in apis + ] - for api, chunk in chunks: - api.start_benchmarking(CURRENT_CONTEST.id, dict(chunk)) + for api, chunk in chunks: + api.start(contest_id, dict(chunk)) diff --git a/validator/weight_setting/contest_state.py b/validator/weight_setting/contest_state.py new file mode 100644 index 00000000..7e0c2fd4 --- /dev/null +++ b/validator/weight_setting/contest_state.py @@ -0,0 +1,88 @@ +from datetime import datetime, timedelta +from threading import Event + +from fiber.logging_utils import get_logger +from pydantic import BaseModel + +from base.checkpoint import Key, current_time, Submissions, Benchmarks +from base.contest import Metrics +from weight_setting.winner_selection import get_contestant_scores, get_contestant_tiers + +logger = get_logger(__name__) + +class ContestState(BaseModel): + step: int + benchmarks_version: int + submissions: Submissions + benchmarks: Benchmarks + baseline: Metrics | None + invalid_submissions: set[Key] + last_benchmarks: Benchmarks + average_benchmarking_time: float | None + contest_end: datetime + + def start_new_contest(self, benchmarks_version: int, submissions: Submissions): + logger.info("Starting new contest") + self.benchmarks_version = benchmarks_version + self.submissions = submissions + + self.last_benchmarks = self.benchmarks + self.benchmarks.clear() + self.baseline = None + self.average_benchmarking_time = None + + now = current_time() + end_time = now.replace(hour=12, minute=0, second=0, microsecond=0) + if now.hour >= 12: + end_time += timedelta(days=1) + self.contest_end = end_time + + def get_contest_start(self) -> datetime: + return self.contest_end - timedelta(days=1) + + def is_ended(self) -> bool: + now = current_time() + return now >= self.contest_end or not self.submissions + + def get_untested_submissions(self) -> Submissions: + return { + key: submission for key, submission in self.submissions.items() + if key not in self.benchmarks and key not in self.invalid_submissions + } + + def sleep_to_next_contest(self, stop_flag: Event): + now = current_time() + next_contest_time = self.contest_end - now + logger.info(f"Sleeping until next contest: {next_contest_time}") + stop_flag.wait(next_contest_time.total_seconds()) + + def get_scores(self) -> dict[Key, float]: + return get_contestant_scores( + submissions=self.submissions, + benchmarks=self.benchmarks, + baseline=self.baseline, + ) + + def get_tiers(self, scores: dict[Key, float]) -> dict[Key, int]: + return get_contestant_tiers( + submitted_blocks={ + key: submission.block + for key, submission in self.submissions.items() + }, + scores=scores, + ) + + @classmethod + def create(cls, benchmarks_version: int) -> "ContestState": + state = cls( + step=0, + benchmarks_version=benchmarks_version, + submissions={}, + benchmarks={}, + baseline=None, + invalid_submissions=set(), + last_benchmarks={}, + average_benchmarking_time=None, + contest_end=current_time() + ) + return state diff --git a/validator/weight_setting/entrypoint.sh b/validator/weight_setting/entrypoint.sh index 47233d4f..574f5255 100755 --- a/validator/weight_setting/entrypoint.sh +++ b/validator/weight_setting/entrypoint.sh @@ -3,4 +3,4 @@ chown -R validator:validator /home/validator/.bittensor chown -R validator:validator /home/validator/.netrc -sudo -u validator ./weight_setting/start.sh "$@" +sudo -u validator ./start.sh "$@" diff --git a/validator/weight_setting/start.sh b/validator/weight_setting/start.sh index eab097f6..30385940 100755 --- a/validator/weight_setting/start.sh +++ b/validator/weight_setting/start.sh @@ -5,5 +5,5 @@ set -e ~/.local/bin/uv run opentelemetry-instrument \ --service_name edge-maxxing-validator \ --exporter_otlp_endpoint http://98.81.78.238:4317 \ - --resource_attributes "neuron.type=validator,$(~/.local/bin/uv run python3 weight_setting/telemetry_attributes.py "$@")" \ + --resource_attributes "neuron.type=validator,$(~/.local/bin/uv run python3 telemetry_attributes.py "$@")" \ start_validator "$@" diff --git a/validator/weight_setting/state_manager.py b/validator/weight_setting/state_manager.py new file mode 100644 index 00000000..92ed26de --- /dev/null +++ b/validator/weight_setting/state_manager.py @@ -0,0 +1,46 @@ +from pathlib import Path + +from fiber.logging_utils import get_logger +from pydantic_core import ValidationError + +from .contest_state import ContestState + +logger = get_logger(__name__) + +STATE_VERSION = 1 + +class StateManager: + _state_file: Path + + def __init__(self, wallet_name: str, hotkey_name: str, netuid: int): + path = ( + Path.home() / + ".bittensor" / + "miners" / + wallet_name / + hotkey_name / + f"netuid{netuid}" / + "validator" + ) + + path.mkdir(parents=True, exist_ok=True) + self._state_file = path / f"state_v{STATE_VERSION}.json" + + def load_state(self) -> ContestState | None: + if not self._state_file.exists(): + return None + + logger.info(f"Loading state") + + try: + with self._state_file.open("rb") as file: + return ContestState.model_validate_json(file.read()) + except ValidationError as e: + logger.error(f"Failed to load state", exc_info=e) + return None + + def save_state(self, state: ContestState): + logger.info(f"Saving state") + + with self._state_file.open("wb") as file: + file.write(state.model_dump_json(indent=4).encode()) diff --git a/validator/weight_setting/telemetry_attributes.py b/validator/weight_setting/telemetry_attributes.py index 79d85a16..ddff8980 100644 --- a/validator/weight_setting/telemetry_attributes.py +++ b/validator/weight_setting/telemetry_attributes.py @@ -1,24 +1,21 @@ import logging + logging.disable() -import sys +from base.config import get_config +from weight_setting.validator_args import add_args from fiber.chain.chain_utils import load_hotkey_keypair -from neuron import get_config -from weight_setting.validator import Validator - - def log_extra_attributes(): - config = get_config(Validator.add_extra_args) + config = get_config(add_args) keypair = load_hotkey_keypair( wallet_name=config["wallet.name"], hotkey_name=config["wallet.hotkey"], ) - sys.stdout.write(f"netuid={config['netuid']},neuron.hotkey={keypair.ss58_address}") - sys.stdout.flush() + print(f"netuid={config['netuid']},neuron.hotkey={keypair.ss58_address}") if __name__ == "__main__": - log_extra_attributes() \ No newline at end of file + log_extra_attributes() diff --git a/validator/weight_setting/validator.py b/validator/weight_setting/validator.py index 47510df2..b993d5cd 100644 --- a/validator/weight_setting/validator.py +++ b/validator/weight_setting/validator.py @@ -1,865 +1,193 @@ -import random -from argparse import ArgumentParser -from dataclasses import dataclass -from datetime import date, datetime, timedelta, time -from json import JSONDecodeError -from math import ceil -from operator import itemgetter, attrgetter -from os import makedirs -from os.path import isfile -from pathlib import Path -from pickle import dump, load -from ssl import SSLEOFError +from importlib.metadata import version +from signal import signal, SIGINT, SIGHUP, SIGTERM +from threading import Event from time import sleep from typing import Any -import requests -import wandb -from opentelemetry import trace - -from base_validator import BenchmarkState, BenchmarkResults, AutoUpdater, init_open_telemetry_logging from fiber.chain.chain_utils import load_hotkey_keypair from fiber.chain.interface import get_substrate from fiber.chain.metagraph import Metagraph -from fiber.chain.weights import set_node_weights from fiber.logging_utils import get_logger -from substrateinterface.exceptions import SubstrateRequestException +from opentelemetry import trace +from requests.exceptions import HTTPError, ConnectionError from substrateinterface import SubstrateInterface, Keypair -from wandb.sdk.wandb_run import Run - -from neuron import ( - get_config, - CURRENT_CONTEST, - INPUTS_ENDPOINT, - Key, - Uid, - MinerModelInfo, - TIMEZONE, - SPEC_VERSION, - get_submissions, - BENCHMARKS_VERSION, - CheckpointBenchmark, - MetricData, -) -from neuron.device import ContestDeviceValidationError -from .benchmarking_api import BenchmarkingApi, send_submissions_to_api -from .wandb_args import add_wandb_args -from .winner_selection import get_scores, get_contestant_scores, get_tiers, get_contestant_tier - -VALIDATOR_VERSION: tuple[int, int, int] = (5, 4, 0) -VALIDATOR_VERSION_STRING = ".".join(map(str, VALIDATOR_VERSION)) -VALIDATOR_STATE_VERSION = 1 -WEIGHTS_VERSION = ( - VALIDATOR_VERSION[0] * 10000 + - VALIDATOR_VERSION[1] * 100 + - VALIDATOR_VERSION[2] -) +from base.checkpoint import Uid +from base.config import get_config +from base.submissions import get_submissions +from base_validator.api_data import BenchmarkState, BenchmarkingResults +from base_validator.auto_updater import AutoUpdater +from base_validator.telemetry import init_open_telemetry_logging +from weight_setting.wandb_manager import WandbManager +from .benchmarking_api import BenchmarkingApi, send_submissions_to_api +from .contest_state import ContestState +from .state_manager import StateManager +from .validator_args import add_args +from .weight_setter import WeightSetter -COLLECTED_SUBMISSIONS_VERSION = SPEC_VERSION * 10 + 2 +BENCHMARK_UPDATE_RATE_BLOCKS = 10 +BENCHMARKS_VERSION = 1 logger = get_logger(__name__) tracer = trace.get_tracer(__name__) - -@dataclass -class ContestState: - miner_score_version: int - submission_spec_version: int - miner_info: list[MinerModelInfo | None] - - def __init__( - self, - miner_info: list[MinerModelInfo | None], - ): - self.miner_score_version = BENCHMARKS_VERSION - self.submission_spec_version = COLLECTED_SUBMISSIONS_VERSION - self.miner_info = miner_info - - class Validator: - auto_updater: AutoUpdater - config: dict[str, Any] - substrate: SubstrateInterface - metagraph: Metagraph - keypair: Keypair + _stop_flag: Event = Event() + contest_state: ContestState | None = None + validator_version: str = version("edge-maxxing-validator") uid: Uid - hotkeys: list[Key] - step: int - - last_day: date | None - contest_state: ContestState | None - benchmarking: bool - benchmarking_api_urls: list[str] + config: dict[str, Any] = get_config(add_args) + + keypair: Keypair = load_hotkey_keypair( + wallet_name=config["wallet.name"], + hotkey_name=config["wallet.hotkey"], + ) + + signature = f"0x{keypair.sign(f'{validator_version}:{keypair.ss58_address}').hex()}" + + substrate: SubstrateInterface = get_substrate( + subtensor_network=config["subtensor.network"], + subtensor_address=config["subtensor.chain_endpoint"] + ) + + metagraph: Metagraph = Metagraph( + substrate=substrate, + netuid=config["netuid"], + load_old_nodes=False, + ) + + state_manager: StateManager = StateManager( + wallet_name=config["wallet.name"], + hotkey_name=config["wallet.hotkey"], + netuid=metagraph.netuid, + ) + + wandb_manager: WandbManager = WandbManager( + config=config, + validator_version=validator_version, + uid=metagraph.netuid, + netuid=metagraph.netuid, + hotkey=keypair.ss58_address, + signature=signature, + ) + + weight_setter: WeightSetter benchmarking_apis: list[BenchmarkingApi] - wandb_run: Run | None - wandb_run_date: date | None - - current_block: int - last_block_fetch: datetime | None = None - last_metagraph_sync: int = 0 - attempted_set_weights: bool = False - - benchmarks: list[CheckpointBenchmark | None] - last_benchmarks: list[CheckpointBenchmark | None] - baseline_metrics: MetricData | None - average_benchmarking_time: float | None - benchmarking_state: BenchmarkState - invalid: dict[int, str] - def __init__(self): - self.auto_updater = AutoUpdater() - self.config = get_config(Validator.add_extra_args) - - logger.info(f"Validator version {VALIDATOR_VERSION_STRING}! Loading...") - - self.substrate = get_substrate( - subtensor_network=self.config["subtensor.network"], - subtensor_address=self.config["subtensor.chain_endpoint"] - ) - - self.metagraph = Metagraph( - self.substrate, - - netuid=self.config["netuid"], - load_old_nodes=False, - ) - self.metagraph.sync_nodes() - - self.keypair = load_hotkey_keypair( - wallet_name=self.config["wallet.name"], - hotkey_name=self.config["wallet.hotkey"], + self.uid = list(self.metagraph.nodes.keys()).index(self.keypair.ss58_address) + + self.weight_setter: WeightSetter = WeightSetter( + version=self.validator_version, + epoch_length=self.config["epoch_length"], + substrate=lambda: self.substrate, + metagraph=self.metagraph, + keypair=self.keypair, + uid=self.uid, + contest_state=lambda: self.contest_state, ) - self.hotkeys = list(self.metagraph.nodes.keys()) - - hotkey = self.keypair.ss58_address + self.contest_state = self.state_manager.load_state() - self.uid = self.hotkeys.index(hotkey) - self.step = 0 + self.benchmarking_apis = [BenchmarkingApi(api=api, keypair=self.keypair) for api in self.config["benchmarker_api"]] - signing_message = f"{VALIDATOR_VERSION_STRING}:{hotkey}" - signature = f"0x{self.keypair.sign(signing_message).hex()}" init_open_telemetry_logging({ "neuron.uid": self.uid, - "neuron.signature": signature, + "neuron.signature": self.signature, "subtensor.chain_endpoint": self.substrate.url, - "validator.version": VALIDATOR_VERSION_STRING, + "validator.version": self.validator_version, }) - self.last_day = None - self.contest_state = None - self.benchmarking = False - self.benchmarking_api_urls = self.config["benchmarker_api"] - - self.wandb_run = None - self.wandb_run_date = None - - self.benchmarks = self.clear_benchmarks() - self.last_benchmarks = self.clear_benchmarks() - self.baseline_metrics = None - self.average_benchmarking_time = None - self.benchmarking_state = BenchmarkState.NOT_STARTED - self.invalid = {} - - self.load_state() - self.start_wandb_run() - - def start_wandb_run(self): - if self.config["wandb.off"]: - return - - if self.wandb_run: - logger.info("New contest day, starting a new wandb run.") - self.wandb_run.finish() - - hotkey = self.keypair.ss58_address - day = self.last_day or self.current_time().date() - name = f"validator-{self.uid}-{day.year}-{day.month}-{day.day}" - - contest_id = CURRENT_CONTEST.id - - signing_message = f"{name}:{hotkey}:{contest_id.name}" - signature = f"0x{self.keypair.sign(signing_message).hex()}" - - self.wandb_run = wandb.init( - name=name, - id=name, - resume="allow", - mode="offline" if self.config["wandb.offline"] else "online", - project=self.config["wandb.project_name"], - entity=self.config["wandb.entity"], - notes=self.config["wandb.notes"], - config={ - "hotkey": hotkey, - "type": "validator", - "uid": self.uid, - "contest": contest_id.name, - "signature": signature, - }, - allow_val_change=True, - anonymous="allow", - tags=[ - f"version_{VALIDATOR_VERSION_STRING}", - f"sn{self.metagraph.netuid}", - ], - ) + self.run() - self.wandb_run_date = day - self.wandb_run.log(data={"benchmarking_state": self.benchmarking_state.name}) - - logger.debug(f"Started a new wandb run: {name}") - - def send_wandb_metrics(self): - if not self.wandb_run: - return - - submission_data = { - str(uid): { - "hotkey": self.hotkeys[uid], - "repository": info.repository.url, - "revision": info.repository.revision, - "block": info.block, - } - for uid, info in enumerate(self.contest_state.miner_info) - if info - } - - log_data = { - "submissions": submission_data, - "benchmarks": self.get_wandb_benchmarks(self.benchmarks), - "last_benchmarks": self.get_wandb_benchmarks(self.last_benchmarks), - "invalid": self.invalid, - "benchmarking_state": self.benchmarking_state.name, - } - - if self.average_benchmarking_time: - log_data["average_benchmark_time"] = self.average_benchmarking_time - - if self.baseline_metrics: - log_data["baseline"] = self.baseline_metrics.model_dump() - - self.wandb_run.log(data=log_data) - - logger.info("Benchmarks uploaded to wandb") - - def get_wandb_benchmarks(self, benchmarks: list[CheckpointBenchmark | None]): - benchmark_data = {} - tiers: list[list[Uid]] = [] - - if self.baseline_metrics: - contestants = get_contestant_scores(CURRENT_CONTEST, benchmarks, self.baseline_metrics) - tiers = get_tiers(contestants) - - for uid, benchmark in enumerate(benchmarks): - if not benchmark: - continue - - miner_info = self.contest_state.miner_info[uid] - if not miner_info: - continue - - data = { - "similarity": benchmark.average_similarity, - "min_similarity": benchmark.min_similarity, - } | benchmark.model_dump() - - if self.baseline_metrics: - data["score"] = CURRENT_CONTEST.calculate_score(self.baseline_metrics, benchmark) - if tiers: - data["tier"] = get_contestant_tier(tiers, uid) - - benchmark_data[str(uid)] = data - - return benchmark_data - - @classmethod - def add_extra_args(cls, argument_parser: ArgumentParser): - argument_parser.add_argument( - "--epoch_length", - type=int, - help="The default epoch length (how often we pull the metagraph, measured in 12 second blocks).", - default=100, - ) - - argument_parser.add_argument( - "--benchmarker_api", - type=str, - nargs="*", - help="The API route to the validator benchmarking API.", - required=True, - ) - - argument_parser.add_argument( - "--delayed_weights.off", - action="store_true", - help="Turn off delayed weight setting.", - default=False, - ) - - add_wandb_args(argument_parser) - - @property - def state_path(self): - full_path = ( - Path.home() / - ".bittensor" / - "miners" / - self.config["wallet.name"] / - self.config["wallet.hotkey"] / - f"netuid{self.metagraph.netuid}" / - "validator" - ) - - makedirs(full_path, exist_ok=True) - - return full_path / f"state_{VALIDATOR_STATE_VERSION}.bin" - - def save_state(self): - """Saves the state of the validator to a file.""" - logger.info("Saving validator state.") - - # Save the state of the validator to file. - with open(self.state_path, "wb") as file: - dump( - { - "step": self.step, - "hotkeys": self.hotkeys, - "benchmarks": self.benchmarks, - "last_benchmarks": self.last_benchmarks, - "baseline_benchmarks": self.baseline_metrics, - "average_benchmarking_time": self.average_benchmarking_time, - "benchmarking_state": self.benchmarking_state, - "invalid": self.invalid, - "last_day": self.last_day, - "contest_state": self.contest_state, - "benchmarking": self.benchmarking, - "last_metagraph_sync": self.last_metagraph_sync, - }, - file, - ) - - def load_state(self): - """Loads the state of the validator from a file.""" - path = self.state_path - - if not isfile(path): - return - - logger.info("Loading validator state.") - - # Load the state of the validator from file. - with open(path, "rb") as file: - state = load(file) - - self.step = state["step"] - self.hotkeys = state["hotkeys"] - self.benchmarks = state.get("benchmarks", self.benchmarks) - self.last_benchmarks = state.get("last_benchmarks", self.last_benchmarks) - self.baseline_metrics = state.get("baseline_benchmarks", self.baseline_metrics) - self.average_benchmarking_time = state.get("average_benchmarking_time", self.average_benchmarking_time) - self.benchmarking_state = state.get("benchmarking_state", self.benchmarking_state) - self.invalid = state.get("invalid", self.invalid) - self.last_day = state["last_day"] - self.contest_state = state["contest_state"] - self.benchmarking = state.get("benchmarking", self.benchmarking) - self.last_metagraph_sync = state.get("last_metagraph_sync", self.last_metagraph_sync) - - if self.contest_state: - if self.contest_state.miner_score_version != BENCHMARKS_VERSION: - logger.warning( - f"Contest state has outdated weights version: {self.contest_state.miner_score_version}, " - f"current version: {BENCHMARKS_VERSION}. Resetting benchmarks." - ) - - self.benchmarks = self.clear_benchmarks() - self.invalid.clear() - self.contest_state.miner_score_version = BENCHMARKS_VERSION - - if self.contest_state.submission_spec_version != COLLECTED_SUBMISSIONS_VERSION: - logger.warning( - f"Contest state has outdated spec version: {self.contest_state.submission_spec_version}, " - f"current version: {COLLECTED_SUBMISSIONS_VERSION}. Resetting benchmarks." - ) - - self.benchmarks = self.clear_benchmarks() - self.invalid.clear() - - self.benchmarking = True - self.contest_state.miner_info = self.get_miner_submissions() - self.contest_state.submission_spec_version = COLLECTED_SUBMISSIONS_VERSION - - def clear_benchmarks(self) -> list[CheckpointBenchmark | None]: - return [None] * len(self.metagraph.nodes) - - def reset_miner(self, uid: Uid): - self.benchmarks[uid] = None - self.last_benchmarks[uid] = None - - if uid in self.invalid: - del self.invalid[uid] - - def resize(self): - new_data = self.clear_benchmarks() - length = len(self.metagraph.nodes) - new_data[:length] = self.benchmarks[:length] - self.benchmarks = new_data - - def check_registration(self): - hotkey = self.keypair.ss58_address - if hotkey not in self.hotkeys: - logger.error( - f"Wallet: {self.keypair} is not registered on netuid {self.metagraph.netuid}." + @tracer.start_as_current_span("initialize_contest") + def initialize_contest(self): + for api in self.benchmarking_apis: + api.initialize( + uid=self.uid, + signature=self.signature, + substrate_url=self.substrate.url, ) - def metagraph_nodes(self): - return sorted(self.metagraph.nodes.values(), key=attrgetter("node_id")) - - def sync_chain_nodes(self, block: int): - logger.info("Syncing metagraph") - self.metagraph.sync_nodes() - - self.check_registration() - - if len(self.hotkeys) != len(self.metagraph.nodes): - self.resize() - - if self.contest_state: - new_miner_info = [None] * len(self.metagraph.nodes) - length = len(self.hotkeys) - new_miner_info[:length] = self.contest_state.miner_info[:length] - - self.contest_state.miner_info = new_miner_info - - nodes = self.metagraph_nodes() - - for uid, hotkey in enumerate(self.hotkeys): - if hotkey != nodes[uid].hotkey: - # hotkey has been replaced - self.reset_miner(uid) - - if self.contest_state: - self.contest_state.miner_info[uid] = None - - self.hotkeys = list(self.metagraph.nodes.keys()) - self.last_metagraph_sync = block - - def sync(self, block: int): - if block - self.last_metagraph_sync > self.config["epoch_length"]: - self.sync_chain_nodes(block) - - try: - self.set_weights() - - self.attempted_set_weights = True - - self.sync_chain_nodes(block) - except SubstrateRequestException as e: - logger.error(f"Failed to set weights: {e}") - except Exception as e: - logger.error(f"Failed to set weights", exc_info=e) - - @tracer.start_as_current_span("set_weights") - def set_weights(self): - if self.attempted_set_weights: - return - - equal_weights = False - delayed_weights = not self.config["delayed_weights.off"] - benchmarks = self.last_benchmarks if delayed_weights else self.benchmarks - - if not delayed_weights and self.benchmarking: - logger.info("Not setting new weights as benchmarking is not done, reusing old weights") - delayed_weights = True - benchmarks = self.last_benchmarks - - if not self.contest_state: - logger.info("Will not set new weights as the contest state has not been set, setting to all ones") - equal_weights = True - - elif not self.baseline_metrics: - logger.info("Will not set new weights as the baseline benchmarks have not been set, setting to all ones") - equal_weights = True - - elif all(benchmark is None for benchmark in self.last_benchmarks): - if any(benchmark is not None for benchmark in self.benchmarks): - logger.info("Setting weights to current benchmarks as the previous day's benchmarks have not been set") - self.last_benchmarks = self.benchmarks - elif delayed_weights: - logger.info("Will not set new weights as the previous day's benchmarks have not been set, setting to all ones") - equal_weights = True - - if equal_weights: - uids = list(range(len(self.metagraph.nodes))) - weights = [1.0] * len(self.metagraph.nodes) - - set_node_weights( - self.substrate, - self.keypair, - node_ids=list(uids), - node_weights=list(weights), - netuid=self.metagraph.netuid, - validator_node_id=self.uid, - version_key=WEIGHTS_VERSION, + self.contest_state.start_new_contest( + benchmarks_version=BENCHMARKS_VERSION, + submissions=get_submissions( + substrate=self.substrate, + metagraph=self.metagraph, + block=self.substrate.get_block_number(None), # type: ignore ) - - return - - logger.info("Setting weights") - - blacklisted_keys = self.get_blacklisted_keys() - for hotkey, node in self.metagraph.nodes.items(): - uid = self.hotkeys.index(hotkey) - if benchmarks[uid]: - if self.is_blacklisted(blacklisted_keys, hotkey, node.coldkey): - logger.warning(f"Not setting weights for blacklisted hotkey {hotkey}") - self.reset_miner(uid) - elif not self.contest_state.miner_info[uid]: - logger.warning(f"Not setting weights for hotkey {hotkey} as their submission was not found") - self.reset_miner(uid) - - contestants = get_contestant_scores(CURRENT_CONTEST, benchmarks, self.baseline_metrics) - tiers = get_tiers(contestants) - blocks = [info.block if info else None for info in self.contest_state.miner_info] - weights = get_scores(tiers, blocks, len(self.metagraph.nodes)) - - self.send_wandb_metrics() - - if sum(weights) <= 0.0: - weights = [1.0] * len(self.metagraph.nodes) - - set_node_weights( - self.substrate, - self.keypair, - node_ids=list(range(len(self.metagraph.nodes))), - node_weights=weights, - netuid=self.metagraph.netuid, - validator_node_id=self.uid, - version_key=WEIGHTS_VERSION, - ) - - self.metagraph.sync_nodes() - - @staticmethod - def get_blacklisted_keys(): - response = requests.get( - f"{INPUTS_ENDPOINT}/blacklist", headers={ - "Content-Type": "application/json" - }, - ) - - response.raise_for_status() - return response.json() - - @staticmethod - def is_blacklisted(blacklisted_keys: dict, hotkey: str, coldkey: str): - return hotkey in blacklisted_keys["hotkeys"] or coldkey in blacklisted_keys["coldkeys"] - - @tracer.start_as_current_span("get_miner_submissions") - def get_miner_submissions(self) -> list[MinerModelInfo | None]: - blacklisted_keys = self.get_blacklisted_keys() - - hotkeys = [ - hotkey - for hotkey, node in self.metagraph.nodes.items() - if not self.is_blacklisted(blacklisted_keys, hotkey, node.coldkey) - ] - - return get_submissions( - substrate=self.substrate, - hotkeys=hotkeys, - netuid=self.metagraph.netuid, - block=self.block, - ) - - def start_benchmarking(self, submissions: dict[Key, MinerModelInfo]): - return send_submissions_to_api(self.benchmarking_apis, submissions) - - @staticmethod - def current_time(): - return datetime.now(tz=TIMEZONE) - - def non_tested_miners(self) -> list[Uid]: - return list( - { - uid - for uid, miner_info in enumerate(self.contest_state.miner_info) - if miner_info and not self.benchmarks[uid] and uid not in self.invalid - } ) - - @tracer.start_as_current_span("initialize_contest") - def initialize_contest(self, now: datetime): - logger.info("Collecting all submissions") - - miner_info = self.get_miner_submissions() - - logger.info(f"Got {len([info for info in miner_info if info])} submissions") - - logger.info(f"Working on contest {CURRENT_CONTEST.id.name}") - - if not self.contest_state: - self.contest_state = ContestState(miner_info) - else: - self.contest_state.miner_info = miner_info - - self.average_benchmarking_time = None - self.benchmarking_state = BenchmarkState.NOT_STARTED - - logger.info(f"Setting updated benchmarks") - self.last_benchmarks = self.benchmarks - - self.benchmarks = self.clear_benchmarks() - self.invalid.clear() - - self.last_day = now.date() - - self.start_wandb_run() - - self.benchmarking = False - - self.step += 1 + self.wandb_manager.init_wandb(self.contest_state) @tracer.start_as_current_span("do_step") - def do_step(self, block: int): - now = self.current_time() + def do_step(self): + if not self.contest_state: + self.contest_state = ContestState.create(BENCHMARKS_VERSION) - if (not self.last_day or self.last_day < now.date()) and now.hour >= 12: - # Past noon, should start collecting submissions - self.initialize_contest(now) + if self.contest_state.is_ended() or self.contest_state.benchmarks_version != BENCHMARKS_VERSION: + self.initialize_contest() return - last_update = self.metagraph.nodes[self.keypair.ss58_address].last_updated - blocks_elapsed = block - last_update - epoch_length = self.config["epoch_length"] - - if blocks_elapsed >= epoch_length: - logger.info(f"{blocks_elapsed} blocks since weight setting, attempting to set weights") - self.sync(block) - - # Recalculate in-case weights were set - blocks_elapsed = block - self.metagraph.nodes[self.keypair.ss58_address].last_updated - else: - logger.info( - f"{blocks_elapsed} since last update, " - f"{epoch_length - blocks_elapsed} blocks remaining until weight setting" - ) - - if not self.benchmarking: - self.step += 1 - - if self.contest_state: - remaining = self.non_tested_miners() - - if remaining: - nodes = self.metagraph_nodes() - - submissions = { - nodes[uid].hotkey: self.contest_state.miner_info[uid] - for uid in remaining - } - - try: - self.start_benchmarking(submissions) - except Exception as e: - logger.error(f"Failed to start benchmarking, retrying in 60 seconds", exc_info=e) - sleep(60) - return - - self.benchmarking = True - - self.save_state() - - return - - blocks_to_wait = epoch_length - blocks_elapsed - - if blocks_to_wait <= 0: - # Randomize in case multiple validators are in this same state, - # to avoid multiple validators setting weights all in the same block - blocks_to_wait = random.randint(1, 10) - - self.sleep_for_blocks(now, blocks_to_wait, "Nothing to do in this step") - - return + untested_submissions = self.contest_state.get_untested_submissions() - try: - states: list[BenchmarkResults] = [api.state() for api in self.benchmarking_apis] - except Exception as e: - logger.error(f"Failed to get benchmarking states, retrying in 60 seconds", exc_info=e) - sleep(60) + if not untested_submissions: + self.contest_state.sleep_to_next_contest(self._stop_flag) return - not_started = [] - in_progress = [] - finished = [] + benchmarking_results = [api.results() for api in self.benchmarking_apis] - for index, result in enumerate(states): - match result.state: - case BenchmarkState.NOT_STARTED: - not_started.append((index, result)) - case BenchmarkState.IN_PROGRESS: - in_progress.append((index, result)) - case BenchmarkState.FINISHED: - finished.append((index, result)) - - if result.baseline_metrics and self.baseline_metrics != result.baseline_metrics: - self.baseline_metrics = result.baseline_metrics - logger.info(f"Updated baseline benchmarks to {result.baseline_metrics}") - - self.benchmarking_state = min((result.state for result in states), key=lambda state: state.value) - - with_results = in_progress + finished - - if not_started: - api_indices = list(map(itemgetter(0), not_started)) - - api_names = ",".join( - str(index + 1) - for index in api_indices + if any(result.state == BenchmarkState.NOT_STARTED for result in benchmarking_results): + send_submissions_to_api( + version=self.validator_version, + all_apis=self.benchmarking_apis, + submissions=untested_submissions, ) - - # API likely crashed or got restarted, need to re-benchmark any submissions sent to API - logger.info( - f"APIs {api_names} are in a different state than expected, likely restarted. " - "Sending submissions again for testing" - ) - - nodes = self.metagraph_nodes() - - submissions = { - nodes[uid].hotkey: self.contest_state.miner_info[uid] - for uid in self.non_tested_miners() - } - - apis = [ - self.benchmarking_apis[index] - for index in api_indices - ] - - try: - send_submissions_to_api(apis, submissions) - except Exception as e: - logger.error(f"Failed to restart benchmarking, retrying in 60 seconds", exc_info=e) - sleep(60) - return - - if not with_results: - self.step += 1 - self.save_state() - - return - - benchmark_times = [ - result.average_benchmark_time - for _, result in with_results - if result.average_benchmark_time - ] - - for _, result in with_results: - def get_uid(hotkey: Key) -> Uid | None: - if not hotkey in self.hotkeys: - logger.info(f"{hotkey} not found, skipping") - return None - - uid = self.hotkeys.index(hotkey) - - if not self.contest_state.miner_info[uid]: - logger.info(f"{hotkey} has no submission, skipping") - return None - - return uid - - - for hotkey, benchmark in result.results.items(): - uid = get_uid(hotkey) - if uid is None: - continue - - if benchmark and self.benchmarks[uid] != benchmark: - logger.info(f"Updating {hotkey}'s benchmarks to {benchmark}") - self.benchmarks[uid] = benchmark - - for hotkey, error_message in result.invalid.items(): - uid = get_uid(hotkey) - if uid is None: - continue - - if error_message and error_message != self.invalid.get(uid): - logger.info(f"Marking {hotkey}'s submission as invalid: '{error_message}'") - self.invalid[uid] = error_message - - self.average_benchmarking_time = (sum(benchmark_times) / len(benchmark_times)) if benchmark_times else None - self.send_wandb_metrics() - - if not not_started and not in_progress and finished: - logger.info("Benchmarking APIs have reported submission testing as done.") - - self.benchmarking = False - self.step += 1 - - self.save_state() return - self.step += 1 + self.update_benchmarks(benchmarking_results) + sleep(BENCHMARK_UPDATE_RATE_BLOCKS * 12) - self.save_state() + def update_benchmarks(self, benchmarking_results: list[BenchmarkingResults]): + self.contest_state.baseline = benchmarking_results[0].baseline + self.contest_state.average_benchmarking_time = benchmarking_results[0].average_benchmarking_time - self.sleep_for_blocks(now, epoch_length / 4, "Benchmarking in progress") + for result in benchmarking_results: + self.contest_state.benchmarks.update(result.benchmarks) + self.contest_state.invalid_submissions.update(result.invalid_submissions) - @tracer.start_as_current_span("sleep_for_blocks") - def sleep_for_blocks(self, now: datetime, blocks: int, reason: str): - next_noon = datetime.combine(now.date() + timedelta(days=int(now.hour >= 12)), time(12), tzinfo=TIMEZONE) - blocks_to_sleep = min(blocks, ceil((next_noon - now).total_seconds() / 12)) - logger.info(f"{reason}, sleeping for {blocks_to_sleep} blocks") - sleep(blocks_to_sleep * 12) + def step(self): + return self.contest_state.step if self.contest_state else 0 - @property - def block(self): - if not self.last_block_fetch or (datetime.now() - self.last_block_fetch).seconds >= 12: - self.current_block = self.substrate.get_block_number(None) # type: ignore - self.last_block_fetch = datetime.now() - self.attempted_set_weights = False - - return self.current_block + def _shutdown(self, _signalnum, _handler): + logger.info("Shutting down validator") + self.weight_setter.stop() + self._stop_flag.set() def run(self): - self.benchmarking_apis = [ - BenchmarkingApi(self.keypair, api) - for api in self.benchmarking_api_urls - ] - - while True: + logger.info("Initializing validator") + signal(SIGTERM, self._shutdown) + signal(SIGINT, self._shutdown) + signal(SIGHUP, self._shutdown) + while not self._stop_flag.is_set(): try: - current_block = self.block - - logger.info(f"Step {self.step}, block {current_block}") - - self.do_step(current_block) - except KeyboardInterrupt: - logger.info("Shutting down validator") - break + logger.info(f"Step {self.step()}") + self.do_step() + self.contest_state.step += 1 + self.state_manager.save_state(self.contest_state) + self.wandb_manager.send_metrics(self.contest_state) + except (ConnectionError, HTTPError) as e: + logger.error(f"Error connecting to API, retrying in 10 blocks: {e}") + self._stop_flag.wait(BENCHMARK_UPDATE_RATE_BLOCKS * 12) except Exception as e: - if not isinstance(e, ContestDeviceValidationError): - if isinstance(e, (SSLEOFError, JSONDecodeError)): - logger.error(f"Error during validation step {self.step}: {e}") - else: - logger.error(f"Error during validation step {self.step}", exc_info=e) - - self.substrate = get_substrate(subtensor_address=self.substrate.url) - - continue - - raise - + logger.error(f"Error during step {self.step()}", exc_info=e) + self.substrate = get_substrate(subtensor_address=self.substrate.url) def main(): - Validator().run() - + AutoUpdater() + Validator() if __name__ == '__main__': main() diff --git a/validator/weight_setting/validator_args.py b/validator/weight_setting/validator_args.py new file mode 100644 index 00000000..fce87db6 --- /dev/null +++ b/validator/weight_setting/validator_args.py @@ -0,0 +1,21 @@ +from argparse import ArgumentParser + +from .wandb_manager import add_wandb_args + +def add_args(argument_parser: ArgumentParser): + argument_parser.add_argument( + "--epoch_length", + type=int, + help="The default epoch length (how often we pull the metagraph, measured in 12 second blocks).", + default=100, + ) + + argument_parser.add_argument( + "--benchmarker_api", + type=str, + nargs="*", + help="The API route to the validator benchmarking API.", + required=True, + ) + + add_wandb_args(argument_parser) diff --git a/validator/weight_setting/wandb_args.py b/validator/weight_setting/wandb_args.py deleted file mode 100644 index 636185f5..00000000 --- a/validator/weight_setting/wandb_args.py +++ /dev/null @@ -1,38 +0,0 @@ -from argparse import ArgumentParser - - -def add_wandb_args(parser: ArgumentParser): - parser.add_argument( - "--wandb.off", - action="store_true", - help="Turn off wandb.", - default=False, - ) - - parser.add_argument( - "--wandb.offline", - action="store_true", - help="Runs wandb in offline mode.", - default=False, - ) - - parser.add_argument( - "--wandb.notes", - type=str, - help="Notes to add to the wandb run.", - default="", - ) - - parser.add_argument( - "--wandb.entity", - type=str, - help="Wandb entity to log to.", - default="w-ai-wombo", - ) - - parser.add_argument( - "--wandb.project_name", - type=str, - help="The name of the project where you are sending the new run.", - default="edge-maxxing", - ) diff --git a/validator/weight_setting/wandb_manager.py b/validator/weight_setting/wandb_manager.py new file mode 100644 index 00000000..59313f00 --- /dev/null +++ b/validator/weight_setting/wandb_manager.py @@ -0,0 +1,114 @@ +from argparse import ArgumentParser +from typing import Any + +import wandb +from wandb.apis.public import Run + +from base.checkpoint import Uid +from .contest_state import ContestState + +class WandbManager: + _run: Run | None = None + + config: dict[str, Any] + validator_version: str + uid: Uid + netuid: Uid + hotkey: str + signature: str + + def __init__( + self, + config: dict[str, Any], + validator_version: str, + uid: Uid, + netuid: Uid, + hotkey: str, + signature: str, + ): + self.config = config + self.validator_version = validator_version + self.uid = uid + self.netuid = netuid + self.hotkey = hotkey + self.signature = signature + + def init_wandb(self, contest_state: ContestState): + if self.config["wandb.off"]: + return + + if self._run: + self._run.finish() + + day = contest_state.get_contest_start() + name = f"validator-{self.uid}-{day.year}-{day.month}-{day.day}" + + self._run = wandb.init( + name=name, + id=name, + resume="allow", + mode="offline" if self.config["wandb.offline"] else "online", + project=self.config["wandb.project_name"], + entity=self.config["wandb.entity"], + notes=self.config["wandb.notes"], + config={ + "hotkey": self.hotkey, + "type": "validator", + "uid": self.uid, + "signature": self.signature, + }, + allow_val_change=True, + anonymous="allow", + tags=[ + f"version_{self.validator_version}", + f"sn{self.netuid}", + ], + ) + + def send_metrics(self, contest_state: ContestState): + if not self._run or self.config["wandb.off"]: + return + + scores = contest_state.get_scores() + data = { + "scores": scores, + "tiers": contest_state.get_tiers(scores), + } | contest_state.model_dump() + + self._run.log(data=data) + +def add_wandb_args(parser: ArgumentParser): + parser.add_argument( + "--wandb.off", + action="store_true", + help="Turn off wandb.", + default=False, + ) + + parser.add_argument( + "--wandb.offline", + action="store_true", + help="Runs wandb in offline mode.", + default=False, + ) + + parser.add_argument( + "--wandb.notes", + type=str, + help="Notes to add to the wandb run.", + default="", + ) + + parser.add_argument( + "--wandb.entity", + type=str, + help="Wandb entity to log to.", + default="w-ai-wombo", + ) + + parser.add_argument( + "--wandb.project_name", + type=str, + help="The name of the project where you are sending the new run.", + default="edge-maxxing", + ) diff --git a/validator/weight_setting/weight_setter.py b/validator/weight_setting/weight_setter.py new file mode 100644 index 00000000..31ee6735 --- /dev/null +++ b/validator/weight_setting/weight_setter.py @@ -0,0 +1,125 @@ +from random import randint +from threading import Thread, Event +from typing import Callable + +from fiber.chain.metagraph import Metagraph +from fiber.chain.weights import set_node_weights +from fiber.logging_utils import get_logger +from opentelemetry import trace +from substrateinterface import SubstrateInterface, Keypair + +from base.inputs_api import blacklisted_keys, is_blacklisted +from weight_setting.contest_state import ContestState +from weight_setting.winner_selection import calculate_weights + +logger = get_logger(__name__) +tracer = trace.get_tracer(__name__) + +class WeightSetter: + _thread: Thread + _stop_flag: Event = Event() + + _epoch_length: int + _substrate: Callable[[], SubstrateInterface] + _metagraph: Metagraph + _keypair: Keypair + _uid: int + _contest_state: Callable[[], ContestState] + _weights_version: int + + def __init__( + self, + version: str, + epoch_length: int, + substrate: Callable[[], SubstrateInterface], + metagraph: Metagraph, + keypair: Keypair, + uid: int, + contest_state: Callable[[], ContestState], + ): + self._epoch_length = epoch_length + self._substrate = substrate + self._metagraph = metagraph + self._keypair = keypair + self._uid = uid + self._contest_state = contest_state + + parts: list[str] = version.split(".") + self._weights_version = int(parts[0]) * 10000 + int(parts[1]) * 100 + int(parts[2]) + + self._thread = Thread(target=self._run) + self._thread.start() + + def stop(self): + self._stop_flag.set() + + def _run(self): + while not self._stop_flag.is_set(): + try: + self.set_weights() + logger.info(f"Successfully set weights, sleeping for {self._epoch_length} blocks") + self._stop_flag.wait(self._epoch_length * 12) + except Exception as e: + blocks_to_sleep = randint(2, 10) + logger.error(f"Failed to set weights, retrying in {blocks_to_sleep} blocks: {e}") + self._stop_flag.wait(blocks_to_sleep * 12) + + @tracer.start_as_current_span("set_weights") + def set_weights(self): + contest_state = self._contest_state() + + if not contest_state: + logger.error("Will not set new weights as the contest state has not been set, setting to all ones") + self._set_equal_weights() + return + + benchmarks = contest_state.last_benchmarks + + if not contest_state.baseline: + logger.error("Will not set new weights as the baseline benchmarks have not been set, setting to all ones") + self._set_equal_weights() + return + + if not contest_state.last_benchmarks: + if contest_state.benchmarks: + logger.error("Setting weights to current benchmarks as the previous day's benchmarks have not been set") + benchmarks = contest_state.benchmarks + else: + logger.error("Will not set new weights as the previous day's benchmarks have not been set, setting to all ones") + self._set_equal_weights() + return + + self._metagraph.sync_nodes() + blacklist = blacklisted_keys() + for hotkey, node in self._metagraph.nodes.items(): + if is_blacklisted(blacklist, hotkey, node.coldkey): + benchmarks.pop(hotkey, None) + if not hotkey in contest_state.submissions: + benchmarks.pop(hotkey, None) + + scores = contest_state.get_scores() + tiers = contest_state.get_tiers(scores) + + weights_by_key = calculate_weights( + node_count=len(self._metagraph.nodes), + tiers=tiers + ) + + self._set_weights([ + weights_by_key.get(key, 0) + for key in self._metagraph.nodes.keys() + ]) + + def _set_equal_weights(self): + self._set_weights([1.0] * len(self._metagraph.nodes)) + + def _set_weights(self, weights: list[float]): + set_node_weights( + self._substrate(), + self._keypair, + node_ids=list(range(len(self._metagraph.nodes))), + node_weights=weights, + netuid=self._metagraph.netuid, + validator_node_id=self._uid, + version_key=self._weights_version, + ) diff --git a/validator/weight_setting/winner_selection.py b/validator/weight_setting/winner_selection.py index 6b9e5a5b..9e79f19d 100644 --- a/validator/weight_setting/winner_selection.py +++ b/validator/weight_setting/winner_selection.py @@ -1,83 +1,27 @@ -from operator import itemgetter - -from neuron import Uid, Contest -from neuron.submission_tester import CheckpointBenchmark, MetricData +from base.checkpoint import Key, Submissions, Benchmarks +from base.contest import Metrics TIER_SCORE_IMPROVEMENT_THRESHOLD = 1.05 WINNER_PERCENTAGE = 0.80 - -def get_contestant_scores(contest: Contest, benchmarks: list[CheckpointBenchmark | None], baseline_metrics: MetricData) -> list[tuple[Uid, float]]: - contestants = [ - (uid, contest.calculate_score(baseline_metrics, benchmark)) - for uid, benchmark in enumerate(benchmarks) - if benchmark - ] - - sorted_contestants = sorted(contestants, key=itemgetter(1), reverse=True) - - return sorted_contestants - - -def get_tiers(contestants: list[tuple[Uid, float]]) -> list[list[Uid]]: - if not contestants: - return [] - - _, last_tier_score = contestants[0] - - tiers = [[]] - - for contestant in contestants: - uid, score = contestant - - if last_tier_score > score * TIER_SCORE_IMPROVEMENT_THRESHOLD: - # New tier - last_tier_score = score - tiers.append([]) - - tiers[-1].append(uid) - - return list(reversed(tiers)) - - -def get_contestant_tier(tiers: list[list[Uid]], uid: Uid) -> int: - for index, tier in enumerate(tiers): - if uid in tier: - return index - - return -1 - - -def get_scores(tiers: list[list[Uid]], blocks: list[int | None], node_count: int) -> list[float]: - if not tiers: - return [1.0] * node_count - - ordered_tiers = [ - sorted(tier, key=blocks.__getitem__) for tier in tiers - ] - - modified_tiers = [] - - last_tier = None - - for tier in reversed(ordered_tiers): - if last_tier: - modified_tiers.append([tier[0], *last_tier[1:]]) - else: - modified_tiers.append([tier[0]]) - - last_tier = tier - - if len(last_tier) > 1: - modified_tiers.append(last_tier[1:]) - - scores = [0.0] * node_count - - for index, tier in enumerate(modified_tiers): - incentive_pool = WINNER_PERCENTAGE * ((1 - WINNER_PERCENTAGE) ** index) - score = incentive_pool / len(tier) - - for uid in tier: - scores[uid] = score - - return scores +def get_contestant_scores( + submissions: Submissions, + benchmarks: Benchmarks, + baseline: Metrics, +) -> dict[Key, float]: + return { + key: submissions[key].contest().calculate_score(baseline, benchmark) + for key, benchmark in benchmarks.items() + } + +def get_contestant_tiers( + submitted_blocks: dict[Key, int], + scores: dict[Key, float], +) -> dict[Key, int]: + return {} # TODO + +def calculate_weights( + node_count: int, + tiers: dict[Key, int], +) -> dict[Key, float]: + return {} # TODO From 881932ce9bc35e0185a508b7970e4ef276a4ff16 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 05:34:51 +0300 Subject: [PATCH 02/33] Implement weight calculation functions --- validator/weight_setting/contest_state.py | 11 ++-- validator/weight_setting/wandb_manager.py | 6 +- validator/weight_setting/weight_setter.py | 7 +-- validator/weight_setting/winner_selection.py | 62 ++++++++++++++++---- 4 files changed, 64 insertions(+), 22 deletions(-) diff --git a/validator/weight_setting/contest_state.py b/validator/weight_setting/contest_state.py index 7e0c2fd4..f6fc38e6 100644 --- a/validator/weight_setting/contest_state.py +++ b/validator/weight_setting/contest_state.py @@ -6,7 +6,7 @@ from base.checkpoint import Key, current_time, Submissions, Benchmarks from base.contest import Metrics -from weight_setting.winner_selection import get_contestant_scores, get_contestant_tiers +from weight_setting.winner_selection import get_contestant_scores, get_contestant_ranks, calculate_rank_weights logger = get_logger(__name__) @@ -63,13 +63,16 @@ def get_scores(self) -> dict[Key, float]: baseline=self.baseline, ) - def get_tiers(self, scores: dict[Key, float]) -> dict[Key, int]: - return get_contestant_tiers( + def get_ranks(self, scores: dict[Key, float]) -> dict[Key, int]: + return get_contestant_ranks(scores=scores) + + def calculate_weights(self, ranks: dict[Key, int]): + return calculate_rank_weights( submitted_blocks={ key: submission.block for key, submission in self.submissions.items() }, - scores=scores, + ranks=ranks, ) @classmethod diff --git a/validator/weight_setting/wandb_manager.py b/validator/weight_setting/wandb_manager.py index 59313f00..1e4c7290 100644 --- a/validator/weight_setting/wandb_manager.py +++ b/validator/weight_setting/wandb_manager.py @@ -71,9 +71,9 @@ def send_metrics(self, contest_state: ContestState): scores = contest_state.get_scores() data = { - "scores": scores, - "tiers": contest_state.get_tiers(scores), - } | contest_state.model_dump() + "scores": scores, + "ranks": contest_state.get_ranks(scores), + } | contest_state.model_dump() self._run.log(data=data) diff --git a/validator/weight_setting/weight_setter.py b/validator/weight_setting/weight_setter.py index 31ee6735..19f024af 100644 --- a/validator/weight_setting/weight_setter.py +++ b/validator/weight_setting/weight_setter.py @@ -98,12 +98,9 @@ def set_weights(self): benchmarks.pop(hotkey, None) scores = contest_state.get_scores() - tiers = contest_state.get_tiers(scores) + ranks = contest_state.get_ranks(scores) - weights_by_key = calculate_weights( - node_count=len(self._metagraph.nodes), - tiers=tiers - ) + weights_by_key = contest_state.calculate_weights(ranks=ranks) self._set_weights([ weights_by_key.get(key, 0) diff --git a/validator/weight_setting/winner_selection.py b/validator/weight_setting/winner_selection.py index 9e79f19d..d0a02f89 100644 --- a/validator/weight_setting/winner_selection.py +++ b/validator/weight_setting/winner_selection.py @@ -1,7 +1,9 @@ +from operator import itemgetter + from base.checkpoint import Key, Submissions, Benchmarks from base.contest import Metrics -TIER_SCORE_IMPROVEMENT_THRESHOLD = 1.05 +RANK_SCORE_IMPROVEMENT_THRESHOLD = 1.05 WINNER_PERCENTAGE = 0.80 def get_contestant_scores( @@ -14,14 +16,54 @@ def get_contestant_scores( for key, benchmark in benchmarks.items() } -def get_contestant_tiers( - submitted_blocks: dict[Key, int], - scores: dict[Key, float], -) -> dict[Key, int]: - return {} # TODO +def get_contestant_ranks(scores: dict[Key, float]) -> dict[Key, int]: + if not scores: + return {} + + scores = iter(sorted(scores.items(), key=itemgetter(1), reverse=True)) + + hotkey, last_score = next(scores) + + rank = 0 + ranks = {hotkey: rank} -def calculate_weights( - node_count: int, - tiers: dict[Key, int], + for hotkey, score in scores: + if last_score > score * RANK_SCORE_IMPROVEMENT_THRESHOLD: + last_score = score + rank += 1 + + ranks[hotkey] = rank + + return ranks + +def calculate_rank_weights( + submitted_blocks: dict[Key, int], + ranks: dict[Key, int], ) -> dict[Key, float]: - return {} # TODO + if not ranks: + return {} + + ranks = iter(sorted(ranks.items(), key=lambda rank: (rank[1], submitted_blocks[rank[0]]))) + + last_rank = None + + rank_hotkeys = [[]] + + for hotkey, rank in ranks: + rank_hotkeys[-1].append(hotkey) + + if rank != last_rank: + rank_hotkeys.append([]) + + last_rank = rank + + weights = {} + + for index, hotkeys in enumerate(rank_hotkeys): + incentive_pool = WINNER_PERCENTAGE * ((1 - WINNER_PERCENTAGE) ** index) + score = incentive_pool / len(hotkeys) + + for hotkey in hotkeys: + weights[hotkey] = score + + return weights From 7d9e82ff46b4c9b528503bafe89d41436202ff0a Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 11:53:50 -0800 Subject: [PATCH 03/33] Readd submission deduplication, clean up output comparator --- base/base/contest.py | 12 +++++---- base/base/device.py | 26 ++++++++++++++++++ base/base/output_comparator.py | 25 +++++++----------- base/base/submissions.py | 32 ++++++++++++++++++++++- validator/weight_setting/contest_state.py | 2 +- validator/weight_setting/state_manager.py | 2 +- validator/weight_setting/wandb_manager.py | 6 ++--- validator/weight_setting/weight_setter.py | 1 - 8 files changed, 78 insertions(+), 28 deletions(-) diff --git a/base/base/contest.py b/base/base/contest.py index eb3dd5e0..ad1c0c13 100644 --- a/base/base/contest.py +++ b/base/base/contest.py @@ -7,7 +7,7 @@ from pydantic import BaseModel from .device import Device, CudaDevice, Gpu -from .output_comparator import OutputComparator, CudaImageOutputComparator +from .output_comparator import OutputComparator, ImageOutputComparator SIMILARITY_SCORE_THRESHOLD = 0.7 @@ -94,11 +94,13 @@ def normalize(baseline_value: float, benchmark_value: float, metric_type: Metric return score * similarity * self.metric_weights.get(MetricType.SIMILARITY_SCORE, 0) / total_weight +CUDA_4090_DEVICE = CudaDevice(gpu=Gpu.NVIDIA_RTX_4090) + CONTESTS = [ Contest( contest_id=ContestId.FLUX_NVIDIA_4090, - device=CudaDevice(gpu=Gpu.NVIDIA_RTX_4090), - output_comparator=partial(CudaImageOutputComparator), + device=CUDA_4090_DEVICE, + output_comparator=partial(ImageOutputComparator, CUDA_4090_DEVICE), baseline_repository=RepositoryInfo(url="https://github.com/womboai/flux-schnell-edge-inference", revision="fbfb8f0"), metric_weights={ MetricType.SIMILARITY_SCORE: 3, @@ -108,8 +110,8 @@ def normalize(baseline_value: float, benchmark_value: float, metric_type: Metric ), Contest( contest_id=ContestId.SDXL_NEWDREAM_NVIDIA_4090, - device=CudaDevice(gpu=Gpu.NVIDIA_RTX_4090), - output_comparator=partial(CudaImageOutputComparator), + device=CUDA_4090_DEVICE, + output_comparator=partial(ImageOutputComparator, CUDA_4090_DEVICE), baseline_repository=RepositoryInfo(url="https://github.com/womboai/sdxl-newdream-20-inference", revision="1b3f9ea"), metric_weights={ MetricType.SIMILARITY_SCORE: 1, diff --git a/base/base/device.py b/base/base/device.py index 7b1670fe..3dacec7c 100644 --- a/base/base/device.py +++ b/base/base/device.py @@ -5,6 +5,10 @@ class Gpu(Enum): NVIDIA_RTX_4090 = "NVIDIA GeForce RTX 4090" class Device(ABC): + @abstractmethod + def get_name(self): + ... + @abstractmethod def get_vram_used(self): ... @@ -13,6 +17,10 @@ def get_vram_used(self): def get_joules(self): ... + @abstractmethod + def empty_cache(self): + ... + @abstractmethod def is_compatible(self): ... @@ -23,6 +31,9 @@ class CudaDevice(Device): def __init__(self, gpu: Gpu): self._gpu = gpu + def get_name(self): + return "cuda" + def get_vram_used(self): import pynvml import torch @@ -43,6 +54,12 @@ def get_joules(self): pynvml.nvmlShutdown() return mj / 1000.0 # convert mJ to J + def empty_cache(self): + import torch + + torch.cuda.synchronize() + torch.cuda.empty_cache() + def is_compatible(self): import torch @@ -51,6 +68,9 @@ def is_compatible(self): return device_name == self._gpu.value class MpsDevice(Device): + def get_name(self): + return "mps" + def get_vram_used(self): import torch @@ -59,6 +79,12 @@ def get_vram_used(self): def get_joules(self): return 0 # TODO + def empty_cache(self): + import torch + + torch.mps.synchronize() + torch.mps.empty_cache() + def is_compatible(self): import torch diff --git a/base/base/output_comparator.py b/base/base/output_comparator.py index 35c6c4c0..1d12f4e6 100644 --- a/base/base/output_comparator.py +++ b/base/base/output_comparator.py @@ -1,9 +1,12 @@ +import gc from abc import ABC, abstractmethod from io import BytesIO from typing import ContextManager from transformers import CLIPProcessor, CLIPVisionModelWithProjection, PreTrainedModel +from base.device import Device + class OutputComparator(ContextManager, ABC): @abstractmethod def compare(self, baseline: bytes, optimized: bytes) -> float: @@ -15,12 +18,13 @@ def __wrapped_compare(self, baseline: bytes, optimized: bytes): __call__ = __wrapped_compare class ImageOutputComparator(OutputComparator): + device: Device clip: PreTrainedModel processor: CLIPProcessor - def __init__(self, device: str): + def __init__(self, device: Device): self.device = device - self.clip = CLIPVisionModelWithProjection.from_pretrained("laion/CLIP-ViT-bigG-14-laion2B-39B-b160k").to(self.device) + self.clip = CLIPVisionModelWithProjection.from_pretrained("laion/CLIP-ViT-bigG-14-laion2B-39B-b160k").to(device.get_name()) self.processor = CLIPProcessor.from_pretrained("laion/CLIP-ViT-bigG-14-laion2B-39B-b160k") def compare(self, baseline: bytes, optimized: bytes): @@ -41,9 +45,9 @@ def load_image(data: bytes): return numpy.array(Image.open(fp).convert("RGB")) def clip_embeddings(image: numpy.ndarray): - processed_input = self.processor(images=image, return_tensors="pt").to(self.device) + processed_input = self.processor(images=image, return_tensors="pt").to(self.device.get_name()) - return self.clip(**processed_input).image_embeds.to(self.device) + return self.clip(**processed_input).image_embeds.to(self.device.get_name()) baseline_array = load_image(baseline) optimized_array = load_image(optimized) @@ -70,16 +74,5 @@ def __exit__(self, exc_type, exc_value, traceback): del self.clip del self.processor -class CudaImageOutputComparator(ImageOutputComparator): - def __init__(self): - super().__init__("cuda") - - def __exit__(self, exc_type, exc_value, traceback): - import torch - import gc - - super().__exit__(exc_type, exc_value, traceback) - gc.collect() - torch.cuda.synchronize() - torch.cuda.empty_cache() + self.device.empty_cache() diff --git a/base/base/submissions.py b/base/base/submissions.py index 7180a3ac..a55ac179 100644 --- a/base/base/submissions.py +++ b/base/base/submissions.py @@ -7,7 +7,7 @@ from substrateinterface import SubstrateInterface, Keypair from substrateinterface.storage import StorageKey -from .checkpoint import SPEC_VERSION, Submissions +from .checkpoint import SPEC_VERSION, Submissions, Key from .contest import RepositoryInfo, find_contest, Submission, ContestId, ACTIVE_CONTESTS from .inputs_api import is_blacklisted, blacklisted_keys from .network_commitments import Encoder, Decoder @@ -130,4 +130,34 @@ def get_submissions( logger.error(f"Failed to get submission from miner {hotkey}: {e}") continue + return deduplicate_submissions(submissions) + +def deduplicate_submissions(submissions: Submissions) -> Submissions: + existing_repositories: dict[str, Submission] = {} + existing_revisions: dict[str, Submission] = {} + to_remove: set[Key] = set() + + for key, submission in submissions.items(): + url = submission.repository_info.url + revision = submission.repository_info.revision + block = submission.block + + existing_repository = existing_repositories.get(url) + existing_revision = existing_revisions.get(revision) + + if (existing_repository and existing_repository.block < block) or (existing_revision and existing_revision.block < block): + to_remove.add(key) + continue + + if existing_repository: + to_remove.add(existing_repository) + if existing_revision: + to_remove.add(existing_revision) + + existing_repositories[url] = submission + existing_revisions[revision] = submission + + for key in to_remove: + submissions.pop(key) + logger.info(f"Skipping duplicate submission: {key}") return submissions diff --git a/validator/weight_setting/contest_state.py b/validator/weight_setting/contest_state.py index f6fc38e6..e190838e 100644 --- a/validator/weight_setting/contest_state.py +++ b/validator/weight_setting/contest_state.py @@ -76,7 +76,7 @@ def calculate_weights(self, ranks: dict[Key, int]): ) @classmethod - def create(cls, benchmarks_version: int) -> "ContestState": + def create(cls, benchmarks_version: int): state = cls( step=0, benchmarks_version=benchmarks_version, diff --git a/validator/weight_setting/state_manager.py b/validator/weight_setting/state_manager.py index 92ed26de..4ec9c2e9 100644 --- a/validator/weight_setting/state_manager.py +++ b/validator/weight_setting/state_manager.py @@ -7,7 +7,7 @@ logger = get_logger(__name__) -STATE_VERSION = 1 +STATE_VERSION = 2 class StateManager: _state_file: Path diff --git a/validator/weight_setting/wandb_manager.py b/validator/weight_setting/wandb_manager.py index 1e4c7290..ef4df04b 100644 --- a/validator/weight_setting/wandb_manager.py +++ b/validator/weight_setting/wandb_manager.py @@ -71,9 +71,9 @@ def send_metrics(self, contest_state: ContestState): scores = contest_state.get_scores() data = { - "scores": scores, - "ranks": contest_state.get_ranks(scores), - } | contest_state.model_dump() + "scores": scores, + "ranks": contest_state.get_ranks(scores), + } | contest_state.model_dump() self._run.log(data=data) diff --git a/validator/weight_setting/weight_setter.py b/validator/weight_setting/weight_setter.py index 19f024af..abd78744 100644 --- a/validator/weight_setting/weight_setter.py +++ b/validator/weight_setting/weight_setter.py @@ -10,7 +10,6 @@ from base.inputs_api import blacklisted_keys, is_blacklisted from weight_setting.contest_state import ContestState -from weight_setting.winner_selection import calculate_weights logger = get_logger(__name__) tracer = trace.get_tracer(__name__) From e54baf9f0dd90c372683c973d98be2320ec43a3a Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 11:58:27 -0800 Subject: [PATCH 04/33] Use double empty line for top level classes and functions --- base/base/checkpoint.py | 1 + base/base/config.py | 1 + base/base/contest.py | 11 +++++++++++ base/base/device.py | 5 +++++ base/base/inputs_api.py | 3 +++ base/base/network_commitments.py | 2 ++ base/base/output_comparator.py | 2 ++ base/base/submissions.py | 4 ++++ base/testing/benchmarker.py | 1 + base/testing/inference_sandbox.py | 3 +++ base/testing/vram_monitor.py | 1 + miner/miner/submit.py | 8 ++++++++ pipelines/pipelines/models.py | 1 + validator/base_validator/api_data.py | 5 +++++ validator/base_validator/auto_updater.py | 1 + validator/base_validator/telemetry.py | 1 + validator/generate_compose.py | 2 ++ validator/submission_tester/api.py | 7 +++++++ validator/weight_setting/benchmarking_api.py | 3 +++ validator/weight_setting/contest_state.py | 1 + validator/weight_setting/state_manager.py | 1 + validator/weight_setting/telemetry_attributes.py | 2 ++ validator/weight_setting/validator.py | 3 +++ validator/weight_setting/validator_args.py | 1 + validator/weight_setting/wandb_manager.py | 2 ++ validator/weight_setting/weight_setter.py | 1 + validator/weight_setting/winner_selection.py | 3 +++ 27 files changed, 76 insertions(+) diff --git a/base/base/checkpoint.py b/base/base/checkpoint.py index 28b2c9f9..c28f9ffd 100644 --- a/base/base/checkpoint.py +++ b/base/base/checkpoint.py @@ -13,5 +13,6 @@ Submissions: TypeAlias = dict[Key, Submission] Benchmarks: TypeAlias = dict[Key, Benchmark] + def current_time() -> datetime: return datetime.now(tz=TIMEZONE) diff --git a/base/base/config.py b/base/base/config.py index 4d8fe8dc..82742c12 100644 --- a/base/base/config.py +++ b/base/base/config.py @@ -3,6 +3,7 @@ from fiber.constants import FINNEY_NETWORK + def get_config(add_args: Callable[[ArgumentParser], None] | None = None): argument_parser = ArgumentParser() diff --git a/base/base/contest.py b/base/base/contest.py index ad1c0c13..f58d6a04 100644 --- a/base/base/contest.py +++ b/base/base/contest.py @@ -11,6 +11,7 @@ SIMILARITY_SCORE_THRESHOLD = 0.7 + class MetricType(IntEnum): SIMILARITY_SCORE = 0 GENERATION_TIME = 1 @@ -19,14 +20,17 @@ class MetricType(IntEnum): WATTS_USED = 4 LOAD_TIME = 5 + class ContestId(IntEnum): FLUX_NVIDIA_4090 = 0 SDXL_NEWDREAM_NVIDIA_4090 = 1 + class RepositoryInfo(BaseModel): url: str revision: str + class Submission(BaseModel): repository_info: RepositoryInfo contest_id: ContestId @@ -35,6 +39,7 @@ class Submission(BaseModel): def contest(self) -> "Contest": return find_contest(self.contest_id) + class Metrics(BaseModel): generation_time: float size: int @@ -42,11 +47,13 @@ class Metrics(BaseModel): watts_used: float load_time: float + class Benchmark(BaseModel): metrics: Metrics average_similarity: float min_similarity: float + @dataclass class Contest: id: ContestId @@ -94,6 +101,7 @@ def normalize(baseline_value: float, benchmark_value: float, metric_type: Metric return score * similarity * self.metric_weights.get(MetricType.SIMILARITY_SCORE, 0) / total_weight + CUDA_4090_DEVICE = CudaDevice(gpu=Gpu.NVIDIA_RTX_4090) CONTESTS = [ @@ -120,6 +128,7 @@ def normalize(baseline_value: float, benchmark_value: float, metric_type: Metric ), ] + def find_contest(contest_id: ContestId): for contest in CONTESTS: if contest.id != contest_id: @@ -129,9 +138,11 @@ def find_contest(contest_id: ContestId): raise RuntimeError(f"Unknown contest ID requested {contest_id}") + def find_compatible_contests() -> list[ContestId]: return [contest.id for contest in CONTESTS if contest.device.is_compatible()] + ACTIVE_CONTESTS = [ ContestId.FLUX_NVIDIA_4090 ] diff --git a/base/base/device.py b/base/base/device.py index 3dacec7c..1fbda5c9 100644 --- a/base/base/device.py +++ b/base/base/device.py @@ -1,9 +1,11 @@ from abc import ABC, abstractmethod from enum import Enum + class Gpu(Enum): NVIDIA_RTX_4090 = "NVIDIA GeForce RTX 4090" + class Device(ABC): @abstractmethod def get_name(self): @@ -25,6 +27,7 @@ def empty_cache(self): def is_compatible(self): ... + class CudaDevice(Device): _gpu: Gpu @@ -67,6 +70,7 @@ def is_compatible(self): return device_name == self._gpu.value + class MpsDevice(Device): def get_name(self): return "mps" @@ -90,6 +94,7 @@ def is_compatible(self): return torch.backends.mps.is_available() + class ContestDeviceValidationError(Exception): def __init__(self, message: str): super().__init__(message) diff --git a/base/base/inputs_api.py b/base/base/inputs_api.py index 8a0b3758..4959f4d0 100644 --- a/base/base/inputs_api.py +++ b/base/base/inputs_api.py @@ -7,6 +7,7 @@ INPUTS_ENDPOINT = os.getenv("INPUTS_ENDPOINT", "https://edge-inputs.api.wombo.ai") + def random_inputs() -> list[TextToImageRequest]: response = requests.get( f"{INPUTS_ENDPOINT}/current_batch", headers={ @@ -18,6 +19,7 @@ def random_inputs() -> list[TextToImageRequest]: return RootModel[list[TextToImageRequest]].model_validate_json(response.text).root + def blacklisted_keys() -> dict: response = requests.get( f"{INPUTS_ENDPOINT}/blacklist", headers={ @@ -28,5 +30,6 @@ def blacklisted_keys() -> dict: response.raise_for_status() return response.json() + def is_blacklisted(blacklist: dict, hotkey: str, coldkey: str): return hotkey in blacklist["hotkeys"] or coldkey in blacklist["coldkeys"] diff --git a/base/base/network_commitments.py b/base/base/network_commitments.py index 48369fbe..d5dbe80d 100644 --- a/base/base/network_commitments.py +++ b/base/base/network_commitments.py @@ -3,6 +3,7 @@ _UINT_16_SIZE = 2 _UINT_32_SIZE = 4 + class Encoder: _data: bytearray @@ -35,6 +36,7 @@ def finish(self): return bytes(self._data) + class Decoder: _position: int _data: bytes diff --git a/base/base/output_comparator.py b/base/base/output_comparator.py index 1d12f4e6..7f0badb2 100644 --- a/base/base/output_comparator.py +++ b/base/base/output_comparator.py @@ -7,6 +7,7 @@ from base.device import Device + class OutputComparator(ContextManager, ABC): @abstractmethod def compare(self, baseline: bytes, optimized: bytes) -> float: @@ -17,6 +18,7 @@ def __wrapped_compare(self, baseline: bytes, optimized: bytes): __call__ = __wrapped_compare + class ImageOutputComparator(OutputComparator): device: Device clip: PreTrainedModel diff --git a/base/base/submissions.py b/base/base/submissions.py index a55ac179..585223b2 100644 --- a/base/base/submissions.py +++ b/base/base/submissions.py @@ -16,6 +16,7 @@ REVISION_LENGTH = 7 + class CheckpointSubmission(BaseModel): repository: str revision: Annotated[str, Field(min_length=REVISION_LENGTH, max_length=REVISION_LENGTH)] @@ -46,6 +47,7 @@ def decode(cls, decoder: Decoder): contest_id=contest_id, ) + def make_submission( substrate: SubstrateInterface, netuid: int, @@ -69,6 +71,7 @@ def make_submission( wait_for_finalization=False, ) + def get_submissions( substrate: SubstrateInterface, metagraph: Metagraph, @@ -132,6 +135,7 @@ def get_submissions( return deduplicate_submissions(submissions) + def deduplicate_submissions(submissions: Submissions) -> Submissions: existing_repositories: dict[str, Submission] = {} existing_revisions: dict[str, Submission] = {} diff --git a/base/testing/benchmarker.py b/base/testing/benchmarker.py index ec42f9b8..caba2eea 100644 --- a/base/testing/benchmarker.py +++ b/base/testing/benchmarker.py @@ -18,6 +18,7 @@ logger = get_logger(__name__) tracer = trace.get_tracer(__name__) + class Benchmarker: _thread: Thread | None _stop_flag: Event = Event() diff --git a/base/testing/inference_sandbox.py b/base/testing/inference_sandbox.py index 9b0dcdee..b23e8395 100644 --- a/base/testing/inference_sandbox.py +++ b/base/testing/inference_sandbox.py @@ -41,13 +41,16 @@ tracer = trace.get_tracer(__name__) hf_api = HfApi() + class InvalidSubmissionError(Exception): ... + class BenchmarkOutput(BaseModel): metrics: Metrics outputs: list[bytes] + class InferenceSandbox: _sandbox_args: list[str] _sandbox_directory: Path diff --git a/base/testing/vram_monitor.py b/base/testing/vram_monitor.py index 91de9d38..c17ccd53 100644 --- a/base/testing/vram_monitor.py +++ b/base/testing/vram_monitor.py @@ -4,6 +4,7 @@ SAMPLE_RATE_MS = 10 + class VRamMonitor: _contest: Contest _thread: Thread diff --git a/miner/miner/submit.py b/miner/miner/submit.py index 68714baf..8abda51d 100644 --- a/miner/miner/submit.py +++ b/miner/miner/submit.py @@ -19,6 +19,7 @@ logger = get_logger(__name__) + def start_benchmarking(contest: Contest, keypair: Keypair, submission: CheckpointSubmission): if not contest.device.is_compatible(): logger.warning("Benchmarking on an incompatible device. Results will not be accurate.") @@ -34,6 +35,7 @@ def start_benchmarking(contest: Contest, keypair: Keypair, submission: Checkpoin submissions={keypair.ss58_address: submission}, ) + def add_extra_args(argument_parser: ArgumentParser): argument_parser.add_argument( "--repository", @@ -60,6 +62,7 @@ def add_extra_args(argument_parser: ArgumentParser): default=False, ) + def validate(repository: str, revision: str, contest: Contest): if not re.match(VALID_REPO_REGEX, repository): raise ValueError(f"Invalid repository URL: {repository}") @@ -79,10 +82,12 @@ def validate(repository: str, revision: str, contest: Contest): except GitCommandError as e: raise ValueError(f"Invalid repository or revision: {e}") + def get_latest_revision(repository: str): git = cmd.Git() return git.ls_remote(repository).split()[0] + def get_submission(config) -> CheckpointSubmission: repository = config["repository"] revision = config["revision"] @@ -134,6 +139,7 @@ def get_submission(config) -> CheckpointSubmission: contest_id=contest.id, ) + def submit(): config = get_config(add_extra_args) @@ -175,8 +181,10 @@ def submit(): logger.info(f"Submitted {submission} as the info for this miner") + def main(): submit() + if __name__ == '__main__': main() diff --git a/pipelines/pipelines/models.py b/pipelines/pipelines/models.py index 480a8a68..67b49c52 100644 --- a/pipelines/pipelines/models.py +++ b/pipelines/pipelines/models.py @@ -1,5 +1,6 @@ from pydantic import BaseModel + class TextToImageRequest(BaseModel): prompt: str negative_prompt: str | None = None diff --git a/validator/base_validator/api_data.py b/validator/base_validator/api_data.py index 089aeec6..cefcad0d 100644 --- a/validator/base_validator/api_data.py +++ b/validator/base_validator/api_data.py @@ -5,25 +5,30 @@ from base.checkpoint import Key, Uid, Benchmarks from base.contest import ContestId, RepositoryInfo + class ApiMetadata(BaseModel): version: str compatible_contests: set[ContestId] + class BenchmarkState(Enum): NOT_STARTED = 0 IN_PROGRESS = 1 FINISHED = 2 + class BenchmarkingResults(BaseModel): state: BenchmarkState benchmarks: Benchmarks invalid_submissions: set[Key] average_benchmark_time: float | None + class BenchmarkingStartRequest(BaseModel): contest_id: ContestId submissions: dict[Key, RepositoryInfo] + class BenchmarkingInitializeRequest(BaseModel): uid: Uid signature: str diff --git a/validator/base_validator/auto_updater.py b/validator/base_validator/auto_updater.py index c16e3a67..3287deba 100644 --- a/validator/base_validator/auto_updater.py +++ b/validator/base_validator/auto_updater.py @@ -10,6 +10,7 @@ logger = get_logger(__name__) + class AutoUpdater: _thread: Thread _stop_flag: Event diff --git a/validator/base_validator/telemetry.py b/validator/base_validator/telemetry.py index f62a408c..05d44b4f 100644 --- a/validator/base_validator/telemetry.py +++ b/validator/base_validator/telemetry.py @@ -10,6 +10,7 @@ initialized = False + def init_open_telemetry_logging(attributes: Attributes): global initialized if initialized: diff --git a/validator/generate_compose.py b/validator/generate_compose.py index 5f12313d..bf8836f6 100644 --- a/validator/generate_compose.py +++ b/validator/generate_compose.py @@ -49,6 +49,7 @@ network_mode: host """ + def main(): with open("compose-gpu-layout.json") as f: layout: list[int] = json.load(f) @@ -70,5 +71,6 @@ def main(): ) ) + if __name__ == '__main__': main() diff --git a/validator/submission_tester/api.py b/validator/submission_tester/api.py index 02abfd5d..f7d55b91 100644 --- a/validator/submission_tester/api.py +++ b/validator/submission_tester/api.py @@ -30,6 +30,7 @@ logger = get_logger(__name__) + @asynccontextmanager async def lifespan(_: FastAPI): AutoUpdater() @@ -46,8 +47,10 @@ async def lifespan(_: FastAPI): "compatible_contests": compatible_contests, } + app = FastAPI(lifespan=lifespan) + def _authenticate_request(nonce: int, signature: str): if debug: return @@ -70,6 +73,7 @@ def _authenticate_request(nonce: int, signature: str): detail="Invalid signature", ) + @app.post("/start") def start( start_request: Annotated[BenchmarkingStartRequest, Body()], @@ -98,6 +102,7 @@ def start( benchmarker.start_timestamp = timestamp benchmarker.start_benchmarking(contest, start_request.submissions) + @app.get("/state") def state(request: Request) -> BenchmarkingResults: benchmarker: Benchmarker = request.state.benchmarker @@ -115,6 +120,7 @@ def state(request: Request) -> BenchmarkingResults: average_benchmark_time=average_benchmark_time, ) + @app.get("/metadata") def metadata(request: Request) -> ApiMetadata: return ApiMetadata( @@ -122,6 +128,7 @@ def metadata(request: Request) -> ApiMetadata: compatible_contests=request.state.compatible_contests, ) + @app.post("/initialize") def initialize( init_request: Annotated[BenchmarkingInitializeRequest, Body()], diff --git a/validator/weight_setting/benchmarking_api.py b/validator/weight_setting/benchmarking_api.py index d43ea12c..b7d826b6 100644 --- a/validator/weight_setting/benchmarking_api.py +++ b/validator/weight_setting/benchmarking_api.py @@ -14,6 +14,7 @@ logger = get_logger(__name__) + class BenchmarkingApi: _api: str _keypair: Keypair @@ -62,6 +63,7 @@ def results(self) -> BenchmarkingResults: response.raise_for_status() return BenchmarkingResults.model_validate(response.json()) + def _authentication_headers(keypair: Keypair): nonce = str(time_ns()) @@ -72,6 +74,7 @@ def _authentication_headers(keypair: Keypair): "Signature": signature, } + def send_submissions_to_api(version: str, all_apis: list[BenchmarkingApi], submissions: Submissions): submissions_by_contest: dict[ContestId, dict[Key, RepositoryInfo]] = defaultdict(lambda: {}) diff --git a/validator/weight_setting/contest_state.py b/validator/weight_setting/contest_state.py index e190838e..18582bbb 100644 --- a/validator/weight_setting/contest_state.py +++ b/validator/weight_setting/contest_state.py @@ -10,6 +10,7 @@ logger = get_logger(__name__) + class ContestState(BaseModel): step: int benchmarks_version: int diff --git a/validator/weight_setting/state_manager.py b/validator/weight_setting/state_manager.py index 4ec9c2e9..47ffacd3 100644 --- a/validator/weight_setting/state_manager.py +++ b/validator/weight_setting/state_manager.py @@ -9,6 +9,7 @@ STATE_VERSION = 2 + class StateManager: _state_file: Path diff --git a/validator/weight_setting/telemetry_attributes.py b/validator/weight_setting/telemetry_attributes.py index ddff8980..dec9b6c5 100644 --- a/validator/weight_setting/telemetry_attributes.py +++ b/validator/weight_setting/telemetry_attributes.py @@ -7,6 +7,7 @@ from fiber.chain.chain_utils import load_hotkey_keypair + def log_extra_attributes(): config = get_config(add_args) @@ -17,5 +18,6 @@ def log_extra_attributes(): print(f"netuid={config['netuid']},neuron.hotkey={keypair.ss58_address}") + if __name__ == "__main__": log_extra_attributes() diff --git a/validator/weight_setting/validator.py b/validator/weight_setting/validator.py index b993d5cd..d499820c 100644 --- a/validator/weight_setting/validator.py +++ b/validator/weight_setting/validator.py @@ -31,6 +31,7 @@ logger = get_logger(__name__) tracer = trace.get_tracer(__name__) + class Validator: _stop_flag: Event = Event() contest_state: ContestState | None = None @@ -185,9 +186,11 @@ def run(self): logger.error(f"Error during step {self.step()}", exc_info=e) self.substrate = get_substrate(subtensor_address=self.substrate.url) + def main(): AutoUpdater() Validator() + if __name__ == '__main__': main() diff --git a/validator/weight_setting/validator_args.py b/validator/weight_setting/validator_args.py index fce87db6..d5c8df85 100644 --- a/validator/weight_setting/validator_args.py +++ b/validator/weight_setting/validator_args.py @@ -2,6 +2,7 @@ from .wandb_manager import add_wandb_args + def add_args(argument_parser: ArgumentParser): argument_parser.add_argument( "--epoch_length", diff --git a/validator/weight_setting/wandb_manager.py b/validator/weight_setting/wandb_manager.py index ef4df04b..0219ae0f 100644 --- a/validator/weight_setting/wandb_manager.py +++ b/validator/weight_setting/wandb_manager.py @@ -7,6 +7,7 @@ from base.checkpoint import Uid from .contest_state import ContestState + class WandbManager: _run: Run | None = None @@ -77,6 +78,7 @@ def send_metrics(self, contest_state: ContestState): self._run.log(data=data) + def add_wandb_args(parser: ArgumentParser): parser.add_argument( "--wandb.off", diff --git a/validator/weight_setting/weight_setter.py b/validator/weight_setting/weight_setter.py index abd78744..76dde1fd 100644 --- a/validator/weight_setting/weight_setter.py +++ b/validator/weight_setting/weight_setter.py @@ -14,6 +14,7 @@ logger = get_logger(__name__) tracer = trace.get_tracer(__name__) + class WeightSetter: _thread: Thread _stop_flag: Event = Event() diff --git a/validator/weight_setting/winner_selection.py b/validator/weight_setting/winner_selection.py index d0a02f89..5dd0d618 100644 --- a/validator/weight_setting/winner_selection.py +++ b/validator/weight_setting/winner_selection.py @@ -6,6 +6,7 @@ RANK_SCORE_IMPROVEMENT_THRESHOLD = 1.05 WINNER_PERCENTAGE = 0.80 + def get_contestant_scores( submissions: Submissions, benchmarks: Benchmarks, @@ -16,6 +17,7 @@ def get_contestant_scores( for key, benchmark in benchmarks.items() } + def get_contestant_ranks(scores: dict[Key, float]) -> dict[Key, int]: if not scores: return {} @@ -36,6 +38,7 @@ def get_contestant_ranks(scores: dict[Key, float]) -> dict[Key, int]: return ranks + def calculate_rank_weights( submitted_blocks: dict[Key, int], ranks: dict[Key, int], From dc9a7ec8cdb5aaa9857993138cfd5e759b342862 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 12:04:18 -0800 Subject: [PATCH 05/33] Fix start script --- validator/submission_tester/Dockerfile | 4 ++-- validator/submission_tester/entrypoint.sh | 2 +- validator/weight_setting/Dockerfile | 4 +--- validator/weight_setting/entrypoint.sh | 2 +- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/validator/submission_tester/Dockerfile b/validator/submission_tester/Dockerfile index 371dc41c..9215c23d 100644 --- a/validator/submission_tester/Dockerfile +++ b/validator/submission_tester/Dockerfile @@ -11,8 +11,8 @@ COPY base . COPY validator . COPY .git .git -WORKDIR /api/validator/submission_tester +WORKDIR /api/validator USER root EXPOSE 8000 -ENTRYPOINT ["entrypoint.sh"] +ENTRYPOINT ["submission_tester/entrypoint.sh"] diff --git a/validator/submission_tester/entrypoint.sh b/validator/submission_tester/entrypoint.sh index cc17952d..18f75c81 100755 --- a/validator/submission_tester/entrypoint.sh +++ b/validator/submission_tester/entrypoint.sh @@ -2,4 +2,4 @@ chown -R sandbox:sandbox /home/sandbox/.cache/huggingface -./start.sh --host 0.0.0.0 --port 8000 submission_tester:app +./submission_tester/start.sh --host 0.0.0.0 --port 8000 submission_tester:app diff --git a/validator/weight_setting/Dockerfile b/validator/weight_setting/Dockerfile index f8617ff5..a119fff7 100644 --- a/validator/weight_setting/Dockerfile +++ b/validator/weight_setting/Dockerfile @@ -18,7 +18,5 @@ COPY base . COPY validator . COPY .git .git -WORKDIR /api/validator/weight_setting - USER root -ENTRYPOINT ["entrypoint.sh"] +ENTRYPOINT ["weight_setting/entrypoint.sh"] diff --git a/validator/weight_setting/entrypoint.sh b/validator/weight_setting/entrypoint.sh index 574f5255..47233d4f 100755 --- a/validator/weight_setting/entrypoint.sh +++ b/validator/weight_setting/entrypoint.sh @@ -3,4 +3,4 @@ chown -R validator:validator /home/validator/.bittensor chown -R validator:validator /home/validator/.netrc -sudo -u validator ./start.sh "$@" +sudo -u validator ./weight_setting/start.sh "$@" From 7ae036a2de2c99e939fcb993536a78671320dc44 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 12:07:24 -0800 Subject: [PATCH 06/33] Update start.sh --- base/pyproject.toml | 4 ++-- validator/submission_tester/start.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/base/pyproject.toml b/base/pyproject.toml index 53551a71..1a38c224 100644 --- a/base/pyproject.toml +++ b/base/pyproject.toml @@ -31,11 +31,11 @@ dev = [ [tool.pytype] inputs = [ "base", - "tester", + "testing", ] [tool.setuptools] packages = [ "base", - "tester", + "testing", ] diff --git a/validator/submission_tester/start.sh b/validator/submission_tester/start.sh index 92f4b841..2d78c973 100755 --- a/validator/submission_tester/start.sh +++ b/validator/submission_tester/start.sh @@ -2,7 +2,7 @@ set -e -./update.sh +./submission_tester/update.sh sudo -u api /home/api/.local/bin/uv run opentelemetry-instrument \ --service_name edge-maxxing-api \ From 9ff390b943ea2b200fbbad4f8023204bd962a6c6 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 12:23:40 -0800 Subject: [PATCH 07/33] Fix dependencies --- validator/pyproject.toml | 1 + validator/uv.lock | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/validator/pyproject.toml b/validator/pyproject.toml index f4aa2e9b..054bd551 100644 --- a/validator/pyproject.toml +++ b/validator/pyproject.toml @@ -33,6 +33,7 @@ dependencies = [ "opentelemetry-instrumentation-tortoiseorm>=0.49b2", "opentelemetry-instrumentation-urllib3>=0.49b2", "fastapi>=0.115.5", + "netaddr>=1.3.0", ] [tool.uv.sources] diff --git a/validator/uv.lock b/validator/uv.lock index d0a7c7fa..f8fe4b57 100644 --- a/validator/uv.lock +++ b/validator/uv.lock @@ -388,6 +388,7 @@ source = { editable = "." } dependencies = [ { name = "edge-maxxing-base" }, { name = "fastapi" }, + { name = "netaddr" }, { name = "opentelemetry-api" }, { name = "opentelemetry-distro" }, { name = "opentelemetry-exporter-otlp" }, @@ -422,6 +423,7 @@ dev = [ requires-dist = [ { name = "edge-maxxing-base", editable = "../base" }, { name = "fastapi", specifier = ">=0.115.5" }, + { name = "netaddr", specifier = ">=1.3.0" }, { name = "opentelemetry-api", specifier = ">=1.28.2" }, { name = "opentelemetry-distro", specifier = ">=0.49b2" }, { name = "opentelemetry-exporter-otlp", specifier = ">=1.28.2" }, @@ -841,6 +843,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3f/76/30d8f152299f65c85c46a2cbeaf95ad1d18516b5ce730acdaef696d4cfe6/msgspec-0.18.6-cp312-cp312-win_amd64.whl", hash = "sha256:1003c20bfe9c6114cc16ea5db9c5466e49fae3d7f5e2e59cb70693190ad34da0", size = 187184 }, ] +[[package]] +name = "netaddr" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/54/90/188b2a69654f27b221fba92fda7217778208532c962509e959a9cee5229d/netaddr-1.3.0.tar.gz", hash = "sha256:5c3c3d9895b551b763779ba7db7a03487dc1f8e3b385af819af341ae9ef6e48a", size = 2260504 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/cc/f4fe2c7ce68b92cbf5b2d379ca366e1edae38cccaad00f69f529b460c3ef/netaddr-1.3.0-py3-none-any.whl", hash = "sha256:c2c6a8ebe5554ce33b7d5b3a306b71bbb373e000bbbf2350dd5213cc56e3dbbe", size = 2262023 }, +] + [[package]] name = "networkx" version = "3.4.2" From 97573b7690403631373605f1f4c62aacf6b22384 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 12:41:51 -0800 Subject: [PATCH 08/33] Fix API --- validator/pyproject.toml | 1 + validator/submission_tester/__init__.py | 1 + 2 files changed, 2 insertions(+) diff --git a/validator/pyproject.toml b/validator/pyproject.toml index 054bd551..d3d0abba 100644 --- a/validator/pyproject.toml +++ b/validator/pyproject.toml @@ -34,6 +34,7 @@ dependencies = [ "opentelemetry-instrumentation-urllib3>=0.49b2", "fastapi>=0.115.5", "netaddr>=1.3.0", + "uvicorn>=0.32.1", ] [tool.uv.sources] diff --git a/validator/submission_tester/__init__.py b/validator/submission_tester/__init__.py index e69de29b..489dadd8 100644 --- a/validator/submission_tester/__init__.py +++ b/validator/submission_tester/__init__.py @@ -0,0 +1 @@ +from .api import app From 5f281f1dbb79e0632f0ab829374ccfb34491d2b6 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 14:17:41 -0800 Subject: [PATCH 09/33] Fix autoupdater blocking termination --- validator/base_validator/auto_updater.py | 5 ++++- validator/submission_tester/api.py | 4 +++- validator/weight_setting/validator.py | 16 ++++++++++++---- validator/weight_setting/weight_setter.py | 2 +- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/validator/base_validator/auto_updater.py b/validator/base_validator/auto_updater.py index 3287deba..1a4462ac 100644 --- a/validator/base_validator/auto_updater.py +++ b/validator/base_validator/auto_updater.py @@ -50,8 +50,11 @@ def _check_for_updates(self): else: logger.info("Already up to date.") - def _restart(self): + def shutdown(self): self._stop_flag.set() + + def _restart(self): + self.shutdown() os.kill(os.getpid(), signal.SIGTERM) logger.info("Waiting for process to terminate...") diff --git a/validator/submission_tester/api.py b/validator/submission_tester/api.py index f7d55b91..55daf1b7 100644 --- a/validator/submission_tester/api.py +++ b/validator/submission_tester/api.py @@ -33,7 +33,7 @@ @asynccontextmanager async def lifespan(_: FastAPI): - AutoUpdater() + auto_updater = AutoUpdater() compatible_contests = find_compatible_contests() if not debug else [contest.id for contest in CONTESTS] if not compatible_contests: @@ -47,6 +47,8 @@ async def lifespan(_: FastAPI): "compatible_contests": compatible_contests, } + auto_updater.shutdown() + app = FastAPI(lifespan=lifespan) diff --git a/validator/weight_setting/validator.py b/validator/weight_setting/validator.py index d499820c..5250415a 100644 --- a/validator/weight_setting/validator.py +++ b/validator/weight_setting/validator.py @@ -1,7 +1,6 @@ from importlib.metadata import version from signal import signal, SIGINT, SIGHUP, SIGTERM from threading import Event -from time import sleep from typing import Any from fiber.chain.chain_utils import load_hotkey_keypair @@ -34,6 +33,7 @@ class Validator: _stop_flag: Event = Event() + auto_updater: AutoUpdater = AutoUpdater() contest_state: ContestState | None = None validator_version: str = version("edge-maxxing-validator") uid: Uid @@ -121,7 +121,15 @@ def initialize_contest(self): block=self.substrate.get_block_number(None), # type: ignore ) ) + + if not self.contest_state.submissions: + sleep_blocks = self.config["epoch_length"] + logger.warning(f"No submissions found, sleeping for {sleep_blocks} blocks") + self._stop_flag.wait(sleep_blocks * 12) + return + self.wandb_manager.init_wandb(self.contest_state) + logger.info(f"Starting a new contest with {len(self.contest_state.submissions)} submissions") @tracer.start_as_current_span("do_step") def do_step(self): @@ -149,7 +157,7 @@ def do_step(self): return self.update_benchmarks(benchmarking_results) - sleep(BENCHMARK_UPDATE_RATE_BLOCKS * 12) + self._stop_flag.wait(BENCHMARK_UPDATE_RATE_BLOCKS * 12) def update_benchmarks(self, benchmarking_results: list[BenchmarkingResults]): self.contest_state.baseline = benchmarking_results[0].baseline @@ -164,7 +172,8 @@ def step(self): def _shutdown(self, _signalnum, _handler): logger.info("Shutting down validator") - self.weight_setter.stop() + self.weight_setter.shutdown() + self.auto_updater.shutdown() self._stop_flag.set() def run(self): @@ -188,7 +197,6 @@ def run(self): def main(): - AutoUpdater() Validator() diff --git a/validator/weight_setting/weight_setter.py b/validator/weight_setting/weight_setter.py index 76dde1fd..3ff5d7ed 100644 --- a/validator/weight_setting/weight_setter.py +++ b/validator/weight_setting/weight_setter.py @@ -50,7 +50,7 @@ def __init__( self._thread = Thread(target=self._run) self._thread.start() - def stop(self): + def shutdown(self): self._stop_flag.set() def _run(self): From 0485c561ffb57eb25b896307b781c3c3cc7c26c9 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 14:33:06 -0800 Subject: [PATCH 10/33] Fix submission script --- miner/miner/submit.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/miner/miner/submit.py b/miner/miner/submit.py index 8abda51d..0cac44e6 100644 --- a/miner/miner/submit.py +++ b/miner/miner/submit.py @@ -92,7 +92,7 @@ def get_submission(config) -> CheckpointSubmission: repository = config["repository"] revision = config["revision"] contest_name = config["contest"] - contest: Contest | None = find_contest(contest_name) if contest_name else None + contest: Contest | None = find_contest(ContestId[contest_name]) if contest_name else None if not repository: while True: @@ -121,7 +121,7 @@ def get_submission(config) -> CheckpointSubmission: print(f"\t- {c.id.name}") contest_id = input(f"Enter the contest (default: {default_contest.id.name}): ") or default_contest.id.name try: - contest = find_contest(ContestId(contest_id)) + contest = find_contest(ContestId[contest_id]) break except ValueError: print(f"Unknown contest: {contest_id}") @@ -158,9 +158,10 @@ def submit(): if enable_benchmarking or input("Benchmark submission before submitting? (y/N): ").strip().lower() in ("yes", "y"): try: - start_benchmarking(find_contest(submission.contest), keypair, submission) + start_benchmarking(find_contest(submission.contest_id), keypair, submission) except Exception as e: - exit(f"Benchmarking failed, submission cancelled: {e}") + logger.critical(f"Benchmarking failed, submission cancelled", exc_info=e) + exit(1) print( "\nSubmission info:\n" From 7eb94076c800c45b256f045fbc60c5572ae9a60f Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 14:51:38 -0800 Subject: [PATCH 11/33] Fix errors from pytype --- base/base/contest.py | 6 ++++++ base/testing/benchmarker.py | 12 ++++++------ validator/base_validator/api_data.py | 10 +--------- validator/uv.lock | 25 +++++++++++++++++++++++++ validator/weight_setting/validator.py | 13 +++++++++---- 5 files changed, 47 insertions(+), 19 deletions(-) diff --git a/base/base/contest.py b/base/base/contest.py index f58d6a04..40080ba0 100644 --- a/base/base/contest.py +++ b/base/base/contest.py @@ -12,6 +12,12 @@ SIMILARITY_SCORE_THRESHOLD = 0.7 +class BenchmarkState(IntEnum): + NOT_STARTED = 0 + IN_PROGRESS = 1 + FINISHED = 2 + + class MetricType(IntEnum): SIMILARITY_SCORE = 0 GENERATION_TIME = 1 diff --git a/base/testing/benchmarker.py b/base/testing/benchmarker.py index caba2eea..5922ac3f 100644 --- a/base/testing/benchmarker.py +++ b/base/testing/benchmarker.py @@ -9,9 +9,8 @@ from opentelemetry import trace from base.checkpoint import Key, Benchmarks -from base.contest import Contest, RepositoryInfo, Benchmark +from base.contest import Contest, RepositoryInfo, Benchmark, BenchmarkState from base.inputs_api import random_inputs -from base_validator.api_data import BenchmarkState from pipelines import TextToImageRequest from .inference_sandbox import BenchmarkOutput, InferenceSandbox @@ -29,7 +28,7 @@ class Benchmarker: start_timestamp: float = 0 state: BenchmarkState = BenchmarkState.NOT_STARTED benchmarks: Benchmarks = {} - invalid_submissions: set[Key] = {} + invalid_submissions: set[Key] = set() baseline: BenchmarkOutput | None = None submission_times: list[float] = [] @@ -128,11 +127,12 @@ def start_benchmarking(self, contest: Contest, submissions: dict[Key, Repository logger.info(f"Started benchmarking for {len(submissions)} submissions") - if self._thread and self._thread.is_alive(): + thread = self._thread + if thread and thread.is_alive(): logger.info("Attempting to cancel previous benchmarking") self._stop_flag.set() - self._thread.join(timeout=60) - if self._thread.is_alive(): + thread.join(timeout=60) + if thread.is_alive(): logger.warning("Benchmarking was not stopped gracefully.") else: logger.info("Benchmarking was stopped gracefully.") diff --git a/validator/base_validator/api_data.py b/validator/base_validator/api_data.py index cefcad0d..4b879d75 100644 --- a/validator/base_validator/api_data.py +++ b/validator/base_validator/api_data.py @@ -1,9 +1,7 @@ -from enum import Enum - from pydantic import BaseModel from base.checkpoint import Key, Uid, Benchmarks -from base.contest import ContestId, RepositoryInfo +from base.contest import ContestId, RepositoryInfo, BenchmarkState class ApiMetadata(BaseModel): @@ -11,12 +9,6 @@ class ApiMetadata(BaseModel): compatible_contests: set[ContestId] -class BenchmarkState(Enum): - NOT_STARTED = 0 - IN_PROGRESS = 1 - FINISHED = 2 - - class BenchmarkingResults(BaseModel): state: BenchmarkState benchmarks: Benchmarks diff --git a/validator/uv.lock b/validator/uv.lock index f8fe4b57..0cf8a2a1 100644 --- a/validator/uv.lock +++ b/validator/uv.lock @@ -411,6 +411,7 @@ dependencies = [ { name = "opentelemetry-instrumentation-urllib3" }, { name = "opentelemetry-instrumentation-wsgi" }, { name = "opentelemetry-sdk" }, + { name = "uvicorn" }, { name = "wandb" }, ] @@ -446,6 +447,7 @@ requires-dist = [ { name = "opentelemetry-instrumentation-urllib3", specifier = ">=0.49b2" }, { name = "opentelemetry-instrumentation-wsgi", specifier = ">=0.49b2" }, { name = "opentelemetry-sdk", specifier = ">=1.28.2" }, + { name = "uvicorn", specifier = ">=0.32.1" }, { name = "wandb", specifier = ">=0.18.7" }, ] @@ -626,6 +628,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e2/1d/b1250907a727f08de6508d752f367e4b46d113d4eac9eb919ebd9da6a5d6/grpcio-1.68.0-cp312-cp312-win_amd64.whl", hash = "sha256:2bddd04a790b69f7a7385f6a112f46ea0b34c4746f361ebafe9ca0be567c78e9", size = 4390622 }, ] +[[package]] +name = "h11" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/38/3af3d3633a34a3316095b39c8e8fb4853a28a536e55d347bd8d8e9a14b03/h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", size = 100418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/04/ff642e65ad6b90db43e668d70ffb6736436c7ce41fcc549f4e9472234127/h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761", size = 58259 }, +] + [[package]] name = "huggingface-hub" version = "0.26.2" @@ -2556,6 +2567,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 }, ] +[[package]] +name = "uvicorn" +version = "0.32.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/3c/21dba3e7d76138725ef307e3d7ddd29b763119b3aa459d02cc05fefcff75/uvicorn-0.32.1.tar.gz", hash = "sha256:ee9519c246a72b1c084cea8d3b44ed6026e78a4a309cbedae9c37e4cb9fbb175", size = 77630 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/c1/2d27b0a15826c2b71dcf6e2f5402181ef85acf439617bb2f1453125ce1f3/uvicorn-0.32.1-py3-none-any.whl", hash = "sha256:82ad92fd58da0d12af7482ecdb5f2470a04c9c9a53ced65b9bbb4a205377602e", size = 63828 }, +] + [[package]] name = "wandb" version = "0.18.7" diff --git a/validator/weight_setting/validator.py b/validator/weight_setting/validator.py index 5250415a..ee60521b 100644 --- a/validator/weight_setting/validator.py +++ b/validator/weight_setting/validator.py @@ -13,8 +13,9 @@ from base.checkpoint import Uid from base.config import get_config +from base.contest import BenchmarkState from base.submissions import get_submissions -from base_validator.api_data import BenchmarkState, BenchmarkingResults +from base_validator.api_data import BenchmarkingResults from base_validator.auto_updater import AutoUpdater from base_validator.telemetry import init_open_telemetry_logging from weight_setting.wandb_manager import WandbManager @@ -160,6 +161,9 @@ def do_step(self): self._stop_flag.wait(BENCHMARK_UPDATE_RATE_BLOCKS * 12) def update_benchmarks(self, benchmarking_results: list[BenchmarkingResults]): + if not self.contest_state: + return + self.contest_state.baseline = benchmarking_results[0].baseline self.contest_state.average_benchmarking_time = benchmarking_results[0].average_benchmarking_time @@ -185,9 +189,10 @@ def run(self): try: logger.info(f"Step {self.step()}") self.do_step() - self.contest_state.step += 1 - self.state_manager.save_state(self.contest_state) - self.wandb_manager.send_metrics(self.contest_state) + if self.contest_state: + self.contest_state.step += 1 + self.state_manager.save_state(self.contest_state) + self.wandb_manager.send_metrics(self.contest_state) except (ConnectionError, HTTPError) as e: logger.error(f"Error connecting to API, retrying in 10 blocks: {e}") self._stop_flag.wait(BENCHMARK_UPDATE_RATE_BLOCKS * 12) From 0438a14564374daef08c3751a2b271b0aa3b1ab4 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 14:55:58 -0800 Subject: [PATCH 12/33] Update submit.py --- miner/miner/submit.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/miner/miner/submit.py b/miner/miner/submit.py index 0cac44e6..5fe4dfe4 100644 --- a/miner/miner/submit.py +++ b/miner/miner/submit.py @@ -165,10 +165,9 @@ def submit(): print( "\nSubmission info:\n" - f"Git Provider: {submission.provider}\n" f"Repository: {submission.repository}\n" f"Revision: {submission.revision}\n" - f"Contest: {submission.contest.name}\n" + f"Contest: {submission.contest_id.name}\n" ) if input("Confirm submission? (Y/n): ").strip().lower() not in ("yes", "y", ""): exit("Submission cancelled.") From cc7deda8e736fa3ffd1bc480704d3731922811e5 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 15:11:48 -0800 Subject: [PATCH 13/33] Fix benchmarking issues --- base/testing/benchmarker.py | 9 ++++----- validator/base_validator/api_data.py | 3 ++- validator/submission_tester/api.py | 1 + validator/weight_setting/benchmarking_api.py | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/base/testing/benchmarker.py b/base/testing/benchmarker.py index 5922ac3f..cabe7198 100644 --- a/base/testing/benchmarker.py +++ b/base/testing/benchmarker.py @@ -19,7 +19,7 @@ class Benchmarker: - _thread: Thread | None + _thread: Thread | None = None _stop_flag: Event = Event() _sandbox_directory: Path @@ -127,12 +127,11 @@ def start_benchmarking(self, contest: Contest, submissions: dict[Key, Repository logger.info(f"Started benchmarking for {len(submissions)} submissions") - thread = self._thread - if thread and thread.is_alive(): + if self._thread and self._thread.is_alive(): logger.info("Attempting to cancel previous benchmarking") self._stop_flag.set() - thread.join(timeout=60) - if thread.is_alive(): + self._thread.join(timeout=60) + if self._thread.is_alive(): logger.warning("Benchmarking was not stopped gracefully.") else: logger.info("Benchmarking was stopped gracefully.") diff --git a/validator/base_validator/api_data.py b/validator/base_validator/api_data.py index 4b879d75..455c7e2e 100644 --- a/validator/base_validator/api_data.py +++ b/validator/base_validator/api_data.py @@ -1,7 +1,7 @@ from pydantic import BaseModel from base.checkpoint import Key, Uid, Benchmarks -from base.contest import ContestId, RepositoryInfo, BenchmarkState +from base.contest import ContestId, RepositoryInfo, BenchmarkState, Metrics class ApiMetadata(BaseModel): @@ -13,6 +13,7 @@ class BenchmarkingResults(BaseModel): state: BenchmarkState benchmarks: Benchmarks invalid_submissions: set[Key] + baseline: Metrics | None average_benchmark_time: float | None diff --git a/validator/submission_tester/api.py b/validator/submission_tester/api.py index 55daf1b7..989f9362 100644 --- a/validator/submission_tester/api.py +++ b/validator/submission_tester/api.py @@ -119,6 +119,7 @@ def state(request: Request) -> BenchmarkingResults: state=benchmarker.state, benchmarks=benchmarker.benchmarks, invalid_submissions=benchmarker.invalid_submissions, + baseline=benchmarker.baseline.metrics if benchmarker.baseline else None, average_benchmark_time=average_benchmark_time, ) diff --git a/validator/weight_setting/benchmarking_api.py b/validator/weight_setting/benchmarking_api.py index b7d826b6..bae70f53 100644 --- a/validator/weight_setting/benchmarking_api.py +++ b/validator/weight_setting/benchmarking_api.py @@ -78,8 +78,8 @@ def _authentication_headers(keypair: Keypair): def send_submissions_to_api(version: str, all_apis: list[BenchmarkingApi], submissions: Submissions): submissions_by_contest: dict[ContestId, dict[Key, RepositoryInfo]] = defaultdict(lambda: {}) - for key, info in submissions.items(): - submissions_by_contest[info.contest_id][key] = info.repository + for key, submission in submissions.items(): + submissions_by_contest[submission.contest_id][key] = submission.repository_info contest_api_assignment: dict[ContestId, list[BenchmarkingApi]] = defaultdict(lambda: []) From b4739c78f3c9d471a09e24c2fe5e6b3e599cbc18 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 16:09:43 -0800 Subject: [PATCH 14/33] Fix pytype workflow --- .github/workflows/pytype-base.yaml | 2 +- validator/weight_setting/benchmarking_api.py | 2 +- validator/weight_setting/contest_state.py | 1 - validator/weight_setting/validator.py | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/pytype-base.yaml b/.github/workflows/pytype-base.yaml index dc4d0344..91761e63 100644 --- a/.github/workflows/pytype-base.yaml +++ b/.github/workflows/pytype-base.yaml @@ -15,6 +15,6 @@ jobs: uses: astral-sh/setup-uv@v3 - name: Test Types - working-directory: main + working-directory: base run: | uv run pytype diff --git a/validator/weight_setting/benchmarking_api.py b/validator/weight_setting/benchmarking_api.py index bae70f53..f8554025 100644 --- a/validator/weight_setting/benchmarking_api.py +++ b/validator/weight_setting/benchmarking_api.py @@ -106,7 +106,7 @@ def send_submissions_to_api(version: str, all_apis: list[BenchmarkingApi], submi for contest_id, apis in contest_api_assignment.items(): if contest_id not in submissions_by_contest: - raise RuntimeError(f"No API compatible with contest type {contest_id}") + raise RuntimeError(f"No API compatible with contest type {contest_id.name}") contest_submissions = submissions_by_contest[contest_id] diff --git a/validator/weight_setting/contest_state.py b/validator/weight_setting/contest_state.py index 18582bbb..11226711 100644 --- a/validator/weight_setting/contest_state.py +++ b/validator/weight_setting/contest_state.py @@ -23,7 +23,6 @@ class ContestState(BaseModel): contest_end: datetime def start_new_contest(self, benchmarks_version: int, submissions: Submissions): - logger.info("Starting new contest") self.benchmarks_version = benchmarks_version self.submissions = submissions diff --git a/validator/weight_setting/validator.py b/validator/weight_setting/validator.py index ee60521b..8fa7c32e 100644 --- a/validator/weight_setting/validator.py +++ b/validator/weight_setting/validator.py @@ -165,7 +165,7 @@ def update_benchmarks(self, benchmarking_results: list[BenchmarkingResults]): return self.contest_state.baseline = benchmarking_results[0].baseline - self.contest_state.average_benchmarking_time = benchmarking_results[0].average_benchmarking_time + self.contest_state.average_benchmarking_time = benchmarking_results[0].average_benchmark_time for result in benchmarking_results: self.contest_state.benchmarks.update(result.benchmarks) From 6e71c02b2fc0f3624ddd7e2aaf83ca66f3f75a58 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 16:34:06 -0800 Subject: [PATCH 15/33] add proper benchmarking shutdown, add more logging --- base/testing/benchmarker.py | 35 +++++++++++++++++++++++++----- base/testing/inference_sandbox.py | 5 ++++- validator/submission_tester/api.py | 19 +++++++--------- 3 files changed, 41 insertions(+), 18 deletions(-) diff --git a/base/testing/benchmarker.py b/base/testing/benchmarker.py index cabe7198..6080c13b 100644 --- a/base/testing/benchmarker.py +++ b/base/testing/benchmarker.py @@ -1,4 +1,5 @@ from concurrent.futures import CancelledError +from datetime import timedelta from pathlib import Path from random import choice from statistics import mean @@ -81,6 +82,7 @@ def _benchmark_submission( @tracer.start_as_current_span("benchmark_baseline") def _benchmark_baseline(self, contest: Contest, inputs: list[TextToImageRequest]): + logger.info("Benchmarking baseline") while not self.baseline and not self._stop_flag.is_set(): try: self._benchmark_submission(contest, inputs, contest.baseline_repository) @@ -101,32 +103,44 @@ def benchmark_submissions(self, contest: Contest, submissions: dict[Key, Reposit inputs = random_inputs() self._benchmark_baseline(contest, inputs) + logger.info(f"Benchmarking {len(submissions)} submissions") while not self._is_done(submissions) and self.baseline and not self._stop_flag.is_set(): start_time = perf_counter() key = choice(list(submissions.keys() - self.benchmarks.keys())) submission = submissions[key] + logger.info(f"Benchmarking submission '{submission.url}' with revision '{submission.revision}'") try: benchmark_output = self._benchmark_submission(contest, inputs, submission) benchmark = self.compare(contest, benchmark_output, self._stop_flag) self.benchmarks[key] = benchmark + except CancelledError: + break except Exception as e: logger.error(f"Failed to benchmark submission '{submission}': '{e}'", exc_info=e) self.invalid_submissions.add(key) finally: self.submission_times.append(perf_counter() - start_time) + average_benchmark_time = self.get_average_benchmark_time() + if average_benchmark_time: + eta = (len(submissions) - len(self.benchmarks)) * average_benchmark_time + logger.info(f"Average benchmark time: {average_benchmark_time}, ETA: {timedelta(seconds=eta)}") + if self._is_done(submissions): + logger.info("Benchmarking complete") self.state = BenchmarkState.FINISHED else: + logger.warning("Benchmarking canceled") self.state = BenchmarkState.NOT_STARTED - def start_benchmarking(self, contest: Contest, submissions: dict[Key, RepositoryInfo]): - if not submissions: - logger.warning("No submissions to benchmark") - return - - logger.info(f"Started benchmarking for {len(submissions)} submissions") + def get_average_benchmark_time(self) -> float | None: + return ( + sum(self.submission_times) / len(self.submission_times) + if self.submission_times + else None + ) + def shutdown(self): if self._thread and self._thread.is_alive(): logger.info("Attempting to cancel previous benchmarking") self._stop_flag.set() @@ -136,6 +150,15 @@ def start_benchmarking(self, contest: Contest, submissions: dict[Key, Repository else: logger.info("Benchmarking was stopped gracefully.") + def start_benchmarking(self, contest: Contest, submissions: dict[Key, RepositoryInfo]): + if not submissions: + logger.warning("No submissions to benchmark") + return + + logger.info(f"Started benchmarking for {len(submissions)} submissions") + + self.shutdown() + self._stop_flag.clear() self._thread = Thread( target=self.benchmark_submissions, diff --git a/base/testing/inference_sandbox.py b/base/testing/inference_sandbox.py index b23e8395..33e573a3 100644 --- a/base/testing/inference_sandbox.py +++ b/base/testing/inference_sandbox.py @@ -186,6 +186,7 @@ def benchmark(self) -> BenchmarkOutput: metrics: list[Metrics] = [] outputs: list[bytes] = [] + logger.info("Loading pipeline") with Popen( [ *self._sandbox_args, @@ -199,7 +200,9 @@ def benchmark(self) -> BenchmarkOutput: ): load_time = self.wait_for_socket() with Client(abspath(self._socket_path)) as client: - for request in self._inputs: + logger.info(f"Benchmarking {len(self._inputs)} samples") + for i, request in enumerate(self._inputs): + logger.info(f"Sample {i + 1}/{len(self._inputs)}") start_joules = self._contest.device.get_joules() vram_monitor = VRamMonitor(self._contest) diff --git a/validator/submission_tester/api.py b/validator/submission_tester/api.py index 989f9362..b4211773 100644 --- a/validator/submission_tester/api.py +++ b/validator/submission_tester/api.py @@ -39,14 +39,17 @@ async def lifespan(_: FastAPI): if not compatible_contests: raise RuntimeError("Device is not compatible with any contests") + benchmarker = Benchmarker( + sandbox_directory=Path("/sandbox"), + sandbox_args=["/bin/sudo", "-u", "sandbox"] + ) + yield { - "benchmarker": Benchmarker( - sandbox_directory=Path("/sandbox"), - sandbox_args=["/bin/sudo", "-u", "sandbox"] - ), + "benchmarker": benchmarker, "compatible_contests": compatible_contests, } + benchmarker.shutdown() auto_updater.shutdown() @@ -109,18 +112,12 @@ def start( def state(request: Request) -> BenchmarkingResults: benchmarker: Benchmarker = request.state.benchmarker - average_benchmark_time = ( - sum(benchmarker.submission_times) / len(benchmarker.submission_times) - if benchmarker.submission_times - else None - ) - return BenchmarkingResults( state=benchmarker.state, benchmarks=benchmarker.benchmarks, invalid_submissions=benchmarker.invalid_submissions, baseline=benchmarker.baseline.metrics if benchmarker.baseline else None, - average_benchmark_time=average_benchmark_time, + average_benchmark_time=benchmarker.get_average_benchmark_time(), ) From 9dffbf7983cb52987ceeb4f5ac325a4793eb2fcb Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 17:05:15 -0800 Subject: [PATCH 16/33] Check popen process, log output --- base/testing/inference_sandbox.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/base/testing/inference_sandbox.py b/base/testing/inference_sandbox.py index 33e573a3..0115551c 100644 --- a/base/testing/inference_sandbox.py +++ b/base/testing/inference_sandbox.py @@ -166,12 +166,13 @@ def _setup_sandbox(self) -> int: return repository_size + huggingface_models_size @tracer.start_as_current_span("wait_for_socket") - def wait_for_socket(self) -> float: + def wait_for_socket(self, process: Popen) -> float: start = perf_counter() for _ in range(LOAD_TIMEOUT): if self._socket_path.exists(): break - self._stop_flag.wait(0.1) + self._stop_flag.wait(1) + check_process(process) if self._stop_flag.is_set(): raise CancelledError() else: @@ -197,8 +198,9 @@ def benchmark(self) -> BenchmarkOutput: stdout=PIPE, stderr=PIPE, text=True, - ): - load_time = self.wait_for_socket() + bufsize=1, + ) as process: + load_time = self.wait_for_socket(process) with Client(abspath(self._socket_path)) as client: logger.info(f"Benchmarking {len(self._inputs)} samples") for i, request in enumerate(self._inputs): @@ -225,11 +227,11 @@ def benchmark(self) -> BenchmarkOutput: load_time=load_time, )) outputs.append(output) + check_process(process) average_generation_time = sum(metric.generation_time for metric in metrics) / len(metrics) vram_used = max(metric.vram_used for metric in metrics) - start_vram watts_used = max(metric.watts_used for metric in metrics) - return BenchmarkOutput( metrics=Metrics( generation_time=average_generation_time, @@ -240,3 +242,18 @@ def benchmark(self) -> BenchmarkOutput: ), outputs=outputs, ) + + +def check_process(process: Popen): + if process.poll(): + log_process(process) + raise InvalidSubmissionError(f"Inference crashed with exit code {process.returncode}") + + +def log_process(process: Popen): + stdout = process.stdout.read() + stderr = process.stderr.read() + if stdout: + logger.info(stdout) + if stderr: + logger.error(stderr) From ad0bbee1c6c774feb1a80b1d0bd57561d011b9d4 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Wed, 27 Nov 2024 17:19:27 -0800 Subject: [PATCH 17/33] Fix dockerfile --- validator/submission_tester/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validator/submission_tester/Dockerfile b/validator/submission_tester/Dockerfile index 9215c23d..2f418df6 100644 --- a/validator/submission_tester/Dockerfile +++ b/validator/submission_tester/Dockerfile @@ -2,7 +2,7 @@ FROM pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime WORKDIR /api -COPY validator/api/update.sh validator/api/ +COPY validator/submission_tester/update.sh validator/submission_tester/ RUN cd validator && ./submission_tester/update.sh USER api From 11c06b40b8fe629715bd2cc7138f83d039fe1edd Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Thu, 28 Nov 2024 12:14:58 -0800 Subject: [PATCH 18/33] Fix docker --- validator/submission_tester/Dockerfile | 29 +++++++++++++++++++------ validator/weight_setting/Dockerfile | 30 +++++++++++++++++++------- validator/weight_setting/start.sh | 2 +- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/validator/submission_tester/Dockerfile b/validator/submission_tester/Dockerfile index 2f418df6..ed6f0d56 100644 --- a/validator/submission_tester/Dockerfile +++ b/validator/submission_tester/Dockerfile @@ -1,18 +1,33 @@ FROM pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime -WORKDIR /api +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y sudo pipx git git-lfs build-essential python3-dev python3-opencv + +RUN useradd --create-home --home-dir /home/api api -COPY validator/submission_tester/update.sh validator/submission_tester/ -RUN cd validator && ./submission_tester/update.sh USER api -COPY pipelines . -COPY base . -COPY validator . -COPY .git .git +RUN pipx install uv + +WORKDIR /api + +COPY --chown=api:api pipelines/pyproject.toml ./pipelines/ +COPY --chown=api:api base/pyproject.toml ./base/ +COPY --chown=api:api validator/pyproject.toml validator/uv.lock ./validator/ + +RUN mkdir -p pipelines/pipelines +RUN mkdir -p base/base +RUN mkdir -p base/testing WORKDIR /api/validator +RUN ~/.local/bin/uv sync --compile-bytecode --no-dev --frozen --no-install-project --no-install-workspace +WORKDIR /api +COPY pipelines pipelines +COPY base base +COPY validator validator +COPY --chown=api:api .git .git + +WORKDIR /api/validator USER root EXPOSE 8000 ENTRYPOINT ["submission_tester/entrypoint.sh"] diff --git a/validator/weight_setting/Dockerfile b/validator/weight_setting/Dockerfile index a119fff7..05fce371 100644 --- a/validator/weight_setting/Dockerfile +++ b/validator/weight_setting/Dockerfile @@ -1,22 +1,36 @@ FROM python:3.10 -RUN apt-get update && apt-get install -y pipx +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y sudo pipx git RUN useradd --create-home --home-dir /home/validator validator + USER validator RUN pipx install uv +WORKDIR /app + +COPY --chown=validator:validator pipelines/pyproject.toml ./pipelines/ +COPY --chown=validator:validator base/pyproject.toml ./base/ +COPY --chown=validator:validator validator/pyproject.toml validator/uv.lock ./validator/ + +RUN mkdir -p pipelines/pipelines +RUN mkdir -p base/base +RUN mkdir -p base/testing + WORKDIR /app/validator +RUN ~/.local/bin/uv sync --compile-bytecode --no-dev --frozen --no-install-project --no-install-workspace +WORKDIR /app -COPY base/pyproject.toml base/ -COPY validator/pyproject.toml validator/ -RUN uv sync --compile-bytecode +COPY pipelines pipelines +COPY base base +COPY validator validator +COPY --chown=validator:validator .git .git -COPY pipelines . -COPY base . -COPY validator . -COPY .git .git +WORKDIR /app/validator USER root + +RUN chown validator:validator uv.lock + ENTRYPOINT ["weight_setting/entrypoint.sh"] diff --git a/validator/weight_setting/start.sh b/validator/weight_setting/start.sh index 30385940..cdc9ac1d 100755 --- a/validator/weight_setting/start.sh +++ b/validator/weight_setting/start.sh @@ -2,7 +2,7 @@ set -e -~/.local/bin/uv run opentelemetry-instrument \ +~/.local/bin/uv run --no-dev --frozen opentelemetry-instrument \ --service_name edge-maxxing-validator \ --exporter_otlp_endpoint http://98.81.78.238:4317 \ --resource_attributes "neuron.type=validator,$(~/.local/bin/uv run python3 telemetry_attributes.py "$@")" \ From 5d11c70ec6ff7483085dca3ec610408108bb1283 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Thu, 28 Nov 2024 12:15:30 -0800 Subject: [PATCH 19/33] Optimize update.sh permission setting --- validator/submission_tester/update.sh | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/validator/submission_tester/update.sh b/validator/submission_tester/update.sh index 884b58fa..03b98f71 100755 --- a/validator/submission_tester/update.sh +++ b/validator/submission_tester/update.sh @@ -5,14 +5,12 @@ set -e apt-get update DEBIAN_FRONTEND=noninteractive apt-get -y install sudo pipx git git-lfs build-essential python3-dev python3-opencv -if ! id -u api &>/dev/null; then - useradd --create-home --home-dir /home/api api || true -fi -if ! id -u sandbox &>/dev/null; then - useradd --shell=/bin/false --create-home --home-dir /home/sandbox sandbox || true -fi +useradd --create-home --home-dir /home/api api || true +useradd --shell=/bin/false --create-home --home-dir /home/sandbox sandbox || true -chown -R api:api /api +chown -R api:api /api/.git +chown api:api /api/validator/.venv +chown api:api /api/validator/uv.lock pkill -9 -u sandbox || true pkill -9 -u api || true @@ -22,6 +20,11 @@ rm -rf /sandbox mkdir /sandbox chown sandbox:sandbox /sandbox +mkdir -p /home/sandbox/.local +chown sandbox:sandbox /home/sandbox/.local +mkdir -p /home/sandbox/.cache +chown sandbox:sandbox /home/sandbox/.cache + if [ -z "$CUDA_VISIBLE_DEVICES" ]; then unset CUDA_VISIBLE_DEVICES fi @@ -38,8 +41,9 @@ git config --system pull.autostash true sudo -u api pipx ensurepath sudo -u api pipx install uv -sudo -u api /home/api/.local/bin/uv sync --compile-bytecode +sudo -u api /home/api/.local/bin/uv sync --no-dev --frozen sudo -u sandbox pipx ensurepath sudo -u sandbox pipx install uv sudo -u sandbox pipx install huggingface-hub[cli,hf_transfer] + From d86d90639f2f6fdefc728292ded8613c5b5b4fd9 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Thu, 28 Nov 2024 12:35:15 -0800 Subject: [PATCH 20/33] Add more logging, fix benchmarking --- README.md | 8 +-- base/base/submissions.py | 16 +++--- base/testing/benchmarker.py | 12 ++--- base/testing/inference_sandbox.py | 66 ++++++++++++----------- validator/base_validator/api_data.py | 2 +- validator/submission_tester/api.py | 2 +- validator/weight_setting/state_manager.py | 2 +- validator/weight_setting/validator.py | 20 ++++++- 8 files changed, 73 insertions(+), 55 deletions(-) diff --git a/README.md b/README.md index 86f987f9..bd717ff5 100644 --- a/README.md +++ b/README.md @@ -129,9 +129,7 @@ uv run submit_model \ --netuid {netuid} \ --subtensor.network finney \ --wallet.name {wallet} \ - --wallet.hotkey {hotkey} \ - --logging.trace \ - --logging.debug + --wallet.hotkey {hotkey} ``` 5. Follow the interactive prompts to submit the repository link, revision, and contest to participate in 6. Optionally, benchmark your submission locally before submitting (make sure you have the right hardware e.g. NVIDIA GeForce RTX 4090). uv and huggingface are required for benchmarking: @@ -150,7 +148,7 @@ If your hardware is not accessed within a container(as in, can use Docker), then To get started, go to the `validator`, and create a `.env` file with the following contents: ``` -VALIDATOR_ARGS=--netuid {netuid} --subtensor.network {network} --wallet.name {wallet} --wallet.hotkey {hotkey} --logging.trace --logging.debug +VALIDATOR_ARGS=--netuid {netuid} --subtensor.network {network} --wallet.name {wallet} --wallet.hotkey {hotkey} VALIDATOR_HOTKEY_SS58_ADDRESS={ss58-address} ``` @@ -201,8 +199,6 @@ In the another pod/container without a GPU, to run the scoring validator, clone --subtensor.network {network} \ --wallet.name {wallet} \ --wallet.hotkey {hotkey} \ - --logging.trace \ - --logging.debug \ --benchmarker_api {API component routes, space separated if multiple} ``` diff --git a/base/base/submissions.py b/base/base/submissions.py index 585223b2..57e58f61 100644 --- a/base/base/submissions.py +++ b/base/base/submissions.py @@ -137,8 +137,8 @@ def get_submissions( def deduplicate_submissions(submissions: Submissions) -> Submissions: - existing_repositories: dict[str, Submission] = {} - existing_revisions: dict[str, Submission] = {} + existing_repositories: dict[str, tuple[Key, Submission]] = {} + existing_revisions: dict[str, tuple[Key, Submission]] = {} to_remove: set[Key] = set() for key, submission in submissions.items(): @@ -146,20 +146,20 @@ def deduplicate_submissions(submissions: Submissions) -> Submissions: revision = submission.repository_info.revision block = submission.block - existing_repository = existing_repositories.get(url) - existing_revision = existing_revisions.get(revision) + existing_repository_key, existing_repository = existing_repositories.get(url, (None, None)) + existing_revision_key, existing_revision = existing_revisions.get(revision, (None, None)) if (existing_repository and existing_repository.block < block) or (existing_revision and existing_revision.block < block): to_remove.add(key) continue if existing_repository: - to_remove.add(existing_repository) + to_remove.add(existing_repository_key) if existing_revision: - to_remove.add(existing_revision) + to_remove.add(existing_revision_key) - existing_repositories[url] = submission - existing_revisions[revision] = submission + existing_repositories[url] = key, submission + existing_revisions[revision] = key, submission for key in to_remove: submissions.pop(key) diff --git a/base/testing/benchmarker.py b/base/testing/benchmarker.py index 6080c13b..82a6d5f3 100644 --- a/base/testing/benchmarker.py +++ b/base/testing/benchmarker.py @@ -85,7 +85,7 @@ def _benchmark_baseline(self, contest: Contest, inputs: list[TextToImageRequest] logger.info("Benchmarking baseline") while not self.baseline and not self._stop_flag.is_set(): try: - self._benchmark_submission(contest, inputs, contest.baseline_repository) + self.baseline = self._benchmark_submission(contest, inputs, contest.baseline_repository) except CancelledError: logger.warning("Benchmarking was canceled while testing the baseline") return @@ -121,10 +121,10 @@ def benchmark_submissions(self, contest: Contest, submissions: dict[Key, Reposit finally: self.submission_times.append(perf_counter() - start_time) - average_benchmark_time = self.get_average_benchmark_time() - if average_benchmark_time: - eta = (len(submissions) - len(self.benchmarks)) * average_benchmark_time - logger.info(f"Average benchmark time: {average_benchmark_time}, ETA: {timedelta(seconds=eta)}") + average_benchmarking_time = self.get_average_benchmarking_time() + if average_benchmarking_time: + eta = (len(submissions) - len(self.benchmarks)) * average_benchmarking_time + logger.info(f"Average benchmark time: {average_benchmarking_time}, ETA: {timedelta(seconds=eta)}") if self._is_done(submissions): logger.info("Benchmarking complete") @@ -133,7 +133,7 @@ def benchmark_submissions(self, contest: Contest, submissions: dict[Key, Reposit logger.warning("Benchmarking canceled") self.state = BenchmarkState.NOT_STARTED - def get_average_benchmark_time(self) -> float | None: + def get_average_benchmarking_time(self) -> float | None: return ( sum(self.submission_times) / len(self.submission_times) if self.submission_times diff --git a/base/testing/inference_sandbox.py b/base/testing/inference_sandbox.py index 0115551c..1f9c1aff 100644 --- a/base/testing/inference_sandbox.py +++ b/base/testing/inference_sandbox.py @@ -91,8 +91,10 @@ def _run(self, script: str, args: list[str]): encoding='utf-8', cwd=self._sandbox_directory.absolute(), ) - logger.info(process.stdout) - logger.info(process.stderr) + if process.stdout.strip(): + logger.info(process.stdout) + if process.stderr.strip(): + logger.info(process.stderr) if process.returncode: raise InvalidSubmissionError(f"Failed to run {script}") @@ -200,34 +202,38 @@ def benchmark(self) -> BenchmarkOutput: text=True, bufsize=1, ) as process: - load_time = self.wait_for_socket(process) - with Client(abspath(self._socket_path)) as client: - logger.info(f"Benchmarking {len(self._inputs)} samples") - for i, request in enumerate(self._inputs): - logger.info(f"Sample {i + 1}/{len(self._inputs)}") - start_joules = self._contest.device.get_joules() - vram_monitor = VRamMonitor(self._contest) - - client.send(request.model_dump_json().encode("utf-8")) - - start = perf_counter() - - output = client.recv_bytes() - - generation_time = perf_counter() - start - joules_used = self._contest.device.get_joules() - start_joules - watts_used = joules_used / generation_time - vram_used = vram_monitor.complete() - - metrics.append(Metrics( - generation_time=generation_time, - size=size, - vram_used=vram_used, - watts_used=watts_used, - load_time=load_time, - )) - outputs.append(output) - check_process(process) + try: + load_time = self.wait_for_socket(process) + with Client(abspath(self._socket_path)) as client: + logger.info(f"Benchmarking {len(self._inputs)} samples") + for i, request in enumerate(self._inputs): + logger.info(f"Sample {i + 1}/{len(self._inputs)}") + start_joules = self._contest.device.get_joules() + vram_monitor = VRamMonitor(self._contest) + + data = request.model_dump_json().encode("utf-8") + logger.debug(data) + client.send_bytes(data) + + start = perf_counter() + output = client.recv_bytes() + + generation_time = perf_counter() - start + joules_used = self._contest.device.get_joules() - start_joules + watts_used = joules_used / generation_time + vram_used = vram_monitor.complete() + + metrics.append(Metrics( + generation_time=generation_time, + size=size, + vram_used=vram_used, + watts_used=watts_used, + load_time=load_time, + )) + outputs.append(output) + check_process(process) + finally: + log_process(process) average_generation_time = sum(metric.generation_time for metric in metrics) / len(metrics) vram_used = max(metric.vram_used for metric in metrics) - start_vram diff --git a/validator/base_validator/api_data.py b/validator/base_validator/api_data.py index 455c7e2e..17709780 100644 --- a/validator/base_validator/api_data.py +++ b/validator/base_validator/api_data.py @@ -14,7 +14,7 @@ class BenchmarkingResults(BaseModel): benchmarks: Benchmarks invalid_submissions: set[Key] baseline: Metrics | None - average_benchmark_time: float | None + average_benchmarking_time: float | None class BenchmarkingStartRequest(BaseModel): diff --git a/validator/submission_tester/api.py b/validator/submission_tester/api.py index b4211773..b6a6e15b 100644 --- a/validator/submission_tester/api.py +++ b/validator/submission_tester/api.py @@ -117,7 +117,7 @@ def state(request: Request) -> BenchmarkingResults: benchmarks=benchmarker.benchmarks, invalid_submissions=benchmarker.invalid_submissions, baseline=benchmarker.baseline.metrics if benchmarker.baseline else None, - average_benchmark_time=benchmarker.get_average_benchmark_time(), + average_benchmarking_time=benchmarker.get_average_benchmarking_time(), ) diff --git a/validator/weight_setting/state_manager.py b/validator/weight_setting/state_manager.py index 47ffacd3..7c1c658d 100644 --- a/validator/weight_setting/state_manager.py +++ b/validator/weight_setting/state_manager.py @@ -41,7 +41,7 @@ def load_state(self) -> ContestState | None: return None def save_state(self, state: ContestState): - logger.info(f"Saving state") + logger.debug(f"Saving state") with self._state_file.open("wb") as file: file.write(state.model_dump_json(indent=4).encode()) diff --git a/validator/weight_setting/validator.py b/validator/weight_setting/validator.py index 8fa7c32e..f4515866 100644 --- a/validator/weight_setting/validator.py +++ b/validator/weight_setting/validator.py @@ -1,3 +1,4 @@ +from datetime import timedelta from importlib.metadata import version from signal import signal, SIGINT, SIGHUP, SIGTERM from threading import Event @@ -164,13 +165,28 @@ def update_benchmarks(self, benchmarking_results: list[BenchmarkingResults]): if not self.contest_state: return - self.contest_state.baseline = benchmarking_results[0].baseline - self.contest_state.average_benchmarking_time = benchmarking_results[0].average_benchmark_time + baseline = benchmarking_results[0].baseline + average_benchmarking_time = benchmarking_results[0].average_benchmarking_time + + if self.contest_state.baseline != baseline: + logger.info(f"Updating baseline to {baseline}") + + self.contest_state.baseline = baseline + self.contest_state.average_benchmarking_time = average_benchmarking_time for result in benchmarking_results: + for key in result.benchmarks.keys() - self.contest_state.benchmarks.keys(): + logger.info(f"Updating benchmarks for {key}") + for key in result.invalid_submissions - self.contest_state.invalid_submissions: + logger.info(f"Marking submission from {key} as invalid") + self.contest_state.benchmarks.update(result.benchmarks) self.contest_state.invalid_submissions.update(result.invalid_submissions) + if average_benchmarking_time: + eta = (len(self.contest_state.submissions) - len(self.contest_state.benchmarks)) * average_benchmarking_time + logger.info(f"Average benchmark time: {average_benchmarking_time}, ETA: {timedelta(seconds=eta)}") + def step(self): return self.contest_state.step if self.contest_state else 0 From 89e75c7b6d8d9e1d500ed4f511e91d28d5ddc5a4 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Thu, 28 Nov 2024 13:02:49 -0800 Subject: [PATCH 21/33] Fix score calculation --- base/base/contest.py | 10 +++++----- base/testing/benchmarker.py | 2 +- validator/weight_setting/validator.py | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/base/base/contest.py b/base/base/contest.py index 40080ba0..9979ba34 100644 --- a/base/base/contest.py +++ b/base/base/contest.py @@ -98,11 +98,11 @@ def normalize(baseline_value: float, benchmark_value: float, metric_type: Metric return (relative_improvement * self.metric_weights.get(metric_type, 0)) / total_weight score = sum([ - normalize(baseline.generation_time, benchmark.model.generation_time, MetricType.GENERATION_TIME), - normalize(baseline.size, benchmark.model.size, MetricType.SIZE), - normalize(baseline.vram_used, benchmark.model.vram_used, MetricType.VRAM_USED), - normalize(baseline.watts_used, benchmark.model.watts_used, MetricType.WATTS_USED), - normalize(baseline.load_time, benchmark.model.load_time, MetricType.LOAD_TIME) + normalize(baseline.generation_time, benchmark.metrics.generation_time, MetricType.GENERATION_TIME), + normalize(baseline.size, benchmark.metrics.size, MetricType.SIZE), + normalize(baseline.vram_used, benchmark.metrics.vram_used, MetricType.VRAM_USED), + normalize(baseline.watts_used, benchmark.metrics.watts_used, MetricType.WATTS_USED), + normalize(baseline.load_time, benchmark.metrics.load_time, MetricType.LOAD_TIME) ]) return score * similarity * self.metric_weights.get(MetricType.SIMILARITY_SCORE, 0) / total_weight diff --git a/base/testing/benchmarker.py b/base/testing/benchmarker.py index 82a6d5f3..11520c57 100644 --- a/base/testing/benchmarker.py +++ b/base/testing/benchmarker.py @@ -124,7 +124,7 @@ def benchmark_submissions(self, contest: Contest, submissions: dict[Key, Reposit average_benchmarking_time = self.get_average_benchmarking_time() if average_benchmarking_time: eta = (len(submissions) - len(self.benchmarks)) * average_benchmarking_time - logger.info(f"Average benchmark time: {average_benchmarking_time}, ETA: {timedelta(seconds=eta)}") + logger.info(f"Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=eta)}") if self._is_done(submissions): logger.info("Benchmarking complete") diff --git a/validator/weight_setting/validator.py b/validator/weight_setting/validator.py index f4515866..d636c0f9 100644 --- a/validator/weight_setting/validator.py +++ b/validator/weight_setting/validator.py @@ -185,7 +185,7 @@ def update_benchmarks(self, benchmarking_results: list[BenchmarkingResults]): if average_benchmarking_time: eta = (len(self.contest_state.submissions) - len(self.contest_state.benchmarks)) * average_benchmarking_time - logger.info(f"Average benchmark time: {average_benchmarking_time}, ETA: {timedelta(seconds=eta)}") + logger.info(f"Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=eta)}") def step(self): return self.contest_state.step if self.contest_state else 0 From 698d54eb611a8a63383ab887858371e024d1dce0 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Thu, 28 Nov 2024 14:15:05 -0800 Subject: [PATCH 22/33] Fix wandb, fix trying to send to inactive contest --- base/testing/benchmarker.py | 5 +- validator/weight_setting/benchmarking_api.py | 4 +- validator/weight_setting/validator.py | 49 +++++++++++--------- 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/base/testing/benchmarker.py b/base/testing/benchmarker.py index 11520c57..7d4970de 100644 --- a/base/testing/benchmarker.py +++ b/base/testing/benchmarker.py @@ -123,8 +123,9 @@ def benchmark_submissions(self, contest: Contest, submissions: dict[Key, Reposit average_benchmarking_time = self.get_average_benchmarking_time() if average_benchmarking_time: - eta = (len(submissions) - len(self.benchmarks)) * average_benchmarking_time - logger.info(f"Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=eta)}") + submissions_left = len(submissions) - len(self.benchmarks) + eta = submissions_left * average_benchmarking_time + logger.info(f"{submissions_left}/{len(submissions)} benchmarked. Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=eta)}") if self._is_done(submissions): logger.info("Benchmarking complete") diff --git a/validator/weight_setting/benchmarking_api.py b/validator/weight_setting/benchmarking_api.py index f8554025..c91e9b3f 100644 --- a/validator/weight_setting/benchmarking_api.py +++ b/validator/weight_setting/benchmarking_api.py @@ -9,7 +9,7 @@ from substrateinterface import Keypair from base.checkpoint import Key, Uid, Submissions -from base.contest import ContestId, RepositoryInfo +from base.contest import ContestId, RepositoryInfo, ACTIVE_CONTESTS from base_validator.api_data import BenchmarkingStartRequest, ApiMetadata, BenchmarkingResults, BenchmarkingInitializeRequest logger = get_logger(__name__) @@ -105,7 +105,7 @@ def send_submissions_to_api(version: str, all_apis: list[BenchmarkingApi], submi contest_api_assignment[lowest_contest_id].append(api) for contest_id, apis in contest_api_assignment.items(): - if contest_id not in submissions_by_contest: + if contest_id not in submissions_by_contest and contest_id in ACTIVE_CONTESTS: raise RuntimeError(f"No API compatible with contest type {contest_id.name}") contest_submissions = submissions_by_contest[contest_id] diff --git a/validator/weight_setting/validator.py b/validator/weight_setting/validator.py index d636c0f9..a2443df3 100644 --- a/validator/weight_setting/validator.py +++ b/validator/weight_setting/validator.py @@ -66,14 +66,7 @@ class Validator: netuid=metagraph.netuid, ) - wandb_manager: WandbManager = WandbManager( - config=config, - validator_version=validator_version, - uid=metagraph.netuid, - netuid=metagraph.netuid, - hotkey=keypair.ss58_address, - signature=signature, - ) + wandb_manager: WandbManager weight_setter: WeightSetter benchmarking_apis: list[BenchmarkingApi] @@ -82,6 +75,22 @@ def __init__(self): self.metagraph.sync_nodes() self.uid = list(self.metagraph.nodes.keys()).index(self.keypair.ss58_address) + init_open_telemetry_logging({ + "neuron.uid": self.uid, + "neuron.signature": self.signature, + "subtensor.chain_endpoint": self.substrate.url, + "validator.version": self.validator_version, + }) + + self.wandb_manager = WandbManager( + config=self.config, + validator_version=self.validator_version, + uid=self.uid, + netuid=self.metagraph.netuid, + hotkey=self.keypair.ss58_address, + signature=self.signature, + ) + self.weight_setter: WeightSetter = WeightSetter( version=self.validator_version, epoch_length=self.config["epoch_length"], @@ -92,17 +101,13 @@ def __init__(self): contest_state=lambda: self.contest_state, ) - self.contest_state = self.state_manager.load_state() + contest_state = self.state_manager.load_state() + if contest_state: + self.contest_state = contest_state + self.wandb_manager.init_wandb(self.contest_state) self.benchmarking_apis = [BenchmarkingApi(api=api, keypair=self.keypair) for api in self.config["benchmarker_api"]] - init_open_telemetry_logging({ - "neuron.uid": self.uid, - "neuron.signature": self.signature, - "subtensor.chain_endpoint": self.substrate.url, - "validator.version": self.validator_version, - }) - self.run() @tracer.start_as_current_span("initialize_contest") @@ -168,11 +173,10 @@ def update_benchmarks(self, benchmarking_results: list[BenchmarkingResults]): baseline = benchmarking_results[0].baseline average_benchmarking_time = benchmarking_results[0].average_benchmarking_time - if self.contest_state.baseline != baseline: + if baseline and baseline != self.contest_state.baseline: logger.info(f"Updating baseline to {baseline}") self.contest_state.baseline = baseline - self.contest_state.average_benchmarking_time = average_benchmarking_time for result in benchmarking_results: for key in result.benchmarks.keys() - self.contest_state.benchmarks.keys(): @@ -183,9 +187,12 @@ def update_benchmarks(self, benchmarking_results: list[BenchmarkingResults]): self.contest_state.benchmarks.update(result.benchmarks) self.contest_state.invalid_submissions.update(result.invalid_submissions) - if average_benchmarking_time: - eta = (len(self.contest_state.submissions) - len(self.contest_state.benchmarks)) * average_benchmarking_time - logger.info(f"Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=eta)}") + if average_benchmarking_time and average_benchmarking_time != self.contest_state.average_benchmarking_time: + submissions_left = len(self.contest_state.submissions) - len(self.contest_state.benchmarks) + eta = submissions_left * average_benchmarking_time + logger.info(f"{submissions_left}/{len(self.contest_state.submissions)} benchmarked. Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=eta)}") + + self.contest_state.average_benchmarking_time = average_benchmarking_time def step(self): return self.contest_state.step if self.contest_state else 0 From e45a1e7e394b7bf14d7f15f7befad836eac3dcc0 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Thu, 28 Nov 2024 14:21:47 -0800 Subject: [PATCH 23/33] Fix divide be 0 error --- validator/weight_setting/benchmarking_api.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/validator/weight_setting/benchmarking_api.py b/validator/weight_setting/benchmarking_api.py index c91e9b3f..2a4c75df 100644 --- a/validator/weight_setting/benchmarking_api.py +++ b/validator/weight_setting/benchmarking_api.py @@ -105,7 +105,9 @@ def send_submissions_to_api(version: str, all_apis: list[BenchmarkingApi], submi contest_api_assignment[lowest_contest_id].append(api) for contest_id, apis in contest_api_assignment.items(): - if contest_id not in submissions_by_contest and contest_id in ACTIVE_CONTESTS: + if not contest_id in ACTIVE_CONTESTS: + continue + if contest_id not in submissions_by_contest: raise RuntimeError(f"No API compatible with contest type {contest_id.name}") contest_submissions = submissions_by_contest[contest_id] From 7c7c2adbe83230e74861c9c6a8805dc956031e65 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Thu, 28 Nov 2024 14:34:02 -0800 Subject: [PATCH 24/33] Fix ETA --- base/testing/benchmarker.py | 5 ++--- validator/weight_setting/validator.py | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/base/testing/benchmarker.py b/base/testing/benchmarker.py index 7d4970de..152195b9 100644 --- a/base/testing/benchmarker.py +++ b/base/testing/benchmarker.py @@ -123,9 +123,8 @@ def benchmark_submissions(self, contest: Contest, submissions: dict[Key, Reposit average_benchmarking_time = self.get_average_benchmarking_time() if average_benchmarking_time: - submissions_left = len(submissions) - len(self.benchmarks) - eta = submissions_left * average_benchmarking_time - logger.info(f"{submissions_left}/{len(submissions)} benchmarked. Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=eta)}") + eta = (len(submissions) - len(self.benchmarks)) * average_benchmarking_time + logger.info(f"{len(self.benchmarks)}/{len(submissions)} benchmarked. Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=eta)}") if self._is_done(submissions): logger.info("Benchmarking complete") diff --git a/validator/weight_setting/validator.py b/validator/weight_setting/validator.py index a2443df3..2160b8e7 100644 --- a/validator/weight_setting/validator.py +++ b/validator/weight_setting/validator.py @@ -188,9 +188,8 @@ def update_benchmarks(self, benchmarking_results: list[BenchmarkingResults]): self.contest_state.invalid_submissions.update(result.invalid_submissions) if average_benchmarking_time and average_benchmarking_time != self.contest_state.average_benchmarking_time: - submissions_left = len(self.contest_state.submissions) - len(self.contest_state.benchmarks) - eta = submissions_left * average_benchmarking_time - logger.info(f"{submissions_left}/{len(self.contest_state.submissions)} benchmarked. Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=eta)}") + eta = (len(self.contest_state.submissions) - len(self.contest_state.benchmarks)) * average_benchmarking_time + logger.info(f"{len(self.contest_state.benchmarks)}/{len(self.contest_state.submissions)} benchmarked. Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=eta)}") self.contest_state.average_benchmarking_time = average_benchmarking_time From 710c1d35c7ee879288ec43c6570984ec4ed6c056 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Thu, 28 Nov 2024 16:02:52 -0800 Subject: [PATCH 25/33] Round ETA --- base/testing/benchmarker.py | 2 +- validator/weight_setting/validator.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/base/testing/benchmarker.py b/base/testing/benchmarker.py index 152195b9..245eeb74 100644 --- a/base/testing/benchmarker.py +++ b/base/testing/benchmarker.py @@ -124,7 +124,7 @@ def benchmark_submissions(self, contest: Contest, submissions: dict[Key, Reposit average_benchmarking_time = self.get_average_benchmarking_time() if average_benchmarking_time: eta = (len(submissions) - len(self.benchmarks)) * average_benchmarking_time - logger.info(f"{len(self.benchmarks)}/{len(submissions)} benchmarked. Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=eta)}") + logger.info(f"{len(self.benchmarks)}/{len(submissions)} benchmarked. Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=int(eta))}") if self._is_done(submissions): logger.info("Benchmarking complete") diff --git a/validator/weight_setting/validator.py b/validator/weight_setting/validator.py index 2160b8e7..7b933c09 100644 --- a/validator/weight_setting/validator.py +++ b/validator/weight_setting/validator.py @@ -189,7 +189,7 @@ def update_benchmarks(self, benchmarking_results: list[BenchmarkingResults]): if average_benchmarking_time and average_benchmarking_time != self.contest_state.average_benchmarking_time: eta = (len(self.contest_state.submissions) - len(self.contest_state.benchmarks)) * average_benchmarking_time - logger.info(f"{len(self.contest_state.benchmarks)}/{len(self.contest_state.submissions)} benchmarked. Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=eta)}") + logger.info(f"{len(self.contest_state.benchmarks)}/{len(self.contest_state.submissions)} benchmarked. Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=int(eta))}") self.contest_state.average_benchmarking_time = average_benchmarking_time From c3af1a7b6d1237cce841c2f49678c0c0d5fc8011 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Thu, 28 Nov 2024 20:50:41 -0800 Subject: [PATCH 26/33] Fix unsuccessful weight setting attempts marked as successful --- validator/weight_setting/weight_setter.py | 29 +++++++++++------------ 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/validator/weight_setting/weight_setter.py b/validator/weight_setting/weight_setter.py index 3ff5d7ed..29c32360 100644 --- a/validator/weight_setting/weight_setter.py +++ b/validator/weight_setting/weight_setter.py @@ -56,29 +56,29 @@ def shutdown(self): def _run(self): while not self._stop_flag.is_set(): try: - self.set_weights() - logger.info(f"Successfully set weights, sleeping for {self._epoch_length} blocks") - self._stop_flag.wait(self._epoch_length * 12) + if self.set_weights(): + logger.info(f"Successfully set weights, sleeping for {self._epoch_length} blocks") + self._stop_flag.wait(self._epoch_length * 12) + else: + raise RuntimeError("Set weights attempt was unsuccessful") except Exception as e: blocks_to_sleep = randint(2, 10) logger.error(f"Failed to set weights, retrying in {blocks_to_sleep} blocks: {e}") self._stop_flag.wait(blocks_to_sleep * 12) @tracer.start_as_current_span("set_weights") - def set_weights(self): + def set_weights(self) -> bool: contest_state = self._contest_state() if not contest_state: logger.error("Will not set new weights as the contest state has not been set, setting to all ones") - self._set_equal_weights() - return + return self._set_equal_weights() benchmarks = contest_state.last_benchmarks if not contest_state.baseline: logger.error("Will not set new weights as the baseline benchmarks have not been set, setting to all ones") - self._set_equal_weights() - return + return self._set_equal_weights() if not contest_state.last_benchmarks: if contest_state.benchmarks: @@ -86,8 +86,7 @@ def set_weights(self): benchmarks = contest_state.benchmarks else: logger.error("Will not set new weights as the previous day's benchmarks have not been set, setting to all ones") - self._set_equal_weights() - return + return self._set_equal_weights() self._metagraph.sync_nodes() blacklist = blacklisted_keys() @@ -102,16 +101,16 @@ def set_weights(self): weights_by_key = contest_state.calculate_weights(ranks=ranks) - self._set_weights([ + return self._set_weights([ weights_by_key.get(key, 0) for key in self._metagraph.nodes.keys() ]) - def _set_equal_weights(self): - self._set_weights([1.0] * len(self._metagraph.nodes)) + def _set_equal_weights(self) -> bool: + return self._set_weights([1.0] * len(self._metagraph.nodes)) - def _set_weights(self, weights: list[float]): - set_node_weights( + def _set_weights(self, weights: list[float]) -> bool: + return set_node_weights( self._substrate(), self._keypair, node_ids=list(range(len(self._metagraph.nodes))), From 8c73e3504b7c24dfc6817c0a398fd874a3089b72 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Thu, 28 Nov 2024 21:03:23 -0800 Subject: [PATCH 27/33] Fix calculating scores before baseline is set --- validator/weight_setting/contest_state.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/validator/weight_setting/contest_state.py b/validator/weight_setting/contest_state.py index 11226711..91004b0e 100644 --- a/validator/weight_setting/contest_state.py +++ b/validator/weight_setting/contest_state.py @@ -57,6 +57,9 @@ def sleep_to_next_contest(self, stop_flag: Event): stop_flag.wait(next_contest_time.total_seconds()) def get_scores(self) -> dict[Key, float]: + if not self.baseline: + return {} + return get_contestant_scores( submissions=self.submissions, benchmarks=self.benchmarks, From 0526de156fbfcbf10cfe125b0b7bdc028c237127 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Thu, 28 Nov 2024 21:07:23 -0800 Subject: [PATCH 28/33] Fix wrong path for telemetry_attributes --- validator/weight_setting/start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validator/weight_setting/start.sh b/validator/weight_setting/start.sh index cdc9ac1d..5aed1bf5 100755 --- a/validator/weight_setting/start.sh +++ b/validator/weight_setting/start.sh @@ -5,5 +5,5 @@ set -e ~/.local/bin/uv run --no-dev --frozen opentelemetry-instrument \ --service_name edge-maxxing-validator \ --exporter_otlp_endpoint http://98.81.78.238:4317 \ - --resource_attributes "neuron.type=validator,$(~/.local/bin/uv run python3 telemetry_attributes.py "$@")" \ + --resource_attributes "neuron.type=validator,$(~/.local/bin/uv run python3 weight_setting/telemetry_attributes.py "$@")" \ start_validator "$@" From 59a0362fc5f571be9dc6fb0ab54663cf4e920ee5 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Thu, 28 Nov 2024 21:17:33 -0800 Subject: [PATCH 29/33] Fix ETA --- base/testing/benchmarker.py | 5 +++-- validator/weight_setting/validator.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/base/testing/benchmarker.py b/base/testing/benchmarker.py index 245eeb74..c75b7103 100644 --- a/base/testing/benchmarker.py +++ b/base/testing/benchmarker.py @@ -123,8 +123,9 @@ def benchmark_submissions(self, contest: Contest, submissions: dict[Key, Reposit average_benchmarking_time = self.get_average_benchmarking_time() if average_benchmarking_time: - eta = (len(submissions) - len(self.benchmarks)) * average_benchmarking_time - logger.info(f"{len(self.benchmarks)}/{len(submissions)} benchmarked. Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=int(eta))}") + benchmarked = len(self.benchmarks) + len(self.invalid_submissions) + eta = (len(submissions) - benchmarked) * average_benchmarking_time + logger.info(f"{benchmarked}/{len(submissions)} benchmarked. Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=int(eta))}") if self._is_done(submissions): logger.info("Benchmarking complete") diff --git a/validator/weight_setting/validator.py b/validator/weight_setting/validator.py index 7b933c09..58389d42 100644 --- a/validator/weight_setting/validator.py +++ b/validator/weight_setting/validator.py @@ -188,8 +188,9 @@ def update_benchmarks(self, benchmarking_results: list[BenchmarkingResults]): self.contest_state.invalid_submissions.update(result.invalid_submissions) if average_benchmarking_time and average_benchmarking_time != self.contest_state.average_benchmarking_time: - eta = (len(self.contest_state.submissions) - len(self.contest_state.benchmarks)) * average_benchmarking_time - logger.info(f"{len(self.contest_state.benchmarks)}/{len(self.contest_state.submissions)} benchmarked. Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=int(eta))}") + benchmarked = len(self.contest_state.benchmarks) + len(self.contest_state.invalid_submissions) + eta = (len(self.contest_state.submissions) - benchmarked) * average_benchmarking_time + logger.info(f"{benchmarked}/{len(self.contest_state.submissions)} benchmarked. Average benchmark time: {average_benchmarking_time:.2f}s, ETA: {timedelta(seconds=int(eta))}") self.contest_state.average_benchmarking_time = average_benchmarking_time From 40c10f9888cd8f5d0ed9f11c9eff8513153c1f60 Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Thu, 28 Nov 2024 21:39:52 -0800 Subject: [PATCH 30/33] Set contest state before setting weights --- validator/weight_setting/validator.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/validator/weight_setting/validator.py b/validator/weight_setting/validator.py index 58389d42..7b13ac10 100644 --- a/validator/weight_setting/validator.py +++ b/validator/weight_setting/validator.py @@ -91,6 +91,11 @@ def __init__(self): signature=self.signature, ) + contest_state = self.state_manager.load_state() + if contest_state: + self.contest_state = contest_state + self.wandb_manager.init_wandb(self.contest_state) + self.weight_setter: WeightSetter = WeightSetter( version=self.validator_version, epoch_length=self.config["epoch_length"], @@ -101,11 +106,6 @@ def __init__(self): contest_state=lambda: self.contest_state, ) - contest_state = self.state_manager.load_state() - if contest_state: - self.contest_state = contest_state - self.wandb_manager.init_wandb(self.contest_state) - self.benchmarking_apis = [BenchmarkingApi(api=api, keypair=self.keypair) for api in self.config["benchmarker_api"]] self.run() From 5428f08abbba23293bba65ba75a20fdd2d17673a Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Thu, 28 Nov 2024 22:43:21 -0800 Subject: [PATCH 31/33] Add benchmarking state to contest state --- validator/weight_setting/contest_state.py | 7 +++++-- validator/weight_setting/validator.py | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/validator/weight_setting/contest_state.py b/validator/weight_setting/contest_state.py index 91004b0e..80a1e080 100644 --- a/validator/weight_setting/contest_state.py +++ b/validator/weight_setting/contest_state.py @@ -2,16 +2,17 @@ from threading import Event from fiber.logging_utils import get_logger -from pydantic import BaseModel +from pydantic import BaseModel, ConfigDict from base.checkpoint import Key, current_time, Submissions, Benchmarks -from base.contest import Metrics +from base.contest import Metrics, BenchmarkState from weight_setting.winner_selection import get_contestant_scores, get_contestant_ranks, calculate_rank_weights logger = get_logger(__name__) class ContestState(BaseModel): + model_config = ConfigDict(extra="ignore") step: int benchmarks_version: int submissions: Submissions @@ -20,6 +21,7 @@ class ContestState(BaseModel): invalid_submissions: set[Key] last_benchmarks: Benchmarks average_benchmarking_time: float | None + benchmarking_state: BenchmarkState contest_end: datetime def start_new_contest(self, benchmarks_version: int, submissions: Submissions): @@ -89,6 +91,7 @@ def create(cls, benchmarks_version: int): invalid_submissions=set(), last_benchmarks={}, average_benchmarking_time=None, + benchmarking_state=BenchmarkState.NOT_STARTED, contest_end=current_time() ) return state diff --git a/validator/weight_setting/validator.py b/validator/weight_setting/validator.py index 7b13ac10..3a96b34c 100644 --- a/validator/weight_setting/validator.py +++ b/validator/weight_setting/validator.py @@ -112,6 +112,7 @@ def __init__(self): @tracer.start_as_current_span("initialize_contest") def initialize_contest(self): + self.contest_state.benchmarking_state = BenchmarkState.NOT_STARTED for api in self.benchmarking_apis: api.initialize( uid=self.uid, @@ -150,6 +151,8 @@ def do_step(self): untested_submissions = self.contest_state.get_untested_submissions() if not untested_submissions: + self.contest_state.benchmarking_state = BenchmarkState.FINISHED + self.wandb_manager.send_metrics(self.contest_state) self.contest_state.sleep_to_next_contest(self._stop_flag) return @@ -164,6 +167,7 @@ def do_step(self): return self.update_benchmarks(benchmarking_results) + self.contest_state.benchmarking_state = BenchmarkState.IN_PROGRESS self._stop_flag.wait(BENCHMARK_UPDATE_RATE_BLOCKS * 12) def update_benchmarks(self, benchmarking_results: list[BenchmarkingResults]): From 8d3a2e97d3c423cbab6f4b540ae3c976e6fbbf3f Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Fri, 29 Nov 2024 01:38:33 -0800 Subject: [PATCH 32/33] Increase sleep blocks after failed weight setting attempt --- validator/weight_setting/weight_setter.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/validator/weight_setting/weight_setter.py b/validator/weight_setting/weight_setter.py index 29c32360..7a6b0d84 100644 --- a/validator/weight_setting/weight_setter.py +++ b/validator/weight_setting/weight_setter.py @@ -62,7 +62,7 @@ def _run(self): else: raise RuntimeError("Set weights attempt was unsuccessful") except Exception as e: - blocks_to_sleep = randint(2, 10) + blocks_to_sleep = randint(10, 50) logger.error(f"Failed to set weights, retrying in {blocks_to_sleep} blocks: {e}") self._stop_flag.wait(blocks_to_sleep * 12) @@ -71,21 +71,21 @@ def set_weights(self) -> bool: contest_state = self._contest_state() if not contest_state: - logger.error("Will not set new weights as the contest state has not been set, setting to all ones") + logger.warning("Will not set new weights as the contest state has not been set, setting to all ones") return self._set_equal_weights() benchmarks = contest_state.last_benchmarks if not contest_state.baseline: - logger.error("Will not set new weights as the baseline benchmarks have not been set, setting to all ones") + logger.warning("Will not set new weights as the baseline benchmarks have not been set, setting to all ones") return self._set_equal_weights() if not contest_state.last_benchmarks: if contest_state.benchmarks: - logger.error("Setting weights to current benchmarks as the previous day's benchmarks have not been set") + logger.info("Setting weights to current benchmarks as the previous day's benchmarks have not been set") benchmarks = contest_state.benchmarks else: - logger.error("Will not set new weights as the previous day's benchmarks have not been set, setting to all ones") + logger.warning("Will not set new weights as the previous day's benchmarks have not been set, setting to all ones") return self._set_equal_weights() self._metagraph.sync_nodes() From a8fbe34bc16058eaff2cb3c30fecffb93908f12a Mon Sep 17 00:00:00 2001 From: Ashley Wright Date: Fri, 29 Nov 2024 10:33:48 -0800 Subject: [PATCH 33/33] Fix inference sandbox logging --- base/testing/inference_sandbox.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/base/testing/inference_sandbox.py b/base/testing/inference_sandbox.py index 1f9c1aff..1c87ee31 100644 --- a/base/testing/inference_sandbox.py +++ b/base/testing/inference_sandbox.py @@ -252,7 +252,6 @@ def benchmark(self) -> BenchmarkOutput: def check_process(process: Popen): if process.poll(): - log_process(process) raise InvalidSubmissionError(f"Inference crashed with exit code {process.returncode}") @@ -262,4 +261,4 @@ def log_process(process: Popen): if stdout: logger.info(stdout) if stderr: - logger.error(stderr) + logger.info(stderr)